diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 5286f4739..000000000 --- a/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -build-* -*.locuser -.DS_Store -liblinphone-sdk -liblinphone-iphone-sdk*.zip -xcuserdata/ -Classes/LinphoneIOSVersion.h -Pods/ -Podfile.lock -GoogleService-Info.plist -build -test-reports -WORK -Makefile -OUTPUT -git-clang-format.diff -submodules/tunnel -submodules/binaries/dummy-*.a -linphone-iphone.ipa -TutorialHellowWorld/hello-world.xcodeproj/project.xcworkspace/ -diff-format.patch -*.xcscmblueprint -liblinphone-iphone-sdk-* diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index e69de29bb..000000000 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 68e131abc..000000000 --- a/.travis.yml +++ /dev/null @@ -1,28 +0,0 @@ -language: objective-c -osx_image: xcode7.2 - -env: - global: - - secure: "JPPcWdmNIJiR3YcIwe0LRYce6qDdsiagO+eKKAp7eVk/wD9UHbz96Ms2FFkXxPhRJB1PA6Pf8FpAzIL2YRiJL9jRtKHSvtdF1cSto+57XyBkCsw7PkMVUIxp7fg6Wiwn3H3tucF8jisIkv/Pn7R+9EqePkZSqqu3+ig5AX9ApQ4=" - - KIF_SCREENSHOTS=$PWD/Screens - -before_install: - - brew update 1>/dev/null - - brew install doxygen nasm yasm optipng imagemagick intltool ninja antlr cmake - - wget --no-check-certificate https://raw.githubusercontent.com/FFmpeg/gas-preprocessor/master/gas-preprocessor.pl - - chmod +x gas-preprocessor.pl - - sudo mv gas-preprocessor.pl /usr/local/bin - - sudo ln -s /usr/local/bin/glibtoolize /usr/local/bin/libtoolize - - git submodule update --init --recursive - -install: - - ./prepare.py -d x86_64 -G Ninja - - make -j4 -s - - mkdir -p $KIF_SCREENSHOTS - -script: - - xctool -project linphone.xcodeproj -scheme linphone -sdk iphonesimulator -destination name='iPhone 6' build 1>/dev/null - - xctool -project linphone.xcodeproj -scheme linphone -sdk iphonesimulator -destination name='iPhone 6' test - -after_script: - - ./Tools/imgur_upload.sh diff --git a/.tx/config b/.tx/config deleted file mode 100644 index 58e946dae..000000000 --- a/.tx/config +++ /dev/null @@ -1,309 +0,0 @@ -[main] -host = https://www.transifex.com -minimum_perc = 1 - -[linphone-ios.localizablestrings] -source_lang = en -file_filter = Resources/.lproj/Localizable.strings -source_file = Resources/en.lproj/Localizable.strings -type = STRINGS - -[linphone-ios.aboutviewstrings] -source_lang = en -file_filter = Classes/.lproj/AboutView.strings -source_file = Classes/Base.lproj/AboutView.strings -type = STRINGS - -[linphone-ios.assistantviewstrings] -source_lang = en -file_filter = Classes/.lproj/AssistantView.strings -source_file = Classes/Base.lproj/AssistantView.strings -type = STRINGS - -[linphone-ios.assistantviewscreensstrings] -source_lang = en -file_filter = Classes/.lproj/AssistantViewScreens.strings -source_file = Classes/Base.lproj/AssistantViewScreens.strings -type = STRINGS - -[linphone-ios.callincomingviewstrings] -source_lang = en -file_filter = Classes/.lproj/CallIncomingView.strings -source_file = Classes/Base.lproj/CallIncomingView.strings -type = STRINGS - -[linphone-ios.calloutgoingviewstrings] -source_lang = en -file_filter = Classes/.lproj/CallOutgoingView.strings -source_file = Classes/Base.lproj/CallOutgoingView.strings -type = STRINGS - -[linphone-ios.callviewstrings] -source_lang = en -file_filter = Classes/.lproj/CallView.strings -source_file = Classes/Base.lproj/CallView.strings -type = STRINGS - -[linphone-ios.callviewipadstrings] -source_lang = en -file_filter = Classes/.lproj/CallView~ipad.strings -source_file = Classes/Base.lproj/CallView~ipad.strings -type = STRINGS - -[linphone-ios.chatconversationcreateviewstrings] -source_lang = en -file_filter = Classes/.lproj/ChatConversationCreateView.strings -source_file = Classes/Base.lproj/ChatConversationCreateView.strings -type = STRINGS - -[linphone-ios.chatconversationviewstrings] -source_lang = en -file_filter = Classes/.lproj/ChatConversationView.strings -source_file = Classes/Base.lproj/ChatConversationView.strings -type = STRINGS - -[linphone-ios.chatslistviewstrings] -source_lang = en -file_filter = Classes/.lproj/ChatsListView.strings -source_file = Classes/Base.lproj/ChatsListView.strings -type = STRINGS - -[linphone-ios.contactdetailsviewstrings] -source_lang = en -file_filter = Classes/.lproj/ContactDetailsView.strings -source_file = Classes/Base.lproj/ContactDetailsView.strings -type = STRINGS - -[linphone-ios.contactslistviewstrings] -source_lang = en -file_filter = Classes/.lproj/ContactsListView.strings -source_file = Classes/Base.lproj/ContactsListView.strings -type = STRINGS - -[linphone-ios.dialerviewstrings] -source_lang = en -file_filter = Classes/.lproj/DialerView.strings -source_file = Classes/Base.lproj/DialerView.strings -type = STRINGS - -[linphone-ios.dialerviewipadstrings] -source_lang = en -file_filter = Classes/.lproj/DialerView~ipad.strings -source_file = Classes/Base.lproj/DialerView~ipad.strings -type = STRINGS - -[linphone-ios.firstloginviewstrings] -source_lang = en -file_filter = Classes/.lproj/FirstLoginView.strings -source_file = Classes/Base.lproj/FirstLoginView.strings -type = STRINGS - -[linphone-ios.historydetailsviewstrings] -source_lang = en -file_filter = Classes/.lproj/HistoryDetailsView.strings -source_file = Classes/Base.lproj/HistoryDetailsView.strings -type = STRINGS - -[linphone-ios.historylistviewstrings] -source_lang = en -file_filter = Classes/.lproj/HistoryListView.strings -source_file = Classes/Base.lproj/HistoryListView.strings -type = STRINGS - -[linphone-ios.imageviewstrings] -source_lang = en -file_filter = Classes/.lproj/ImageView.strings -source_file = Classes/Base.lproj/ImageView.strings -type = STRINGS - -[linphone-ios.settingsviewstrings] -source_lang = en -file_filter = Classes/.lproj/SettingsView.strings -source_file = Classes/Base.lproj/SettingsView.strings -type = STRINGS - -[linphone-ios.sidemenuviewstrings] -source_lang = en -file_filter = Classes/.lproj/SideMenuView.strings -source_file = Classes/Base.lproj/SideMenuView.strings -type = STRINGS - -[linphone-ios.sidemenuviewipadstrings] -source_lang = en -file_filter = Classes/.lproj/SideMenuView~ipad.strings -source_file = Classes/Base.lproj/SideMenuView~ipad.strings -type = STRINGS - -[linphone-ios.statusbarviewstrings] -source_lang = en -file_filter = Classes/LinphoneUI/.lproj/StatusBarView.strings -source_file = Classes/LinphoneUI/Base.lproj/StatusBarView.strings -type = STRINGS - -[linphone-ios.tabbarviewstrings] -source_lang = en -file_filter = Classes/LinphoneUI/.lproj/TabBarView.strings -source_file = Classes/LinphoneUI/Base.lproj/TabBarView.strings -type = STRINGS - -[linphone-ios.uicallconferencecellstrings] -source_lang = en -file_filter = Classes/LinphoneUI/.lproj/UICallConferenceCell.strings -source_file = Classes/LinphoneUI/Base.lproj/UICallConferenceCell.strings -type = STRINGS - -[linphone-ios.uicallpausedcellstrings] -source_lang = en -file_filter = Classes/LinphoneUI/.lproj/UICallPausedCell.strings -source_file = Classes/LinphoneUI/Base.lproj/UICallPausedCell.strings -type = STRINGS - -[linphone-ios.uichatbubblephotocellstrings] -source_lang = en -file_filter = Classes/LinphoneUI/.lproj/UIChatBubblePhotoCell.strings -source_file = Classes/LinphoneUI/Base.lproj/UIChatBubblePhotoCell.strings -type = STRINGS - -[linphone-ios.uichatbubbletextcellstrings] -source_lang = en -file_filter = Classes/LinphoneUI/.lproj/UIChatBubbleTextCell.strings -source_file = Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.strings -type = STRINGS - -[linphone-ios.uichatcellstrings] -source_lang = en -file_filter = Classes/LinphoneUI/.lproj/UIChatCell.strings -source_file = Classes/LinphoneUI/Base.lproj/UIChatCell.strings -type = STRINGS - -[linphone-ios.uichatcreatecellstrings] -source_lang = en -file_filter = Classes/LinphoneUI/.lproj/UIChatCreateCell.strings -source_file = Classes/LinphoneUI/Base.lproj/UIChatCreateCell.strings -type = STRINGS - -[linphone-ios.uiconfirmationdialogstrings] -source_lang = en -file_filter = Classes/LinphoneUI/.lproj/UIConfirmationDialog.strings -source_file = Classes/LinphoneUI/Base.lproj/UIConfirmationDialog.strings -type = STRINGS - -[linphone-ios.uicontactcellstrings] -source_lang = en -file_filter = Classes/LinphoneUI/.lproj/UIContactCell.strings -source_file = Classes/LinphoneUI/Base.lproj/UIContactCell.strings -type = STRINGS - -[linphone-ios.uicontactdetailscellstrings] -source_lang = en -file_filter = Classes/LinphoneUI/.lproj/UIContactDetailsCell.strings -source_file = Classes/LinphoneUI/Base.lproj/UIContactDetailsCell.strings -type = STRINGS - -[linphone-ios.uihistorycellstrings] -source_lang = en -file_filter = Classes/LinphoneUI/.lproj/UIHistoryCell.strings -source_file = Classes/LinphoneUI/Base.lproj/UIHistoryCell.strings -type = STRINGS - -[linphone-ios.inappsettingsaccountstrings] -source_lang = en -file_filter = Settings/InAppSettings.bundle/.lproj/Account.strings -source_file = Settings/InAppSettings.bundle/en.lproj/Account.strings -type = STRINGS - -[linphone-ios.inappsettingsadvancedstrings] -source_lang = en -file_filter = Settings/InAppSettings.bundle/.lproj/Advanced.strings -source_file = Settings/InAppSettings.bundle/en.lproj/Advanced.strings -type = STRINGS - -[linphone-ios.inappsettingsaudiostrings] -source_lang = en -file_filter = Settings/InAppSettings.bundle/.lproj/Audio.strings -source_file = Settings/InAppSettings.bundle/en.lproj/Audio.strings -type = STRINGS - -[linphone-ios.inappsettingscallstrings] -source_lang = en -file_filter = Settings/InAppSettings.bundle/.lproj/Call.strings -source_file = Settings/InAppSettings.bundle/en.lproj/Call.strings -type = STRINGS - -[linphone-ios.inappsettingsnetworkstrings] -source_lang = en -file_filter = Settings/InAppSettings.bundle/.lproj/Network.strings -source_file = Settings/InAppSettings.bundle/en.lproj/Network.strings -type = STRINGS - -[linphone-ios.inappsettingsrootstrings] -source_lang = en -file_filter = Settings/InAppSettings.bundle/.lproj/Root.strings -source_file = Settings/InAppSettings.bundle/en.lproj/Root.strings -type = STRINGS - -[linphone-ios.inappsettingstunnelstrings] -source_lang = en -file_filter = Settings/InAppSettings.bundle/.lproj/Tunnel.strings -source_file = Settings/InAppSettings.bundle/en.lproj/Tunnel.strings -type = STRINGS - -[linphone-ios.inappsettingsvideostrings] -source_lang = en -file_filter = Settings/InAppSettings.bundle/.lproj/Video.strings -source_file = Settings/InAppSettings.bundle/en.lproj/Video.strings -type = STRINGS - -[linphone-ios.shopviewstrings] -source_lang = en -file_filter = Classes/.lproj/ShopView.strings -source_file = Classes/en.lproj/ShopView.strings -type = STRINGS - -[linphone-ios.assistantlinkviewstrings] -source_lang = en -file_filter = Classes/.lproj/AssistantLinkView.strings -source_file = Classes/Base.lproj/AssistantLinkView.strings -type = STRINGS - -[linphone-ios.countrylistviewstrings] -source_lang = en -file_filter = Classes/.lproj/CountryListView.strings -source_file = Classes/Base.lproj/CountryListView.strings -type = STRINGS - -[linphone-ios.inappsettingschatstrings] -source_lang = en -file_filter = Settings/InAppSettings.bundle/.lproj/Chat.strings -source_file = Settings/InAppSettings.bundle/en.lproj/Chat.strings -type = STRINGS - -[linphone-ios.uichatconversationinfotableviewcellstrings] -source_lang = en -file_filter = Classes/LinphoneUI/.lproj/UIChatConversationInfoTableViewCell.strings -source_file = Classes/LinphoneUI/Base.lproj/UIChatConversationInfoTableViewCell.strings -type = STRINGS - -[linphone-ios.uichatconversationimdntableviewcellstrings] -source_lang = en -file_filter = Classes/LinphoneUI/.lproj/UIChatConversationImdnTableViewCell.strings -source_file = Classes/LinphoneUI/Base.lproj/UIChatConversationImdnTableViewCell.strings -type = STRINGS - -[linphone-ios.uichatcreatecollectionviewcellstrings] -source_lang = en -file_filter = Classes/LinphoneUI/.lproj/UIChatCreateCollectionViewCell.strings -source_file = Classes/LinphoneUI/Base.lproj/UIChatCreateCollectionViewCell.strings -type = STRINGS - -[linphone-ios.chatconversationinfoviewstrings] -source_lang = en -file_filter = Classes/.lproj/ChatConversationInfoView.strings -source_file = Classes/Base.lproj/ChatConversationInfoView.strings -type = STRINGS - -[linphone-ios.chatconversationimdnviewstrings] -source_lang = en -file_filter = Classes/.lproj/ChatConversationImdnView.strings -source_file = Classes/Base.lproj/ChatConversationImdnView.strings -type = STRINGS diff --git a/CallUITests-Info.plist b/CallUITests-Info.plist deleted file mode 100644 index 0c67376eb..000000000 --- a/CallUITests-Info.plist +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/Classes/AboutView.h b/Classes/AboutView.h deleted file mode 100644 index b1576e7ac..000000000 --- a/Classes/AboutView.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UICompositeView.h" - -@interface AboutView : TPMultiLayoutViewController - -@property(weak, nonatomic) IBOutlet UILabel *nameLabel; -@property(weak, nonatomic) IBOutlet UILabel *descriptionLabel; -@property(weak, nonatomic) IBOutlet UILabel *appVersionLabel; -@property(weak, nonatomic) IBOutlet UILabel *libVersionLabel; -@property(weak, nonatomic) IBOutlet UILabel *licenceLabel; -@property(weak, nonatomic) IBOutlet UILabel *translateLabel; -@property(weak, nonatomic) IBOutlet UILabel *policyLabel; -- (IBAction)onLinkTap:(id)sender; -- (IBAction)onLicenceTap; -- (IBAction)onPolicyTap; -- (IBAction)onDialerBackClick:(id)sender; - -@end diff --git a/Classes/AboutView.m b/Classes/AboutView.m deleted file mode 100644 index 9329d01b3..000000000 --- a/Classes/AboutView.m +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "PhoneMainView.h" -#import "LinphoneManager.h" -#import "LinphoneIOSVersion.h" - -@implementation AboutView - -#pragma mark - UICompositeViewDelegate Functions - -static UICompositeViewDescription *compositeDescription = nil; -+ (UICompositeViewDescription *)compositeViewDescription { - if (compositeDescription == nil) { - compositeDescription = [[UICompositeViewDescription alloc] init:self.class - statusBar:StatusBarView.class - tabBar:nil - sideMenu:SideMenuView.class - fullscreen:false - isLeftFragment:YES - fragmentWith:nil]; - } - return compositeDescription; -} - -- (UICompositeViewDescription *)compositeViewDescription { - return self.class.compositeViewDescription; -} - -#pragma mark - ViewController Functions - -- (void)viewDidLoad { - [super viewDidLoad]; - NSString *name = [NSBundle.mainBundle objectForInfoDictionaryKey:@"CFBundleDisplayName"]; - _nameLabel.text = name; - NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary]; - 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; - [_policyLabel addGestureRecognizer:tapGestureRecognizerPolicy]; - _policyLabel.userInteractionEnabled = YES; -} - -#pragma mark - Action Functions - -- (IBAction)onLinkTap:(id)sender { - UIGestureRecognizer *gest = sender; - NSString *url = ((UILabel *)gest.view).text; - if (![UIApplication.sharedApplication openURL:[NSURL URLWithString:url]]) { - LOGE(@"Failed to open %@, invalid URL", url); - } -} - -- (IBAction)onPolicyTap { - NSString *url = @"https://www.linphone.org/privacy-policy"; - if (![UIApplication.sharedApplication openURL:[NSURL URLWithString:url]]) { - LOGE(@"Failed to open %@, invalid URL", url); - } -} - -- (IBAction)onLicenceTap { - NSString *url = @"https://www.gnu.org/licenses/gpl-3.0.html"; - if (![UIApplication.sharedApplication openURL:[NSURL URLWithString:url]]) { - 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]; -} -@end diff --git a/Classes/AssistantLinkView.h b/Classes/AssistantLinkView.h deleted file mode 100644 index f8135ac2a..000000000 --- a/Classes/AssistantLinkView.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "PhoneMainView.h" -#import -#import "TPKeyboardAvoidingScrollView.h" - -@interface AssistantLinkView : UIViewController -@property(weak, nonatomic) IBOutlet TPKeyboardAvoidingScrollView *linkAccountView; -@property(weak, nonatomic) IBOutlet UIView *activateSMSView; - -@property(weak, nonatomic) IBOutlet UIButton *countryButton; -@property(weak, nonatomic) IBOutlet UITextField *countryCodeField; -@property(weak, nonatomic) IBOutlet UITextField *activationCodeField; -@property (weak, nonatomic) IBOutlet UIRoundBorderedButton *maybeLaterButton; -@property(weak, nonatomic) IBOutlet UIRoundBorderedButton *linkAccountButton; -@property(weak, nonatomic) IBOutlet UIRoundBorderedButton *checkValidationButton; -@property(weak, nonatomic) IBOutlet UIView *waitView; -@property(weak, nonatomic) IBOutlet UITextField *phoneField; -@property (weak, nonatomic) IBOutlet UILabel *linkSMSText; -@property BOOL firstTime; - -- (IBAction)onLinkAccount:(id)sender; -- (IBAction)onCheckValidationButton:(id)sender; -- (IBAction)onCountryClick:(id)sender; -- (IBAction)onDialerClick:(id)sender; -- (IBAction)onPhoneNumberDisclosureClick:(id)sender; -- (IBAction)onMaybeLater:(id)sender; - -@end diff --git a/Classes/AssistantLinkView.m b/Classes/AssistantLinkView.m deleted file mode 100644 index 080e8b4ec..000000000 --- a/Classes/AssistantLinkView.m +++ /dev/null @@ -1,345 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import - -#import "AssistantLinkView.h" -#import "UITextField+DoneButton.h" -#import "UIAssistantTextField.h" - -@implementation AssistantLinkView { - LinphoneAccountCreator *account_creator; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - // every UITextField subviews with phone keyboard must be tweaked to have a done button - [self addDoneButtonRecursivelyInView:self.view]; - self.phoneField.delegate = self; self.firstTime = TRUE; -} - -- (void)addDoneButtonRecursivelyInView:(UIView *)subview { - for (UIView *child in [subview subviews]) { - if ([child isKindOfClass:UITextField.class]) { - UITextField *tf = (UITextField *)child; - if (tf.keyboardType == UIKeyboardTypePhonePad || tf.keyboardType == UIKeyboardTypeNumberPad) { - [tf addDoneButton]; - } - } - [self addDoneButtonRecursivelyInView:child]; - } -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - - _linkAccountView.hidden = _activateSMSView.userInteractionEnabled = NO; - _activateSMSView.hidden = _linkAccountView.userInteractionEnabled = YES; - [self fitScrollContentSize]; - - if (!account_creator) { - account_creator = linphone_account_creator_new( - LC, - [LinphoneManager.instance lpConfigStringForKey:@"xmlrpc_url" inSection:@"assistant" withDefault:@""] - .UTF8String); - } - - linphone_account_creator_set_user_data(account_creator, (__bridge void *)(self)); - - LinphoneAccountCreatorCbs * cbs = linphone_factory_create_account_creator_cbs(linphone_factory_get()); - linphone_account_creator_cbs_set_link_account(cbs, assistant_link_phone_number_with_account); - linphone_account_creator_cbs_set_activate_alias(cbs, assistant_activate_phone_number_link); - linphone_account_creator_add_callbacks(account_creator, cbs); - linphone_account_creator_cbs_unref(cbs); - - LinphoneAccount *acc = linphone_core_get_default_account(LC); - LinphoneAccountParams const *accParams = (acc) ? linphone_account_get_params(acc) : NULL; - if (acc && - strcmp([LinphoneManager.instance lpConfigStringForKey:@"domain_name" - inSection:@"app" - withDefault:@"sip.linphone.org"] - .UTF8String, - linphone_account_params_get_domain(accParams)) == 0) { - linphone_account_creator_set_username( - account_creator, linphone_address_get_username(linphone_account_params_get_identity_address(accParams))); - const LinphoneAuthInfo *info = linphone_account_find_auth_info(acc); - if (info) { - if (linphone_auth_info_get_passwd(info)) - linphone_account_creator_set_password(account_creator, linphone_auth_info_get_passwd(info)); - else - linphone_account_creator_set_ha1(account_creator, linphone_auth_info_get_ha1(info)); - } - linphone_account_creator_set_domain(account_creator, linphone_account_params_get_domain(accParams)); - } else { - LOGW(@"Default proxy is NOT a sip.linphone.org, aborting"); - [PhoneMainView.instance popToView:DialerView.compositeViewDescription]; - } - - CTTelephonyNetworkInfo *networkInfo = [CTTelephonyNetworkInfo new]; - CTCarrier *carrier = networkInfo.subscriberCellularProvider; - NSDictionary *country = [CountryListView countryWithIso:carrier.isoCountryCode]; - if (!country) { - // fetch phone locale - for (NSString *lang in [NSLocale preferredLanguages]) { - NSUInteger idx = [lang rangeOfString:@"-"].location; - idx = (idx == NSNotFound) ? idx = 0 : idx + 1; - if ((country = [CountryListView countryWithIso:[lang substringFromIndex:idx]]) != nil) - break; - } - } - - if (country && self.firstTime) { - [self didSelectCountry:country]; - } -} - -- (void)viewDidDisappear:(BOOL)animated { - if (account_creator) { - linphone_account_creator_unref(account_creator); - } - account_creator = NULL; - [super viewDidDisappear:animated]; -} - -- (void)fitScrollContentSize { - // make view scrollable only if next button is too away - CGRect viewframe = _linkAccountView.frame; - if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) { - viewframe.size.height += 60; - } - [_linkAccountView setContentSize:viewframe.size]; -} - -- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { - [self fitScrollContentSize]; -} - -#pragma mark - UICompositeViewDelegate Functions - -static UICompositeViewDescription *compositeDescription = nil; - -+ (UICompositeViewDescription *)compositeViewDescription { - if (compositeDescription == nil) { - compositeDescription = [[UICompositeViewDescription alloc] init:self.class - statusBar:StatusBarView.class - tabBar:nil - sideMenu:SideMenuView.class - fullscreen:false - isLeftFragment:NO - fragmentWith:nil]; - - compositeDescription.darkBackground = true; - } - return compositeDescription; -} - -- (UICompositeViewDescription *)compositeViewDescription { - return self.class.compositeViewDescription; -} - -#pragma mark - popup - -- (void)showErrorPopup:(const char *)err { - if (strcmp(err, "ERROR_KEY_DOESNT_MATCH") == 0) { - UIAlertController *errView = - [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Account configuration issue", nil) - message:[AssistantView StringForXMLRPCError:err] - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"OK" - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *action) { - self.linkAccountView.hidden = NO; - self.linkAccountView.userInteractionEnabled = YES; - self.activateSMSView.userInteractionEnabled = NO; - self.activateSMSView.hidden = YES; - self.activationCodeField.text = @""; - }]; - - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; - } else { - UIAlertController *errView = - [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Account configuration issue", nil) - message:[AssistantView StringForXMLRPCError:err] - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"OK" - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *action){ - }]; - - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; - } -} - -#pragma mark - cbs - -void assistant_link_phone_number_with_account(LinphoneAccountCreator *creator, LinphoneAccountCreatorStatus status, - const char *resp) { - AssistantLinkView *thiz = (__bridge AssistantLinkView *)(linphone_account_creator_get_user_data(creator)); - thiz.waitView.hidden = YES; - if (status == LinphoneAccountCreatorStatusRequestOk) { - thiz.linkAccountView.hidden = thiz.activateSMSView.userInteractionEnabled = YES; - NSString* phoneNumber = [NSString stringWithUTF8String:linphone_account_creator_get_phone_number(creator)]; - thiz.linkSMSText.text = [NSString stringWithFormat:NSLocalizedString(@"We have sent a SMS with a validation code to %@. To complete your phone number verification, please enter the 4 digit code below:",nil), phoneNumber]; - thiz.activateSMSView.hidden = thiz.linkAccountView.userInteractionEnabled = NO; - } else { - if (strcmp(resp, "Missing required parameters") == 0) { - [thiz showErrorPopup:"ERROR_NO_PHONE_NUMBER"]; - } else { - [thiz showErrorPopup:resp]; - } - } -} - -void assistant_activate_phone_number_link(LinphoneAccountCreator *creator, LinphoneAccountCreatorStatus status, - const char *resp) { - AssistantLinkView *thiz = (__bridge AssistantLinkView *)(linphone_account_creator_get_user_data(creator)); - thiz.waitView.hidden = YES; - if (status == LinphoneAccountCreatorStatusAccountActivated) { - [LinphoneManager.instance lpConfigSetInt:0 forKey:@"must_link_account_time"]; - // save country code prefix if none is already entered - LinphoneAccount *acc = linphone_core_get_default_account(LC); - LinphoneAccountParams const *accParams = linphone_account_get_params(acc); - if (linphone_account_params_get_international_prefix(accParams) == NULL) { - const char *prefix = thiz.countryCodeField.text.UTF8String; - LinphoneAccountParams * newPrefixAccountParams = linphone_account_params_clone(accParams); - linphone_account_params_set_international_prefix(newPrefixAccountParams, prefix[0] == '+' ? &prefix[1] : prefix); - linphone_account_set_params(acc, newPrefixAccountParams); - linphone_account_params_unref(newPrefixAccountParams); - } - [PhoneMainView.instance popToView:DialerView.compositeViewDescription]; - [[NSNotificationCenter defaultCenter] postNotificationName:kLinphoneAddressBookUpdate object:NULL]; - [LinphoneManager.instance.fastAddressBook fetchContactsInBackGroundThread]; - } else { - [thiz showErrorPopup:resp]; - } -} - -#pragma mark - other -- (void)updateCountry:(BOOL)force { - NSDictionary *c = [CountryListView countryWithCountryCode:_countryCodeField.text]; - if (c || force) { - [_countryButton setTitle:c ? [c objectForKey:@"name"] : NSLocalizedString(@"Unknown country code", nil) - forState:UIControlStateNormal]; - } - if ([[_countryButton currentTitle] isEqualToString:NSLocalizedString(@"Unknown country code", nil)]) { - _countryCodeField.layer.borderWidth = .8; - _countryCodeField.layer.cornerRadius = 4.f; - _countryCodeField.layer.borderColor = [[UIColor redColor] CGColor]; - self.linkAccountButton.enabled = FALSE; - } else { - _countryCodeField.layer.borderColor = [[UIColor clearColor] CGColor]; - if (_phoneField.layer.borderColor != [[UIColor redColor] CGColor]) { - self.linkAccountButton.enabled = TRUE; - } - } -} - -- (IBAction)onCountryCodeFieldChange:(id)sender { - [self updateCountry:NO]; -} - -- (IBAction)onCountryCodeFieldEnd:(id)sender { - [self updateCountry:YES]; -} - -- (IBAction)onCountryClick:(id)sender { - self.firstTime = FALSE; - CountryListView *view = VIEW(CountryListView); - [view setDelegate:(id)self]; - [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; -} - -- (IBAction)onLinkAccount:(id)sender { - _waitView.hidden = NO; - NSString *newStr = [_countryCodeField.text substringWithRange:NSMakeRange(1, [_countryCodeField.text length]-1)]; - linphone_account_creator_set_phone_number(account_creator, _phoneField.text.UTF8String, - newStr.UTF8String); - - NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0]; - linphone_account_creator_set_language(account_creator, [[language substringToIndex:2] UTF8String]); - linphone_account_creator_link_account(account_creator); -} - -- (IBAction)onCheckValidationButton:(id)sender { - _waitView.hidden = NO; - linphone_account_creator_set_activation_code(account_creator, _activationCodeField.text.UTF8String); - linphone_account_creator_activate_alias(account_creator); -} - -- (IBAction)onDialerClick:(id)sender { - [PhoneMainView.instance popCurrentView]; -} - -- (IBAction)onPhoneNumberDisclosureClick:(id)sender { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"What will my phone number be used for?", nil) - message:NSLocalizedString(@"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.", - nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; -} - -- (IBAction)onMaybeLater:(id)sender { - [PhoneMainView.instance popToView:DialerView.compositeViewDescription]; -} - -#pragma mark - select country delegate - -- (void)didSelectCountry:(NSDictionary *)country { - [_countryButton setTitle:[country objectForKey:@"name"] forState:UIControlStateNormal]; - _countryCodeField.text = [country objectForKey:@"code"]; -} - -#pragma mark - UITextFieldDelegate Functions - -- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { - //remove the + from the country code to avoir error when checking its validity - NSString *newStr = [_countryCodeField.text substringWithRange:NSMakeRange(1, [_countryCodeField.text length]-1)]; - LinphoneAccountCreatorStatus status = linphone_account_creator_set_phone_number(account_creator, [_phoneField.text UTF8String], [newStr UTF8String]); - if (status == LinphoneAccountCreatorPhoneNumberStatusTooLong || - status == LinphoneAccountCreatorPhoneNumberStatusTooShort) { - self.phoneField.layer.borderWidth = .8; - self.phoneField.layer.cornerRadius = 4.f; - self.phoneField.layer.borderColor = [[UIColor redColor] CGColor]; - self.linkAccountButton.enabled = FALSE; - } else { - self.phoneField.layer.borderColor = [[UIColor clearColor] CGColor]; - if (_countryCodeField.layer.borderColor != [[UIColor redColor] CGColor]){ - self.linkAccountButton.enabled = TRUE; - } - } - return YES; -} - -@end diff --git a/Classes/AssistantView.h b/Classes/AssistantView.h deleted file mode 100644 index b9a225654..000000000 --- a/Classes/AssistantView.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import "UICompositeView.h" -#import "TPKeyboardAvoidingScrollView.h" -#import "PhoneMainView.h" - -typedef enum _TokenRequestAction { - TokenRequestAction_None, - TokenRequestAction_CreateAccount, - TokenRequestAction_RecoverAccount -} TokenRequestAction; - -@interface AssistantView : UIViewController { - - @private - LinphoneAccountCreator *account_creator; - UIView *currentView; - UIView *nextView; - NSMutableArray *historyViews; - LinphoneAccount *new_account; - size_t number_of_accounts_before; - BOOL mustRestoreView; - long phone_number_length; - TokenRequestAction tokenRequestAction; -} - -@property(nonatomic) UICompositeViewDescription *outgoingView; -@property (weak, nonatomic) IBOutlet UILabel *subtileLabel_useLinphoneAccount; - -@property(nonatomic, strong) IBOutlet TPKeyboardAvoidingScrollView *contentView; -@property(nonatomic, strong) IBOutlet UIView *waitView; -@property(nonatomic, strong) IBOutlet UIButton *backButton; -@property (weak, nonatomic) IBOutlet UIButton *infoLoginButton; -@property (weak, nonatomic) IBOutlet UIRoundBorderedButton *linphoneLoginButton; - -@property(nonatomic, strong) IBOutlet UIView *welcomeView; -@property(nonatomic, strong) IBOutlet UIView *createAccountView; -@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; -@property (strong, nonatomic) IBOutlet UIView *qrCodeView; - -@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; -@property (weak, nonatomic) IBOutlet UILabel *phoneTitle; -@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; -@property (weak, nonatomic) IBOutlet UIButton *downloadButton; -@property (weak, nonatomic) IBOutlet UITextField *urlLabel; -@property (weak, nonatomic) IBOutlet NSLayoutConstraint *createAccountNextButtonPositionConstraint; -@property (weak, nonatomic) IBOutlet UIButton *acceptButton; -- (IBAction)onAcceptTermsClick:(id)sender; -@property (weak, nonatomic) IBOutlet UITextView *acceptText; - - -+ (NSString *)StringForXMLRPCError:(const char *)err; -+ (NSString *)errorForLinphoneAccountCreatorPhoneNumberStatus:(LinphoneAccountCreatorPhoneNumberStatus)status; -+ (NSString *)errorForLinphoneAccountCreatorUsernameStatus:(LinphoneAccountCreatorUsernameStatus)status; -+ (NSString *)errorForLinphoneAccountCreatorEmailStatus:(LinphoneAccountCreatorEmailStatus)status; -+ (NSString *)errorForLinphoneAccountCreatorPasswordStatus:(LinphoneAccountCreatorPasswordStatus)status; -+ (NSString *)errorForLinphoneAccountCreatorActivationCodeStatus:(LinphoneAccountCreatorActivationCodeStatus)status; -+ (NSString *)errorForLinphoneAccountCreatorStatus:(LinphoneAccountCreatorStatus)status; -+ (NSString *)errorForLinphoneAccountCreatorDomainStatus:(LinphoneAccountCreatorDomainStatus)status; - -- (void)reset; -- (void)fillDefaultValues; - -- (IBAction)onBackClick:(id)sender; - -- (IBAction)onGotoCreateAccountClick:(id)sender; -- (IBAction)onGotoLinphoneLoginClick:(id)sender; -- (IBAction)onGotoLoginClick:(id)sender; -- (IBAction)onGotoRemoteProvisioningClick:(id)sender; - -- (IBAction)onCreateAccountClick:(id)sender; -- (IBAction)onCreateAccountActivationClick:(id)sender; -- (IBAction)onLinphoneLoginClick:(id)sender; -- (IBAction)onLoginClick:(id)sender; -- (IBAction)onRemoteProvisioningLoginClick:(id)sender; -- (IBAction)onRemoteProvisioningDownloadClick:(id)sender; -- (IBAction)onLaunchQRCodeView:(id)sender; -- (IBAction)onCreateAccountCheckActivatedClick:(id)sender; -- (IBAction)onLinkAccountClick:(id)sender; - -- (IBAction)onFormSwitchToggle:(id)sender; -- (IBAction)onCountryCodeClick:(id)sender; -- (IBAction)onCountryCodeFieldChange:(id)sender; -- (IBAction)onCountryCodeFieldEnd:(id)sender; -- (IBAction)onPhoneNumberDisclosureClick:(id)sender; -@end diff --git a/Classes/AssistantView.m b/Classes/AssistantView.m deleted file mode 100644 index 9979fc071..000000000 --- a/Classes/AssistantView.m +++ /dev/null @@ -1,1973 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "linphone/linphonecore_utils.h" -#import -#import - -#import "AssistantView.h" -#import "CountryListView.h" -#import "LinphoneManager.h" -#import "PhoneMainView.h" -#import "UIAssistantTextField.h" -#import "UITextField+DoneButton.h" -#import "LinphoneAppDelegate.h" -#import "SVProgressHUD.h" - -#ifdef DEBUG -#define PROVIDER_NAME "apns.dev" -#else -#define PROVIDER_NAME "apns" -#endif - -typedef enum _ViewElement { - ViewElement_Username = 100, - ViewElement_Password = 101, - ViewElement_Password2 = 102, - ViewElement_Email = 103, - ViewElement_Domain = 104, - ViewElement_URL = 105, - ViewElement_DisplayName = 106, - ViewElement_Phone = 107, - ViewElement_SMSCode = 108, - ViewElement_PhoneCC = 109, - ViewElement_TextFieldCount = ViewElement_PhoneCC - 100 + 1, - ViewElement_Transport = 110, - ViewElement_Username_Label = 120, - ViewElement_NextButton = 130, - - ViewElement_PhoneButton = 150, - - ViewElement_UsernameFormView = 181, - ViewElement_EmailFormView = 182, -} ViewElement; - -@implementation AssistantView - -#pragma mark - Lifecycle Functions - -- (id)init { - self = [super initWithNibName:NSStringFromClass(self.class) bundle:[NSBundle mainBundle]]; - if (self != nil) { - [[NSBundle mainBundle] loadNibNamed:@"AssistantViewScreens" owner:self options:nil]; - historyViews = [[NSMutableArray alloc] init]; - currentView = nil; - mustRestoreView = NO; - } - return self; -} - -#pragma mark - UICompositeViewDelegate Functions - -static UICompositeViewDescription *compositeDescription = nil; - -+ (UICompositeViewDescription *)compositeViewDescription { - if (compositeDescription == nil) { - compositeDescription = [[UICompositeViewDescription alloc] init:self.class - statusBar:StatusBarView.class - tabBar:nil - sideMenu:SideMenuView.class - fullscreen:false - isLeftFragment:NO - fragmentWith:nil]; - - compositeDescription.darkBackground = true; - } - return compositeDescription; -} - -- (UICompositeViewDescription *)compositeViewDescription { - return self.class.compositeViewDescription; -} - -#pragma mark - ViewController Functions - -- (IBAction)onContactTap { - NSString *url = @"https://www.linphone.org/contact"; - if (![UIApplication.sharedApplication openURL:[NSURL URLWithString:url]]) { - LOGE(@"[Assistant] 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]; - - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(registrationUpdateEvent:) - name:kLinphoneRegistrationUpdate - object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(configuringUpdate:) - name:kLinphoneConfiguringStateUpdate - object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(onAccountAuthenticationTokenReceived:) - name:kLinphoneAccountCreationAuthenticationTokenReceived - object:nil]; - - if (!mustRestoreView) { - new_account = NULL; - MSList *accounts = [LinphoneManager.instance createAccountsNotHiddenList]; - number_of_accounts_before = bctbx_list_size(accounts); - bctbx_free(accounts); - [self resetTextFields]; - [self changeView:_welcomeView back:FALSE animation:FALSE]; - } - mustRestoreView = NO; - _outgoingView = DialerView.compositeViewDescription; - _qrCodeButton.hidden = !ENABLE_QRCODE; - [self resetLiblinphone:FALSE]; - [self enableWelcomeViewButtons]; - NSString *message = NSLocalizedString(@"I accept Belledonne Communications’ terms of use and privacy policy", nil); - NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:message attributes:@{NSForegroundColorAttributeName : [UIColor systemGrayColor]}]; - [attributedString addAttribute:NSLinkAttributeName - value:@"https://www.linphone.org/general-terms" - range:[[attributedString string] rangeOfString:NSLocalizedString(@"terms of use", nil)]]; - [attributedString addAttribute:NSLinkAttributeName - value:@"https://www.linphone.org/privacy-policy" - range:[[attributedString string] rangeOfString:NSLocalizedString(@"privacy policy", nil)]]; - - NSDictionary *linkAttributes = @{NSForegroundColorAttributeName : [UIColor redColor], - NSUnderlineStyleAttributeName : @(NSUnderlineStyleSingle)}; - - _acceptText.linkTextAttributes = linkAttributes; - _acceptText.attributedText = attributedString; - _acceptText.editable = NO; - _acceptText.delegate = self; -} - -- (void)viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; - [NSNotificationCenter.defaultCenter removeObserver:self]; -} - -- (void)fitContent { - // always resize content view so that it fits whole available width - CGRect frame = currentView.frame; - frame.size.width = _contentView.bounds.size.width; - currentView.frame = frame; - - [_contentView setContentSize:frame.size]; - [_contentView contentSizeToFit]; - - _qrCodeView.frame = [[UIScreen mainScreen] bounds]; -} - -- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { - [self fitContent]; -} - -#pragma mark - UITextViewDelegate -- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction { - return [[UIApplication sharedApplication] openURL:URL]; -} - -#pragma mark - Utils - -- (void)resetLiblinphone:(BOOL)core { - - if (account_creator) { - linphone_account_creator_unref(account_creator); - account_creator = NULL; - } - if (core) { - [LinphoneManager.instance resetLinphoneCore]; - } - account_creator = linphone_account_creator_new( - LC, [LinphoneManager.instance lpConfigStringForKey:@"xmlrpc_url" inSection:@"assistant" withDefault:@""] - .UTF8String); - linphone_account_creator_set_user_data(account_creator, (__bridge void *)(self)); - - LinphoneAccountCreatorCbs * cbs = linphone_factory_create_account_creator_cbs(linphone_factory_get()); - - linphone_account_creator_cbs_set_is_account_exist(cbs, assistant_is_account_used); - linphone_account_creator_cbs_set_create_account(cbs, assistant_create_account); - linphone_account_creator_cbs_set_activate_account(cbs, assistant_activate_account); - linphone_account_creator_cbs_set_is_account_activated(cbs, - assistant_is_account_activated); - linphone_account_creator_cbs_set_recover_account(cbs, - assistant_recover_phone_account); - linphone_account_creator_cbs_set_is_account_linked(cbs, - assistant_is_account_linked); - linphone_account_creator_cbs_set_login_linphone_account(cbs, assistant_login_linphone_account); - linphone_account_creator_cbs_set_send_token(cbs, assistant_request_auth_token_cb); - - linphone_account_creator_add_callbacks(account_creator, cbs); - linphone_account_creator_cbs_unref(cbs); -} - -- (void)loadAssistantConfig:(NSString *)rcFilename { - linphone_core_load_config_from_xml(LC, - [LinphoneManager bundleFile:rcFilename].UTF8String); - if (account_creator) { - // Below two settings are applied to account creator when it is built. - // Reloading Core config after won't change the account creator configuration, - // hence the manual reload - linphone_account_creator_set_domain(account_creator, [[LinphoneManager.instance lpConfigStringForKey:@"domain" inSection:@"assistant" withDefault:@""] UTF8String]); - linphone_account_creator_set_algorithm(account_creator, [[LinphoneManager.instance lpConfigStringForKey:@"algorithm" inSection:@"assistant" withDefault:@""] UTF8String]); - } - [self changeView:nextView back:FALSE animation:TRUE]; -} - -- (void)reset { - [LinphoneManager.instance removeAllAccounts]; - [self resetTextFields]; - [self changeView:_welcomeView back:FALSE animation:FALSE]; - _waitView.hidden = TRUE; -} - -- (void)clearHistory { - [historyViews removeAllObjects]; -} - -+ (NSString *)StringForXMLRPCError:(const char *)err { -#define IS(x) (strcmp(err, #x) == 0) - if - IS(ERROR_ACCOUNT_ALREADY_ACTIVATED) - return NSLocalizedString(@"This account is already activated.", nil); - if - IS(ERROR_ACCOUNT_ALREADY_IN_USE) - return NSLocalizedString(@"This account is already in use.", nil); - if - IS(ERROR_ACCOUNT_DOESNT_EXIST) - return NSLocalizedString(@"This account does not exist.", nil); - if - IS(ERROR_ACCOUNT_NOT_ACTIVATED) - return NSLocalizedString(@"This account is not activated yet.", nil); - if - IS(ERROR_ALIAS_ALREADY_IN_USE) - return NSLocalizedString(@"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.", - nil); - if - IS(ERROR_ALIAS_DOESNT_EXIST) - return NSLocalizedString(@"This alias does not exist.", nil); - if - IS(ERROR_EMAIL_ALREADY_IN_USE) - return NSLocalizedString(@"This email address is already used.", nil); - if - IS(ERROR_EMAIL_DOESNT_EXIST) - return NSLocalizedString(@"This email does not exist.", nil); - if - IS(ERROR_KEY_DOESNT_MATCH) - return NSLocalizedString(@"The confirmation code is invalid. \nPlease try again.", nil); - if - IS(ERROR_PASSWORD_DOESNT_MATCH) - return NSLocalizedString(@"Passwords do not match.", nil); - if - IS(ERROR_PHONE_ISNT_E164) - return NSLocalizedString(@"Your phone number is invalid.", nil); - if - IS(ERROR_CANNOT_SEND_SMS) - return NSLocalizedString(@"Server error, please try again later.", nil); - if - IS(ERROR_NO_PHONE_NUMBER) - return NSLocalizedString(@"Please confirm your country code and enter your phone number.", nil); - if - IS(Missing required parameters) - return NSLocalizedString(@"Missing required parameters", nil); - if - IS(ERROR_BAD_CREDENTIALS) - return NSLocalizedString(@"Bad credentials, check your account settings", nil); - if - IS(ERROR_NO_PASSWORD) - return NSLocalizedString(@"Please enter a password to your account", nil); - if - IS(ERROR_NO_EMAIL) - return NSLocalizedString(@"Please enter your email", nil); - if - IS(ERROR_NO_USERNAME) - return NSLocalizedString(@"Please enter a username", nil); - if - IS(ERROR_INVALID_CONFIRMATION) - return NSLocalizedString(@"Your confirmation password doesn't match your password", nil); - if - IS(ERROR_INVALID_EMAIL) - return NSLocalizedString(@"Your email is invalid", nil); - - if (!linphone_core_is_network_reachable(LC)) - return NSLocalizedString(@"There is no network connection available, enable " - @"WIFI or WWAN prior to configure an account.", - nil); - if IS(ERROR_PUSH_UNAVAILABLE) - return NSLocalizedString(@"Push parameters are not available, and are required in order to create an account through an iPhone.\n Please enable them or create your account on https://subscribe.linphone.org", nil); - - if IS(ERROR_AUTH_TOKEN_NOT_RECEIVED) - return NSLocalizedString(@"Failed to get an auth token from account manager server", nil); - - return NSLocalizedString(@"Unknown error, please try again later.", nil); -} - -- (void)enableWelcomeViewButtons { - 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 = _gotoLinphoneSpecificFeatureWarningButton.enabled = acceptTerms; -} - -+ (NSString *)errorForLinphoneAccountCreatorPhoneNumberStatus:(LinphoneAccountCreatorPhoneNumberStatus)status { - switch (status) { - case LinphoneAccountCreatorPhoneNumberStatusTooShort: /**< Phone number too short */ - return NSLocalizedString(@"Your phone number is too short.", nil); - case LinphoneAccountCreatorPhoneNumberStatusTooLong: /**< Phone number too long */ - return NSLocalizedString(@"Your phone number is too long.", nil); - return nil; /* this is not an error, just user has to finish typing */ - case LinphoneAccountCreatorPhoneNumberStatusInvalidCountryCode: /**< Country code invalid */ - return NSLocalizedString(@"Your country code is invalid.", nil); - case LinphoneAccountCreatorPhoneNumberStatusInvalid: /**< Phone number invalid */ - return NSLocalizedString(@"Your phone number is invalid.", nil); - default: - return NSLocalizedString(@"Unknown error, please try again later.", nil); - } -} - -+ (NSString *)errorForLinphoneAccountCreatorUsernameStatus:(LinphoneAccountCreatorUsernameStatus)status { - switch (status) { - case LinphoneAccountCreatorUsernameStatusTooShort: /**< Username too short */ - return NSLocalizedString(@"Your username is too short.", nil); - case LinphoneAccountCreatorUsernameStatusTooLong: /**< Username too long */ - return NSLocalizedString(@"Your username is too long.", nil); - case LinphoneAccountCreatorUsernameStatusInvalidCharacters: /**< Contain invalid characters */ - return NSLocalizedString(@"Your username contains invalid characters.", nil); - case LinphoneAccountCreatorUsernameStatusInvalid: /**< Invalid username */ - return NSLocalizedString(@"Your username is invalid.", nil); - default: - return NSLocalizedString(@"Unknown error, please try again later.", nil); - } -} - -+ (NSString *)errorForLinphoneAccountCreatorEmailStatus:(LinphoneAccountCreatorEmailStatus)status { - switch (status) { - case LinphoneAccountCreatorEmailStatusMalformed: /**< Email malformed */ - return NSLocalizedString(@"Your email is malformed.", nil); - case LinphoneAccountCreatorEmailStatusInvalidCharacters: /**< Contain invalid characters */ - return NSLocalizedString(@"Your email contains invalid characters.", nil); - default: - return NSLocalizedString(@"Unknown error, please try again later.", nil); - } -} - -+ (NSString *)errorForLinphoneAccountCreatorPasswordStatus:(LinphoneAccountCreatorPasswordStatus)status { - switch (status) { - case LinphoneAccountCreatorPasswordStatusTooShort: /**< Password too short */ - // return NSLocalizedString(@"Your password is too short.", nil); - case LinphoneAccountCreatorPasswordStatusTooLong: /**< Password too long */ - // return NSLocalizedString(@"Your password is too long.", nil); - return nil; - case LinphoneAccountCreatorPasswordStatusInvalidCharacters: /**< Contain invalid characters */ - return NSLocalizedString(@"Your password contains invalid characters.", nil); - case LinphoneAccountCreatorPasswordStatusMissingCharacters: /**< Missing specific characters */ - default: - return NSLocalizedString(@"Unknown error, please try again later.", nil); - } -} - -+ (NSString *)errorForLinphoneAccountCreatorActivationCodeStatus:(LinphoneAccountCreatorActivationCodeStatus)status { - switch (status) { - case LinphoneAccountCreatorActivationCodeStatusTooShort: /**< Activation code too short */ - return NSLocalizedString(@"Your country code is too short.", nil); - case LinphoneAccountCreatorActivationCodeStatusTooLong: /**< Activation code too long */ - return NSLocalizedString(@"Your country code is too long.", nil); - return nil; /* this is not an error, just user has to finish typing */ - case LinphoneAccountCreatorActivationCodeStatusInvalidCharacters: /**< Contain invalid characters */ - return NSLocalizedString(@"Your activation code contains invalid characters.", nil); - default: - return NSLocalizedString(@"Unknown error, please try again later.", nil); - } -} - -+ (NSString *)errorForLinphoneAccountCreatorStatus:(LinphoneAccountCreatorStatus)status { - switch (status) { - case LinphoneAccountCreatorStatusRequestFailed: /**< Request failed */ - return NSLocalizedString(@"Server error, please try again later.", nil); - case LinphoneAccountCreatorStatusMissingArguments: /**< Request failed due to missing argument(s) */ - return NSLocalizedString(@"Missing required parameters", nil); - case LinphoneAccountCreatorStatusMissingCallbacks: /**< Request failed due to missing callback(s) */ - return NSLocalizedString(@"Missing required callbacks", nil); - - /** Account status **/ - /* Existence */ - case LinphoneAccountCreatorStatusAccountNotExist: /**< Account not exist */ - return NSLocalizedString(@"This account does not exist.", nil); - case LinphoneAccountCreatorStatusAliasExist: /**< Alias exist */ - return NSLocalizedString( - @"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.", - nil); - case LinphoneAccountCreatorStatusAliasNotExist: /**< Alias not exist */ - return NSLocalizedString(@"This alias does not exist.", nil); - /* Activation */ - case LinphoneAccountCreatorStatusAccountAlreadyActivated: /**< Account already activated */ - return NSLocalizedString(@"This account is already activated.", nil); - case LinphoneAccountCreatorStatusAccountNotActivated: /**< Account not activated */ - return NSLocalizedString(@"This account is not activated yet.", nil); - - /** Server **/ - case LinphoneAccountCreatorStatusServerError: /**< Error server */ - return NSLocalizedString(@"Server error, please try again later.", nil); - default: - if (!linphone_core_is_network_reachable(LC)) { - return NSLocalizedString(@"There is no network connection available, enable " - @"WIFI or WWAN prior to configure an account.", - nil); - } - return NSLocalizedString(@"Unknown error, please try again later.", nil); - } -} - -+ (NSString *)errorForLinphoneAccountCreatorDomainStatus:(LinphoneAccountCreatorDomainStatus)status { - switch (status) { - case LinphoneAccountCreatorDomainInvalid: /**< Domain invalid */ - return NSLocalizedString(@"Invalid.", nil); - default: - return NSLocalizedString(@"Unknown error, please try again later.", nil); - } -} - -- (void)configureAccount { - LinphoneManager *lm = LinphoneManager.instance; - - if (!linphone_core_is_network_reachable(LC)) { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Network Error", nil) - message:NSLocalizedString(@"There is no network connection available, enable " - @"WIFI or WWAN prior to configure an account", - nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; - _waitView.hidden = YES; - return; - } - - // remove previous proxy config, if any - if (new_account != NULL) { - const LinphoneAuthInfo *auth = linphone_account_find_auth_info(new_account); - linphone_core_remove_account(LC, new_account); - if (auth) { - linphone_core_remove_auth_info(LC, auth); - } - } - // Used to be linphone_account_creator_create_proxy_config, which is now deprecated and has no "account" equivalent since linphone_account_creator_create_account is a very different function. - - /** start of linphone_account_creator_create_proxy_config re-implementation for accounts **/ - LinphoneAuthInfo *info; - LinphoneAccountParams *accountParams = linphone_core_create_account_params(LC); - LinphoneAddress *identity = linphone_address_new(NULL); - linphone_address_set_username(identity, linphone_account_creator_get_username(account_creator)); - linphone_address_set_domain(identity, linphone_account_creator_get_domain(account_creator)); - - char const *creatorDisplayName = linphone_account_creator_get_display_name(account_creator); - if (creatorDisplayName) { - linphone_address_set_display_name(identity, creatorDisplayName); - } - linphone_account_params_set_identity_address(accountParams, identity); - if (linphone_account_creator_get_phone_country_code(account_creator)) { - linphone_account_params_set_international_prefix(accountParams, linphone_account_creator_get_phone_country_code(account_creator)); - } else if (linphone_account_creator_get_phone_number(account_creator)) { - int dial_prefix_number = linphone_dial_plan_lookup_ccc_from_e164(linphone_account_creator_get_phone_number(account_creator)); - char buff[4]; - snprintf(buff, sizeof(buff), "%d", dial_prefix_number); - linphone_account_params_set_international_prefix(accountParams, buff); - } - char const* creatorDomain = linphone_account_creator_get_domain(account_creator); - if (linphone_account_params_get_server_addr(accountParams) == NULL && creatorDomain != NULL) { - char *url = ms_strdup_printf("sip:%s", creatorDomain); - LinphoneAddress *proxy_addr = linphone_address_new(url); - if (proxy_addr) { - linphone_address_set_transport(proxy_addr, linphone_account_creator_get_transport(account_creator)); - linphone_account_params_set_server_addr(accountParams, linphone_address_as_string_uri_only(proxy_addr)); - linphone_address_unref(proxy_addr); - } else { - linphone_account_params_set_server_addr(accountParams, creatorDomain); - } - ms_free(url); - } - - linphone_account_params_set_register_enabled(accountParams, TRUE); - - const char* creatorPassword = linphone_account_creator_get_password(account_creator); - const char* creatorHa1 = linphone_account_creator_get_ha1(account_creator); - info = linphone_auth_info_new_for_algorithm(linphone_address_get_username(identity), // username - NULL, //user id - creatorPassword, // passwd - creatorPassword ? NULL : creatorHa1, // ha1 - !creatorPassword && creatorHa1 ? linphone_address_get_domain(identity) : NULL, // realm - assumed to be domain - linphone_address_get_domain(identity), // domain - creatorPassword ? NULL : linphone_account_creator_get_algorithm(account_creator) //if clear text password is given, allow its usage with all algorithms. - ); - linphone_core_add_auth_info(LC, info); - linphone_address_unref(identity); - - LinphonePushNotificationConfig *pushConfig = linphone_account_params_get_push_notification_config(accountParams); - linphone_push_notification_config_set_provider(pushConfig, PROVIDER_NAME); - - if (strcmp(creatorDomain, "sip.linphone.org")==0) { - linphone_core_set_media_encryption(LC, LinphoneMediaEncryptionSRTP); - } - - new_account = linphone_core_create_account(LC, accountParams); - linphone_account_params_unref(accountParams); - - if (linphone_core_add_account(LC, new_account) != -1) { - if (linphone_account_creator_get_set_as_default(account_creator)) { - linphone_core_set_default_account(LC, new_account); - } - } - else { - linphone_core_remove_auth_info(LC, info); - linphone_auth_info_unref(info); - new_account = NULL; - } - /** end of linphone_account_creator_create_proxy_config re-implementation for accounts **/ - - if (new_account) { - // reload address book to prepend proxy config domain to contacts' phone number - // todo: STOP doing that! - [[LinphoneManager.instance fastAddressBook] fetchContactsInBackGroundThread]; - } else - [self displayAssistantConfigurationError]; - - [LinphoneManager.instance migrationPerAccount]; - - linphone_config_sync(LinphoneManager.instance.configDb); - -} - -- (void)displayAssistantConfigurationError { - UIAlertController *errView = [UIAlertController - alertControllerWithTitle:NSLocalizedString(@"Assistant error", nil) - message:NSLocalizedString( - @"Could not configure your account, please check parameters or try again later", - nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *action){ - }]; - - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; - _waitView.hidden = YES; - return; -} - -#pragma mark - UI update - -- (void)changeView:(UIView *)view back:(BOOL)back animation:(BOOL)animation { - - static BOOL placement_done = NO; // indicates if the button placement has been done in the assistant choice view - - - if (view == _welcomeView) { - BOOL show_logo = [LinphoneManager.instance lpConfigBoolForKey:@"show_assistant_logo_in_choice_view_preference"]; - BOOL show_extern = ![LinphoneManager.instance lpConfigBoolForKey:@"hide_assistant_custom_account"]; - BOOL show_new = ![LinphoneManager.instance lpConfigBoolForKey:@"hide_assistant_create_account"]; - BOOL show_fetch_remote = ![LinphoneManager.instance lpConfigBoolForKey:@"show_remote_provisioning_in_assistant"]; - - if (!placement_done) { - // visibility - _welcomeLogoImage.hidden = !show_logo; - _gotoLoginButton.hidden = !show_extern; - _gotoCreateAccountButton.hidden = !show_new; - _gotoRemoteProvisioningButton.hidden = !show_fetch_remote; - - // placement - if (show_logo && show_new && !show_extern) { - // lower both remaining buttons - [_gotoCreateAccountButton setCenter:[_gotoLinphoneLoginButton center]]; - [_gotoLoginButton setCenter:[_gotoLoginButton center]]; - - } else if (!show_logo && !show_new && show_extern) { - // move up the extern button - [_gotoLoginButton setCenter:[_gotoCreateAccountButton center]]; - } - placement_done = YES; - } - if (!show_extern && !show_logo) { - // no option to create or specify a custom account: go to connect view directly - view = _linphoneLoginView; - } - } - - if (currentView == _qrCodeView) { - linphone_core_enable_video_preview(LC, FALSE); - linphone_core_enable_qrcode_video_preview(LC, FALSE); - LinphoneAppDelegate *delegate = (LinphoneAppDelegate *)UIApplication.sharedApplication.delegate; - delegate.onlyPortrait = FALSE; - } - - // Animation - if (animation && ANIMATED) { - CATransition *trans = [CATransition animation]; - [trans setType:kCATransitionPush]; - [trans setDuration:0.35]; - [trans setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; - if (back) { - [trans setSubtype:kCATransitionFromLeft]; - } else { - [trans setSubtype:kCATransitionFromRight]; - } - [_contentView.layer addAnimation:trans forKey:@"Transition"]; - } - - // Stack current view - if (currentView != nil) { - if (!back) - [historyViews addObject:currentView]; - [currentView removeFromSuperview]; - } - - // Set current view - currentView = view; - [_contentView insertSubview:currentView atIndex:0]; - [_contentView setContentOffset:CGPointMake(0, -_contentView.contentInset.top) animated:NO]; - - // Resize next button to fix text length - UIRoundBorderedButton *button = [self findButton:ViewElement_NextButton]; - CGSize size = [button.titleLabel.text sizeWithFont:button.titleLabel.font]; - size.width += 60; - CGRect frame = button.frame; - frame.origin.x += (button.frame.size.width - size.width) / 2; - frame.size.width = size.width; - [button setFrame:frame]; - - [self fitContent]; - - // also force next button alignement on create account page - if ([self findView:ViewElement_PhoneButton inView:currentView ofType:UIRoundBorderedButton.class]) { - CTTelephonyNetworkInfo *networkInfo = [CTTelephonyNetworkInfo new]; - CTCarrier *carrier = networkInfo.subscriberCellularProvider; - NSDictionary *country = [CountryListView countryWithIso:carrier.isoCountryCode]; - - if (!IPAD) { - UISwitch *emailSwitch = (UISwitch *)[self findView:ViewElement_EmailFormView inView:self.contentView ofType:UISwitch.class]; - UILabel *emailLabel = (UILabel *)[self findView:ViewElement_EmailFormView inView:self.contentView ofType:UILabel.class]; - [emailSwitch removeFromSuperview]; - [emailLabel removeFromSuperview]; - //Move up the createAccountButton - CGRect r1 = [currentView frame]; - r1.size.height = 460; - [currentView setFrame:r1]; - } - - if (!country) { - //fetch phone locale - for (NSString* lang in [NSLocale preferredLanguages]) { - NSUInteger idx = [lang rangeOfString:@"-"].location; - idx = (idx == NSNotFound) ? idx = 0 : idx + 1; - if ((country = [CountryListView countryWithIso:[lang substringFromIndex:idx]]) != nil) - break; - } - } - - if (country) { - [self didSelectCountry:country]; - } - [self onFormSwitchToggle:nil]; - } - - // every UITextField subviews with phone keyboard must be tweaked to have a done button - [self addDoneButtonRecursivelyInView:self.view]; - [self prepareErrorLabels]; -} - -- (void)addDoneButtonRecursivelyInView:(UIView *)subview { - for (UIView *child in [subview subviews]) { - if ([child isKindOfClass:UITextField.class]) { - UITextField *tf = (UITextField *)child; - if (tf.keyboardType == UIKeyboardTypePhonePad || tf.keyboardType == UIKeyboardTypeNumberPad) { - [tf addDoneButton]; - } - } - [self addDoneButtonRecursivelyInView:child]; - } -} - -- (void)fillDefaultValues { - [self resetTextFields]; - - LinphoneAccountParams *default_account_params = linphone_core_create_account_params(LC); - LinphoneAccount *default_account = linphone_core_create_account(LC, default_account_params); - const char *identity = linphone_account_params_get_identity(linphone_account_get_params(default_account)); - if (identity) { - LinphoneAddress *default_addr = linphone_core_interpret_url_2(LC, identity, false); - if (default_addr) { - const char *domain = linphone_address_get_domain(default_addr); - const char *username = linphone_address_get_username(default_addr); - if (domain && strlen(domain) > 0) { - [self findTextField:ViewElement_Domain].text = [NSString stringWithUTF8String:domain]; - } - if (username && strlen(username) > 0 && username[0] != '?') { - [self findTextField:ViewElement_Username].text = [NSString stringWithUTF8String:username]; - } - } - } - - [self changeView:_remoteProvisioningLoginView back:FALSE animation:TRUE]; - - linphone_account_params_unref(default_account_params); -} - -- (void)resetTextFields { - for (UIView *view in @[ - _welcomeView, - _createAccountView, - _linphoneLoginView, - _loginView, - _createAccountActivateEmailView, - _createAccountActivateSMSView, - _remoteProvisioningLoginView - ]) { - [AssistantView cleanTextField:view]; -#if DEBUG - UIAssistantTextField *atf = - (UIAssistantTextField *)[self findView:ViewElement_Domain inView:view ofType:UIAssistantTextField.class]; - atf.text = @"test.linphone.org"; -#endif - } - phone_number_length = 0; -} - -+ (void)cleanTextField:(UIView *)view { - if ([view isKindOfClass:UIAssistantTextField.class]) { - [(UIAssistantTextField *)view setText:@""]; - ((UIAssistantTextField *)view).canShowError = NO; - } else if (view.tag == ViewElement_PhoneButton) { - [(UIButton *)view setTitle:NSLocalizedString(@"Select your country", nil) forState:UIControlStateNormal]; - } else { - for (UIView *subview in view.subviews) { - [AssistantView cleanTextField:subview]; - } - } -} - -- (UIView *)findView:(ViewElement)tag inView:view ofType:(Class)type { - for (UIView *child in [view subviews]) { - if (child.tag == tag && child.class == type) { - return child; - } else { - UIView *o = [self findView:tag inView:child ofType:type]; - if (o) - return o; - } - } - return nil; -} - -- (UIAssistantTextField *)findTextField:(ViewElement)tag { - return (UIAssistantTextField *)[self findView:tag inView:self.contentView ofType:[UIAssistantTextField class]]; -} - -- (UIRoundBorderedButton *)findButton:(ViewElement)tag { - return (UIRoundBorderedButton *)[self findView:tag inView:self.contentView ofType:[UIRoundBorderedButton class]]; -} - -- (UILabel *)findLabel:(ViewElement)tag { - return (UILabel *)[self findView:tag inView:self.contentView ofType:[UILabel class]]; -} - -- (void)prepareErrorLabels { - UIAssistantTextField *createUsername = [self findTextField:ViewElement_Username]; - [createUsername - showError:[AssistantView - errorForLinphoneAccountCreatorUsernameStatus:LinphoneAccountCreatorUsernameStatusInvalid] - when:^BOOL(NSString *inputEntry) { - LinphoneAccountCreatorUsernameStatus s = - linphone_account_creator_set_username(account_creator, inputEntry.UTF8String); - if (s != LinphoneAccountCreatorUsernameStatusOk) - linphone_account_creator_set_username(account_creator, NULL); - createUsername.errorLabel.text = [AssistantView errorForLinphoneAccountCreatorUsernameStatus:s]; - return s != LinphoneAccountCreatorUsernameStatusOk; - }]; - UIAssistantTextField *createPhone = [self findTextField:ViewElement_Phone]; - [createPhone - showError:[AssistantView - errorForLinphoneAccountCreatorPhoneNumberStatus:LinphoneAccountCreatorPhoneNumberStatusInvalid] - when:^BOOL(NSString *inputEntry) { - - UIAssistantTextField *countryCodeField = [self findTextField:ViewElement_PhoneCC]; - NSString *newStr = - [countryCodeField.text substringWithRange:NSMakeRange(1, [countryCodeField.text length] - 1)]; - NSString *prefix = (inputEntry.length > 0) ? newStr : nil; - LinphoneAccountCreatorPhoneNumberStatus s = linphone_account_creator_set_phone_number( - account_creator, inputEntry.length > 0 ? inputEntry.UTF8String : NULL, prefix.UTF8String); - if (s != LinphoneAccountCreatorPhoneNumberStatusOk) { - linphone_account_creator_set_phone_number(account_creator, NULL, NULL); - } - - createPhone.errorLabel.text = [AssistantView errorForLinphoneAccountCreatorPhoneNumberStatus:s]; - - return s != LinphoneAccountCreatorPhoneNumberStatusOk; - }]; - - UIAssistantTextField *password = [self findTextField:ViewElement_Password]; - [password showError:[AssistantView - errorForLinphoneAccountCreatorPasswordStatus:LinphoneAccountCreatorPasswordStatusTooShort] - when:^BOOL(NSString *inputEntry) { - LinphoneAccountCreatorPasswordStatus s = - linphone_account_creator_set_password(account_creator, inputEntry.UTF8String); - password.errorLabel.text = [AssistantView errorForLinphoneAccountCreatorPasswordStatus:s]; - return s != LinphoneAccountCreatorPasswordStatusOk; - }]; - - UIAssistantTextField *password2 = [self findTextField:ViewElement_Password2]; - [password2 showError:NSLocalizedString(@"The confirmation code is invalid. \nPlease check your SMS and try again.", nil) - when:^BOOL(NSString *inputEntry) { - return ![inputEntry isEqualToString:[self findTextField:ViewElement_Password].text]; - }]; - - UIAssistantTextField *email = [self findTextField:ViewElement_Email]; - [email - showError:[AssistantView errorForLinphoneAccountCreatorEmailStatus:LinphoneAccountCreatorEmailStatusMalformed] - when:^BOOL(NSString *inputEntry) { - LinphoneAccountCreatorEmailStatus s = - linphone_account_creator_set_email(account_creator, inputEntry.UTF8String); - email.errorLabel.text = [AssistantView errorForLinphoneAccountCreatorEmailStatus:s]; - return s != LinphoneAccountCreatorEmailStatusOk; - }]; - - UIAssistantTextField *domain = [self findTextField:ViewElement_Domain]; - [domain showError:[AssistantView errorForLinphoneAccountCreatorDomainStatus:LinphoneAccountCreatorDomainInvalid] - when:^BOOL(NSString *inputEntry) { - if (![inputEntry isEqualToString:@""]) { - LinphoneAccountCreatorDomainStatus s = - linphone_account_creator_set_domain(account_creator, inputEntry.UTF8String); - domain.errorLabel.text = [AssistantView errorForLinphoneAccountCreatorDomainStatus:s]; - return s != LinphoneAccountCreatorDomainOk; - } - return true; - }]; - - UIAssistantTextField *url = [self findTextField:ViewElement_URL]; - [url showError:NSLocalizedString(@"Invalid remote provisioning URL", nil) - when:^BOOL(NSString *inputEntry) { - if (inputEntry.length > 0) { - bool isValid = linphone_core_set_provisioning_uri(LC, [self addSchemeToProvisiionninUriIMissing:inputEntry].UTF8String) != 0; - linphone_core_set_provisioning_uri(LC,NULL); - return isValid; - } - return TRUE; - }]; - - UIAssistantTextField *displayName = [self findTextField:ViewElement_DisplayName]; - [displayName showError:[AssistantView - errorForLinphoneAccountCreatorUsernameStatus:LinphoneAccountCreatorUsernameStatusInvalid] - when:^BOOL(NSString *inputEntry) { - LinphoneAccountCreatorUsernameStatus s = LinphoneAccountCreatorUsernameStatusOk; - if (inputEntry.length > 0) { - s = linphone_account_creator_set_display_name(account_creator, inputEntry.UTF8String); - displayName.errorLabel.text = - [AssistantView errorForLinphoneAccountCreatorUsernameStatus:s]; - } - return s != LinphoneAccountCreatorUsernameStatusOk; - }]; - - UIAssistantTextField *smsCode = [self findTextField:ViewElement_SMSCode]; - [smsCode showError:nil when:^BOOL(NSString *inputEntry) { - return inputEntry.length != 4; - }]; - [self shouldEnableNextButton]; - -} - --(NSString *) addSchemeToProvisiionninUriIMissing:(NSString *)uri { - // missing prefix will result in http:// being used - return [uri rangeOfString:@"://"].location == NSNotFound ? [NSString stringWithFormat:@"http://%@", uri] : uri; -} - -- (void)shouldEnableNextButton { - BOOL invalidInputs = NO; - for (int i = 0; !invalidInputs && i < ViewElement_TextFieldCount; i++) { - ViewElement ve = (ViewElement)100+i; - if ([self findTextField:ve].isInvalid) { - invalidInputs = YES; - break; - } - } - - UISwitch *emailSwitch = (UISwitch *)[self findView:ViewElement_EmailFormView inView:self.contentView ofType:UISwitch.class]; - if (!emailSwitch.isOn) { - [self findButton:ViewElement_NextButton].enabled = !invalidInputs; - } -} - -- (BOOL) checkFields { - UISwitch *emailSwitch = (UISwitch *)[self findView:ViewElement_EmailFormView inView:self.contentView ofType:UISwitch.class]; - if (emailSwitch.isOn) { - if ([self findTextField:ViewElement_Username].text.length == 0) { - [self showErrorPopup:"ERROR_NO_USERNAME"]; - return FALSE; - } - if ([self findTextField:ViewElement_Email].text.length == 0) { - [self showErrorPopup:"ERROR_NO_EMAIL"]; - return FALSE; - } else { - LinphoneAccountCreatorEmailStatus s = linphone_account_creator_set_email( - account_creator, [self findTextField:ViewElement_Email].text.UTF8String); - if (s == LinphoneAccountCreatorEmailStatusMalformed) { - [self showErrorPopup:"ERROR_INVALID_EMAIL"]; - return FALSE; - } - } - if ([self findTextField:ViewElement_Password].text.length == 0) { - [self showErrorPopup:"ERROR_NO_PASSWORD"]; - return FALSE; - } - if (![[self findTextField:ViewElement_Password].text isEqualToString:[self findTextField:ViewElement_Password2].text]) { - [self showErrorPopup:"ERROR_INVALID_CONFIRMATION"]; - return FALSE; - } - - return TRUE; - } else { - return TRUE; - } -} - -#pragma mark - Event Functions - -- (void)registrationUpdateEvent:(NSNotification *)notif { - NSString *message = [notif.userInfo objectForKey:@"message"]; - [self registrationUpdate:[[notif.userInfo objectForKey:@"state"] intValue] - forAccount:[[notif.userInfo objectForKeyedSubscript:@"account"] pointerValue] - message:message]; -} - -- (void)registrationUpdate:(LinphoneRegistrationState)state - forAccount:(LinphoneAccount *)account - message:(NSString *)message { - // in assistant we only care about ourself - if (new_account && account != new_account) { - return; - } - - switch (state) { - case LinphoneRegistrationOk: { - _waitView.hidden = true; - - [LinphoneManager.instance - lpConfigSetInt:[NSDate new].timeIntervalSince1970 + - [LinphoneManager.instance lpConfigIntForKey:@"link_account_popup_time" withDefault:84200] - forKey:@"must_link_account_time"]; - [PhoneMainView.instance popToView:_outgoingView]; - break; - } - case LinphoneRegistrationNone: - case LinphoneRegistrationCleared: { - _waitView.hidden = true; - break; - } - case LinphoneRegistrationFailed: { - _waitView.hidden = true; - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Connection failure", nil) - message:message - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - UIAlertAction* continueAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Continue", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - [PhoneMainView.instance popToView:DialerView.compositeViewDescription]; - }]; - - [errView addAction:defaultAction]; - [errView addAction:continueAction]; - [self presentViewController:errView animated:YES completion:nil]; - break; - } - case LinphoneRegistrationProgress: { - _waitView.hidden = false; - break; - } - default: - break; - } -} - -- (void)configuringUpdate:(NSNotification *)notif { - LinphoneConfiguringState status = (LinphoneConfiguringState)[[notif.userInfo valueForKey:@"state"] integerValue]; - - switch (status) { - case LinphoneConfiguringSuccessful: - // we successfully loaded a remote provisioned config, go to dialer - [LinphoneManager.instance lpConfigSetInt:[NSDate new].timeIntervalSince1970 - forKey:@"must_link_account_time"]; - [LinphoneManager.instance configurePushProviderForAccounts]; - - MSList *accounts = [LinphoneManager.instance createAccountsNotHiddenList]; - if (number_of_accounts_before < bctbx_list_size(accounts)) { - LOGI(@"[Assistant] A proxy config was set up with the remote provisioning, skip assistant"); - [self onDialerClick:nil]; - } - bctbx_free(accounts); - - _waitView.hidden = true; - if (nextView == nil) { - [self fillDefaultValues]; - } else { - [self changeView:nextView back:false animation:TRUE]; - nextView = nil; - } - break; - case LinphoneConfiguringFailed: { - _waitView.hidden = true; - NSString *error_message = [notif.userInfo valueForKey:@"message"]; - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Provisioning Load error", nil) - message:error_message - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; - break; - } - - case LinphoneConfiguringSkipped: - _waitView.hidden = true; - default: - break; - } -} - -- (void)onAccountAuthenticationTokenReceived:(NSNotification *)notif { - NSString *token = [LinphoneManager.instance lpConfigStringForKey:@"account_creation_token" inSection:@"app"]; - linphone_account_creator_set_token(account_creator, [token UTF8String]); - if (tokenRequestAction == TokenRequestAction_CreateAccount) - linphone_account_creator_is_account_exist(account_creator); - else if (tokenRequestAction == TokenRequestAction_RecoverAccount) - linphone_account_creator_recover_account(account_creator); - - tokenRequestAction = TokenRequestAction_None; -} - -- (void)showErrorPopup:(const char *)error { - [SVProgressHUD dismiss]; - const char *err = error ? error : ""; - if (strcmp(err, "ERROR_BAD_CREDENTIALS") == 0) { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Connection failure", nil) - message:[AssistantView StringForXMLRPCError:err] - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - UIAlertAction* continueAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Continue", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - [PhoneMainView.instance popToView:DialerView.compositeViewDescription]; - }]; - - defaultAction.accessibilityLabel = @"PopUpResp"; - [errView addAction:defaultAction]; - [errView addAction:continueAction]; - [self presentViewController:errView animated:YES completion:nil]; - } else if (strcmp(err, "ERROR_KEY_DOESNT_MATCH") == 0) { - UIAlertController *errView = - [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Account configuration issue", nil) - message:[AssistantView StringForXMLRPCError:err] - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction *defaultAction = [UIAlertAction - actionWithTitle:@"OK" - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *action) { - NSString *tmp_phone = - [NSString stringWithUTF8String:linphone_account_creator_get_phone_number(account_creator)]; - int ccc = -1; - const LinphoneDialPlan *dialplan = NULL; - char *nationnal_significant_number = NULL; - ccc = linphone_dial_plan_lookup_ccc_from_e164(tmp_phone.UTF8String); - if (ccc > -1) { /*e164 like phone number*/ - dialplan = linphone_dial_plan_by_ccc_as_int(ccc); - nationnal_significant_number = strstr(tmp_phone.UTF8String, linphone_dial_plan_get_country_calling_code(dialplan)); - if (nationnal_significant_number) { - nationnal_significant_number += strlen(linphone_dial_plan_get_country_calling_code(dialplan)); - } - } - [self changeView:_linphoneLoginView back:FALSE animation:TRUE]; - UISwitch *usernameSwitch = (UISwitch *)[self findView:ViewElement_UsernameFormView - inView:self.contentView - ofType:UISwitch.class]; - [usernameSwitch setOn:FALSE]; - UIView *usernameView = - [self findView:ViewElement_UsernameFormView inView:self.contentView ofType:UIView.class]; - usernameView.hidden = !usernameSwitch.isOn; - if (nationnal_significant_number) { - ((UITextField *)[self findView:ViewElement_Phone - inView:_linphoneLoginView - ofType:[UIAssistantTextField class]]) - .text = [NSString stringWithUTF8String:nationnal_significant_number]; - } - ((UITextField *)[self findView:ViewElement_SMSCode - inView:_createAccountActivateSMSView - ofType:[UITextField class]]) - .text = @""; - linphone_account_creator_set_activation_code(account_creator, ""); - if (linphone_dial_plan_get_iso_country_code(dialplan)) { - NSDictionary *country = [CountryListView - countryWithIso:[NSString stringWithUTF8String:linphone_dial_plan_get_iso_country_code(dialplan)]]; - [self didSelectCountry:country]; - } - // Reset phone number in account_creator to be sure to let the user retry - if (nationnal_significant_number) { - linphone_account_creator_set_phone_number(account_creator, nationnal_significant_number, - linphone_dial_plan_get_country_calling_code(dialplan)); - } - }]; - - defaultAction.accessibilityLabel = @"PopUpResp"; - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; - } else if (strcmp(err, "ERROR_PUSH_UNAVAILABLE") == 0) { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Push unavailable", nil) - message:[AssistantView StringForXMLRPCError:err] - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - defaultAction.accessibilityLabel = @"PopUpResp"; - [self presentViewController:errView animated:YES completion:nil]; - } else if (strcmp(err, "ERROR_AUTH_TOKEN_NOT_RECEIVED") == 0) { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Authentication token error", nil) - message:[AssistantView StringForXMLRPCError:err] - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - defaultAction.accessibilityLabel = @"PopUpResp"; - [self presentViewController:errView animated:YES completion:nil]; - } else { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Account configuration issue", nil) - message:[AssistantView StringForXMLRPCError:err] - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - defaultAction.accessibilityLabel = @"PopUpResp"; - [self presentViewController:errView animated:YES completion:nil]; - } - - // enable linphoneLoginButton if error - [_linphoneLoginButton setBackgroundColor:[UIColor clearColor]]; - _linphoneLoginButton.enabled = YES; -} - -- (void)isAccountUsed:(LinphoneAccountCreatorStatus)status withResp:(const char *)resp { - if (currentView == _linphoneLoginView) { - if (status == LinphoneAccountCreatorStatusAccountExistWithAlias) { - _outgoingView = DialerView.compositeViewDescription; - [self configureAccount]; - } else if (status == LinphoneAccountCreatorStatusAccountExist) { - if([LinphoneManager.instance lpConfigIntForKey:@"hide_link_phone_number"]){ - _outgoingView = DialerView.compositeViewDescription; - }else{ - _outgoingView = AssistantLinkView.compositeViewDescription; - } - [self configureAccount]; - } else { - if (resp) { - if (linphone_account_creator_get_username(account_creator) && - (strcmp(resp, "ERROR_ACCOUNT_DOESNT_EXIST") == 0)) { - [self showErrorPopup:"ERROR_BAD_CREDENTIALS"]; - } else { - [self showErrorPopup:resp]; - } - } else { - [self showErrorPopup:""]; - } - } - } else { - if (status == LinphoneAccountCreatorStatusAccountExist || - status == LinphoneAccountCreatorStatusAccountExistWithAlias) { - if (linphone_account_creator_get_phone_number(account_creator) != NULL) { - // Offer the possibility to resend a sms confirmation in some cases - linphone_account_creator_is_account_activated(account_creator); - } else { - [self showErrorPopup:resp]; - } - } else if (status == LinphoneAccountCreatorStatusAccountNotExist) { - NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0]; - linphone_account_creator_set_language(account_creator, [[language substringToIndex:2] UTF8String]); - linphone_account_creator_create_account(account_creator); - } else { - [self showErrorPopup:resp]; - - } - } -} - -- (void) isAccountActivated:(const char *)resp { - if (currentView != _createAccountView) { - if( linphone_account_creator_get_phone_number(account_creator) == NULL) { - [self configureAccount]; - [PhoneMainView.instance changeCurrentView:AssistantLinkView.compositeViewDescription]; - } else { - [PhoneMainView.instance changeCurrentView:DialerView.compositeViewDescription]; - } - } else { - if (!linphone_account_creator_get_username(account_creator)) { - [self showErrorPopup:"ERROR_ALIAS_ALREADY_IN_USE"]; - } else { - [self showErrorPopup:"ERROR_ACCOUNT_ALREADY_IN_USE"]; - } - } -} - -#pragma mark - Account creator callbacks - -void assistant_is_account_used(LinphoneAccountCreator *creator, LinphoneAccountCreatorStatus status, const char *resp) { - AssistantView *thiz = (__bridge AssistantView *)(linphone_account_creator_get_user_data(creator)); - thiz.waitView.hidden = YES; - [thiz isAccountUsed:status withResp:resp]; -} - -void assistant_create_account(LinphoneAccountCreator *creator, LinphoneAccountCreatorStatus status, const char *resp) { - AssistantView *thiz = (__bridge AssistantView *)(linphone_account_creator_get_user_data(creator)); - thiz.waitView.hidden = YES; - if (status == LinphoneAccountCreatorStatusAccountCreated) { - [SVProgressHUD dismiss]; - if (linphone_account_creator_get_phone_number(creator)) { - NSString* phoneNumber = [NSString stringWithUTF8String:linphone_account_creator_get_phone_number(creator)]; - thiz.activationSMSText.text = [NSString stringWithFormat:NSLocalizedString(@"We have sent a SMS with a validation code to %@. To complete your phone number verification, please enter the 4 digit code below:", nil), phoneNumber]; - [thiz changeView:thiz.createAccountActivateSMSView back:FALSE animation:TRUE]; - } else { - NSString* email = [NSString stringWithUTF8String:linphone_account_creator_get_email(creator)]; - thiz.activationEmailText.text = [NSString stringWithFormat:NSLocalizedString(@" 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.", nil), email]; - [thiz changeView:thiz.createAccountActivateEmailView back:FALSE animation:TRUE]; - } - } else { - [thiz showErrorPopup:resp]; - } -} - -void assistant_recover_phone_account(LinphoneAccountCreator *creator, LinphoneAccountCreatorStatus status, - const char *resp) { - AssistantView *thiz = (__bridge AssistantView *)(linphone_account_creator_get_user_data(creator)); - thiz.waitView.hidden = YES; - if (status == LinphoneAccountCreatorStatusRequestOk) { - [SVProgressHUD dismiss]; - NSString* phoneNumber = [NSString stringWithUTF8String:linphone_account_creator_get_phone_number(creator)]; - thiz.activationSMSText.text = [NSString stringWithFormat:NSLocalizedString(@"We have sent a SMS with a validation code to %@. To complete your phone number verification, please enter the 4 digit code below:", nil), phoneNumber]; - [thiz changeView:thiz.createAccountActivateSMSView back:FALSE animation:TRUE]; - } else { - if(!resp) { - [thiz showErrorPopup:"ERROR_CANNOT_SEND_SMS"]; - } else { - [thiz showErrorPopup:resp]; - } - } -} - -void assistant_activate_account(LinphoneAccountCreator *creator, LinphoneAccountCreatorStatus status, - const char *resp) { - AssistantView *thiz = (__bridge AssistantView *)(linphone_account_creator_get_user_data(creator)); - thiz.waitView.hidden = YES; - if (status == LinphoneAccountCreatorStatusAccountActivated) { - [thiz configureAccount]; - [[NSNotificationCenter defaultCenter] postNotificationName:kLinphoneAddressBookUpdate object:NULL]; - } else if (status == LinphoneAccountCreatorStatusAccountAlreadyActivated) { - // in case we are actually trying to link account, let's try it now - linphone_account_creator_activate_alias(creator); - } else { - [thiz showErrorPopup:resp]; - } -} - -void assistant_request_auth_token_cb(LinphoneAccountCreator *creator, LinphoneAccountCreatorStatus status, - const char *resp) { - AssistantView *thiz = (__bridge AssistantView *)(linphone_account_creator_get_user_data(creator)); - - if (status == LinphoneAccountCreatorStatusMissingArguments) { - [thiz showErrorPopup:"ERROR_PUSH_UNAVAILABLE"]; - } else if (status == LinphoneAccountCreatorStatusUnexpectedError) { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Unknown error", nil) - message:NSLocalizedString(@"Failed to request an authentication token from account manager", nil) - preferredStyle:UIAlertControllerStyleAlert]; - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - [errView addAction:defaultAction]; - [thiz presentViewController:errView animated:YES completion:nil]; - } -} - -void assistant_login_linphone_account(LinphoneAccountCreator *creator, LinphoneAccountCreatorStatus status, - const char *resp) { - AssistantView *thiz = (__bridge AssistantView *)(linphone_account_creator_get_user_data(creator)); - thiz.waitView.hidden = YES; - if (status == LinphoneAccountCreatorStatusRequestOk) { - [thiz configureAccount]; - [[NSNotificationCenter defaultCenter] postNotificationName:kLinphoneAddressBookUpdate object:NULL]; - } else { - [thiz showErrorPopup:resp]; - } -} - -void assistant_is_account_activated(LinphoneAccountCreator *creator, LinphoneAccountCreatorStatus status, - const char *resp) { - AssistantView *thiz = (__bridge AssistantView *)(linphone_account_creator_get_user_data(creator)); - thiz.waitView.hidden = YES; - if (status == LinphoneAccountCreatorStatusAccountActivated) { - [thiz isAccountActivated:resp]; - } else if (status == LinphoneAccountCreatorStatusAccountNotActivated) { - if (!IPAD || linphone_account_creator_get_phone_number(creator) != NULL) { - //Re send SMS if the username is the phone number - if (linphone_account_creator_get_username(creator) != linphone_account_creator_get_phone_number(creator) && linphone_account_creator_get_username(creator) != NULL) { - [thiz showErrorPopup:"ERROR_ACCOUNT_ALREADY_IN_USE"]; - [thiz findButton:ViewElement_NextButton].enabled = NO; - } else { - NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0]; - linphone_account_creator_set_language(creator, [[language substringToIndex:2] UTF8String]); - - if (linphone_account_creator_get_token(creator)) { - linphone_account_creator_recover_account(creator); - } else { - [thiz requestAuthToken:TokenRequestAction_RecoverAccount]; - } - } - } else { - // TODO : Re send email ? - [thiz showErrorPopup:"ERROR_ACCOUNT_ALREADY_IN_USE"]; - [thiz findButton:ViewElement_NextButton].enabled = NO; - } - } else { - [thiz showErrorPopup:resp]; - } -} - -void assistant_is_account_linked(LinphoneAccountCreator *creator, LinphoneAccountCreatorStatus status, - const char *resp) { - AssistantView *thiz = (__bridge AssistantView *)(linphone_account_creator_get_user_data(creator)); - thiz.waitView.hidden = YES; - if (status == LinphoneAccountCreatorStatusAccountLinked) { - [LinphoneManager.instance lpConfigSetInt:0 forKey:@"must_link_account_time"]; - } else if (status == LinphoneAccountCreatorStatusAccountNotLinked) { - [LinphoneManager.instance lpConfigSetInt:[NSDate new].timeIntervalSince1970 forKey:@"must_link_account_time"]; - } else { - [thiz showErrorPopup:resp]; - } -} - -#pragma mark - UITextFieldDelegate Functions - -- (void)textFieldDidBeginEditing:(UITextField *)textField { - UIAssistantTextField *atf = (UIAssistantTextField *)textField; - [atf textFieldDidBeginEditing:atf]; -} - -- (void)textFieldDidEndEditing:(UITextField *)textField { - UIAssistantTextField *atf = (UIAssistantTextField *)textField; - [atf textFieldDidEndEditing:atf]; - [self shouldEnableNextButton]; -} - -- (BOOL)textFieldShouldReturn:(UITextField *)textField { - UIAssistantTextField *atf = (UIAssistantTextField *)textField; - [textField resignFirstResponder]; - if (textField.returnKeyType == UIReturnKeyNext) { - [atf.nextFieldResponder becomeFirstResponder]; - } else if (textField.returnKeyType == UIReturnKeyDone) { - [[self findButton:ViewElement_NextButton] sendActionsForControlEvents:UIControlEventTouchUpInside]; - } - return YES; -} - -- (BOOL)textField:(UITextField *)textField - shouldChangeCharactersInRange:(NSRange)range - replacementString:(NSString *)string { - if (textField.tag == ViewElement_SMSCode) { - // max 4 length - return range.location + range.length <= 4; - } else { - UIAssistantTextField *atf = (UIAssistantTextField *)textField; - BOOL replace = YES; - // if we are hitting backspace on secure entry, this will clear all text - if ([string isEqual:@""] && textField.isSecureTextEntry) { - range = NSMakeRange(0, atf.text.length); - } - [atf textField:atf shouldChangeCharactersInRange:range replacementString:string]; - if (atf.tag == ViewElement_Username && currentView == _createAccountView) { - atf.text = [atf.text stringByReplacingCharactersInRange:range withString:string.lowercaseString]; - replace = NO; - } - - if (textField.tag == ViewElement_Phone || textField.tag == ViewElement_Username) { - [self refreshYourUsername]; - } - [self shouldEnableNextButton]; - - return replace; - } -} - -// 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:previousColor]; \ - _waitView.hidden = YES; \ - }); \ - -// Change button color and wait until object finished to avoid duplicated actions -#define ONNEWCLICKBUTTON(button, timewaitmsec, body) \ -[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]]; \ - }); \ - -#pragma mark - Action Functions - -- (IBAction)onGotoCreateAccountClick:(id)sender { - ONCLICKBUTTON(sender, 100, { - nextView = _createAccountView; - _accountLabel.text = NSLocalizedString(@"Please enter your phone number", nil); - [self loadAssistantConfig:@"assistant_linphone_create.rc"]; - }); -} - -- (IBAction)onGotoLinphoneLoginClick:(id)sender { - ONCLICKBUTTON(sender, 100, { - nextView = _linphoneLoginView; - [self loadAssistantConfig:@"assistant_linphone_existing.rc"]; - }); -} - -- (IBAction)onGotoLoginClick:(id)sender { - ONCLICKBUTTON(sender, 100, { - nextView = _loginView; - [self loadAssistantConfig:@"assistant_external_sip.rc"]; - }); -} - -- (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; - [self findTextField:ViewElement_URL].text = - [LinphoneManager.instance lpConfigStringForKey:@"config-uri" inSection:@"misc"]; - [self loadAssistantConfig:@"assistant_remote.rc"]; - }); -} - --(void)requestAuthToken:(TokenRequestAction)requestType { - const LinphonePushNotificationConfig * core_push_config = linphone_core_get_push_notification_config(LC); - - linphone_account_creator_set_pn_provider(account_creator, PROVIDER_NAME); - //extract ".remote" from core pn_param which is of the form : VABCD1234.org.linphone.phone.voip&remote - NSString *formatedPnParam = [NSString stringWithUTF8String:linphone_push_notification_config_get_param(core_push_config)]; - formatedPnParam = [formatedPnParam stringByReplacingOccurrencesOfString:@"voip&remote" withString:@"remote"]; - linphone_account_creator_set_pn_param(account_creator, [formatedPnParam UTF8String]); - - //extract REMOTETOKENID from core pn_prid which is of the form : VOIPTOKENID:voip&REMOTETOKENID:remote - const char* core_remote_token = linphone_push_notification_config_get_remote_token(core_push_config); - NSString *formatedRemoteToken=@""; - if (core_remote_token) { - formatedRemoteToken = [[NSString stringWithUTF8String:core_remote_token] substringToIndex:64]; - linphone_account_creator_set_pn_prid(account_creator, [formatedRemoteToken UTF8String]); - } else { - LOGW(@"[Assistant] - No remote push token available in core for account creator configuration"); - [self showErrorPopup:"ERROR_PUSH_UNAVAILABLE"]; - return; - } - LOGI(@"[Assistant] Found push notification info: provider [%s], param [%@] and prid [%@]", PROVIDER_NAME, formatedPnParam, formatedRemoteToken); - - - LinphoneAccountCreatorStatus requestStatus = linphone_account_creator_request_auth_token(account_creator); - if (requestStatus == LinphoneAccountCreatorStatusRequestOk) { - [SVProgressHUD show]; - tokenRequestAction = requestType; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - if (tokenRequestAction == requestType) { - tokenRequestAction = TokenRequestAction_None; - [self showErrorPopup:"ERROR_AUTH_TOKEN_NOT_RECEIVED"]; - [SVProgressHUD dismiss]; - } - }); - } else { - [self showErrorPopup:"ERROR_PUSH_UNAVAILABLE"]; - } -} - -- (IBAction)onCreateAccountClick:(id)sender { - if ([self checkFields]) { - ONCLICKBUTTON(sender, 100, { - _activationTitle.text = @"CREATE ACCOUNT"; - _waitView.hidden = NO; - - - UIAssistantTextField *createUsername = [self findTextField:ViewElement_Username]; - if ([createUsername.text length] == 0) { - linphone_account_creator_set_username(account_creator, linphone_account_creator_get_phone_number(account_creator)); - } - - if (linphone_account_creator_get_token(account_creator)) { - linphone_account_creator_is_account_exist(account_creator); - } else { - [self requestAuthToken:TokenRequestAction_CreateAccount]; - } - }); - } -} - -- (IBAction)onCreateAccountActivationClick:(id)sender { - ONCLICKBUTTON(sender, 100, { - [self debugtest]; - /* - _waitView.hidden = NO; - linphone_account_creator_set_activation_code( - account_creator, - ((UITextField *)[self findView:ViewElement_SMSCode inView:_contentView ofType:UITextField.class]) - .text.UTF8String); - - if ([_activationTitle.text isEqualToString:@"USE LINPHONE ACCOUNT"]) { - linphone_account_creator_login_linphone_account(account_creator); - } else { - linphone_account_creator_activate_account(account_creator); - } *//* else { - NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0]; - linphone_account_creator_set_language(account_creator, [[language substringToIndex:2] UTF8String]); - linphone_account_creator_link_account(account_creator); - linphone_account_creator_activate_alias(account_creator); - } */ - }); -} - --(void) debugtest{ - _waitView.hidden = NO; - linphone_account_creator_set_activation_code( - account_creator, - ((UITextField *)[self findView:ViewElement_SMSCode inView:_contentView ofType:UITextField.class]) - .text.UTF8String); - - if ([_activationTitle.text isEqualToString:@"USE LINPHONE ACCOUNT"]) { - linphone_account_creator_login_linphone_account(account_creator); - } else { - linphone_account_creator_activate_account(account_creator); - } /* else { - NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0]; - linphone_account_creator_set_language(account_creator, [[language substringToIndex:2] UTF8String]); - linphone_account_creator_link_account(account_creator); - linphone_account_creator_activate_alias(account_creator); - } */ -} - -- (IBAction)onCreateAccountCheckActivatedClick:(id)sender { - ONCLICKBUTTON(sender, 100, { - _waitView.hidden = NO; - linphone_account_creator_is_account_activated(account_creator); - }); -} - -- (IBAction)onLinkAccountClick:(id)sender { - ONCLICKBUTTON(sender, 100, { - _waitView.hidden = NO; - NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0]; - linphone_account_creator_set_language(account_creator, [[language substringToIndex:2] UTF8String]); - linphone_account_creator_link_account(account_creator); - }); -} - -- (IBAction)onLinphoneLoginClick:(id)sender { - // disable button after first click - _linphoneLoginButton.enabled = NO; - [_linphoneLoginButton setBackgroundColor:[UIColor lightGrayColor]]; - _waitView.hidden = NO; - - dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (100 * NSEC_PER_MSEC)); - dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ - ((UITextField *)[self findView:ViewElement_SMSCode inView:_contentView ofType:UITextField.class]).text = @""; - _activationTitle.text = @"USE LINPHONE ACCOUNT"; - if ((linphone_account_creator_get_phone_number(account_creator) != NULL) && - linphone_account_creator_get_password(account_creator) == NULL && - linphone_account_creator_get_ha1(account_creator) == NULL) { - NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0]; - linphone_account_creator_set_language(account_creator, [[language substringToIndex:2] UTF8String]); - linphone_account_creator_set_username(account_creator, linphone_account_creator_get_phone_number(account_creator)); - if (linphone_account_creator_get_token(account_creator)) { - linphone_account_creator_recover_account(account_creator); - } else { - [self requestAuthToken:TokenRequestAction_RecoverAccount]; - } - - } else { - // check if account is already linked with a phone number. - // if not, propose it to the user - linphone_account_creator_is_account_exist(account_creator); - } - }); -} - -- (IBAction)onLoginClick:(id)sender { - ONCLICKBUTTON(sender, 100, { - _waitView.hidden = NO; - NSString *domain = [self findTextField:ViewElement_Domain].text; - NSString *username = [self findTextField:ViewElement_Username].text; - NSString *displayName = [self findTextField:ViewElement_DisplayName].text; - NSString *pwd = [self findTextField:ViewElement_Password].text; - LinphoneAccountParams *accountParams = linphone_core_create_account_params(LC); - LinphoneAddress *addr = linphone_address_new(NULL); - LinphoneAddress *tmpAddr = linphone_address_new([NSString stringWithFormat:@"sip:%@",domain].UTF8String); - if (tmpAddr == nil) { - [self displayAssistantConfigurationError]; - return; - } - - linphone_address_set_username(addr, username.UTF8String); - linphone_address_set_port(addr, linphone_address_get_port(tmpAddr)); - linphone_address_set_domain(addr, linphone_address_get_domain(tmpAddr)); - if (displayName && ![displayName isEqualToString:@""]) { - linphone_address_set_display_name(addr, displayName.UTF8String); - } - - linphone_account_params_set_identity_address(accountParams, addr); - // set transport - UISegmentedControl *transports = (UISegmentedControl *)[self findView:ViewElement_Transport - inView:self.contentView - ofType:UISegmentedControl.class]; - if (transports) { - NSString *type = [transports titleForSegmentAtIndex:[transports selectedSegmentIndex]]; - LinphoneAddress *transportAddr = linphone_address_new([NSString stringWithFormat:@"sip:%s;transport=%s", domain.UTF8String, type.lowercaseString.UTF8String].UTF8String); - linphone_account_params_set_routes_addresses(accountParams, bctbx_list_new(transportAddr)); - linphone_account_params_set_server_addr(accountParams, [NSString stringWithFormat:@"%s;transport=%s", domain.UTF8String, type.lowercaseString.UTF8String].UTF8String); - - linphone_address_unref(transportAddr); - } - linphone_account_params_set_publish_enabled(accountParams, FALSE); - linphone_account_params_set_register_enabled(accountParams, TRUE); - - LinphoneAuthInfo *info = - linphone_auth_info_new(linphone_address_get_username(addr), // username - NULL, // user id - pwd.UTF8String, // passwd - NULL, // ha1 - linphone_address_get_domain(addr), // realm - assumed to be domain - linphone_address_get_domain(addr) // domain - ); - linphone_core_add_auth_info(LC, info); - linphone_address_unref(addr); - linphone_address_unref(tmpAddr); - - LinphoneAccount *account = linphone_core_create_account(LC, accountParams); - linphone_account_params_unref(accountParams); - if (account) { - if (linphone_core_add_account(LC, account) != -1) { - linphone_core_set_default_account(LC, account); - // reload address book to prepend proxy config domain to contacts' phone number - // todo: STOP doing that! - [[LinphoneManager.instance fastAddressBook] fetchContactsInBackGroundThread]; - [PhoneMainView.instance changeCurrentView:DialerView.compositeViewDescription]; - } else { - [self displayAssistantConfigurationError]; - } - } else { - [self displayAssistantConfigurationError]; - } - }); -} - -- (IBAction)onRemoteProvisioningLoginClick:(id)sender { - ONCLICKBUTTON(sender, 100, { - _waitView.hidden = NO; - [self configureAccount]; - }); -} - -- (IBAction)onRemoteProvisioningDownloadClick:(id)sender { - ONNEWCLICKBUTTON(sender, 100, { - if (number_of_accounts_before > 0) { - // TODO remove ME when it is fixed in SDK. - linphone_core_set_provisioning_uri(LC, NULL); - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Provisioning Load error", nil) - message:NSLocalizedString(@"Please remove other accounts before remote provisioning.", nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; - _waitView.hidden = TRUE; - } else { - linphone_core_set_provisioning_uri(LC, [self addSchemeToProvisiionninUriIMissing:[self findTextField:ViewElement_URL].text].UTF8String); - [self resetLiblinphone:TRUE]; - } - }); -} - -- (IBAction)onLaunchQRCodeView:(id)sender { - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(qrCodeFound:) - name:kLinphoneQRCodeFound - object:nil]; - LinphoneAppDelegate *delegate = (LinphoneAppDelegate *)UIApplication.sharedApplication.delegate; - delegate.onlyPortrait = TRUE; - NSNumber *value = [NSNumber numberWithInt:UIDeviceOrientationPortrait]; - [[UIDevice currentDevice] setValue:value forKey:@"orientation"]; - //[UIViewController attemptRotationToDeviceOrientation]; - AVCaptureDevice *backCamera = [AVCaptureDevice defaultDeviceWithDeviceType:AVCaptureDeviceTypeBuiltInWideAngleCamera mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionBack]; - if (![[NSString stringWithUTF8String:linphone_core_get_video_device(LC) ?: ""] containsString:[backCamera uniqueID]]) { - - bctbx_list_t *deviceList = linphone_core_get_video_devices_list(LC); - NSMutableArray *devices = [NSMutableArray array]; - - while (deviceList) { - char *data = deviceList->data; - if (data) [devices addObject:[NSString stringWithUTF8String:data]]; - deviceList = deviceList->next; - } - bctbx_list_free(deviceList); - - for (NSString *device in devices) { - if ([device containsString:backCamera.uniqueID]) { - linphone_core_set_video_device(LC, device.UTF8String); - } - } - } - - - linphone_core_set_native_preview_window_id(LC, (__bridge void *)(_qrCodeView)); - linphone_core_enable_video_preview(LC, TRUE); - linphone_core_enable_qrcode_video_preview(LC, TRUE); - - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(qrCodeFound:) - name:kLinphoneQRCodeFound - object:nil]; - - [self changeView:_qrCodeView back:FALSE animation:TRUE]; -} - -- (void)refreshYourUsername { - UIAssistantTextField *username = [self findTextField:ViewElement_Username]; - UIAssistantTextField *phone = [self findTextField:ViewElement_Phone]; - const char* uri = NULL; - if (!username.superview.hidden && ![username.text isEqualToString:@""]) { - uri = linphone_account_creator_get_username(account_creator); - } else if (!phone.superview.hidden && ![phone.text isEqualToString:@""]) { - uri = linphone_account_creator_get_phone_number(account_creator); - } - - if (uri) { - _accountLabel.text = [NSString stringWithFormat:NSLocalizedString(@"Your SIP address will be sip:%s@sip.linphone.org", nil), uri]; - } else if (!username.superview.hidden) { - _accountLabel.text = NSLocalizedString(@"Please enter your username", nil); - } else { - _accountLabel.text = NSLocalizedString(@"Please enter your phone number", nil); - } -} - -- (IBAction)onFormSwitchToggle:(UISwitch*)sender { - UISwitch *usernameSwitch = (UISwitch *)[self findView:ViewElement_UsernameFormView inView:self.contentView ofType:UISwitch.class]; - UISwitch *emailSwitch = (UISwitch *)[self findView:ViewElement_EmailFormView inView:self.contentView ofType:UISwitch.class]; - - UIView * usernameView = [self findView:ViewElement_UsernameFormView inView:self.contentView ofType:UIView.class]; - UIView * emailView = [self findView:ViewElement_EmailFormView inView:self.contentView ofType:UIView.class]; - usernameView.hidden = !usernameSwitch.isOn && !emailSwitch.isOn; - emailView.hidden = !emailSwitch.isOn; - - [self findTextField:ViewElement_Phone].hidden = emailSwitch.isOn; - [self findTextField:ViewElement_PhoneCC].hidden = emailSwitch.isOn; - [self findButton:ViewElement_PhoneButton].hidden = emailSwitch.isOn; - self.phoneLabel.hidden = emailSwitch.isOn; - self.phoneTitle.hidden = emailSwitch.isOn; - self.phoneTitle.text = NSLocalizedString(@"Please confirm your country code and enter your phone number", nil); - self.infoLoginButton.hidden = !usernameView.hidden; - if (!usernameView.hidden) { - self.subtileLabel_useLinphoneAccount.text = NSLocalizedString(@"Please enter your username and password", nil); - } else { - self.subtileLabel_useLinphoneAccount.text = NSLocalizedString(@"Please confirm your country code and enter your phone number", nil); - } - - - UIAssistantTextField* countryCodeField = [self findTextField:ViewElement_PhoneCC]; - UIRoundBorderedButton *phoneButton = [self findButton:ViewElement_PhoneButton]; - usernameSwitch.enabled = phoneButton.enabled = countryCodeField.enabled = countryCodeField.userInteractionEnabled = - [self findTextField:ViewElement_Phone].userInteractionEnabled = [self findTextField:ViewElement_Phone].enabled = - !emailSwitch.isOn; - - [self refreshYourUsername]; - - // put next button right after latest field (avoid blanks) - int old = _createAccountNextButtonPositionConstraint.constant; - _createAccountNextButtonPositionConstraint.constant = IPAD || !usernameView.hidden ? 21 : -10; - if (!usernameView.hidden) { - _createAccountNextButtonPositionConstraint.constant += usernameView.frame.size.height; - } - if (!emailView.hidden) { - _createAccountNextButtonPositionConstraint.constant += emailView.frame.size.height; - } - // make view scrollable only if next button is too away - CGRect viewframe = currentView.frame; - viewframe.size.height = 30 + _createAccountNextButtonPositionConstraint.constant - old + [self findButton:ViewElement_NextButton].frame.origin.y + [self findButton:ViewElement_NextButton].frame.size.height; - [_contentView setContentSize:viewframe.size]; - if (emailSwitch.isOn) { - [self findButton:ViewElement_NextButton].enabled = TRUE; - } - [self shouldEnableNextButton]; -} - -- (IBAction)onCountryCodeClick:(id)sender { - mustRestoreView = YES; - - CountryListView *view = VIEW(CountryListView); - [view setDelegate:(id)self]; - [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; -} - -- (void)updateCountry:(BOOL)force { - UIAssistantTextField* countryCodeField = [self findTextField:ViewElement_PhoneCC]; - NSDictionary *c = [CountryListView countryWithCountryCode:countryCodeField.text]; - if (c || force) { - UIRoundBorderedButton *phoneButton = [self findButton:ViewElement_PhoneButton]; - [phoneButton setTitle:c ? [c objectForKey:@"name"] : NSLocalizedString(@"Unknown country code", nil) - forState:UIControlStateNormal]; - } -} - -- (IBAction)onCountryCodeFieldChange:(id)sender { - [self updateCountry:NO]; -} - -- (IBAction)onCountryCodeFieldEnd:(id)sender { - [self updateCountry:YES]; -} - -- (IBAction)onPhoneNumberDisclosureClick:(id)sender { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"What will my phone number be used for?", nil) - message:NSLocalizedString(@"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.", - nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; -} - -- (IBAction)onBackClick:(id)sender { - if ([historyViews count] > 0) { - if (currentView == _createAccountActivateSMSView || currentView == _createAccountActivateEmailView || currentView == _qrCodeView) { - UIView *view = [historyViews lastObject]; - [historyViews removeLastObject]; - [self changeView:view back:TRUE animation:TRUE]; - } else if (currentView == _welcomeView) { - [PhoneMainView.instance popCurrentView]; - } else { - [self changeView:_welcomeView back:TRUE animation:TRUE]; - } - } else { - [self onDialerClick:nil]; - } -} - -- (IBAction)onDialerClick:(id)sender { - [PhoneMainView.instance popToView:DialerView.compositeViewDescription]; - } - -- (IBAction)onLinkTap:(id)sender { - NSString *url = @"https://subscribe.linphone.org"; - if (![UIApplication.sharedApplication openURL:[NSURL URLWithString:url]]) { - LOGE(@"[Assistant] Failed to open %@, invalid URL", url); - } -} - -- (IBAction)onAcceptTermsClick:(id)sender { - BOOL acceptTerms = [LinphoneManager.instance lpConfigBoolForKey:@"accept_terms" withDefault:FALSE]; - [LinphoneManager.instance lpConfigSetBool:!acceptTerms forKey:@"accept_terms"]; - [self enableWelcomeViewButtons]; -} - -#pragma mark - select country delegate - -- (void)didSelectCountry:(NSDictionary *)country { - UIRoundBorderedButton *phoneButton = [self findButton:ViewElement_PhoneButton]; - [phoneButton setTitle:[country objectForKey:@"name"] forState:UIControlStateNormal]; - UIAssistantTextField* countryCodeField = [self findTextField:ViewElement_PhoneCC]; - countryCodeField.text = countryCodeField.lastText = [country objectForKey:@"code"]; - phone_number_length = [[country objectForKey:@"phone_length "] integerValue]; - [self shouldEnableNextButton]; -} - --(void)qrCodeFound:(NSNotification *)notif { - if ([notif.userInfo count] == 0){ - return; - } - [NSNotificationCenter.defaultCenter removeObserver:self name:kLinphoneQRCodeFound object:nil]; - dispatch_async(dispatch_get_main_queue(), ^{ - self.urlLabel.text = [notif.userInfo objectForKey:@"qrcode"]; - - if ([historyViews count] > 0) { - if (currentView == _qrCodeView) { - UIView *view = [historyViews lastObject]; - [historyViews removeLastObject]; - [self changeView:view back:TRUE animation:TRUE]; - } else { - [self changeView:_welcomeView back:TRUE animation:TRUE]; - } - } - }); -} - -@end diff --git a/Classes/Base.lproj/AboutView.strings b/Classes/Base.lproj/AboutView.strings deleted file mode 100644 index 19cb66551..000000000 Binary files a/Classes/Base.lproj/AboutView.strings and /dev/null differ diff --git a/Classes/Base.lproj/AboutView.xib b/Classes/Base.lproj/AboutView.xib deleted file mode 100644 index 286b802c2..000000000 --- a/Classes/Base.lproj/AboutView.xib +++ /dev/null @@ -1,300 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Base.lproj/AssistantLinkView.strings b/Classes/Base.lproj/AssistantLinkView.strings deleted file mode 100644 index 7a967d82d..000000000 Binary files a/Classes/Base.lproj/AssistantLinkView.strings and /dev/null differ diff --git a/Classes/Base.lproj/AssistantLinkView.xib b/Classes/Base.lproj/AssistantLinkView.xib deleted file mode 100644 index ca7f16313..000000000 --- a/Classes/Base.lproj/AssistantLinkView.xib +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Base.lproj/AssistantSubviews.strings b/Classes/Base.lproj/AssistantSubviews.strings deleted file mode 100644 index 10e7b95e4..000000000 Binary files a/Classes/Base.lproj/AssistantSubviews.strings and /dev/null differ diff --git a/Classes/Base.lproj/AssistantView.strings b/Classes/Base.lproj/AssistantView.strings deleted file mode 100644 index d3126f715..000000000 Binary files a/Classes/Base.lproj/AssistantView.strings and /dev/null differ diff --git a/Classes/Base.lproj/AssistantView.xib b/Classes/Base.lproj/AssistantView.xib deleted file mode 100644 index 078af144f..000000000 --- a/Classes/Base.lproj/AssistantView.xib +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Base.lproj/AssistantViewScreens.strings b/Classes/Base.lproj/AssistantViewScreens.strings deleted file mode 100644 index 33e0e883f..000000000 Binary files a/Classes/Base.lproj/AssistantViewScreens.strings and /dev/null differ diff --git a/Classes/Base.lproj/AssistantViewScreens.xib b/Classes/Base.lproj/AssistantViewScreens.xib deleted file mode 100644 index 3a2eca6f0..000000000 --- a/Classes/Base.lproj/AssistantViewScreens.xib +++ /dev/null @@ -1,1666 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Base.lproj/AssistantViews.strings b/Classes/Base.lproj/AssistantViews.strings deleted file mode 100644 index 8b6aa3f3b..000000000 Binary files a/Classes/Base.lproj/AssistantViews.strings and /dev/null differ diff --git a/Classes/Base.lproj/AssistantView~ipad.strings b/Classes/Base.lproj/AssistantView~ipad.strings deleted file mode 100644 index 75a68e71e..000000000 Binary files a/Classes/Base.lproj/AssistantView~ipad.strings and /dev/null differ diff --git a/Classes/Base.lproj/CallIncomingView.strings b/Classes/Base.lproj/CallIncomingView.strings deleted file mode 100644 index 383ae2d16..000000000 Binary files a/Classes/Base.lproj/CallIncomingView.strings and /dev/null differ diff --git a/Classes/Base.lproj/CallOutgoingView.strings b/Classes/Base.lproj/CallOutgoingView.strings deleted file mode 100644 index 9f052fcb6..000000000 Binary files a/Classes/Base.lproj/CallOutgoingView.strings and /dev/null differ diff --git a/Classes/Base.lproj/CallView.strings b/Classes/Base.lproj/CallView.strings deleted file mode 100644 index 7eab58bf3..000000000 Binary files a/Classes/Base.lproj/CallView.strings and /dev/null differ diff --git a/Classes/Base.lproj/CallView~ipad.strings b/Classes/Base.lproj/CallView~ipad.strings deleted file mode 100644 index 743293f4d..000000000 Binary files a/Classes/Base.lproj/CallView~ipad.strings and /dev/null differ diff --git a/Classes/Base.lproj/ChatConversationCreateView.strings b/Classes/Base.lproj/ChatConversationCreateView.strings deleted file mode 100644 index 861b50fd4..000000000 Binary files a/Classes/Base.lproj/ChatConversationCreateView.strings and /dev/null differ diff --git a/Classes/Base.lproj/ChatConversationCreateView.xib b/Classes/Base.lproj/ChatConversationCreateView.xib deleted file mode 100644 index bbf38c238..000000000 --- a/Classes/Base.lproj/ChatConversationCreateView.xib +++ /dev/null @@ -1,274 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Base.lproj/ChatConversationImdnView.strings b/Classes/Base.lproj/ChatConversationImdnView.strings deleted file mode 100644 index c2c12c056..000000000 Binary files a/Classes/Base.lproj/ChatConversationImdnView.strings and /dev/null differ diff --git a/Classes/Base.lproj/ChatConversationImdnView.xib b/Classes/Base.lproj/ChatConversationImdnView.xib deleted file mode 100644 index 99dc77538..000000000 --- a/Classes/Base.lproj/ChatConversationImdnView.xib +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Base.lproj/ChatConversationInfoView.strings b/Classes/Base.lproj/ChatConversationInfoView.strings deleted file mode 100644 index 69315c608..000000000 Binary files a/Classes/Base.lproj/ChatConversationInfoView.strings and /dev/null differ diff --git a/Classes/Base.lproj/ChatConversationInfoView.xib b/Classes/Base.lproj/ChatConversationInfoView.xib deleted file mode 100644 index 083f7064f..000000000 --- a/Classes/Base.lproj/ChatConversationInfoView.xib +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Base.lproj/ChatConversationView.strings b/Classes/Base.lproj/ChatConversationView.strings deleted file mode 100644 index 394c7aca1..000000000 Binary files a/Classes/Base.lproj/ChatConversationView.strings and /dev/null differ diff --git a/Classes/Base.lproj/ChatConversationView.xib b/Classes/Base.lproj/ChatConversationView.xib deleted file mode 100644 index 1f462666a..000000000 --- a/Classes/Base.lproj/ChatConversationView.xib +++ /dev/null @@ -1,713 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Base.lproj/ChatRoomView.strings b/Classes/Base.lproj/ChatRoomView.strings deleted file mode 100644 index fcaf31239..000000000 Binary files a/Classes/Base.lproj/ChatRoomView.strings and /dev/null differ diff --git a/Classes/Base.lproj/ChatView.strings b/Classes/Base.lproj/ChatView.strings deleted file mode 100644 index 0a6a5b802..000000000 Binary files a/Classes/Base.lproj/ChatView.strings and /dev/null differ diff --git a/Classes/Base.lproj/ChatsListView.strings b/Classes/Base.lproj/ChatsListView.strings deleted file mode 100644 index 2273c8280..000000000 Binary files a/Classes/Base.lproj/ChatsListView.strings and /dev/null differ diff --git a/Classes/Base.lproj/ChatsListView.xib b/Classes/Base.lproj/ChatsListView.xib deleted file mode 100644 index e0527c064..000000000 --- a/Classes/Base.lproj/ChatsListView.xib +++ /dev/null @@ -1,239 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Base.lproj/ContactDetailsView.strings b/Classes/Base.lproj/ContactDetailsView.strings deleted file mode 100644 index e1f38b24f..000000000 Binary files a/Classes/Base.lproj/ContactDetailsView.strings and /dev/null differ diff --git a/Classes/Base.lproj/ContactDetailsView.xib b/Classes/Base.lproj/ContactDetailsView.xib deleted file mode 100644 index a9a2879a4..000000000 --- a/Classes/Base.lproj/ContactDetailsView.xib +++ /dev/null @@ -1,342 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Base.lproj/ContactsListView.strings b/Classes/Base.lproj/ContactsListView.strings deleted file mode 100644 index 75457d146..000000000 Binary files a/Classes/Base.lproj/ContactsListView.strings and /dev/null differ diff --git a/Classes/Base.lproj/ContactsListView.xib b/Classes/Base.lproj/ContactsListView.xib deleted file mode 100644 index 69ff91400..000000000 --- a/Classes/Base.lproj/ContactsListView.xib +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Base.lproj/ContactsView.strings b/Classes/Base.lproj/ContactsView.strings deleted file mode 100644 index 933e3a629..000000000 Binary files a/Classes/Base.lproj/ContactsView.strings and /dev/null differ diff --git a/Classes/Base.lproj/CountryListView.strings b/Classes/Base.lproj/CountryListView.strings deleted file mode 100644 index d3f5ff520..000000000 Binary files a/Classes/Base.lproj/CountryListView.strings and /dev/null differ diff --git a/Classes/Base.lproj/CountryListView.xib b/Classes/Base.lproj/CountryListView.xib deleted file mode 100755 index 40977ba7e..000000000 --- a/Classes/Base.lproj/CountryListView.xib +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Base.lproj/DialerView.strings b/Classes/Base.lproj/DialerView.strings deleted file mode 100644 index a53319359..000000000 Binary files a/Classes/Base.lproj/DialerView.strings and /dev/null differ diff --git a/Classes/Base.lproj/DialerView.xib b/Classes/Base.lproj/DialerView.xib deleted file mode 100644 index 3728f77cf..000000000 --- a/Classes/Base.lproj/DialerView.xib +++ /dev/null @@ -1,350 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Base.lproj/DialerView~ipad.strings b/Classes/Base.lproj/DialerView~ipad.strings deleted file mode 100644 index aac28d0e3..000000000 Binary files a/Classes/Base.lproj/DialerView~ipad.strings and /dev/null differ diff --git a/Classes/Base.lproj/DialerView~ipad.xib b/Classes/Base.lproj/DialerView~ipad.xib deleted file mode 100644 index 1b50b5abc..000000000 --- a/Classes/Base.lproj/DialerView~ipad.xib +++ /dev/null @@ -1,674 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Base.lproj/FirstLoginView.strings b/Classes/Base.lproj/FirstLoginView.strings deleted file mode 100644 index ded50f888..000000000 Binary files a/Classes/Base.lproj/FirstLoginView.strings and /dev/null differ diff --git a/Classes/Base.lproj/FirstLoginView.xib b/Classes/Base.lproj/FirstLoginView.xib deleted file mode 100644 index bc94ee2e5..000000000 --- a/Classes/Base.lproj/FirstLoginView.xib +++ /dev/null @@ -1,315 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Base.lproj/HistoryDetailsView.strings b/Classes/Base.lproj/HistoryDetailsView.strings deleted file mode 100644 index 56036a31f..000000000 Binary files a/Classes/Base.lproj/HistoryDetailsView.strings and /dev/null differ diff --git a/Classes/Base.lproj/HistoryDetailsView.xib b/Classes/Base.lproj/HistoryDetailsView.xib deleted file mode 100644 index 63116312d..000000000 --- a/Classes/Base.lproj/HistoryDetailsView.xib +++ /dev/null @@ -1,500 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMSAAGGoF8QD05T -S2V5ZWRBcmNoaXZlctEICVRyb290gAGvEBALDBccEyEmJy4xND5GR0tOVSRudWxs1Q0ODxAREhMUFRZW -JGNsYXNzXk5TUmVzaXppbmdNb2RlXE5TSW1hZ2VGbGFnc1ZOU1JlcHNXTlNDb2xvcoAPEAASAMAAAIAC -gArSGA0ZG1pOUy5vYmplY3RzoRqAA4AJ0hgNHSCiHh+ABIAFgAjTDSIjJCUTXxAUTlNUSUZGUmVwcmVz -ZW50YXRpb25fEBlOU0ludGVybmFsTGF5b3V0RGlyZWN0aW9ugAeABk8RAj5NTQAqAAAADOHh4eEADwEA -AAMAAAABAAIAAAEBAAMAAAABAAIAAAECAAMAAAABAAgAAAEDAAMAAAABAAEAAAEGAAMAAAABAAEAAAEK -AAMAAAABAAEAAAERAAQAAAABAAAACAESAAMAAAABAAEAAAEVAAMAAAABAAEAAAEWAAMAAAABAAIAAAEX -AAQAAAABAAAABAEcAAMAAAABAAEAAAEoAAMAAAABAAIAAAFTAAMAAAABAAEAAIdzAAcAAAF4AAAAxgAA -AAAAAAF4YXBwbAIQAABtbnRyR1JBWVhZWiAH1QAHAAEAAAAAAABhY3NwQVBQTAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAARkZXNjAAAAtAAAAHVjcHJ0AAABLAAAACd3dHB0AAABVAAAABRrVFJDAAABaAAA -AA5kZXNjAAAAAAAAABtDYWxpYnJhdGVkIEdyYXkgQ29sb3JzcGFjZQAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLgAAWFlaIAAAAAAAAPNRAAEAAAAB -FsxjdXJ2AAAAAAAAAAECMwAA0igpKitaJGNsYXNzbmFtZVgkY2xhc3Nlc18QEE5TQml0bWFwSW1hZ2VS -ZXCjKiwtWk5TSW1hZ2VSZXBYTlNPYmplY3TSKCkvMFdOU0FycmF5oi8t0igpMjNeTlNNdXRhYmxlQXJy -YXmjMi8t1TU2NzgNOTo7PD1XTlNXaGl0ZVxOU0NvbXBvbmVudHNcTlNDb2xvclNwYWNlXxASTlNDdXN0 -b21Db2xvclNwYWNlRDAgMABDMCAwEAOAC4AO1D9AQQ1CQ0RFVE5TSURVTlNJQ0NXTlNNb2RlbBAJgAwQ -AIANTxERnAAAEZxhcHBsAgAAAG1udHJHUkFZWFlaIAfcAAgAFwAPAC4AD2Fjc3BBUFBMAAAAAG5vbmUA -AAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMtYXBwbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAABWRlc2MAAADAAAAAeWRzY20AAAE8AAAIGmNwcnQAAAlYAAAAI3d0cHQA -AAl8AAAAFGtUUkMAAAmQAAAIDGRlc2MAAAAAAAAAH0dlbmVyaWMgR3JheSBHYW1tYSAyLjIgUHJvZmls -ZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAB8AAAAMc2tTSwAAAC4AAAGEZGFESwAAADoA -AAGyY2FFUwAAADgAAAHsdmlWTgAAAEAAAAIkcHRCUgAAAEoAAAJkdWtVQQAAACwAAAKuZnJGVQAAAD4A -AALaaHVIVQAAADQAAAMYemhUVwAAABoAAANMa29LUgAAACIAAANmbmJOTwAAADoAAAOIY3NDWgAAACgA -AAPCaGVJTAAAACQAAAPqcm9STwAAACoAAAQOZGVERQAAAE4AAAQ4aXRJVAAAAE4AAASGc3ZTRQAAADgA -AATUemhDTgAAABoAAAUMamFKUAAAACYAAAUmZWxHUgAAACoAAAVMcHRQTwAAAFIAAAV2bmxOTAAAAEAA -AAXIZXNFUwAAAEwAAAYIdGhUSAAAADIAAAZUdHJUUgAAACQAAAaGZmlGSQAAAEYAAAaqaHJIUgAAAD4A -AAbwcGxQTAAAAEoAAAcuYXJFRwAAACwAAAd4cnVSVQAAADoAAAekZW5VUwAAADwAAAfeAFYBYQBlAG8A -YgBlAGMAbgDhACAAcwBpAHYA4QAgAGcAYQBtAGEAIAAyACwAMgBHAGUAbgBlAHIAaQBzAGsAIABnAHIA -5QAgADIALAAyACAAZwBhAG0AbQBhAC0AcAByAG8AZgBpAGwARwBhAG0AbQBhACAAZABlACAAZwByAGkA -cwBvAHMAIABnAGUAbgDoAHIAaQBjAGEAIAAyAC4AMgBDHqUAdQAgAGgA7ABuAGgAIABNAOAAdQAgAHgA -4QBtACAAQwBoAHUAbgBnACAARwBhAG0AbQBhACAAMgAuADIAUABlAHIAZgBpAGwAIABHAGUAbgDpAHIA -aQBjAG8AIABkAGEAIABHAGEAbQBhACAAZABlACAAQwBpAG4AegBhAHMAIAAyACwAMgQXBDAEMwQwBDsE -TAQ9BDAAIABHAHIAYQB5AC0EMwQwBDwEMAAgADIALgAyAFAAcgBvAGYAaQBsACAAZwDpAG4A6QByAGkA -cQB1AGUAIABnAHIAaQBzACAAZwBhAG0AbQBhACAAMgAsADIAwQBsAHQAYQBsAOEAbgBvAHMAIABzAHoA -/AByAGsAZQAgAGcAYQBtAG0AYQAgADIALgAykBp1KHBwlo5RSV6mADIALgAygnJfaWPPj/DHfLwYACDW -jMDJACCsELnIACAAMgAuADIAINUEuFzTDMd8AEcAZQBuAGUAcgBpAHMAawAgAGcAcgDlACAAZwBhAG0A -bQBhACAAMgAsADIALQBwAHIAbwBmAGkAbABPAGIAZQBjAG4A4QAgAWEAZQBkAOEAIABnAGEAbQBhACAA -MgAuADIF0gXQBd4F1AAgBdAF5AXVBegAIAXbBdwF3AXZACAAMgAuADIARwBhAG0AYQAgAGcAcgBpACAA -ZwBlAG4AZQByAGkAYwEDACAAMgAsADIAQQBsAGwAZwBlAG0AZQBpAG4AZQBzACAARwByAGEAdQBzAHQA -dQBmAGUAbgAtAFAAcgBvAGYAaQBsACAARwBhAG0AbQBhACAAMgAsADIAUAByAG8AZgBpAGwAbwAgAGcA -cgBpAGcAaQBvACAAZwBlAG4AZQByAGkAYwBvACAAZABlAGwAbABhACAAZwBhAG0AbQBhACAAMgAsADIA -RwBlAG4AZQByAGkAcwBrACAAZwByAOUAIAAyACwAMgAgAGcAYQBtAG0AYQBwAHIAbwBmAGkAbGZukBpw -cF6mfPtlcAAyAC4AMmPPj/Blh072TgCCLDCwMOwwpDCsMPMw3gAgADIALgAyACAw1zDtMNUwoTCkMOsD -kwO1A70DuQO6A8wAIAOTA7oDwQO5ACADkwOsA7wDvAOxACAAMgAuADIAUABlAHIAZgBpAGwAIABnAGUA -bgDpAHIAaQBjAG8AIABkAGUAIABjAGkAbgB6AGUAbgB0AG8AcwAgAGQAYQAgAEcAYQBtAG0AYQAgADIA -LAAyAEEAbABnAGUAbQBlAGUAbgAgAGcAcgBpAGoAcwAgAGcAYQBtAG0AYQAgADIALAAyAC0AcAByAG8A -ZgBpAGUAbABQAGUAcgBmAGkAbAAgAGcAZQBuAOkAcgBpAGMAbwAgAGQAZQAgAGcAYQBtAG0AYQAgAGQA -ZQAgAGcAcgBpAHMAZQBzACAAMgAsADIOIw4xDgcOKg41DkEOAQ4hDiEOMg5ADgEOIw4iDkwOFw4xDkgO -Jw5EDhsAIAAyAC4AMgBHAGUAbgBlAGwAIABHAHIAaQAgAEcAYQBtAGEAIAAyACwAMgBZAGwAZQBpAG4A -ZQBuACAAaABhAHIAbQBhAGEAbgAgAGcAYQBtAG0AYQAgADIALAAyACAALQBwAHIAbwBmAGkAaQBsAGkA -RwBlAG4AZQByAGkBDQBrAGkAIABHAHIAYQB5ACAARwBhAG0AbQBhACAAMgAuADIAIABwAHIAbwBmAGkA -bABVAG4AaQB3AGUAcgBzAGEAbABuAHkAIABwAHIAbwBmAGkAbAAgAHMAegBhAHIAbwFbAGMAaQAgAGcA -YQBtAG0AYQAgADIALAAyBjoGJwZFBicAIAAyAC4AMgAgBkQGSAZGACAGMQZFBicGLwZKACAGOQYnBkUE -HgQxBEkEMARPACAEQQQ1BEAEMARPACAEMwQwBDwEPAQwACAAMgAsADIALQQ/BEAEPgREBDgEOwRMAEcA -ZQBuAGUAcgBpAGMAIABHAHIAYQB5ACAARwBhAG0AbQBhACAAMgAuADIAIABQAHIAbwBmAGkAbABlAAB0 -ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBJbmMuLCAyMDEyAABYWVogAAAAAAAA81EAAQAAAAEWzGN1cnYA -AAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwA -gQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkB -HwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB -+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYD -IQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwE -mgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkG -agZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIII -lgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsL -Igs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgO -Ew4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8R -bRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIV -NBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZ -axmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHewe -Fh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwoj -OCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhxKKIo -1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu -7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01 -hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8 -pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANE -R0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpM -cky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtV -KFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpe -bF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+lo -P2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwckty -pnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9 -oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhpiM6J -M4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSV -X5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFHobai -JqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxav -i7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9 -j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bM -Ncy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp22vvb -gNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb6uXr -cOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8 -B/yY/Sn9uv5L/tz/bf//0igpSElcTlNDb2xvclNwYWNlokotXE5TQ29sb3JTcGFjZdIoKUxNV05TQ29s -b3KiTC3SKClPUFdOU0ltYWdlok8tAAgAEQAaACQAKQAyADcASQBMAFEAUwBmAGwAdwB+AI0AmgChAKkA -qwCtALIAtAC2ALsAxgDIAMoAzADRANQA1gDYANoA4QD4ARQBFgEYA1oDXwNqA3MDhgOKA5UDngOjA6sD -rgOzA8IDxgPRA9kD5gPzBAgEDQQRBBMEFQQXBCAEJQQrBDMENQQ3BDkEOxXbFeAV7RXwFf0WAhYKFg0W -EhYaAAAAAAAAAgEAAAAAAAAAUQAAAAAAAAAAAAAAAAAAFh0 - - - - - - - - - - - - diff --git a/Classes/Base.lproj/HistoryListView.strings b/Classes/Base.lproj/HistoryListView.strings deleted file mode 100644 index 1d0c576ad..000000000 Binary files a/Classes/Base.lproj/HistoryListView.strings and /dev/null differ diff --git a/Classes/Base.lproj/HistoryListView.xib b/Classes/Base.lproj/HistoryListView.xib deleted file mode 100644 index 90a4022b3..000000000 --- a/Classes/Base.lproj/HistoryListView.xib +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Base.lproj/HistoryView.strings b/Classes/Base.lproj/HistoryView.strings deleted file mode 100644 index d29c7a5b6..000000000 Binary files a/Classes/Base.lproj/HistoryView.strings and /dev/null differ diff --git a/Classes/Base.lproj/ImageView.strings b/Classes/Base.lproj/ImageView.strings deleted file mode 100644 index ade838734..000000000 Binary files a/Classes/Base.lproj/ImageView.strings and /dev/null differ diff --git a/Classes/Base.lproj/ImageView.xib b/Classes/Base.lproj/ImageView.xib deleted file mode 100644 index 510358109..000000000 --- a/Classes/Base.lproj/ImageView.xib +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Base.lproj/InCallView.strings b/Classes/Base.lproj/InCallView.strings deleted file mode 100644 index 229e293de..000000000 Binary files a/Classes/Base.lproj/InCallView.strings and /dev/null differ diff --git a/Classes/Base.lproj/IncomingCallView.strings b/Classes/Base.lproj/IncomingCallView.strings deleted file mode 100644 index d880a031c..000000000 Binary files a/Classes/Base.lproj/IncomingCallView.strings and /dev/null differ diff --git a/Classes/Base.lproj/IncomingCallView~ipad.strings b/Classes/Base.lproj/IncomingCallView~ipad.strings deleted file mode 100644 index 322b0100b..000000000 Binary files a/Classes/Base.lproj/IncomingCallView~ipad.strings and /dev/null differ diff --git a/Classes/Base.lproj/PhoneMainView.xib b/Classes/Base.lproj/PhoneMainView.xib deleted file mode 100644 index 91d01a21f..000000000 --- a/Classes/Base.lproj/PhoneMainView.xib +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Base.lproj/RecordingsListView.xib b/Classes/Base.lproj/RecordingsListView.xib deleted file mode 100644 index 5132e66cd..000000000 --- a/Classes/Base.lproj/RecordingsListView.xib +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Base.lproj/SettingsView.strings b/Classes/Base.lproj/SettingsView.strings deleted file mode 100644 index eda4583d1..000000000 Binary files a/Classes/Base.lproj/SettingsView.strings and /dev/null differ diff --git a/Classes/Base.lproj/SettingsView.xib b/Classes/Base.lproj/SettingsView.xib deleted file mode 100644 index 2437492a8..000000000 --- a/Classes/Base.lproj/SettingsView.xib +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Base.lproj/ShopView.strings b/Classes/Base.lproj/ShopView.strings deleted file mode 100644 index cc79d924b..000000000 Binary files a/Classes/Base.lproj/ShopView.strings and /dev/null differ diff --git a/Classes/Base.lproj/ShopView.xib b/Classes/Base.lproj/ShopView.xib deleted file mode 100644 index f8b8dd5e5..000000000 --- a/Classes/Base.lproj/ShopView.xib +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Base.lproj/SideMenuView.strings b/Classes/Base.lproj/SideMenuView.strings deleted file mode 100644 index a1f126d9b..000000000 Binary files a/Classes/Base.lproj/SideMenuView.strings and /dev/null differ diff --git a/Classes/Base.lproj/SideMenuView.xib b/Classes/Base.lproj/SideMenuView.xib deleted file mode 100644 index c2b04fff6..000000000 --- a/Classes/Base.lproj/SideMenuView.xib +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Base.lproj/SideMenuView~ipad.strings b/Classes/Base.lproj/SideMenuView~ipad.strings deleted file mode 100644 index 0ec55c3e1..000000000 Binary files a/Classes/Base.lproj/SideMenuView~ipad.strings and /dev/null differ diff --git a/Classes/Base.lproj/SideMenuView~ipad.xib b/Classes/Base.lproj/SideMenuView~ipad.xib deleted file mode 100644 index 91c6aecb2..000000000 --- a/Classes/Base.lproj/SideMenuView~ipad.xib +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/ChatConversationCreateCollectionViewController.h b/Classes/ChatConversationCreateCollectionViewController.h deleted file mode 100644 index 3e1775d97..000000000 --- a/Classes/ChatConversationCreateCollectionViewController.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -@interface ChatConversationCreateCollectionViewController : UICollectionViewController - -@end diff --git a/Classes/ChatConversationCreateCollectionViewController.m b/Classes/ChatConversationCreateCollectionViewController.m deleted file mode 100644 index 2b56f91a8..000000000 --- a/Classes/ChatConversationCreateCollectionViewController.m +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "ChatConversationCreateCollectionViewController.h" - -@interface ChatConversationCreateCollectionViewController () - -@end - -@implementation ChatConversationCreateCollectionViewController - -static NSString * const reuseIdentifier = @"Cell"; - -- (void)viewDidLoad { - [super viewDidLoad]; - - // Register cell classes - [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; -} - -@end diff --git a/Classes/ChatConversationCreateTableView.h b/Classes/ChatConversationCreateTableView.h deleted file mode 100644 index 640af50d9..000000000 --- a/Classes/ChatConversationCreateTableView.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -@interface ChatConversationCreateTableView : UITableViewController -@property(nonatomic) Boolean allFilter; -@property(nonatomic) Boolean notFirstTime; -@property(nonatomic) Boolean reloadMagicSearch; -@property(nonatomic, strong) NSMutableArray *contactsGroup; - -@property(weak, nonatomic) IBOutlet UISearchBar *searchBar; -@property (weak, nonatomic) IBOutlet UICollectionView *collectionView; -@property (weak, nonatomic) IBOutlet UIButton *controllerNextButton; -@property (weak, nonatomic) IBOutlet UIView *waitView; -@property (weak, nonatomic) IBOutlet UIView *loadingView; - -@property(nonatomic) Boolean isForEditing; -@property(nonatomic) Boolean isGroupChat; -@property(nonatomic) Boolean isEncrypted; -- (void) loadData; - -@end diff --git a/Classes/ChatConversationCreateTableView.m b/Classes/ChatConversationCreateTableView.m deleted file mode 100644 index 5dd389375..000000000 --- a/Classes/ChatConversationCreateTableView.m +++ /dev/null @@ -1,399 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "linphoneapp-Swift.h" -#import "ChatConversationCreateTableView.h" -#import "UIChatCreateCell.h" -#import "LinphoneManager.h" -#import "PhoneMainView.h" -#import "UIChatCreateCollectionViewCell.h" - -@interface ChatConversationCreateTableView () - -@property(nonatomic, strong) NSMutableArray *addresses; -@property(nonatomic, strong) NSMutableArray *phoneOrAddr; -@property(nonatomic, strong) NSMutableArray *addressesCached; -@property(readonly, nonatomic) NSMutableDictionary *ldapAndProvisioningContactAddressBookMap; - -@end - -@implementation ChatConversationCreateTableView - -- (void)viewWillAppear:(BOOL)animated { - if (!_ldapAndProvisioningContactAddressBookMap) { - _ldapAndProvisioningContactAddressBookMap = [NSMutableDictionary dictionary]; - } - [super viewWillAppear:animated]; - - int y = _contactsGroup.count > 0 - ? _collectionView.frame.origin.y + _collectionView.frame.size.height - : _searchBar.frame.origin.y + _searchBar.frame.size.height; - [UIView animateWithDuration:0 - delay:0 - options:UIViewAnimationOptionCurveEaseOut - animations:^{ - [self.tableView setFrame:CGRectMake(self.tableView.frame.origin.x, - y, - self.tableView.frame.size.width, - _waitView.frame.size.height - _waitView.frame.origin.y - y)]; - } - completion:nil]; - - _addresses = [[NSMutableArray alloc] initWithCapacity:LinphoneManager.instance.fastAddressBook.addressBookMap.allKeys.count]; - _phoneOrAddr = [[NSMutableArray alloc] initWithCapacity:LinphoneManager.instance.fastAddressBook.addressBookMap.allKeys.count]; - _addressesCached = [[NSMutableArray alloc] initWithCapacity:LinphoneManager.instance.fastAddressBook.addressBookMap.allKeys.count]; - - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(onChatMagicSearchStarted:) - name:kLinphoneMagicSearchStarted - object:nil]; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(onChatMagicSearchFinished:) - name:kLinphoneMagicSearchFinished - object:nil]; - - if(_notFirstTime) { - for(NSString *addr in _contactsGroup) { - [_collectionView registerClass:UIChatCreateCollectionViewCell.class forCellWithReuseIdentifier:addr]; - } - [self searchBar:_searchBar textDidChange:_searchBar.text]; - return; - } - _contactsGroup = [[NSMutableArray alloc] init]; - [_searchBar setText:@""]; - [self searchBar:_searchBar textDidChange:_searchBar.text]; - self.tableView.accessibilityIdentifier = @"Suggested addresses"; - - NSDictionary* userInfo; - [NSNotificationCenter.defaultCenter addObserver:self - selector: @selector(receivePresenceNotification:) - name: @"LinphoneFriendPresenceUpdate" - object: userInfo]; -} - --(void) receivePresenceNotification:(NSNotification*)notification -{ - if ([notification.name isEqualToString:@"LinphoneFriendPresenceUpdate"]) - { - NSDictionary* userInfo = notification.userInfo; - NSString* friend = (NSString*)userInfo[@"friend"]; - - for (int i = 0; i < _addresses.count; i++) - { - - NSString *key = [_addresses objectAtIndex:i]; - Contact *contact = [LinphoneManager.instance.fastAddressBook.addressBookMap objectForKey:[FastAddressBook normalizeSipURI:key use_prefix:[CallManager.instance applyInternationalPrefix]]]; - if (!contact) { - contact = [_ldapAndProvisioningContactAddressBookMap objectForKey:key]; - } - - if (contact.friend != nil && linphone_friend_get_address(contact.friend) != nil) { - char *curi = linphone_address_as_string_uri_only(linphone_friend_get_address(contact.friend)); - NSString *uri = [NSString stringWithUTF8String:curi]; - - if([uri isEqual:friend]){ - NSIndexPath* indexPath = [NSIndexPath indexPathForRow:i inSection:0]; - NSArray* indexArray = [NSArray arrayWithObjects:indexPath, nil]; - [self.tableView reloadRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationFade]; - } - } - } - } -} - -- (void) viewWillDisappear:(BOOL)animated { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:@"LinphoneFriendPresenceUpdate" object:nil]; - [AvatarBridge removeAllObserver]; - _notFirstTime = FALSE; -} - -- (void)onChatMagicSearchStarted:(NSNotification *)k { - _loadingView.hidden = FALSE; -} -- (void)onChatMagicSearchFinished:(NSNotification *)k { - [self buildChatContactTable]; - _loadingView.hidden = TRUE; -} - --(BOOL) isSecureChatable:(const LinphoneFriend*)friend { - if (!friend) - return false; - const LinphonePresenceModel *model = linphone_friend_get_presence_model(friend); - return model && linphone_presence_model_has_capability(model, LinphoneFriendCapabilityLimeX3dh); -} - -- (void) buildChatContactTable { - - bctbx_list_t *result_list = [MagicSearchSingleton.instance getLastSearchResults]; - bctbx_list_t *it; - LinphoneAccount *account = linphone_core_get_default_account(LC); - - for (it = result_list; it != NULL; it = it->next) { - LinphoneSearchResult *result = it->data; - const LinphoneAddress *addr = linphone_search_result_get_address(result); - const LinphoneFriend* friend = linphone_search_result_get_friend(result); - const char *phoneNumber = linphone_search_result_get_phone_number(result); - - if (([LinphoneManager.instance lpConfigBoolForKey:@"force_lime_chat_rooms"] && ![self isSecureChatable:friend]) || [LinphoneManager.instance lpConfigBoolForKey:@"disable_chat_feature"]) { - continue; - } - - Contact *contact = nil; - char *uri = nil; - NSString *address = nil; - - if (addr) { - uri = linphone_address_as_string_uri_only(addr); - address = [NSString stringWithUTF8String:uri]; - contact = [LinphoneManager.instance.fastAddressBook.addressBookMap objectForKey:[FastAddressBook normalizeSipURI:address use_prefix:[CallManager.instance applyInternationalPrefix]]]; - - if (!contact && friend) { - contact = [[Contact alloc] initWithFriend:friend]; - [contact setCreatedFromLdapOrProvisioning:TRUE]; - [_ldapAndProvisioningContactAddressBookMap setObject:contact forKey:address]; - } - } else if (friend){ - if (!phoneNumber) { - continue; - } - - if (account) { - char *normalizedPhoneNumber = linphone_account_normalize_phone_number(account, phoneNumber); - if (!normalizedPhoneNumber) { - // get invalid phone number, continue - continue; - } - addr = linphone_account_normalize_sip_uri(account, normalizedPhoneNumber); - bctbx_free(normalizedPhoneNumber); - uri = linphone_address_as_string_uri_only(addr); - address = [NSString stringWithUTF8String:uri]; - - contact = [[Contact alloc] initWithFriend:friend]; - [contact setCreatedFromLdapOrProvisioning:TRUE]; - [_ldapAndProvisioningContactAddressBookMap setObject:contact forKey:address]; - linphone_address_unref(addr); - } - } - if (uri) ms_free(uri); - - if (!addr) { - continue; - } - [_addresses addObject:address]; - [_phoneOrAddr addObject:phoneNumber ? [NSString stringWithUTF8String:phoneNumber] : address]; - [_addressesCached addObject:[NSString stringWithFormat:@"%d",linphone_search_result_get_capabilities(result)]]; - - } - bctbx_list_free(result_list); - [self.tableView reloadData]; - _reloadMagicSearch = FALSE; -} - - -- (void) loadData { - [self reloadDataWithFilter:_searchBar.text]; -} - -- (void)reloadDataWithFilter:(NSString *)filter { - [_addresses removeAllObjects]; - [_phoneOrAddr removeAllObjects]; - [_addressesCached removeAllObjects]; - [_ldapAndProvisioningContactAddressBookMap removeAllObjects]; - [self.tableView reloadData]; - - _reloadMagicSearch = _reloadMagicSearch || [filter length]==0 || ![[MagicSearchSingleton.instance currentFilter] isEqualToString:filter]; - [MagicSearchSingleton.instance setCurrentFilter:filter]; - - if (_reloadMagicSearch) { - [MagicSearchSingleton.instance searchForContactsWithDomain:_allFilter ? @"" : @"*" sourceFlags:LinphoneMagicSearchSourceAll clearCache:FALSE]; - } else { - [self buildChatContactTable]; - } -} - -#pragma mark - TableView methods - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 1; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return _addresses.count; -} - -- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(nonnull NSIndexPath *)indexPath { - return 60.0; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - NSString *kCellId = NSStringFromClass(UIChatCreateCell.class); - UIChatCreateCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId]; - if (cell == nil) - cell = [[UIChatCreateCell alloc] initWithIdentifier:kCellId]; - - NSString *key = [_addresses objectAtIndex:indexPath.row]; - NSString *phoneOrAddr = [_phoneOrAddr objectAtIndex:indexPath.row]; - Contact *contact = [LinphoneManager.instance.fastAddressBook.addressBookMap objectForKey:[FastAddressBook normalizeSipURI:key use_prefix:[CallManager.instance applyInternationalPrefix]]]; - if (!contact) { - contact = [_ldapAndProvisioningContactAddressBookMap objectForKey:key]; - } - - const LinphonePresenceModel *model = contact.friend ? linphone_friend_get_presence_model(contact.friend) : NULL; - Boolean linphoneContact = [FastAddressBook contactHasValidSipDomain:contact] - || (model && linphone_presence_model_get_basic_status(model) == LinphonePresenceBasicStatusOpen); - LinphoneAddress *addr = [LinphoneUtils normalizeSipOrPhoneAddress:key]; - if (!addr) - return cell; - - cell.linphoneImage.hidden = [LinphoneManager.instance lpConfigBoolForKey:@"hide_linphone_contacts" inSection:@"app"] || !linphoneContact; - cell.securityImage.hidden = !(model && linphone_presence_model_has_capability(model, LinphoneFriendCapabilityLimeX3dh)); - int capabilities = [[_addressesCached objectAtIndex:indexPath.row] intValue]; - BOOL greyCellForEncryptedChat = _isEncrypted ? capabilities > 1 : TRUE; - BOOL greyCellForGroupChat = _isGroupChat ? capabilities > 0 : TRUE; - cell.userInteractionEnabled = cell.greyView.hidden = greyCellForEncryptedChat && greyCellForGroupChat; - cell.displayNameLabel.text = [contact createdFromLdapOrProvisioning] ? [contact displayName] : [FastAddressBook displayNameForAddress:addr]; - char *str = linphone_address_as_string(addr); - cell.addressLabel.text = linphoneContact ? [NSString stringWithUTF8String:str] : phoneOrAddr; - ms_free(str); - cell.selectedImage.hidden = ![_contactsGroup containsObject:cell.addressLabel.text]; - [cell.avatarImage setImage:[FastAddressBook imageForAddress:addr]]; - cell.contentView.userInteractionEnabled = false; - cell.contentView.backgroundColor = UIColor.clearColor; - cell.backgroundColor = UIColor.clearColor; - return cell; -} - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - UIChatCreateCell *cell = [tableView cellForRowAtIndexPath:indexPath]; - if (!cell.userInteractionEnabled) - return; - - LinphoneAccount *defaultAccount = linphone_core_get_default_account(LC); - if (!(defaultAccount && linphone_account_params_get_conference_factory_uri(linphone_account_get_params(defaultAccount))) || !_isGroupChat) { - LinphoneAddress *addr = linphone_address_new(cell.addressLabel.text.UTF8String); - [PhoneMainView.instance getOrCreateOneToOneChatRoom:addr waitView:_waitView isEncrypted:_isEncrypted]; - if (!addr) { - LOGE(@"Chat room could not be created on server, because null address."); - [ChatConversationInfoView displayCreationError]; - } else { - linphone_address_unref(addr); - } - return; - } - - [tableView deselectRowAtIndexPath:indexPath animated:YES]; - NSInteger index = 0; - if(cell.selectedImage.hidden) { - if(![_contactsGroup containsObject:cell.addressLabel.text]) { - [_contactsGroup addObject:cell.addressLabel.text]; - [_collectionView registerClass:UIChatCreateCollectionViewCell.class forCellWithReuseIdentifier:cell.addressLabel.text]; - } - } else if([_contactsGroup containsObject:cell.addressLabel.text]) { - index = (NSInteger)[_contactsGroup indexOfObject:cell.addressLabel.text]; - [_contactsGroup removeObject:cell.addressLabel.text]; - if(index == _contactsGroup.count) - index = index-1; - } - cell.selectedImage.hidden = !cell.selectedImage.hidden; - _controllerNextButton.enabled = (_contactsGroup.count > 0) || _isForEditing; - if (_contactsGroup.count > 1 || (_contactsGroup.count == 1 && cell.selectedImage.hidden)) { - [UIView animateWithDuration:0.2 - delay:0 - options:UIViewAnimationOptionCurveEaseOut - animations:^{ - [tableView setFrame:CGRectMake(tableView.frame.origin.x, - _collectionView.frame.origin.y + _collectionView.frame.size.height, - tableView.frame.size.width, - tableView.frame.size.height)]; - - } - completion:nil]; - } else if (_contactsGroup.count == 1 && !cell.selectedImage.hidden) { - [UIView animateWithDuration:0.2 - delay:0 - options:UIViewAnimationOptionCurveEaseOut - animations:^{ - [tableView setFrame:CGRectMake(tableView.frame.origin.x, - _collectionView.frame.origin.y + _collectionView.frame.size.height, - tableView.frame.size.width, - tableView.frame.size.height - _collectionView.frame.size.height)]; - - } - completion:nil]; - } else { - [UIView animateWithDuration:0.2 - delay:0 - options:UIViewAnimationOptionCurveEaseOut - animations:^{ - [tableView setFrame:CGRectMake(tableView.frame.origin.x, - _searchBar.frame.origin.y + _searchBar.frame.size.height, - tableView.frame.size.width, - tableView.frame.size.height + _collectionView.frame.size.height)]; - } - completion:nil]; - } - [_collectionView reloadData]; - if (!cell.selectedImage.hidden) { - index = _contactsGroup.count - 1; - } - - dispatch_async(dispatch_get_main_queue(), ^{ - if(index > 0) { - NSIndexPath *path = [NSIndexPath indexPathForItem:index inSection:0]; - [_collectionView scrollToItemAtIndexPath:path - atScrollPosition:(UICollectionViewScrollPositionCenteredHorizontally | UICollectionViewScrollPositionCenteredVertically) - animated:YES]; - } - }); -} - -#pragma mark - Searchbar delegates - -- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { - searchBar.showsCancelButton = (searchText.length > 0); - [self reloadDataWithFilter:searchText]; - if ([searchText isEqualToString:@""]) { - [_searchBar resignFirstResponder]; - } -} - -- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(nonnull NSString *)text { - return TRUE; -} - -- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar { - [searchBar setShowsCancelButton:FALSE animated:TRUE]; -} - -- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { - [searchBar setShowsCancelButton:(searchBar.text.length > 0) animated:TRUE]; -} - -- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { - [searchBar resignFirstResponder]; -} - -- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { - [searchBar resignFirstResponder]; -} - -@end diff --git a/Classes/ChatConversationCreateView.h b/Classes/ChatConversationCreateView.h deleted file mode 100644 index 32e998c23..000000000 --- a/Classes/ChatConversationCreateView.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef ChatConversationCreateView_h -#define ChatConversationCreateView_h - -#import -#import "ChatConversationCreateTableView.h" -#import "ChatConversationCreateCollectionViewController.h" -#import "UICompositeView.h" - -@interface ChatConversationCreateView : UIViewController - -@property(strong, nonatomic) IBOutlet ChatConversationCreateTableView *tableController; -@property(strong, nonatomic) IBOutlet ChatConversationCreateCollectionViewController *collectionController; -@property (weak, nonatomic) IBOutlet UICollectionView *collectionView; -@property (weak, nonatomic) IBOutlet UIButton *backButton; -@property (weak, nonatomic) IBOutlet UIButton *nextButton; -@property (weak, nonatomic) IBOutlet UIButton *allButton; -@property (weak, nonatomic) IBOutlet UIButton *linphoneButton; -@property (weak, nonatomic) IBOutlet UIImageView *selectedButtonImage; -@property (weak, nonatomic) IBOutlet UIView *waitView; -@property (weak, nonatomic) IBOutlet UIView *chiffreOptionView; -@property (weak, nonatomic) IBOutlet UIView *switchView; -@property (weak, nonatomic) IBOutlet UIImageView *chiffreImage; -@property (weak, nonatomic) IBOutlet UIButton *chiffreButton; -@property (weak, nonatomic) IBOutlet UIView *topBar; - -@property(nonatomic) Boolean isForEditing; -@property(nonatomic) Boolean isGroupChat; -@property(nonatomic) Boolean isEncrypted; - -@property(nonatomic) Boolean isForVoipConference; -@property(nonatomic) Boolean isForOngoingVoipConference; - -@property (weak, nonatomic) IBOutlet UILabel *voipTitle; - -- (IBAction)onBackClick:(id)sender; -- (IBAction)onNextClick:(id)sender; -- (IBAction)onChiffreClick:(id)sender; - --(void) unfragmentCompositeDescription; --(void) fragmentCompositeDescription; - -@end - -#endif /* ChatConversationCreateView_h */ diff --git a/Classes/ChatConversationCreateView.m b/Classes/ChatConversationCreateView.m deleted file mode 100644 index 724f6aff6..000000000 --- a/Classes/ChatConversationCreateView.m +++ /dev/null @@ -1,337 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "ChatConversationCreateView.h" -#import "PhoneMainView.h" -#import "UIChatCreateCollectionViewCell.h" -#import "linphoneapp-Swift.h" - -@implementation ChatConversationCreateView - -#pragma mark - UICompositeViewDelegate Functions - -static UICompositeViewDescription *compositeDescription = nil; - -+ (UICompositeViewDescription *)compositeViewDescription { - if (compositeDescription == nil) { - compositeDescription = [[UICompositeViewDescription alloc] init:self.class - statusBar:StatusBarView.class - tabBar:TabBarView.class - sideMenu:SideMenuView.class - fullscreen:false - isLeftFragment:NO - fragmentWith:ChatsListView.class]; - } - return compositeDescription; -} - -- (UICompositeViewDescription *)compositeViewDescription { - return self.class.compositeViewDescription; -} - --(void) unfragmentCompositeDescription { - if (!IPAD) - return; - compositeDescription.isLeftFragment = true; - compositeDescription.otherFragment = nil; -} - --(void) fragmentCompositeDescription { - if (!IPAD) - return; - compositeDescription.otherFragment = IPAD ? NSStringFromClass(ChatsListView.class) : nil; - compositeDescription.isLeftFragment = false; -} - - -- (void)viewDidLoad { - [super viewDidLoad]; - UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] - initWithTarget:self - action:@selector(dismissKeyboards)]; - tap.delegate = self; - [self.view addGestureRecognizer:tap]; - UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; - layout.scrollDirection = UICollectionViewScrollDirectionHorizontal; - layout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize; - _collectionController.collectionView = _collectionView; - _collectionController = (ChatConversationCreateCollectionViewController *)[[UICollectionViewController alloc] initWithCollectionViewLayout:layout]; - _collectionView.dataSource = self; - [_collectionView setCollectionViewLayout:layout]; - _tableController.collectionView = _collectionView; - _tableController.controllerNextButton = _nextButton; - _isForEditing = FALSE; - _voipTitle.text = VoipTexts.call_action_participants_list; - _topBar.backgroundColor = [VoipTheme.voipToolbarBackgroundColor get]; - -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - [self viewUpdateEvent:nil]; - - if (IPAD) - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(viewUpdateEvent:) - name:kLinphoneChatCreateViewChange - object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(displayModeChanged) - name:kDisplayModeChanged - object:nil]; - LinphoneAccount *defaultAccount = linphone_core_get_default_account(LC); - _chiffreOptionView.hidden = !(defaultAccount && linphone_account_params_get_conference_factory_uri(linphone_account_get_params(defaultAccount))); - if ([LinphoneManager.instance lpConfigBoolForKey:@"hide_linphone_contacts" inSection:@"app"]) { - self.linphoneButton.hidden = TRUE; - self.selectedButtonImage.hidden = TRUE; - CGRect frame = _allButton.frame; - frame.origin.x = _linphoneButton.frame.origin.x; - _allButton.frame = frame; - - } - - if ([LinphoneManager.instance lpConfigBoolForKey:@"force_lime_chat_rooms"] || [LinphoneManager.instance lpConfigBoolForKey:@"disable_chat_feature"]) { - _chiffreOptionView.hidden = true; - _isEncrypted = true; - _tableController.isEncrypted = true; - _allButton.hidden = true; - _linphoneButton.hidden = true; - _selectedButtonImage.hidden = true; - } - - if (_isForVoipConference) { - _switchView.hidden = true; - _chiffreOptionView.hidden = true; - _voipTitle.hidden = false; - if (_isForOngoingVoipConference) { - [_nextButton setImage:[UIImage imageNamed:@"valid_default"] forState:UIControlStateNormal]; - } else { - [_nextButton setImage:[UIImage imageNamed:@"next_default"] forState:UIControlStateNormal]; - } - } else { - _voipTitle.hidden = true; - [_nextButton setImage:[UIImage imageNamed:@"next_default"] forState:UIControlStateNormal]; - } - [self displayModeChanged]; -} - -- (void)displayModeChanged{ - [self.tableController.tableView reloadData]; - if (_isForVoipConference) { - self.view.backgroundColor = [VoipTheme.voipBackgroundBWColor get]; - _tableController.tableView.backgroundColor = [VoipTheme.voipBackgroundBWColor get]; - _tableController.searchBar.backgroundColor = [VoipTheme.voipBackgroundBWColor get]; - _tableController.collectionView.backgroundColor = [VoipTheme.voipBackgroundBWColor get]; - } else { - self.view.backgroundColor = [VoipTheme.backgroundWhiteBlack get]; - _tableController.tableView.backgroundColor = [VoipTheme.backgroundWhiteBlack get]; - _tableController.searchBar.backgroundColor = [VoipTheme.backgroundWhiteBlack get]; - _tableController.collectionView.backgroundColor = [VoipTheme.backgroundWhiteBlack get]; - } -} - -- (void)viewUpdateEvent:(NSNotification *)notif { - CGRect frame = _chiffreOptionView.frame; - if (_isGroupChat) { - _nextButton.hidden = FALSE; - _switchView.hidden = TRUE; - frame.origin.x = (self.view.frame.size.width - _chiffreOptionView.frame.size.width)/2; - } else { - _nextButton.hidden = TRUE; - _switchView.hidden = FALSE; - frame.origin.x = self.view.frame.size.width * 0.192; - } - _chiffreOptionView.frame = frame; - _isEncrypted = [LinphoneManager.instance lpConfigBoolForKey:@"force_lime_chat_rooms"] || [LinphoneManager.instance lpConfigBoolForKey:@"disable_chat_feature"]; // false by default - CGRect buttonFrame = _chiffreButton.frame; - - if (!_isEncrypted) { - buttonFrame.origin.x = 2; - [_chiffreImage setImage:[UIImage imageNamed:@"security_toogle_background_grey.png"]]; - _chiffreButton.frame = buttonFrame; - } - - _waitView.hidden = YES; - _backButton.hidden = IPAD && !(_isForVoipConference||_isForOngoingVoipConference); - if(_tableController.contactsGroup.count == 0) { - if (!_isForEditing) - _nextButton.enabled = FALSE; - - _tableController.tableView.frame = CGRectMake(_tableController.tableView.frame.origin.x, - _tableController.searchBar.frame.origin.y + _tableController.searchBar.frame.size.height, - _tableController.tableView.frame.size.width, - _tableController.tableView.frame.size.height + _collectionView.frame.size.height); - } else { - _tableController.tableView.frame = CGRectMake(_tableController.tableView.frame.origin.x, - _collectionView.frame.origin.y + _collectionView.frame.size.height, - _tableController.tableView.frame.size.width, - _tableController.tableView.frame.size.height); - } - [_collectionView reloadData]; - _tableController.isForEditing = _isForEditing; - _tableController.isGroupChat = _isGroupChat; - _tableController.isEncrypted = _isEncrypted; - [self changeView:ContactsLinphone]; -} - -- (void)viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; - [NSNotificationCenter.defaultCenter removeObserver:self]; -} - -#pragma mark - Chat room functions - -- (void)createChatRoom { - NSString *addr = _tableController.contactsGroup[0]; - LinphoneAddress *remoteAddress = linphone_address_new(addr.UTF8String); - [PhoneMainView.instance getOrCreateOneToOneChatRoom:remoteAddress waitView:_waitView isEncrypted:_isEncrypted]; - linphone_address_unref(remoteAddress); -} - -#pragma mark - Buttons signals - -- (IBAction)onBackClick:(id)sender { - [_tableController.contactsGroup removeAllObjects]; - if (_isForVoipConference) { - if (_isForOngoingVoipConference) { - [PhoneMainView.instance popToView:VIEW(ConferenceCallView).compositeViewDescription]; - [ControlsViewModelBridge showParticipants]; - } else { - [PhoneMainView.instance popToView:ConferenceSchedulingView.compositeViewDescription]; - } - } else { - if (_tableController.isForEditing) - [PhoneMainView.instance popToView:ChatConversationInfoView.compositeViewDescription]; - else - [PhoneMainView.instance popToView:ChatsListView.compositeViewDescription]; - } -} - -- (IBAction)onNextClick:(id)sender { - if (_isForVoipConference) { - if (_isForOngoingVoipConference) { - [PhoneMainView.instance popToView:VIEW(ConferenceCallView).compositeViewDescription]; - [ConferenceViewModelBridge updateParticipantsListWithAddresses:_tableController.contactsGroup]; - } else { - [PhoneMainView.instance changeCurrentView:VIEW(ConferenceSchedulingSummaryView).compositeViewDescription]; - [VIEW(ConferenceSchedulingSummaryView) setParticipantsWithAddresses:_tableController.contactsGroup]; - } - } else { - ChatConversationInfoView *view = VIEW(ChatConversationInfoView); - view.contacts = _tableController.contactsGroup; - view.create = !_isForEditing; - view.encrypted = _isEncrypted; - [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; - } -} - -- (IBAction)onChiffreClick:(id)sender { - CGRect frame = _chiffreButton.frame; - _isEncrypted = !_isEncrypted; - _tableController.isEncrypted = _isEncrypted; - if (_isEncrypted) { - // encrypted - frame.origin.x = 20; - [_chiffreImage setImage:[UIImage imageNamed:@"security_toogle_background_green.png"]]; - } else { - // no encrypted - frame.origin.x = 2; - [_chiffreImage setImage:[UIImage imageNamed:@"security_toogle_background_grey.png"]]; - } - _chiffreButton.frame = frame; - [_tableController.tableView reloadData]; -} - -- (void)dismissKeyboards { - if ([self.tableController.searchBar isFirstResponder]) - [self.tableController.searchBar resignFirstResponder]; -} - -#pragma mark - Contacts filter - -typedef enum { ContactsAll, ContactsLinphone, ContactsMAX } ContactsCategory; - -- (void)changeView:(ContactsCategory)view { - CGRect frame = _selectedButtonImage.frame; - - if (view == ContactsAll && !_allButton.selected) { - frame.origin.x = _allButton.frame.origin.x; - _allButton.selected = TRUE; - _linphoneButton.selected = FALSE; - _tableController.allFilter = TRUE; - _tableController.reloadMagicSearch = TRUE; - [_tableController loadData]; - } else if (view == ContactsLinphone && !_linphoneButton.selected) { - frame.origin.x = _linphoneButton.frame.origin.x; - _linphoneButton.selected = TRUE; - _allButton.selected = FALSE; - _tableController.allFilter = FALSE; - _tableController.reloadMagicSearch = TRUE; - [_tableController loadData]; - } - _selectedButtonImage.frame = frame; - if ([LinphoneManager.instance lpConfigBoolForKey:@"hide_linphone_contacts" inSection:@"app"]) { - _allButton.selected = FALSE; - } -} - -- (IBAction)onAllClick:(id)event { - [self changeView:ContactsAll]; -} - -- (IBAction)onLinphoneClick:(id)event { - [self changeView:ContactsLinphone]; -} - -#pragma mark - GestureRecognizerDelegate - -- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch -{ - return NO; -} - -#pragma mark - UICollectionViewDataSource & Delegate -- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { - return _tableController.contactsGroup.count; -} - -- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { - return 1; -} - -- (UIChatCreateCollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { - NSString *uri = _tableController.contactsGroup[indexPath.item]; - UIChatCreateCollectionViewCell *cell = (UIChatCreateCollectionViewCell *)[_collectionView dequeueReusableCellWithReuseIdentifier:uri forIndexPath:indexPath]; - cell.controller = self; - cell.uri = uri; - LinphoneAddress *addr = NULL; - LinphoneAccount *account = linphone_core_get_default_account(LC); - if (account && linphone_account_is_phone_number(account, uri.UTF8String)) { - char *phone = linphone_account_normalize_phone_number(account, uri.UTF8String); - addr = linphone_account_normalize_sip_uri(account, phone); - ms_free(phone); - } else - addr = linphone_address_new(uri.UTF8String); - [cell.nameLabel setText:[FastAddressBook displayNameForAddress:addr]]; - linphone_address_unref(addr); - return cell; -} - - -@end diff --git a/Classes/ChatConversationImdnView.h b/Classes/ChatConversationImdnView.h deleted file mode 100644 index e0bc17f18..000000000 --- a/Classes/ChatConversationImdnView.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef ChatConversationImdnView_h -#define ChatConversationImdnView_h - -#import - -#import "UICompositeView.h" -#import "UIRoundBorderedButton.h" -#import "UIChatBubbleTextCell.h" - -@interface ChatConversationImdnView : UIViewController -{ - @private - NSString *messageText; -} - -@property(nonatomic) LinphoneEventLog *event; -@property(nonatomic) bctbx_list_t *displayedList; -@property(nonatomic) bctbx_list_t *receivedList; -@property(nonatomic) bctbx_list_t *notReceivedList; -@property(nonatomic) bctbx_list_t *errorList; -@property(nonatomic) UIChatBubbleTextCell *cell; -@property(nonatomic) NSTimer *ephemeralDisplayTimer; - - -@property (weak, nonatomic) IBOutlet UIView *msgView; -@property (weak, nonatomic) IBOutlet UITableView *tableView; - -- (IBAction)onBackClick:(id)sender; -- (void)updateImdnList; - -@end - -#endif /* ChatConversationImdnView_h */ diff --git a/Classes/ChatConversationImdnView.m b/Classes/ChatConversationImdnView.m deleted file mode 100644 index f83a8b64e..000000000 --- a/Classes/ChatConversationImdnView.m +++ /dev/null @@ -1,327 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "ChatConversationImdnView.h" -#import "PhoneMainView.h" -#import "UIChatBubbleTextCell.h" -#import "UIChatBubblePhotoCell.h" -#import "UIChatConversationImdnTableViewCell.h" - -@implementation ChatConversationImdnView - -static UICompositeViewDescription *compositeDescription = nil; - -+ (UICompositeViewDescription *)compositeViewDescription { - if (compositeDescription == nil) { - compositeDescription = [[UICompositeViewDescription alloc] init:self.class - statusBar:StatusBarView.class - tabBar:TabBarView.class - sideMenu:SideMenuView.class - fullscreen:false - isLeftFragment:NO - fragmentWith:ChatsListView.class]; - } - return compositeDescription; -} - -- (UICompositeViewDescription *)compositeViewDescription { - return self.class.compositeViewDescription; -} - -- (void)viewDidLoad { - [super viewDidLoad]; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - - _cell = [VIEW(ChatConversationView).tableController buildMessageCell:_event]; - _cell.frame = CGRectMake(-10,0,_msgView.frame.size.width,_msgView.frame.size.height); - _cell.isFirst = true; - _cell.isLast = true; - [_cell update]; - _cell.popupMenuAllowed = false; - for (UIView *v in [_msgView subviews]) { - [v removeFromSuperview]; - } - [_msgView addSubview:_cell]; - - - _tableView.delegate = self; - _tableView.dataSource = self; - - [self updateImdnList]; - [self fitContent]; - [self startEphemeralDisplayTimer]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(ephemeralDeleted:) - name:kLinphoneEphemeralMessageDeletedInRoom - object:nil]; - -} - --(void) viewWillDisappear:(BOOL)animated { - [self stopEphemeralDisplayTimer]; - [NSNotificationCenter.defaultCenter removeObserver:self]; - [super viewWillDisappear:animated]; -} - -- (void)updateImdnList { - if (_event) { - LinphoneChatMessage *_msg = linphone_event_log_get_chat_message(_event); - if (_msg) { - _displayedList = linphone_chat_message_get_participants_by_imdn_state(_msg, LinphoneChatMessageStateDisplayed); - _receivedList = linphone_chat_message_get_participants_by_imdn_state(_msg, LinphoneChatMessageStateDeliveredToUser); - _notReceivedList = linphone_chat_message_get_participants_by_imdn_state(_msg, LinphoneChatMessageStateDelivered); - _errorList = linphone_chat_message_get_participants_by_imdn_state(_msg, LinphoneChatMessageStateNotDelivered); - - [_tableView reloadData]; - } - } -} - -- (void)fitContent { - LinphoneChatMessage *_msg = linphone_event_log_get_chat_message(_event); - CGSize messageSize = [UIChatBubbleTextCell ViewHeightForMessage:_msg withWidth:self.view.frame.size.width]; - if (messageSize.height > self.view.bounds.size.height/2) { - [_msgView setFrame:CGRectMake(_msgView.frame.origin.x, - _msgView.frame.origin.y, - self.view.frame.size.width, - self.view.bounds.size.height/2 +5)]; - } else { - [_msgView setFrame:CGRectMake(_msgView.frame.origin.x, - _msgView.frame.origin.y, - self.view.frame.size.width, - messageSize.height+5)]; - } - - [_tableView setFrame:CGRectMake(_tableView.frame.origin.x, - _msgView.frame.origin.y + _msgView.frame.size.height + 10, - _tableView.frame.size.width, - self.view.frame.size.height - (_msgView.frame.origin.y + _msgView.frame.size.height))]; -} - -- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { - [self fitContent]; -} - - -#pragma mark - TableView - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - NSInteger numberOfSection = 0; - if (_displayedList) numberOfSection++; - if (_receivedList) numberOfSection++; - if (_notReceivedList) numberOfSection++; - if (_errorList) numberOfSection++; - return numberOfSection; -} - -- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { - return 23.0; -} - -- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(nonnull NSIndexPath *)indexPath { - return 44.0; -} -- (nullable UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { - UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 0, 0)]; - label.numberOfLines = 1; - UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 23)]; - UIImage *image = NULL; - - if (section == 0) { - if (_displayedList) { - label.text = NSLocalizedString(@"Read", nil); - label.textColor = [UIColor colorWithRed:(24 / 255.0) green:(167 / 255.0) blue:(175 / 255.0) alpha:1.0]; - image = [UIImage imageNamed:@"chat_read"]; - } else if (_receivedList) { - label.text = NSLocalizedString(@"Delivered", nil); - label.textColor = [UIColor grayColor]; - image = [UIImage imageNamed:@"chat_delivered"]; - } else if (_notReceivedList) { - label.text = NSLocalizedString(@"Sent", nil); - label.textColor = [UIColor grayColor]; - } else if (_errorList) { - label.text = NSLocalizedString(@"Error", nil); - label.textColor = [UIColor redColor]; - image = [UIImage imageNamed:@"chat_error"]; - } - } else if (section == 1) { - if (_displayedList && _receivedList) { - label.text = NSLocalizedString(@"Delivered", nil); - label.textColor = [UIColor grayColor]; - image = [UIImage imageNamed:@"chat_delivered"]; - } else if (_notReceivedList) { - label.text = NSLocalizedString(@"Sent", nil); - label.textColor = [UIColor grayColor]; - } else if (_errorList) { - label.text = NSLocalizedString(@"Error", nil); - label.textColor = [UIColor redColor]; - image = [UIImage imageNamed:@"chat_error"]; - } - } else if (section == 2) { - if (_displayedList && _receivedList && _notReceivedList) { - label.text = NSLocalizedString(@"Sent", nil); - label.textColor = [UIColor grayColor]; - } else if (_errorList) { - label.text = NSLocalizedString(@"Error", nil); - label.textColor = [UIColor redColor]; - image = [UIImage imageNamed:@"chat_error"]; - } - } else if (section == 3) { - label.text = NSLocalizedString(@"Error", nil); - label.textColor = [UIColor redColor]; - image = [UIImage imageNamed:@"chat_error"]; - } - - [view addSubview:label]; - [label sizeToFit]; - [label setCenter:view.center]; - - if (image) { - UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; - [view addSubview:imageView]; - [imageView setFrame:CGRectMake(label.frame.origin.x + label.frame.size.width + 5, 2, 19, 19)]; - } - - if (@available(iOS 13, *)) { - [view setBackgroundColor:[UIColor secondarySystemBackgroundColor]]; - } else { - [view setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"color_G.png"]]]; - } - return view; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - if (section == 0) { - if (_displayedList) - return bctbx_list_size(_displayedList); - else if (_receivedList) - return bctbx_list_size(_receivedList); - else if (_notReceivedList) - return bctbx_list_size(_notReceivedList); - else if (_errorList) - return bctbx_list_size(_errorList); - } else if (section == 1) { - if (_displayedList &&_receivedList) - return bctbx_list_size(_receivedList); - else if (_notReceivedList) - return bctbx_list_size(_notReceivedList); - else if (_errorList) - return bctbx_list_size(_errorList); - } else if (section == 2) { - if (_displayedList && _receivedList && _notReceivedList) - return bctbx_list_size(_notReceivedList); - else if (_errorList) - return bctbx_list_size(_errorList); - } else if (section == 3) - return bctbx_list_size(_errorList); - - return 0; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - bctbx_list_t *list = NULL; - if (indexPath.section == 0) { - if (_displayedList) - list = _displayedList; - else if (_receivedList) - list = _receivedList; - else if (_notReceivedList) - list = _notReceivedList; - else if (_errorList) - list = _errorList; - } else if (indexPath.section == 1) { - if (_displayedList &&_receivedList) - list = _receivedList; - else if (_notReceivedList) - list = _notReceivedList; - else if (_errorList) - list = _errorList; - } else if (indexPath.section == 2) { - if (_displayedList && _receivedList && _notReceivedList) - list = _notReceivedList; - else if (_errorList) - list = _errorList; - } else if (indexPath.section == 3) - list = _errorList; - - if (!list) - return nil; - - NSString *kCellId = NSStringFromClass(UIChatConversationImdnTableViewCell.class); - UIChatConversationImdnTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId]; - if (cell == nil) { - cell = [[UIChatConversationImdnTableViewCell alloc] initWithIdentifier:kCellId]; - } - LinphoneParticipantImdnState *state = bctbx_list_nth_data(list, (int)indexPath.row); - const LinphoneParticipant *participant = linphone_participant_imdn_state_get_participant(state); - time_t time = linphone_participant_imdn_state_get_state_change_time(state); - const LinphoneAddress *addr = linphone_participant_get_address(participant); - cell.displayName.text = [FastAddressBook displayNameForAddress:addr]; - cell.avatar.image = [FastAddressBook imageForAddress:addr]; - cell.dateLabel.text = [LinphoneUtils timeToString:time withFormat:LinphoneDateChatBubble]; - cell.userInteractionEnabled = false; - - return cell; -} - -- (IBAction)onBackClick:(id)sender { - [PhoneMainView.instance popCurrentView]; -} - -#pragma mark ephemeral messages - --(void) startEphemeralDisplayTimer { - _ephemeralDisplayTimer = [NSTimer scheduledTimerWithTimeInterval:1 - target:self - selector:@selector(updateEphemeralTimes) - userInfo:nil - repeats:YES]; -} - --(void) updateEphemeralTimes { - NSDateComponentsFormatter *f= [[NSDateComponentsFormatter alloc] init]; - f.unitsStyle = NSDateComponentsFormatterUnitsStylePositional; - f.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad; - - LinphoneChatMessage *_msg = _event ? linphone_event_log_get_chat_message(_event) : nil; - if (_msg && linphone_chat_message_is_ephemeral(_msg)) { - long duration = linphone_chat_message_get_ephemeral_expire_time(_msg) == 0 ? - linphone_chat_room_get_ephemeral_lifetime(linphone_chat_message_get_chat_room(_msg)) : - linphone_chat_message_get_ephemeral_expire_time(_msg)-[NSDate date].timeIntervalSince1970; - f.allowedUnits = (duration > 86400 ? kCFCalendarUnitDay : 0)|(duration > 3600 ? kCFCalendarUnitHour : 0)|kCFCalendarUnitMinute|kCFCalendarUnitSecond; - _cell.ephemeralTime.text = [f stringFromTimeInterval:duration]; - _cell.ephemeralTime.hidden = NO; - _cell.ephemeralIcon.hidden = NO; - } -} - --(void) stopEphemeralDisplayTimer { - [_ephemeralDisplayTimer invalidate]; -} - -- (void)ephemeralDeleted:(NSNotification *)notif { - [PhoneMainView.instance popToView:ChatConversationView.compositeViewDescription]; -} - -@end diff --git a/Classes/ChatConversationInfoView.h b/Classes/ChatConversationInfoView.h deleted file mode 100644 index ba781d684..000000000 --- a/Classes/ChatConversationInfoView.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UICompositeView.h" -#import "UIRoundBorderedButton.h" - -@interface ChatConversationInfoView : UIViewController - -@property(nonatomic) BOOL create; -@property(nonatomic) BOOL imAdmin; -@property(nonatomic) BOOL encrypted; -@property(nonatomic, strong) NSMutableArray *contacts; -@property(nonatomic, strong) NSMutableArray *admins; -@property(nonatomic, strong) NSMutableArray *oldContacts; -@property(nonatomic, strong) NSMutableArray *oldAdmins; -@property(nonatomic) NSString *oldSubject; -@property(nonatomic) LinphoneChatRoom *room; -@property(nonatomic) LinphoneChatRoomCbs *chatRoomCbs; -@property(nonatomic) const char *peerAddress; -@property(nonatomic) const char *localAddress; - -@property (weak, nonatomic) IBOutlet UIIconButton *nextButton; -@property (weak, nonatomic) IBOutlet UIRoundBorderedButton *quitButton; -@property (weak, nonatomic) IBOutlet UIIconButton *addButton; -@property (weak, nonatomic) IBOutlet UITextField *nameLabel; -@property (weak, nonatomic) IBOutlet UITableView *tableView; -@property (weak, nonatomic) IBOutlet UIView *waitView; -@property (weak, nonatomic) IBOutlet UIView *participantsBar; - -+ (void)displayCreationError; - -- (IBAction)onNextClick:(id)sender; -- (IBAction)onBackClick:(id)sender; -- (IBAction)onQuitClick:(id)sender; - -@end diff --git a/Classes/ChatConversationInfoView.m b/Classes/ChatConversationInfoView.m deleted file mode 100644 index b5ea0ae06..000000000 --- a/Classes/ChatConversationInfoView.m +++ /dev/null @@ -1,467 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "ChatConversationInfoView.h" -#import "PhoneMainView.h" -#import "UIChatConversationInfoTableViewCell.h" -#import "linphoneapp-Swift.h" - -#import "linphone/core.h" - -@implementation ChatConversationInfoView - -#pragma mark - UICompositeViewDelegate Functions - -static UICompositeViewDescription *compositeDescription = nil; - -+ (UICompositeViewDescription *)compositeViewDescription { - if (compositeDescription == nil) { - compositeDescription = [[UICompositeViewDescription alloc] init:self.class - statusBar:StatusBarView.class - tabBar:TabBarView.class - sideMenu:SideMenuView.class - fullscreen:false - isLeftFragment:NO - fragmentWith:ChatsListView.class]; - } - return compositeDescription; -} - -- (UICompositeViewDescription *)compositeViewDescription { - return self.class.compositeViewDescription; -} - -+ (void)displayCreationError { - static UIAlertController *errorView = nil; - // avoid having multiple popups - [PhoneMainView.instance dismissViewControllerAnimated:YES completion:nil]; - errorView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Chat room creation error", nil) - message:NSLocalizedString(@"Chat room could not be created on server", nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - [errorView addAction:defaultAction]; - [PhoneMainView.instance presentViewController:errorView animated:YES completion:nil]; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self - action:@selector(dismissKeyboards)]; - tap.delegate = self; - [self.view addGestureRecognizer:tap]; - - UITapGestureRecognizer *particpantsBarTap = [[UITapGestureRecognizer alloc] initWithTarget:self - action:@selector(onAddClick:)]; - particpantsBarTap.delegate = self; - [_participantsBar addGestureRecognizer:particpantsBarTap]; - - _nameLabel.delegate = self; - _tableView.dataSource = self; - _tableView.delegate = self; - _admins = [[NSMutableArray alloc] init]; - _oldAdmins = [[NSMutableArray alloc] init]; - _oldContacts = [[NSMutableArray alloc] init]; - _room = NULL; - _chatRoomCbs = NULL; - _peerAddress = NULL; - _localAddress = NULL; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - _waitView.hidden = YES; - - [self configure]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(onLinphoneCoreReady:) - name:kLinphoneGlobalStateUpdate - object:nil]; - - NSDictionary* userInfo; - [NSNotificationCenter.defaultCenter addObserver:self - selector: @selector(receivePresenceNotification:) - name: @"LinphoneFriendPresenceUpdate" - object: userInfo]; -} - --(void) receivePresenceNotification:(NSNotification*)notification -{ - if ([notification.name isEqualToString:@"LinphoneFriendPresenceUpdate"]) - { - NSDictionary* userInfo = notification.userInfo; - NSString* friend = (NSString*)userInfo[@"friend"]; - - for (int i = 0; i < _contacts.count; i++) - { - - NSString *uri = _contacts[i]; - LinphoneAddress *addr = linphone_address_new(uri.UTF8String); - - if (addr != nil) { - char *curi = linphone_address_as_string_uri_only(addr); - NSString *uri = [NSString stringWithUTF8String:curi]; - - if([uri isEqual:friend]){ - NSIndexPath* indexPath = [NSIndexPath indexPathForRow:i inSection:0]; - NSArray* indexArray = [NSArray arrayWithObjects:indexPath, nil]; - [self.tableView reloadRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationFade]; - } - } - } - } -} - -- (void)viewWillDisappear:(BOOL)animated { - [NSNotificationCenter.defaultCenter removeObserver:self]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:@"LinphoneFriendPresenceUpdate" object:nil]; - [AvatarBridge removeAllObserver]; - if (!_room || !_chatRoomCbs) - return; - - linphone_chat_room_remove_callbacks(_room, _chatRoomCbs); - _chatRoomCbs = NULL; -} - -- (void)configure { - if (_create) - _room = NULL; - - _nameLabel.text = _room && linphone_chat_room_get_subject(_room) - ? [NSString stringWithUTF8String:linphone_chat_room_get_subject(_room)] - : @""; - _nextButton.enabled = _nameLabel.text.length > 0 && _contacts.count > 0; - LinphoneParticipant *me = _room && !linphone_chat_room_is_read_only(_room) - ? linphone_chat_room_get_me(_room) - : NULL; - _imAdmin = me - ? linphone_participant_is_admin(me) - : false; - _quitButton.hidden = _create || (me == NULL); - _nameLabel.enabled = _create || _imAdmin; - _addButton.hidden = !_create && !_imAdmin; - _nextButton.hidden = !_create && !_imAdmin; - - CGFloat height = _quitButton.hidden - ? self.view.frame.size.height - _tableView.frame.origin.y - : _quitButton.frame.origin.y - _tableView.frame.origin.y - 10; - [_tableView setFrame:CGRectMake( - _tableView.frame.origin.x, - _tableView.frame.origin.y, - _tableView.frame.size.width, - height - )]; - - if (_room) { - _chatRoomCbs = linphone_factory_create_chat_room_cbs(linphone_factory_get()); - linphone_chat_room_cbs_set_state_changed(_chatRoomCbs, main_view_chat_room_state_changed); - linphone_chat_room_cbs_set_subject_changed(_chatRoomCbs, chat_room_subject_changed); - linphone_chat_room_cbs_set_participant_added(_chatRoomCbs, chat_room_participant_added); - linphone_chat_room_cbs_set_participant_removed(_chatRoomCbs, chat_room_participant_removed); - linphone_chat_room_cbs_set_participant_admin_status_changed(_chatRoomCbs, chat_room_participant_admin_status_changed); - linphone_chat_room_cbs_set_user_data(_chatRoomCbs, (__bridge void*)self); - linphone_chat_room_add_callbacks(_room, _chatRoomCbs); - } - - [_tableView reloadData]; -} - -#pragma mark - next functions - -- (void)onLinphoneCoreReady:(NSNotification *)notif { - if ((LinphoneGlobalState)[[[notif userInfo] valueForKey:@"state"] integerValue] == LinphoneGlobalOn) { - if (!_create && _peerAddress && _localAddress) { - LinphoneAddress *peerAddr = linphone_core_create_address([LinphoneManager getLc], _peerAddress); - LinphoneAddress *localAddr = linphone_core_create_address([LinphoneManager getLc], _localAddress); - if (peerAddr && localAddr) { - _room = linphone_core_search_chat_room([LinphoneManager getLc], NULL, localAddr, peerAddr, NULL); - } - [self configure]; - } - } -} - -- (void)onCreate { - bctbx_list_t *addresses = NULL; - for (NSString *addr in _contacts) { - LinphoneAddress *linphoneAddress = linphone_address_new(addr.UTF8String); - if (!linphoneAddress) - continue; - - if (!addresses) { - addresses = bctbx_list_new((void *)linphoneAddress); - continue; - } - addresses = bctbx_list_append(addresses, (void *)linphoneAddress); - } - [PhoneMainView.instance createChatRoom:_nameLabel.text.UTF8String addresses:addresses andWaitView:_waitView isEncrypted:_encrypted isGroup:TRUE]; - bctbx_list_free_with_data(addresses, (void (*)(void *))linphone_address_unref); -} - -- (void)onValidate { - ChatConversationViewSwift *view = VIEW(ChatConversationViewSwift); - // Change subject if necessary - if (![_oldSubject isEqualToString:_nameLabel.text]) - linphone_chat_room_set_subject(_room, _nameLabel.text.UTF8String); - - // Add participants if necessary - bctbx_list_t *addedPartipants = NULL; - for (NSString *uri in _contacts) { - if ([_oldContacts containsObject:uri]) - continue; - - LinphoneAddress *addr = linphone_address_new(uri.UTF8String); - linphone_address_clean(addr);//keep only username@domain - if (addedPartipants) - addedPartipants = bctbx_list_append(addedPartipants, addr); - else - addedPartipants = bctbx_list_new(addr); - } - if (addedPartipants) { - linphone_chat_room_add_participants(_room, addedPartipants); - bctbx_list_free_with_data(addedPartipants, (void (*)(void *))linphone_address_unref); - } - - - // Remove participants if necessary - bctbx_list_t *removedPartipants = NULL; - for (NSString *uri in _oldContacts) { - if ([_contacts containsObject:uri]) - continue; - - LinphoneAddress *addr = linphone_address_new(uri.UTF8String); - LinphoneParticipant *participant = linphone_participant_ref(linphone_chat_room_find_participant(_room, addr)); - if (!participant) - continue; - - if (removedPartipants) - removedPartipants = bctbx_list_append(removedPartipants, participant); - else - removedPartipants = bctbx_list_new(participant); - - linphone_address_unref(addr); - } - if (removedPartipants) { - linphone_chat_room_remove_participants(_room, removedPartipants); - bctbx_list_free_with_data(removedPartipants, (void (*)(void *))linphone_participant_unref); - } - - // add admins if necessary - for (NSString *admin in _admins) { - if ([_oldAdmins containsObject:admin]) - continue; - - LinphoneAddress *addr = linphone_address_new(admin.UTF8String); - LinphoneParticipant *participant = linphone_chat_room_find_participant(_room, addr); - if (!participant) - continue; - - linphone_chat_room_set_participant_admin_status(_room, participant, true); - linphone_address_unref(addr); - } - - // remove admins if necessary - for (NSString *admin in _oldAdmins) { - if ([_admins containsObject:admin]) - continue; - - LinphoneAddress *addr = linphone_address_new(admin.UTF8String); - LinphoneParticipant *participant = linphone_chat_room_find_participant(_room, addr); - if (!participant) - continue; - - linphone_chat_room_set_participant_admin_status(_room, participant, false); - linphone_address_unref(addr); - } - [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; -} - -#pragma mark - Buttons responders - -- (IBAction)onNextClick:(id)sender { - if(_create) - [self onCreate]; - else - [self onValidate]; -} - -- (IBAction)onBackClick:(id)sender { - if(_create) { - ChatConversationCreateView *view = VIEW(ChatConversationCreateView); - [view fragmentCompositeDescription]; - view.tableController.contactsGroup = [_contacts mutableCopy]; - view.tableController.notFirstTime = TRUE; - view.isForEditing = FALSE; - view.isForVoipConference = FALSE; - [PhoneMainView.instance popToView:view.compositeViewDescription]; - } else { - ChatConversationViewSwift *view = VIEW(ChatConversationViewSwift); - [PhoneMainView.instance popToView:view.compositeViewDescription]; - } -} - -- (IBAction)onQuitClick:(id)sender { - NSString *msg = - [NSString stringWithFormat:NSLocalizedString(@"Do you want to leave this conversation?", nil)]; - [UIConfirmationDialog ShowWithMessage:msg - cancelMessage:nil - confirmMessage:NSLocalizedString(@"LEAVE", nil) - onCancelClick:^() {} - onConfirmationClick:^() { - linphone_chat_room_leave(_room); - }]; -} - -- (IBAction)onAddClick:(id)sender { - if (_create || _imAdmin) { - ChatConversationCreateView *view = VIEW(ChatConversationCreateView); - [view fragmentCompositeDescription]; - view.tableController.notFirstTime = TRUE; - view.isForEditing = !_create; - view.isGroupChat = TRUE; - view.tableController.contactsGroup = [_contacts mutableCopy]; - view.isForVoipConference = FALSE; - [PhoneMainView.instance popToView:view.compositeViewDescription]; - } -} - -#pragma mark - TableView - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 1; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return _contacts.count; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - NSString *kCellId = NSStringFromClass(UIChatConversationInfoTableViewCell.class); - UIChatConversationInfoTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId]; - if (cell == nil) { - cell = [[UIChatConversationInfoTableViewCell alloc] initWithIdentifier:kCellId]; - } - cell.uri = _contacts[indexPath.row]; - LinphoneAddress *addr = linphone_address_new(cell.uri.UTF8String); - cell.nameLabel.text = (addr == nil? cell.uri : [FastAddressBook displayNameForAddress:addr]); - [cell.avatarImage setImage:[FastAddressBook imageForAddress:addr]]; - cell.controllerView = self; - if(![_admins containsObject:cell.uri]) { - cell.adminLabel.enabled = FALSE; - cell.adminImage.image = [UIImage imageNamed:@"check_unselected.png"]; - } - cell.adminButton.hidden = _create || (!_imAdmin && !cell.adminLabel.enabled) || ![_oldContacts containsObject:cell.uri]; - cell.adminButton.userInteractionEnabled = _imAdmin; - cell.removeButton.hidden = !_create && !_imAdmin; - if (addr) - linphone_address_unref(addr); - - return cell; -} - -#pragma mark - searchBar delegate - -- (void)dismissKeyboards { - if ([_nameLabel isFirstResponder]) { - [_nameLabel resignFirstResponder]; - } -} - -#pragma mark - UITextFieldDelegate - -- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { - _nextButton.enabled = (!((string.length == 0 || string == nil || [string isEqual:@""]) && (textField.text.length == 1)) - && _contacts.count > 0); - return TRUE; -} - -#pragma mark - chat room callbacks - -- (void)myAdminStatusChanged:(BOOL)admin { - NSString *message = admin - ? NSLocalizedString(@"You are now an admin of the chat room", nil) - : NSLocalizedString(@"You are no longer an admin of the chat room", nil); - - static UIAlertController *alertView = nil; - // avoid having multiple popups - [PhoneMainView.instance dismissViewControllerAnimated:YES completion:nil]; - alertView = [UIAlertController alertControllerWithTitle:[NSString stringWithFormat:@"%@", message] - message:nil - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - [alertView addAction:defaultAction]; - [PhoneMainView.instance presentViewController:alertView animated:YES completion:nil]; -} - -void chat_room_subject_changed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { - ChatConversationInfoView *view = (__bridge ChatConversationInfoView *)linphone_chat_room_cbs_get_user_data(linphone_chat_room_get_current_callbacks(cr)); - view.nameLabel.text = [NSString stringWithUTF8String:linphone_event_log_get_subject(event_log)]; -} - -void chat_room_participant_added(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { - ChatConversationInfoView *view = (__bridge ChatConversationInfoView *)linphone_chat_room_cbs_get_user_data(linphone_chat_room_get_current_callbacks(cr)); - char *str = linphone_address_as_string(linphone_event_log_get_participant_address(event_log)); - NSString *participantAddress = [NSString stringWithUTF8String:str]; - ms_free(str); - [view.oldContacts addObject:participantAddress]; - [view.contacts addObject:participantAddress]; - [view.tableView reloadData]; -} - -void chat_room_participant_removed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { - ChatConversationInfoView *view = (__bridge ChatConversationInfoView *)linphone_chat_room_cbs_get_user_data(linphone_chat_room_get_current_callbacks(cr)); - char *str = linphone_address_as_string(linphone_event_log_get_participant_address(event_log)); - NSString *participantAddress = [NSString stringWithUTF8String:str]; - ms_free(str); - [view.oldContacts removeObject:participantAddress]; - [view.contacts removeObject:participantAddress]; - [view.tableView reloadData]; -} - -void chat_room_participant_admin_status_changed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { - ChatConversationInfoView *view = (__bridge ChatConversationInfoView *)linphone_chat_room_cbs_get_user_data(linphone_chat_room_get_current_callbacks(cr)); - char *str = linphone_address_as_string(linphone_event_log_get_participant_address(event_log)); - NSString *participantAddress = [NSString stringWithUTF8String:str]; - ms_free(str); - - LinphoneParticipant *me = linphone_chat_room_get_me(cr); - if (me && linphone_address_equal(linphone_participant_get_address(me), linphone_event_log_get_participant_address(event_log))) { - [view myAdminStatusChanged:(linphone_event_log_get_type(event_log) == LinphoneEventLogTypeConferenceParticipantSetAdmin)]; - [view viewWillAppear:TRUE]; - return; - } - - if (linphone_event_log_get_type(event_log) == LinphoneEventLogTypeConferenceParticipantSetAdmin) { - [view.admins addObject:participantAddress]; - [view.oldAdmins addObject:participantAddress]; - } else { // linphone_event_log_get_type(event_log) == LinphoneEventLogTypeConferenceParticipantUnsetAdmin - [view.admins removeObject:participantAddress]; - [view.oldAdmins removeObject:participantAddress]; - } - [view.tableView reloadData]; -} - -@end diff --git a/Classes/ChatConversationTableView.h b/Classes/ChatConversationTableView.h deleted file mode 100644 index f62ed074c..000000000 --- a/Classes/ChatConversationTableView.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#include "linphone/linphonecore.h" - -#import "linphone/api/c-event-log.h" -#import "linphone/api/c-chat-room.h" - -#import "UICheckBoxTableView.h" - - -@interface FileContext : NSObject -@property NSMutableArray *typesArray; -@property NSMutableArray *datasArray; -@property NSMutableArray *previewsArray; -@property NSMutableArray *namesArray; -@property NSMutableArray *uuidsArray; - -- (void)clear; -- (NSUInteger)count; -- (void)addObject:(NSData *)data name:(NSString *)name type:(NSString *)type; -@end - -@protocol ChatConversationDelegate - -- (BOOL)resendMultiFiles:(FileContext *)newFileContext message:(NSString *)message rootMessage:(LinphoneChatMessage *)rootMessage; -- (BOOL)resendFile:(NSData *)data withName:(NSString *)name type:(NSString *)type key:(NSString *)key message:(NSString *)message rootMessage:(LinphoneChatMessage *)rootMessage; -- (BOOL)startFileUpload:(NSData *)data withName:(NSString *)name rootMessage:(LinphoneChatMessage *)rootMessage; -- (void)resendChat:(NSString *)message withExternalUrl:(NSString *)url rootMessage:(LinphoneChatMessage *)rootMessage; -- (void)tableViewIsScrolling; - -@end - -@interface ChatConversationTableView : UICheckBoxTableView { - @private - NSMutableArray *eventList; - NSMutableArray *totalEventList; -} - -@property(nonatomic) LinphoneChatRoom *chatRoom; -@property(nonatomic) NSInteger currentIndex; -@property(nonatomic, strong) id chatRoomDelegate; -@property NSMutableDictionary *imagesInChatroom; -@property(nonatomic) NSTimer *ephemeralDisplayTimer; -@property (nullable, nonatomic) UIButton *floatingScrollButton; -@property (nullable, nonatomic) UILabel *scrollBadge; -@property (nullable, nonatomic) UIButton *floatingScrollBackground; - -- (void)addEventEntry:(LinphoneEventLog *)event; -- (void)scrollToBottom:(BOOL)animated; -- (void)scrollToLastUnread:(BOOL)animated; -- (void)updateEventEntry:(LinphoneEventLog *)event; -- (void)refreshData; -- (void)reloadData; -- (void) dismissMessagesPopups; -- (void) scrollToMessage:(LinphoneChatMessage *)message; -- (int) indexOfMesssage:(LinphoneChatMessage *)message; -- (void *)buildMessageCell:(LinphoneEventLog *) event; - -@end diff --git a/Classes/ChatConversationTableView.m b/Classes/ChatConversationTableView.m deleted file mode 100644 index 42d2d123a..000000000 --- a/Classes/ChatConversationTableView.m +++ /dev/null @@ -1,533 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "LinphoneManager.h" -#import "ChatConversationTableView.h" -#import "ChatConversationImdnView.h" -#import "UIChatBubblePhotoCell.h" -#import "UIChatNotifiedEventCell.h" -#import "PhoneMainView.h" -#import "linphoneapp-Swift.h" - -@implementation ChatConversationTableView - -#pragma mark - Lifecycle Functions - -- (void)dealloc { - [self clearEventList]; -} - - -#pragma mark - ViewController Functions - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - self.tableView.accessibilityIdentifier = @"ChatRoom list"; - _imagesInChatroom = [NSMutableDictionary dictionary]; - _currentIndex = 0; - [self startEphemeralDisplayTimer]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(ephemeralDeleted:) - name:kLinphoneEphemeralMessageDeletedInRoom - object:nil]; -} - --(void) viewWillDisappear:(BOOL)animated { - [self dismissMessagesPopups]; - [self stopEphemeralDisplayTimer]; - [NSNotificationCenter.defaultCenter removeObserver:self]; - [super viewWillDisappear:animated]; - [_floatingScrollButton setHidden:TRUE]; -} - -#pragma mark - - -- (void)clearEventList { - for (NSValue *value in totalEventList) { - LinphoneEventLog *event = value.pointerValue; - linphone_event_log_unref(event); - } - [eventList removeAllObjects]; - [totalEventList removeAllObjects]; -} - --(bool) eventTypeIsOfInterestForOneToOneRoom:(LinphoneEventLogType)type { - return - type == LinphoneEventLogTypeConferenceChatMessage || - type == LinphoneEventLogTypeConferenceEphemeralMessageEnabled || - type == LinphoneEventLogTypeConferenceEphemeralMessageDisabled || - type == LinphoneEventLogTypeConferenceEphemeralMessageLifetimeChanged; -} - -- (void)updateData { - [self clearEventList]; - if (!_chatRoom) - return; - - LinphoneChatRoomCapabilitiesMask capabilities = linphone_chat_room_get_capabilities(_chatRoom); - 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); - totalEventList = [[NSMutableArray alloc] initWithCapacity:listSize]; - eventList = [[NSMutableArray alloc] initWithCapacity:MIN(listSize, BASIC_EVENT_LIST)]; - BOOL autoDownload = (linphone_core_get_max_size_for_auto_download_incoming_files(LC) > -1); - while (chatRoomEvents) { - LinphoneEventLog *event = (LinphoneEventLog *)chatRoomEvents->data; - if (oneToOne && ![self eventTypeIsOfInterestForOneToOneRoom:linphone_event_log_get_type(event)]) { - 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)]]; - if (listSize <= BASIC_EVENT_LIST) { - [eventList addObject:[NSValue valueWithPointer:linphone_event_log_ref(event)]]; - } - } - - chatRoomEvents = chatRoomEvents->next; - listSize -= 1; - } - } - bctbx_list_free_with_data(head, (bctbx_list_free_func)linphone_event_log_unref); -} - -- (void)refreshData { - if (totalEventList.count <= eventList.count) { - _currentIndex = 0; - return; - } - - NSUInteger num = MIN(totalEventList.count-eventList.count, BASIC_EVENT_LIST); - _currentIndex = num - 1; - while (num) { - NSInteger index = totalEventList.count - eventList.count - 1; - [eventList insertObject:[totalEventList objectAtIndex:index] atIndex:0]; - index -= 1; - num -= 1; - } -} - -- (void)reloadData { - [self updateData]; - [self.tableView reloadData]; - [self scrollToLastUnread:false]; -} - -- (void)addEventEntry:(LinphoneEventLog *)event { - [eventList addObject:[NSValue valueWithPointer:linphone_event_log_ref(event)]]; - [totalEventList addObject:[NSValue valueWithPointer:linphone_event_log_ref(event)]]; - int pos = (int)eventList.count - 1; - NSIndexPath *indexPath = [NSIndexPath indexPathForRow:pos inSection:0]; - [self.tableView beginUpdates]; - [self.tableView insertRowsAtIndexPaths:@[ indexPath ] withRowAnimation:UITableViewRowAnimationFade]; - [self.tableView endUpdates]; -} - -- (void)updateEventEntry:(LinphoneEventLog *)event { - NSInteger index = [eventList indexOfObject:[NSValue valueWithPointer:event]]; - if (index < 0) { - LOGW(@"event entry doesn't exist"); - return; - } - [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:index inSection:0]] - withRowAnimation:FALSE]; // just reload - return; -} - -- (void)scrollToBottom:(BOOL)animated { - //[self.tableView reloadData]; - size_t count = eventList.count; - if (!count) - return; - - //[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:(count - 1) inSection:0]]; - [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:(count - 1) inSection:0] - atScrollPosition:UITableViewScrollPositionBottom - animated:animated]; - if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) - [ChatConversationViewSwift markAsRead:_chatRoom]; -} - -- (void)scrollToLastUnread:(BOOL)animated { - if (eventList.count == 0 || _chatRoom == nil) - return; - - int index = -1; - size_t count = eventList.count; - // Find first unread & set all entry read - for (int i = (int)count - 1; i > 0; --i) { - LinphoneEventLog *event = [[eventList objectAtIndex:i] pointerValue]; - if (!(linphone_event_log_get_type(event) == LinphoneEventLogTypeConferenceChatMessage)) - break; - - LinphoneChatMessage *chat = linphone_event_log_get_chat_message(event); - int read = linphone_chat_message_is_read(chat); - LinphoneChatMessageState state = linphone_chat_message_get_state(chat); - if (read == 0 && - !(state == LinphoneChatMessageStateFileTransferError || state == LinphoneChatMessageStateNotDelivered)) { - if (index == -1) { - index = i; - break; - } - } - } - if (index == -1 && count > 0) - index = (int)count - 1; - - if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) - [ChatConversationViewSwift markAsRead:_chatRoom]; - - // Scroll to unread - if (index < 0) - return; - - [self.tableView.layer removeAllAnimations]; - [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:index inSection:0] - atScrollPosition:UITableViewScrollPositionTop - animated:animated]; -} - - -- (void) scrollToMessage:(LinphoneChatMessage *)message { - int index = [self indexOfMesssage:message]; - if (index < 0) - return; - - [self.tableView.layer removeAllAnimations]; - [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:index inSection:0] - atScrollPosition:UITableViewScrollPositionTop - animated:true]; -} - --(int) indexOfMesssage:(LinphoneChatMessage *)message { - if (eventList.count == 0 || _chatRoom == nil) - return -1; - - const char *msgId = linphone_chat_message_get_message_id(message); - - int index = -1; - size_t count = eventList.count; - for (int i = (int)count - 1; i > 0; --i) { - LinphoneEventLog *event = [[eventList objectAtIndex:i] pointerValue]; - LinphoneChatMessage *chat = linphone_event_log_get_chat_message(event); - if (!chat) - continue; - if (!strcmp(msgId, linphone_chat_message_get_message_id(chat))) { - index = i; - break; - } - - } - return index; -} - -#pragma mark - Property Functions - -- (void)setChatRoom:(LinphoneChatRoom *)room { - _chatRoom = room; - [self reloadData]; - [self updateEphemeralTimes]; -} - -static const int MAX_AGGLOMERATED_TIME=300; -static const int BASIC_EVENT_LIST=15; - -- (BOOL)isFirstIndexInTableView:(NSIndexPath *)indexPath chat:(LinphoneChatMessage *)chat { - LinphoneEventLog *previousEvent = nil; - NSInteger indexOfPreviousEvent = indexPath.row - 1; - if (indexOfPreviousEvent > -1) { - previousEvent = [[eventList objectAtIndex:indexOfPreviousEvent] pointerValue]; - if (linphone_event_log_get_type(previousEvent) != LinphoneEventLogTypeConferenceChatMessage) { - return TRUE; - } - } - if (!previousEvent) - return TRUE; - - LinphoneChatMessage *previousChat = linphone_event_log_get_chat_message(previousEvent); - if (!linphone_address_equal(linphone_chat_message_get_from_address(previousChat), linphone_chat_message_get_from_address(chat))) { - return TRUE; - } - // the maximum interval between 2 agglomerated chats at 5mn - if ((linphone_chat_message_get_time(chat)-linphone_chat_message_get_time(previousChat)) > MAX_AGGLOMERATED_TIME) { - return TRUE; - } - - return FALSE; -} - -- (BOOL)isLastIndexInTableView:(NSIndexPath *)indexPath chat:(LinphoneChatMessage *)chat { - LinphoneEventLog *nextEvent = nil; - NSInteger indexOfNextEvent = indexPath.row + 1; - while (!nextEvent && indexOfNextEvent < [eventList count]) { - LinphoneEventLog *tmp = [[eventList objectAtIndex:indexOfNextEvent] pointerValue]; - if (linphone_event_log_get_type(tmp) == LinphoneEventLogTypeConferenceChatMessage) { - nextEvent = tmp; - } - ++indexOfNextEvent; - } - - if (!nextEvent) - return TRUE; - - LinphoneChatMessage *nextChat = linphone_event_log_get_chat_message(nextEvent); - if (!linphone_address_equal(linphone_chat_message_get_from_address(nextChat), linphone_chat_message_get_from_address(chat))) { - return TRUE; - } - - return FALSE; -} - -#pragma mark - UITableViewDataSource Functions - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 1; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return eventList.count; -} - -- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath { - if (!_chatRoom && [[cell reuseIdentifier] isEqualToString:@"UIChatBubblePhotoCell"]) { - [(UIChatBubbleTextCell *)cell clearEncryptedFiles]; - } - if ([cell isKindOfClass:[UIChatBubbleTextCell class]] ||[cell isKindOfClass:[UIChatBubblePhotoCell class]]) - [(UIChatBubbleTextCell *)cell dismissPopup]; -} - --(void) dismissMessagesPopups { - for (UITableViewCell *cell in self.tableView.visibleCells) { - if (![[cell reuseIdentifier] isEqualToString:NSStringFromClass(UIChatNotifiedEventCell.class)]) - [(UIChatBubbleTextCell *)cell dismissPopup]; - } -} - --(UIChatBubbleTextCell *)buildMessageCell:(LinphoneEventLog *) event { - NSString *kCellId = nil; - LinphoneChatMessage *chat = linphone_event_log_get_chat_message(event); - BOOL isConferenceIcs = [ICSBubbleView isConferenceInvitationMessageWithCmessage:chat]; - if (!isConferenceIcs && (linphone_chat_message_get_file_transfer_information(chat) || linphone_chat_message_get_external_body_url(chat))) - kCellId = NSStringFromClass(UIChatBubblePhotoCell.class); - else - kCellId = NSStringFromClass(UIChatBubbleTextCell.class); - // To use less memory and to avoid overlapping. To be improved. - UIChatBubbleTextCell *cell = [self.tableView dequeueReusableCellWithIdentifier:kCellId]; - cell = [[NSClassFromString(kCellId) alloc] initWithIdentifier:kCellId]; - [cell setEvent:event]; - return cell; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - NSString *kCellId = nil; - LinphoneEventLog *event = [[eventList objectAtIndex:indexPath.row] pointerValue]; - if (linphone_event_log_get_type(event) == LinphoneEventLogTypeConferenceChatMessage) { - UIChatBubbleTextCell *cell = [self buildMessageCell:event]; - LinphoneChatMessage *chat = linphone_event_log_get_chat_message(event); - if (chat) { - cell.isFirst = [self isFirstIndexInTableView:indexPath chat:chat]; - cell.isLast = [self isLastIndexInTableView:indexPath chat:chat]; - [cell update]; - } - [cell setChatRoomDelegate:_chatRoomDelegate]; - [super accessoryForCell:cell atPath:indexPath]; - cell.selectionStyle = UITableViewCellSelectionStyleNone; - cell.tableController = self; - cell.popupMenuAllowed = true; - return cell; - } else { - kCellId = NSStringFromClass(UIChatNotifiedEventCell.class); - UIChatNotifiedEventCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId]; - if (!cell) - cell = [[NSClassFromString(kCellId) alloc] initWithIdentifier:kCellId]; - - [cell setEvent:event]; - [super accessoryForCell:cell atPath:indexPath]; - cell.selectionStyle = UITableViewCellSelectionStyleNone; - return cell; - } -} - -#pragma mark - UITableViewDelegate Functions - -- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { - [_chatRoomDelegate tableViewIsScrolling]; -} - -- (void)scrollViewDidScroll:(UIScrollView *)scrollView { - if (scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.frame.size.height)) { - if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) - [ChatConversationViewSwift markAsRead:_chatRoom]; - } -} - -static const CGFloat MESSAGE_SPACING_PERCENTAGE = 1.f; - -- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { - LinphoneEventLog *event = [[eventList objectAtIndex:indexPath.row] pointerValue]; - if (linphone_event_log_get_type(event) == LinphoneEventLogTypeConferenceChatMessage) { - LinphoneChatMessage *chat = linphone_event_log_get_chat_message(event); - //If the message is followed by another one that is not from the same address, we add a little space under it - CGFloat height = 0; - if ([self isLastIndexInTableView:indexPath chat:chat]) - height += tableView.frame.size.height * MESSAGE_SPACING_PERCENTAGE / 100; - if (![self isFirstIndexInTableView:indexPath chat:chat]) - height -= 20; - return [UIChatBubbleTextCell ViewHeightForMessage:chat withWidth:self.view.frame.size.width].height + height; - } - return [UIChatNotifiedEventCell height]; -} - -- (void) tableView:(UITableView *)tableView deleteRowAtIndex:(NSIndexPath *)indexPath { - [tableView beginUpdates]; - LinphoneEventLog *event = [[eventList objectAtIndex:indexPath.row] pointerValue]; - linphone_event_log_delete_from_database(event); - NSInteger index = indexPath.row + _currentIndex + (totalEventList.count - eventList.count); - if (index < totalEventList.count) - [totalEventList removeObjectAtIndex:index]; - [eventList removeObjectAtIndex:indexPath.row]; - - [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] - withRowAnimation:UITableViewRowAnimationBottom]; - [tableView endUpdates]; - [self loadData]; -} - -- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView - leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath { - - LinphoneEventLog *event = [[eventList objectAtIndex:indexPath.row] pointerValue]; - - if (linphone_event_log_get_type(event) != LinphoneEventLogTypeConferenceChatMessage) { - return [UISwipeActionsConfiguration configurationWithActions:@[]]; - } - - 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(ChatConversationViewSwift) initiateReplyViewForMessage:msg]; - [self scrollToBottom:TRUE]; - }]; - - UISwipeActionsConfiguration *swipeActionConfig = [UISwipeActionsConfiguration configurationWithActions:@[replyAction]]; - swipeActionConfig.performsFirstActionWithFullSwipe = YES; - return swipeActionConfig; -} - -- (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)) { - ChatConversationImdnView *view = VIEW(ChatConversationImdnView); - view.event = event; - [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 { - [super removeSelectionUsing:^(NSIndexPath *indexPath) { - LinphoneEventLog *event = [[eventList objectAtIndex:indexPath.row] pointerValue]; - if (linphone_event_log_get_chat_message(event)) { - linphone_chat_room_delete_message(_chatRoom, linphone_event_log_get_chat_message(event)); - } else { - linphone_event_log_delete_from_database(event); - } - NSInteger index = indexPath.row + _currentIndex + (totalEventList.count - eventList.count); - if (index < totalEventList.count) - [totalEventList removeObjectAtIndex:index]; - [eventList removeObjectAtIndex:indexPath.row]; - }]; -} - -#pragma mark ephemeral messages - --(void) startEphemeralDisplayTimer { - _ephemeralDisplayTimer = [NSTimer scheduledTimerWithTimeInterval:1 - target:self - selector:@selector(updateEphemeralTimes) - userInfo:nil - repeats:YES]; -} - --(void) updateEphemeralTimes { - NSDateComponentsFormatter *f= [[NSDateComponentsFormatter alloc] init]; - f.unitsStyle = NSDateComponentsFormatterUnitsStylePositional; - f.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad; - - for (NSValue *v in eventList) { - LinphoneEventLog *event = [v pointerValue]; - if (linphone_event_log_get_type(event) == LinphoneEventLogTypeConferenceChatMessage) { - LinphoneChatMessage *msg = linphone_event_log_get_chat_message(event); - if (linphone_chat_message_is_ephemeral(msg)) { - UIChatBubbleTextCell *cell = (UIChatBubbleTextCell *)[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:[eventList indexOfObject:v] inSection:0]]; - long duration = linphone_chat_message_get_ephemeral_expire_time(msg) == 0 ? - linphone_chat_room_get_ephemeral_lifetime(linphone_chat_message_get_chat_room(msg)) : - linphone_chat_message_get_ephemeral_expire_time(msg)-[NSDate date].timeIntervalSince1970; - f.allowedUnits = (duration > 86400 ? kCFCalendarUnitDay : 0)|(duration > 3600 ? kCFCalendarUnitHour : 0)|kCFCalendarUnitMinute|kCFCalendarUnitSecond; - cell.ephemeralTime.text = [f stringFromTimeInterval:duration]; - cell.ephemeralTime.hidden = NO; - cell.ephemeralIcon.hidden = NO; - } - } - } -} - --(void) stopEphemeralDisplayTimer { - [_ephemeralDisplayTimer invalidate]; -} - -- (void)ephemeralDeleted:(NSNotification *)notif { - LinphoneChatRoom *r =[[notif.userInfo objectForKey:@"room"] pointerValue]; - if (r ==_chatRoom) - [self reloadData]; -} - - -@end diff --git a/Classes/ChatConversationView.h b/Classes/ChatConversationView.h deleted file mode 100644 index 16ab31f55..000000000 --- a/Classes/ChatConversationView.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import -#import - -#import "UIToggleButton.h" -#import "UICompositeView.h" -#import "ChatConversationTableView.h" -#import "ImagePickerView.h" -#import "OrderedDictionary.h" -#import "UIRoundedImageView.h" -#import "UIBackToCallButton.h" -#import "Utils/HPGrowingTextView/HPGrowingTextView.h" -#import "UIImageViewDeletable.h" -#import "UIConfirmationDialog.h" -#import "UIInterfaceStyleButton.h" -#import "UIChatReplyBubbleView.h" -#include "linphone/linphonecore.h" - - -//Quicklook Preview Item -@interface PreviewItem : NSObject -@property(readonly, nonatomic) NSURL *previewItemURL; -@property(readonly, nonatomic) NSString *previewItemTitle; -@end - -//QuickLook Datasource for rending PDF docs -@interface FileDataSource : NSObject -@property NSMutableArray *files; -@end - -@interface ChatConversationView - : TPMultiLayoutViewController { - OrderedDictionary *imageQualities; - BOOL scrollOnGrowingEnabled; - BOOL composingVisible; - UIConfirmationDialog *securityDialog; - UIRefreshControl *refreshControl; - BOOL isOneToOne; - BOOL isEncrypted; -} - -@property(nonatomic) LinphoneChatRoom *chatRoom; -@property(nonatomic) LinphoneChatRoomCbs *chatRoomCbs; -@property(nonatomic) Boolean markAsRead; -@property(nonatomic) const char *peerAddress; -@property(nonatomic) const char *localAddress; - -@property (strong, nonatomic) FileDataSource *FileDataSource; - -@property(weak, nonatomic) IBOutlet UIButton *backButton; -@property(nonatomic, strong) IBOutlet ChatConversationTableView *tableController; -@property(weak, nonatomic) IBOutlet HPGrowingTextView *messageField; -@property(weak, nonatomic) IBOutlet UIView *topBar; -@property(nonatomic, strong) IBOutlet UIButton *sendButton; -@property(nonatomic, strong) IBOutlet UILabel *addressLabel; -@property(nonatomic, strong) IBOutlet UIView *chatView; -@property(nonatomic, strong) IBOutlet UIView *messageView; -@property(nonatomic, strong) IBOutlet UITapGestureRecognizer *listTapGestureRecognizer; -@property(nonatomic, strong) IBOutlet UISwipeGestureRecognizer *listSwipeGestureRecognizer; -@property(strong, nonatomic) IBOutlet UILabel *composeLabel; -@property(strong, nonatomic) IBOutlet UIView *composeIndicatorView; -@property(nonatomic, strong) IBOutlet UIButton *pictureButton; -@property(weak, nonatomic) IBOutlet UIButton *callButton; -@property(weak, nonatomic) IBOutlet UIBackToCallButton *backToCallButton; -@property (weak, nonatomic) IBOutlet UILabel *particpantsLabel; -@property NSMutableArray *qualitySettingsArray; -@property (weak, nonatomic) IBOutlet UICollectionView *imagesCollectionView; -@property (weak, nonatomic) IBOutlet UIView *imagesView; -@property (weak, nonatomic) IBOutlet UIButton *encryptedButton; -@property (weak, nonatomic) IBOutlet UIInterfaceStyleButton *toggleSelectionButton; -@property FileContext *fileContext; -@property (weak, nonatomic) IBOutlet UITableView *popupMenu; -@property (weak, nonatomic) IBOutlet UIInterfaceStyleButton *toggleMenuButton; -@property (weak, nonatomic) IBOutlet UIImageView *ephemeralndicator; - - -// Voice recording -@property (strong, nonatomic) IBOutlet UIView *vrView; -@property (weak, nonatomic) IBOutlet UIView *vrInnerView; -@property (weak, nonatomic) IBOutlet UIButton *vrDeleteButton; -@property (weak, nonatomic) IBOutlet UIButton *vrPlayButton; -@property (weak, nonatomic) IBOutlet UIImageView *vrWave; -@property (weak, nonatomic) IBOutlet UIView *vrWaveMask; -@property (weak, nonatomic) IBOutlet UIView *vrWaveMaskPlayer; -@property (weak, nonatomic) IBOutlet UILabel *vrDurationLabel; -@property NSTimer *vrRecordTimer; -@property NSTimer *vrPlayerTimer; -@property (weak, nonatomic) IBOutlet UIButton *toggleRecord; -@property BOOL isVoiceRecording; -@property BOOL isPendingVoiceRecord; -@property BOOL isPlayingVoiceRecording; -@property LinphoneRecorder *voiceRecorder; -@property LinphonePlayer *sharedVoicePlayer; -@property BOOL showVoiceRecorderView; -@property BOOL preservePendingActions; -@property BOOL *sharingMedia; - -// Reply -@property (weak, nonatomic) IBOutlet UIView *replyView; -@property BOOL showReplyView; -@property UIChatReplyBubbleView *replyBubble; - -// Forward -@property LinphoneChatMessage *pendingForwardMessage; - - -+ (void)markAsRead:(LinphoneChatRoom *)chatRoom; -+ (void)autoDownload:(LinphoneChatMessage *)message; -+(NSString *)getKeyFromFileType:(NSString *)fileType fileName:(NSString *)name; -+ (NSURL *)getFileUrl:(NSString *)name; -+ (void)writeFileInImagesDirectory:(NSData *)data name:(NSString *)name; -+ (NSData *)getFileData:(NSString *)name; -+ (void)writeMediaToGallery:(NSString *)name fileType:(NSString *)fileType; -+(UIImage *)getBasicImage; -+(UIImage*)drawText:(NSString*)text image:(UIImage *)image textSize:(CGFloat)textSize; -+(BOOL) isBasicChatRoom:(LinphoneChatRoom *)room; - -- (void)configureForRoom:(BOOL)editing; -- (IBAction)onBackClick:(id)event; -- (IBAction)onEditClick:(id)event; -- (IBAction)onMessageChange:(id)sender; -- (IBAction)onSendClick:(id)event; -- (IBAction)onPictureClick:(id)event; -- (IBAction)onListTap:(id)sender; -- (IBAction)onCallClick:(id)sender; -- (IBAction)onDeleteClick:(id)sender; -- (IBAction)onEditionChangeClick:(id)sender; -- (IBAction)onEncryptedDevicesClick:(id)sender; -- (void)update; -- (void)openFileWithURL:(NSURL *)url; -- (void)openFileWithURLs:(NSMutableArray*)urls index:(NSInteger)currentIndex; -- (void)clearMessageView; -- (void)configureMessageField; - -- (void)showFileDownloadError; -- (NSURL *)getICloudFileUrl:(NSString *)name; -- (void)removeCallBacks; - --(void) startSharedPlayer:(const char *)path; --(void) stopSharedPlayer; --(BOOL) sharedPlayedIsPlaying:(const char *)path; - --(void) initiateReplyViewForMessage:(LinphoneChatMessage *)message; - --(void) stopVoiceRecording; - -@end diff --git a/Classes/ChatConversationView.m b/Classes/ChatConversationView.m deleted file mode 100644 index 15eeb882e..000000000 --- a/Classes/ChatConversationView.m +++ /dev/null @@ -1,2297 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "linphoneapp-Swift.h" -#import "ChatConversationView.h" -#import "PhoneMainView.h" -#import "Utils.h" -#import "FileTransferDelegate.h" -#import "UIChatBubbleTextCell.h" -#import "DevicesListView.h" -#import "SVProgressHUD.h" -#import "EphemeralSettingsView.h" -#import "Utils.h" - -@implementation FileContext - -- (void)addObject:(UIImage *)image withQuality:(float)quality { - NSString *name = [NSString stringWithFormat:@"%li-%f.jpg", (long)image.hash, [NSDate timeIntervalSinceReferenceDate]]; - NSData *data = UIImageJPEGRepresentation(image, quality); - - [self addObject:data name:name type:@"image" image:image]; -} - -- (void)addObject:(NSData *)data name:(NSString *)name type:(NSString *)type image:(UIImage *)image { - [_previewsArray addObject:image]; - [_uuidsArray addObject:[NSUUID UUID]]; - [self addObject:data name:name type:type]; -} - -- (void)addObject:(NSData *)data name:(NSString *)name type:(NSString *)type { - [_namesArray addObject:name]; - [_typesArray addObject:type]; - [_datasArray addObject:data]; -} - -- (void)deleteContentWithUuid:(NSUUID *)uuid { - NSUInteger key = [_uuidsArray indexOfObject:uuid]; - [_previewsArray removeObjectAtIndex:key]; - [_uuidsArray removeObjectAtIndex:key]; - [_namesArray removeObjectAtIndex:key]; - [_typesArray removeObjectAtIndex:key]; - [_datasArray removeObjectAtIndex:key]; -} - -- (void)clear { - _previewsArray = [NSMutableArray array]; - _uuidsArray = [NSMutableArray array]; - _namesArray = [NSMutableArray array]; - _typesArray = [NSMutableArray array]; - _datasArray = [NSMutableArray array]; -} - -- (NSUInteger)count { - return [_datasArray count]; -} - -@end - - -@implementation PreviewItem -- (instancetype)initPreviewURL:(NSURL *)docURL - WithTitle:(NSString *)title { - self = [super init]; - if (self) { - _previewItemURL = [docURL copy]; - _previewItemTitle = [title copy]; - } - return self; -} -@end - -@implementation FileDataSource -- (instancetype)initWithFiles:(NSMutableArray*)files { - self = [super init]; - if (self) { - _files = files; - } - return self; -} -- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller { - return _files.count; -} -- (id)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index { - NSURL *url = [_files objectAtIndex:index]; - return [[PreviewItem alloc] initPreviewURL:url WithTitle:[url lastPathComponent]]; -} -@end - -@implementation ChatConversationView - -#pragma mark - Lifecycle Functions - -- (id)init { - self = [super initWithNibName:NSStringFromClass(self.class) bundle:[NSBundle mainBundle]]; - if (self != nil) { - scrollOnGrowingEnabled = TRUE; - _chatRoom = NULL; - _chatRoomCbs = NULL; - securityDialog = NULL; - isOneToOne = TRUE; - isEncrypted = FALSE; - imageQualities = [[OrderedDictionary alloc] - initWithObjectsAndKeys:[NSNumber numberWithFloat:0.9], NSLocalizedString(@"Maximum", nil), - [NSNumber numberWithFloat:0.5], NSLocalizedString(@"Average", nil), - [NSNumber numberWithFloat:0.0], NSLocalizedString(@"Minimum", nil), nil]; - composingVisible = false; - [self initSharedPlayer]; - } - return self; -} - -- (void)dealloc { - [NSNotificationCenter.defaultCenter removeObserver:self]; -} - -#pragma mark - UICompositeViewDelegate Functions - -static UICompositeViewDescription *compositeDescription = nil; - -+ (UICompositeViewDescription *)compositeViewDescription { - if (compositeDescription == nil) { - compositeDescription = [[UICompositeViewDescription alloc] init:self.class - statusBar:StatusBarView.class - tabBar:IPAD ? TabBarView.class :nil - sideMenu:SideMenuView.class - fullscreen:false - isLeftFragment:NO - fragmentWith:ChatsListView.class]; - } - return compositeDescription; -} - -- (UICompositeViewDescription *)compositeViewDescription { - return self.class.compositeViewDescription; -} - - -+ (void)markAsRead:(LinphoneChatRoom *)chatRoom { - if (!chatRoom) - return; - - linphone_chat_room_mark_as_read(chatRoom); - if (IPAD) { - ChatsListView *listView = VIEW(ChatsListView); - [listView.tableController markCellAsRead:chatRoom]; - } - [PhoneMainView.instance updateApplicationBadgeNumber]; -} - -#pragma mark - ViewController Functions - -- (void)viewDidLoad { - [super viewDidLoad]; - _markAsRead = TRUE; - // if we use fragments, remove back button - if (IPAD) { - _backButton.hidden = YES; - _backButton.alpha = 0; - } - - refreshControl = [[UIRefreshControl alloc]init]; - [refreshControl addTarget:self action:@selector(refreshData) forControlEvents:UIControlEventValueChanged]; - _tableController.refreshControl = refreshControl; - - _messageField.minNumberOfLines = 1; - _messageField.maxNumberOfLines = IPAD ? 10 : 3; - _messageField.delegate = self; - _messageField.font = [UIFont systemFontOfSize:18.0f]; - _messageField.contentInset = UIEdgeInsetsMake(-15, 0, 0, 0); - // _messageField.internalTextView.scrollIndicatorInsets = UIEdgeInsetsMake(0, 0, 0, 10); - [_tableController setChatRoomDelegate:self]; - [_imagesCollectionView registerClass:[UIImageViewDeletable class] forCellWithReuseIdentifier:NSStringFromClass([UIImageViewDeletable class])]; - [_imagesCollectionView setDataSource:self]; - [_imagesCollectionView setDelegate:self]; - [_toggleSelectionButton setImage:[UIImage imageNamed:@"select_all_default.png"] forState:UIControlStateSelected]; - - _vrInnerView.layer.cornerRadius = 5.0f; - _vrInnerView.layer.masksToBounds = YES; - _vrWaveMaskPlayer.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"color_L"]]; // rgba(1,88,7,0.2); - _showVoiceRecorderView = false; - _toggleMenuButton.imageView.contentMode = UIViewContentModeScaleAspectFit; - _toggleRecord.imageView.contentMode = UIViewContentModeScaleAspectFit; -} - -- (void)refreshData { - [_tableController refreshData]; - [refreshControl endRefreshing]; - if (_tableController.totalNumberOfItems == 0) - return; - [_tableController loadData]; - [_tableController.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:_tableController.currentIndex inSection:0] - atScrollPosition:UITableViewScrollPositionTop - animated:false]; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - if (!_chatRoom) - [self onLinphoneCoreReady:nil]; - - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(applicationDidEnterBackground) - name:UIApplicationDidEnterBackgroundNotification - object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(applicationWillEnterForeground) - name:UIApplicationWillEnterForegroundNotification - object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(keyboardWillShow:) - name:UIKeyboardWillShowNotification - object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(keyboardWillHide:) - name:UIKeyboardWillHideNotification - object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(onMessageChange:) - name:UITextViewTextDidChangeNotification - object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(callUpdateEvent:) - name:kLinphoneCallUpdate - object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(onLinphoneCoreReady:) - name:kLinphoneGlobalStateUpdate - object:nil]; - - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(endVoicePlayingIfDoingSO:) - name:kLinphoneVoiceMessagePlayerLostFocus - object:nil]; - - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(endVoicePlayingIfDoingSO:) - name:kLinphoneVoiceMessagePlayerEOF - object:nil]; - if ([_fileContext count] > 0) { - [UIView animateWithDuration:0 - delay:0 - options:UIViewAnimationOptionBeginFromCurrentState - animations:^{ - // resizing imagesView - CGRect imagesFrame = [_imagesView frame]; - imagesFrame.origin.y = [_messageView frame].origin.y - 120; - imagesFrame.size.height = 120; - [_imagesView setFrame:imagesFrame]; - // resizing chatTable - CGRect tableViewFrame = [_tableController.tableView frame]; - tableViewFrame.size.height -= 120; - [_tableController.tableView setFrame:tableViewFrame]; - [self updateFramesInclRecordingAndReplyView]; - } completion:nil]; - } - [self configureForRoom:self.editing]; - - // Resize the popup table depending on wether ephemeral messages are enabled or not. - CGRect popupFrame = _popupMenu.frame; - popupFrame.size.height = 44 * [_popupMenu numberOfRowsInSection:0]; - _popupMenu.frame = popupFrame; - - // Voice recording & Replies - _vrView.hidden = true; - _toggleRecord.enabled = linphone_core_get_calls_nb(LC) == 0; - _replyView.hidden = true; - _preservePendingActions = false; - - _toggleRecord.enabled = linphone_core_get_calls_nb(LC) == 0; - - [PhoneMainView.instance hideTabBar:!IPAD]; -} - -- (void)viewWillDisappear:(BOOL)animated { - - if (!_preservePendingActions) - [self cancelVoiceRecording]; - - if (!_preservePendingActions) - [self closePendingReply]; - - - - else if (_isVoiceRecording) - [self stopVoiceRecording]; - - [super viewWillDisappear:animated]; - - [self removeCallBacks]; - - [_messageField resignFirstResponder]; - - [self setComposingVisible:false withDelay:0]; // will hide the "user is composing.." message - - [self stopAllPlays]; - - [NSNotificationCenter.defaultCenter removeObserver:self]; - PhoneMainView.instance.currentRoom = NULL; - [[UIApplication sharedApplication] setIdleTimerDisabled:false]; - _chatRoom = NULL; - _tableController.chatRoom = nil; -} - -- (void)removeCallBacks { - if (_chatRoom && _chatRoomCbs) { - linphone_chat_room_remove_callbacks(_chatRoom, _chatRoomCbs); - _chatRoomCbs = NULL; - } -} - -- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { - [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; - if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground) { - [self refreshImageDrawer]; - return; - } - composingVisible = !composingVisible; - - // force offset recomputing - [_messageField refreshHeight]; - LinphoneAddress *peerAddr = linphone_core_create_address([LinphoneManager getLc], _peerAddress); - LinphoneAddress *localAddr = linphone_core_create_address([LinphoneManager getLc], _localAddress); - if (peerAddr && localAddr) { - _chatRoom = linphone_core_search_chat_room([LinphoneManager getLc], NULL, localAddr, peerAddr, NULL); - if (_chatRoom) { - isOneToOne = linphone_chat_room_get_capabilities(_chatRoom) & LinphoneChatRoomCapabilitiesOneToOne; - isEncrypted = linphone_chat_room_get_capabilities(_chatRoom) & LinphoneChatRoomCapabilitiesEncrypted; - [self setComposingVisible:!composingVisible withDelay:0]; - [self configureForRoom:true]; - [_tableController scrollToBottom:true]; - } - } - if (peerAddr) linphone_address_unref(peerAddr); - if (localAddr) linphone_address_unref(localAddr); - - _backButton.hidden = _tableController.isEditing; - [self refreshImageDrawer]; - [self stopAllPlays]; - [self keyboardWillHide:nil]; -} - -#pragma mark - - -- (void)applicationDidEnterBackground{ - if (!_preservePendingActions) - [self cancelVoiceRecording]; - else if (_isVoiceRecording) - [self stopVoiceRecording]; - if (!_preservePendingActions) - [self closePendingReply]; - [self stopAllPlays]; - _chatRoom = nil; - [_messageField resignFirstResponder]; -} - -- (void)applicationWillEnterForeground{ - if (_chatRoom == nil) { - if (linphone_core_get_calls_nb(LC) == 0) - [SVProgressHUD show]; - else - [self onLinphoneCoreReady:nil]; - } -} - -- (void)configureForRoom:(BOOL)editing { - if (!_chatRoom) { - _chatView.hidden = YES; - return; - } - - if (!_chatRoomCbs) { - _chatRoomCbs = linphone_factory_create_chat_room_cbs(linphone_factory_get()); - linphone_chat_room_cbs_set_state_changed(_chatRoomCbs, on_chat_room_state_changed); - linphone_chat_room_cbs_set_subject_changed(_chatRoomCbs, on_chat_room_subject_changed); - linphone_chat_room_cbs_set_participant_added(_chatRoomCbs, on_chat_room_participant_added); - linphone_chat_room_cbs_set_participant_removed(_chatRoomCbs, on_chat_room_participant_removed); - linphone_chat_room_cbs_set_participant_admin_status_changed(_chatRoomCbs, on_chat_room_participant_admin_status_changed); - linphone_chat_room_cbs_set_chat_message_received(_chatRoomCbs, on_chat_room_chat_message_received); - linphone_chat_room_cbs_set_chat_message_sending(_chatRoomCbs, on_chat_room_chat_message_sending); - linphone_chat_room_cbs_set_is_composing_received(_chatRoomCbs, on_chat_room_is_composing_received); - linphone_chat_room_cbs_set_conference_joined(_chatRoomCbs, on_chat_room_conference_joined); - linphone_chat_room_cbs_set_conference_left(_chatRoomCbs, on_chat_room_conference_left); - linphone_chat_room_cbs_set_security_event(_chatRoomCbs, on_chat_room_conference_alert); - linphone_chat_room_cbs_set_user_data(_chatRoomCbs, (__bridge void*)self); - linphone_chat_room_add_callbacks(_chatRoom, _chatRoomCbs); - } - - [self updateSuperposedButtons]; - - if (_tableController.isEditing) - [_tableController setEditing:editing]; - - BOOL fileSharingEnabled = linphone_core_get_file_transfer_server(LC) != NULL; - [_pictureButton setEnabled:fileSharingEnabled]; - - [self updateSuperposedButtons]; - _toggleRecord.enabled = linphone_core_get_calls_nb(LC) == 0; - - PhoneMainView.instance.currentRoom = _chatRoom; - if (isOneToOne) { - bctbx_list_t *participants = linphone_chat_room_get_participants(_chatRoom); - LinphoneParticipant *firstParticipant = participants ? (LinphoneParticipant *)participants->data : NULL; - const LinphoneAddress *addr = firstParticipant ? linphone_participant_get_address(firstParticipant) : linphone_chat_room_get_peer_address(_chatRoom); - [ContactDisplay setDisplayNameLabel:_addressLabel forAddress:addr]; - bctbx_list_free(participants); - } else - _addressLabel.text = [NSString stringWithUTF8String:linphone_chat_room_get_subject(_chatRoom) ?: LINPHONE_DUMMY_SUBJECT]; - - [self updateParticipantLabel]; - [self configureMessageField]; - [_tableController setChatRoom:_chatRoom]; - - _chatView.hidden = NO; - UIImage *image = [FastAddressBook imageForSecurityLevel:linphone_chat_room_get_security_level(_chatRoom)]; - [_encryptedButton setImage:image forState:UIControlStateNormal]; - _encryptedButton.hidden = image ? FALSE : TRUE; - [self update]; - [self shareFile]; - - [self setupPopupMenu]; - _ephemeralndicator.hidden = !linphone_chat_room_ephemeral_enabled(_chatRoom); - [self handlePendingTransferIfAny]; - -} - -+(BOOL) isBasicChatRoom:(LinphoneChatRoom *)room { - if (!room) - return true; - LinphoneChatRoomCapabilitiesMask capabilities = linphone_chat_room_get_capabilities(room); - return capabilities & LinphoneChatRoomCapabilitiesBasic; -} - --(BOOL) isEncryptedChatRoom:(LinphoneChatRoom *)room { - if (!room) - return true; - LinphoneChatRoomCapabilitiesMask capabilities = linphone_chat_room_get_capabilities(room); - return capabilities & LinphoneChatRoomCapabilitiesEncrypted; -} - - - -- (void)configureMessageField { - if (isOneToOne) { - _messageField.editable = TRUE; - _pictureButton.enabled = TRUE; - _messageView.userInteractionEnabled = TRUE; - if (linphone_chat_room_is_read_only(_chatRoom)) { - linphone_chat_room_add_participant(_chatRoom, linphone_participant_get_address(linphone_chat_room_get_me(_chatRoom))); - } - } else { - _messageField.editable = !linphone_chat_room_is_read_only(_chatRoom); - _pictureButton.enabled = !linphone_chat_room_is_read_only(_chatRoom); - _messageView.userInteractionEnabled = !linphone_chat_room_is_read_only(_chatRoom); - } -} - --(NSData *) nsDataRead { - 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]; -} - - -- (void)shareFile { - NSString* groupName = [NSString stringWithFormat:@"group.%@.linphoneExtension",[[NSBundle mainBundle] bundleIdentifier]]; - - - NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:groupName]; - NSDictionary *dict = [defaults valueForKey:@"photoData"]; - NSDictionary *dictFile = [defaults valueForKey:@"icloudData"]; - NSDictionary *dictUrl = [defaults valueForKey:@"url"]; - if (dict) { - //file shared from photo lib - NSString *fileName = dict[@"url"]; - [_messageField setText:dict[@"message"]]; - [self confirmShare:[self nsDataRead] url:nil fileName:fileName]; - [defaults removeObjectForKey:@"photoData"]; - } else if (dictFile) { - NSString *fileName = dictFile[@"url"]; - [_messageField setText:dictFile[@"message"]]; - [self confirmShare:[self nsDataRead] url:nil fileName:fileName]; - [defaults removeObjectForKey:@"icloudData"]; - } else if (dictUrl) { - NSString *url = dictUrl[@"url"]; - [_messageField setText:dictUrl[@"message"]]; - [self confirmShare:nil url:url fileName:nil]; - [defaults removeObjectForKey:@"url"]; - } -} - -// reload the chatroom after the core starts -- (void)onLinphoneCoreReady:(NSNotification *)notif { - if (linphone_core_get_global_state(LC) == LinphoneGlobalOn) { - LinphoneAddress *peerAddr = linphone_core_create_address([LinphoneManager getLc], _peerAddress); - LinphoneAddress *localAddr = linphone_core_create_address([LinphoneManager getLc], _localAddress); - if (peerAddr && localAddr) { - _chatRoom = linphone_core_search_chat_room([LinphoneManager getLc], NULL, localAddr, peerAddr, NULL); - if (_chatRoom) { - isOneToOne = linphone_chat_room_get_capabilities(_chatRoom) & LinphoneChatRoomCapabilitiesOneToOne; - isEncrypted = linphone_chat_room_get_capabilities(_chatRoom) & LinphoneChatRoomCapabilitiesEncrypted; - [self configureForRoom:self.editing]; - if (_chatRoom && _markAsRead) { - if (IPAD) { - [VIEW(ChatsListView).tableController loadData]; - } - [ChatConversationView markAsRead:_chatRoom]; - } - _markAsRead = TRUE; - } - } - [SVProgressHUD dismiss]; - } -} - -- (void)callUpdateEvent:(NSNotification *)notif { - [self updateSuperposedButtons]; - _toggleRecord.enabled = linphone_core_get_calls_nb(LC) == 0; - [_tableController.tableView reloadData]; - -} - -- (void)update { - if (_chatRoom == NULL) { - LOGW(@"Cannot update chat room header: null contact"); - return; - } - - const LinphoneAddress *addr = linphone_chat_room_get_peer_address(_chatRoom); - if (addr == NULL) { - [PhoneMainView.instance popCurrentView]; - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Invalid SIP address", nil) - message:NSLocalizedString(@"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)", - nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Continue", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; - return; - } -} - -- (BOOL)sendMessage:(NSString *)message withExterlBodyUrl:(NSURL *)externalUrl rootMessage:(LinphoneChatMessage *)rootMessage { - if (_chatRoom == NULL) { - LOGW(@"Cannot send message: No chatroom"); - return FALSE; - } - - LinphoneChatMessage *msg = rootMessage; - BOOL basic = [ChatConversationView isBasicChatRoom:_chatRoom]; - const LinphoneAccountParams *params = linphone_account_get_params(linphone_core_get_default_account(LC)); - BOOL cpimEnabled = linphone_account_params_cpim_in_basic_chat_room_enabled(params); - if ((!basic || cpimEnabled) && 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]); - } - - bctbx_list_t const *contentList = linphone_chat_message_get_contents(msg); - if (bctbx_list_size(contentList) > 0) { - linphone_chat_message_send(msg); - } - - if (basic && !cpimEnabled && message && message.length > 0) { - linphone_chat_message_send(linphone_chat_room_create_message_from_utf8(_chatRoom, message.UTF8String)); - } - - return TRUE; -} - -- (void)saveAndSend:(UIImage *)image assetId:(NSString *)phAssetId withQuality:(float)quality{ - [_fileContext addObject:image withQuality:quality]; - [_qualitySettingsArray addObject:@(quality)]; - [self refreshImageDrawer]; -} - -- (void)chooseImageQuality:(UIImage *)image assetId:(NSString *)phAssetId { - [SVProgressHUD show]; - NSMutableDictionary *optionsBlock = [[NSMutableDictionary alloc] init]; - NSMutableDictionary *optionsText = [[NSMutableDictionary alloc] init]; - DTActionSheet *sheet = [[DTActionSheet alloc] initWithTitle:NSLocalizedString(@"Choose the image size", nil)]; - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - for (NSString *key in [imageQualities allKeys]) { - NSNumber *quality = [imageQualities objectForKey:key]; - NSData *data = UIImageJPEGRepresentation(image, [quality floatValue]); - NSNumber *size = [NSNumber numberWithInteger:[data length]]; - NSString *text = [NSString stringWithFormat:@"%@ (%@)", key, [size toHumanReadableSize]]; - [optionsBlock setObject:^() { - [self saveAndSend:image assetId:phAssetId withQuality:[quality floatValue]]; - } forKey:key]; - [optionsText setObject:text forKey:key]; - } - dispatch_async(dispatch_get_main_queue(), ^{ - for (NSString *key in [imageQualities allKeys]) { - [sheet addButtonWithTitle:[optionsText objectForKey:key] block:[optionsBlock objectForKey:key]]; - } - [sheet addCancelButtonWithTitle:NSLocalizedString(@"Cancel", nil) block:nil]; - [SVProgressHUD dismiss]; - [sheet showInView:PhoneMainView.instance.view]; - }); - }); -} - -- (void)confirmShare:(NSData *)data url:(NSString *)url fileName:(NSString *)fileName { - DTActionSheet *sheet = [[DTActionSheet alloc] initWithTitle:NSLocalizedString(@"Select or create a conversation to share the file(s)", nil)]; - dispatch_async(dispatch_get_main_queue(), ^{ - [sheet addButtonWithTitle:NSLocalizedString(@"Send to this conversation", nil) - block:^() { - if (![[self.messageField text] isEqualToString:@""]) { - [self sendMessageInMessageField:linphone_chat_room_create_empty_message(_chatRoom)]; - } - if (url) - [self sendMessage:url withExterlBodyUrl:nil rootMessage:linphone_chat_room_create_empty_message(_chatRoom)]; - else - [self startFileUpload:data withName:fileName rootMessage:linphone_chat_room_create_empty_message(_chatRoom)]; - }]; - - [sheet addCancelButtonWithTitle:NSLocalizedString(@"Cancel", nil) block:nil]; - [sheet showInView:PhoneMainView.instance.view]; - }); -} - -- (void)setComposingVisible:(BOOL)visible withDelay:(CGFloat)delay { - Boolean shouldAnimate = composingVisible != visible; - CGRect keyboardFrame = [_messageView frame]; - CGRect newComposingFrame = [_composeIndicatorView frame]; - CGRect newTableFrame = [_tableController.tableView frame]; - - if (visible) { - // pull up the composing frame and shrink the table view - newTableFrame.size.height -= newComposingFrame.size.height; - newComposingFrame.origin.y = keyboardFrame.origin.y - newComposingFrame.size.height; - const bctbx_list_t *addresses = linphone_chat_room_get_composing_addresses(_chatRoom); - NSString *composingAddresses = @""; - if (bctbx_list_size(addresses) == 1) { - composingAddresses = [FastAddressBook displayNameForAddress:(LinphoneAddress *)addresses->data]; - _composeLabel.text = [NSString stringWithFormat:NSLocalizedString(@"%@ is writing...", nil), composingAddresses]; - } else { - while (addresses) { - if (![composingAddresses isEqualToString:@""]) - composingAddresses = [composingAddresses stringByAppendingString:@", "]; - composingAddresses = [composingAddresses stringByAppendingString:[FastAddressBook displayNameForAddress:(LinphoneAddress *)addresses->data]]; - addresses = addresses->next; - } - _composeLabel.text = [NSString stringWithFormat:NSLocalizedString(@"%@ are writing...", nil), composingAddresses]; - } - } else { - // pull down the composing frame and widen the tableview - newTableFrame.size.height += newComposingFrame.size.height; - newComposingFrame.origin.y = keyboardFrame.origin.y; - } - composingVisible = visible; - if (!shouldAnimate) - return; - - [UIView animateWithDuration:delay - animations:^{ - _tableController.tableView.frame = newTableFrame; - _composeIndicatorView.frame = newComposingFrame; - } - completion:^(BOOL finished) { - _composeIndicatorView.hidden = !visible; - }]; - if (visible) { - if (_tableController.tableView.contentOffset.y + newComposingFrame.size.height >= (_tableController.tableView.contentSize.height - _tableController.tableView.frame.size.height - 1)) { - [_tableController scrollToBottom:TRUE]; - } - } -} - -- (BOOL) groupCallAvailable { - if (isOneToOne || !_backToCallButton.hidden || _tableController.tableView.isEditing) - return false; - LinphoneAccount *account = linphone_core_get_default_account(LC); - if (!account) - return false; - const LinphoneAccountParams *params = linphone_account_get_params(account); - if (!params) - return false; - return linphone_account_params_get_audio_video_conference_factory_address(params) != nil || linphone_account_params_get_conference_factory_uri(params) != nil; - -} - -- (void)updateSuperposedButtons { - [_backToCallButton update]; - _callButton.hidden = !_backToCallButton.hidden || _tableController.tableView.isEditing; - _toggleMenuButton.hidden = _tableController.isEditing; - - // Group call : - if (self.groupCallAvailable ) { - [_callButton setImage: [LinphoneUtils resizeImage:[UIImage imageNamed:@"voip_conference_new"] newSize:CGSizeMake(50, 50)] forState:UIControlStateNormal]; - _callButton.hidden = false; - } else { - [_callButton setImage:[UIImage imageNamed:@"call_alt_start_default"] forState:UIControlStateNormal]; - } - -} - -- (void)updateParticipantLabel { - CGRect frame = _addressLabel.frame; - if (isOneToOne) { - _particpantsLabel.hidden = TRUE; - frame.origin.y = (_topBar.frame.size.height - _addressLabel.frame.size.height)/2; - } else { - _particpantsLabel.hidden = FALSE; - bctbx_list_t *participants = linphone_chat_room_get_participants(_chatRoom); - _particpantsLabel.text = @""; - while (participants) { - LinphoneParticipant *participant = (LinphoneParticipant *)participants->data; - if (![_particpantsLabel.text isEqualToString:@""]) - _particpantsLabel.text = [_particpantsLabel.text stringByAppendingString:@", "]; - - _particpantsLabel.text = [_particpantsLabel.text stringByAppendingString: - [FastAddressBook displayNameForAddress:linphone_participant_get_address(participant)]]; - participants = participants->next; - } - frame.origin.y = 0; - } - _addressLabel.frame = frame; -} - -- (void)sendMessageInMessageField:(LinphoneChatMessage *)rootMessage { - if ([self sendMessage:[_messageField text] withExterlBodyUrl:nil rootMessage:rootMessage]) { - scrollOnGrowingEnabled = FALSE; - [_messageField setText:@""]; - scrollOnGrowingEnabled = TRUE; - [self onMessageChange:nil]; - } -} - -#pragma mark - UITextFieldDelegate Functions - -- (BOOL)growingTextViewShouldBeginEditing:(HPGrowingTextView *)growingTextView { - if (_tableController.isEditing) { - [_tableController setEditing:NO]; - } - [_listTapGestureRecognizer setEnabled:TRUE]; - return TRUE; -} - -- (BOOL)growingTextViewShouldEndEditing:(HPGrowingTextView *)growingTextView { - [_listTapGestureRecognizer setEnabled:FALSE]; - return TRUE; -} - -- (void)growingTextChanged:(HPGrowingTextView *)growingTextView text:(NSString *)text { - if ([text length] > 0 && _chatRoom) - linphone_chat_room_compose(_chatRoom); -} - -- (void)growingTextView:(HPGrowingTextView *)growingTextView willChangeHeight:(float)height { - int diff = height - growingTextView.bounds.size.height; - - if (diff != 0) { - CGRect messageRect = [_messageView frame]; - messageRect.origin.y -= diff; - messageRect.size.height += diff; - [_messageView setFrame:messageRect]; - - if ([_fileContext count] > 0) { - CGRect _imagesRect = [_imagesView frame]; - _imagesRect.origin.y -= diff; - [_imagesView setFrame:_imagesRect]; - } - - // Always stay at bottom - if (scrollOnGrowingEnabled) { - CGRect tableFrame = [_tableController.view frame]; - CGPoint contentPt = [_tableController.tableView contentOffset]; - contentPt.y += diff; - if (contentPt.y + tableFrame.size.height > _tableController.tableView.contentSize.height) - contentPt.y += diff; - [_tableController.tableView setContentOffset:contentPt animated:FALSE]; - } - - CGRect tableRect = [_tableController.view frame]; - tableRect.size.height -= diff; - [_tableController.view setFrame:tableRect]; - [self updateFramesInclRecordingAndReplyView]; - - // if we're showing the compose message, update it position - if (![_composeLabel isHidden]) { - CGRect frame = [_composeIndicatorView frame]; - frame.origin.y -= diff; - [_composeIndicatorView setFrame:frame]; - } - } -} - -#pragma mark - Action Functions - -- (IBAction)onBackClick:(id)event { - NSString *previousViewName = [PhoneMainView.instance getPreviousViewName]; - _sharingMedia = nil; - if ([previousViewName isEqualToString:@"ContactDetailsView"]) { - ContactDetailsView *view = VIEW(ContactDetailsView); - [PhoneMainView.instance popToView:view.compositeViewDescription]; - } else { - ChatsListView *view = VIEW(ChatsListView); - [PhoneMainView.instance popToView:view.compositeViewDescription]; - } -} - -- (IBAction)onEditClick:(id)event { - [_tableController setEditing:![_tableController isEditing] animated:TRUE]; - [_messageField resignFirstResponder]; - [self updateSuperposedButtons]; -} - -- (IBAction)onSendClick:(id)event { - - if (!linphone_core_is_network_reachable(LC)) { - //[PhoneMainView.instance presentViewController:[LinphoneUtils networkErrorView:@"send a message"] animated:YES completion:nil]; - //return; - } - - LinphoneChatMessage *rootMessage = _replyBubble ? linphone_chat_room_create_reply_message(_chatRoom, _replyBubble.message) : linphone_chat_room_create_empty_message(_chatRoom); - - if (_replyBubble) { - [self closePendingReply]; - } - - if (_isPendingVoiceRecord && _voiceRecorder && linphone_recorder_get_file(_voiceRecorder)) { - LinphoneContent * voiceContent = linphone_recorder_create_content(_voiceRecorder); - _isPendingVoiceRecord = false; - [self cancelVoiceRecording]; - [self stopVoiceRecordPlayer]; - linphone_chat_message_add_content(rootMessage, voiceContent); - } - - if ([_fileContext count] > 0) { - if (linphone_chat_room_get_capabilities(_chatRoom) & LinphoneChatRoomCapabilitiesConference) { - [self startMultiFilesUpload:rootMessage]; - } else { - int i = 0; - for (i = 0; i < [_fileContext count]-1; ++i) { - [self startUploadData:[_fileContext.datasArray objectAtIndex:i] withType:[_fileContext.typesArray objectAtIndex:i] withName:[_fileContext.namesArray objectAtIndex:i] andMessage:NULL rootMessage:NULL]; - } - if (isOneToOne) { - [self startUploadData:[_fileContext.datasArray objectAtIndex:i] withType:[_fileContext.typesArray objectAtIndex:i] withName:[_fileContext.namesArray objectAtIndex:i] andMessage:NULL rootMessage:NULL]; - if (![[self.messageField text] isEqualToString:@""]) { - [self sendMessage:[_messageField text] withExterlBodyUrl:nil rootMessage:rootMessage]; - } - } else { - [self startUploadData:[_fileContext.datasArray objectAtIndex:i] withType:[_fileContext.typesArray objectAtIndex:i] withName:[_fileContext.namesArray objectAtIndex:i] andMessage:[self.messageField text] rootMessage:rootMessage]; - } - } - - [self clearMessageView]; - return; - } - [self sendMessageInMessageField:rootMessage]; -} - -- (IBAction)onListTap:(id)sender { - [_messageField resignFirstResponder]; -} - -- (IBAction)onDeleteClick:(id)sender { - LOGI(@"onDeleteClick"); - NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"Do you want to delete the selected messages?", nil)]; - [UIConfirmationDialog ShowWithMessage:msg - cancelMessage:nil - confirmMessage:nil - onCancelClick:^() { - [self onEditionChangeClick:nil]; - } - onConfirmationClick:^() { - [_tableController removeSelectionUsing:nil]; - _tableController.editButton.hidden = true; - [_tableController loadData]; - [self onEditionChangeClick:nil]; - }]; -} - -- (IBAction)onEditionChangeClick:(id)sender { - _backButton.hidden = _tableController.isEditing; - [self updateSuperposedButtons]; -} - -- (IBAction)onEncryptedDevicesClick:(id)sender { - NSString *message = NSLocalizedString(@"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.",nil); - BOOL notAskAgain = [LinphoneManager.instance lpConfigBoolForKey:@"confirmation_dialog_before_sas_call_not_ask_again"]; - - if (notAskAgain) { - [self goToDeviceListView]; - } else { - securityDialog = [UIConfirmationDialog ShowWithMessage:message cancelMessage:NSLocalizedString(@"CANCEL", nil) confirmMessage:NSLocalizedString(@"OK", nil) onCancelClick:^() { - } onConfirmationClick:^() { - [self goToDeviceListView]; - }]; - [_messageField resignFirstResponder]; - securityDialog.authView.hidden = FALSE; - [securityDialog setSpecialColor]; - } -} - -- (IBAction)onCallClick:(id)sender { - bctbx_list_t *participants = linphone_chat_room_get_participants(_chatRoom); - LinphoneParticipant *firstParticipant = participants ? (LinphoneParticipant *)participants->data : NULL; - const LinphoneAddress *addr = firstParticipant ? linphone_participant_get_address(firstParticipant) : linphone_chat_room_get_peer_address(_chatRoom); - if (self.groupCallAvailable) { - UIConfirmationDialog *d = [UIConfirmationDialog ShowWithMessage:VoipTexts.conference_start_group_call_dialog_message - cancelMessage:nil - confirmMessage:VoipTexts.conference_start_group_call_dialog_ok_button - onCancelClick:^() {} - onConfirmationClick:^() { - [ConferenceViewModelBridge startGroupCallWithCChatRoom:_chatRoom]; - }]; - d.groupCallImage.hidden = NO; - [d.groupCallImage setImageNamed:@"voip_conference_new" tintColor:UIColor.whiteColor]; - [d setSpecialColor]; - [d setWhiteCancel]; - } else - [LinphoneManager.instance call:addr]; -} - -- (IBAction)onListSwipe:(id)sender { - [self onBackClick:sender]; -} - -- (IBAction)onMessageChange:(id)sender { - [self setSendButtonState]; -} - -- (IBAction)onPictureClick:(id)event { - _preservePendingActions = true; - [_messageField resignFirstResponder]; - [ImagePickerView SelectImageFromDevice:self atPosition:_pictureButton inView:self.view withDocumentMenuDelegate:self]; - -} - -- (void)displayGroupInfo { - NSMutableArray *contactsArray = [[NSMutableArray alloc] init]; - NSMutableArray *admins = [[NSMutableArray alloc] init]; - bctbx_list_t *participants = linphone_chat_room_get_participants(_chatRoom); - while (participants) { - LinphoneParticipant *participant = (LinphoneParticipant *)participants->data; - char *curi = linphone_address_as_string_uri_only(linphone_participant_get_address(participant)); - NSString *uri = [NSString stringWithUTF8String:curi]; - [contactsArray addObject:uri]; - - if(linphone_participant_is_admin(participant)) - [admins addObject:uri]; - participants = participants->next; - ms_free(curi); - } - ChatConversationInfoView *view = VIEW(ChatConversationInfoView); - view.create = FALSE; - view.contacts = [contactsArray mutableCopy]; - view.oldContacts = [contactsArray mutableCopy]; - view.admins = [admins mutableCopy]; - view.oldAdmins = [admins mutableCopy]; - view.oldSubject = [NSString stringWithUTF8String:linphone_chat_room_get_subject(_chatRoom) ?: LINPHONE_DUMMY_SUBJECT]; - view.room = _chatRoom; - view.peerAddress = _peerAddress; - view.localAddress = _localAddress; - [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; -} - -- (IBAction)onInfoClick:(id)sender { - [self displayGroupInfo]; -} - -#pragma mark ChatRoomDelegate - -- (BOOL)startMultiFilesUpload:(LinphoneChatMessage *)rootMessage { - FileTransferDelegate *fileTransfer = [[FileTransferDelegate alloc] init]; - [fileTransfer setText:[self.messageField text]]; - [fileTransfer uploadFileContent:_fileContext forChatRoom:_chatRoom rootMessage:rootMessage]; - [_tableController scrollToBottom:true]; - return TRUE; -} - -- (BOOL)startUploadData:(NSData *)data withType:(NSString*)type withName:(NSString *)name andMessage:(NSString *)message rootMessage:(LinphoneChatMessage *)rootMessage { - FileTransferDelegate *fileTransfer = [[FileTransferDelegate alloc] init]; - if (message) - [fileTransfer setText:message]; - NSString *key = @"localfile"; - if ([type isEqualToString:@"video"]) { - key = @"localvideo"; - } else if ([type isEqualToString:@"image"]) { - key = @"localimage"; - } - [fileTransfer uploadData:data forChatRoom:_chatRoom type:type subtype:type name:name key:key rootMessage:rootMessage]; - [_tableController scrollToBottom:true]; - return TRUE; -} - -- (BOOL)startFileUpload:(NSData *)data withName:(NSString *)name rootMessage:(LinphoneChatMessage *)rootMessage { - FileTransferDelegate *fileTransfer = [[FileTransferDelegate alloc] init]; - [fileTransfer uploadFile:data forChatRoom:_chatRoom withName:name rootMessage:rootMessage]; - [_tableController scrollToBottom:true]; - return TRUE; -} - -- (BOOL)resendMultiFiles:(FileContext *)newFileContext message:(NSString *)message rootMessage:(LinphoneChatMessage *)rootMessage { - FileTransferDelegate *fileTransfer = [[FileTransferDelegate alloc] init]; - if (message) - [fileTransfer setText:message]; - [fileTransfer uploadFileContent:newFileContext forChatRoom:_chatRoom rootMessage:rootMessage]; - [_tableController scrollToBottom:true]; - return TRUE; -} - -- (BOOL)resendFile: (NSData *)data withName:(NSString *)name type:(NSString *)type key:(NSString *)key message:(NSString *)message rootMessage:(LinphoneChatMessage *)rootMessage{ - FileTransferDelegate *fileTransfer = [[FileTransferDelegate alloc] init]; - if (message) - [fileTransfer setText:message]; - [fileTransfer uploadData:data forChatRoom:_chatRoom type:type subtype:type name:name key:key rootMessage:rootMessage]; - [_tableController scrollToBottom:true]; - return TRUE; -} - -- (void)resendChat:(NSString *)message withExternalUrl:(NSString *)url rootMessage:(LinphoneChatMessage *)rootMessage { - [self sendMessage:message withExterlBodyUrl:[NSURL URLWithString:url] rootMessage:rootMessage]; -} - -#pragma mark ImagePickerDelegate - -- (void)imagePickerDelegateImage:(UIImage *)image info:(NSString *)phAssetId { - // When getting image from the camera, it may be 90° rotated due to orientation - // (image.imageOrientation = UIImageOrientationRight). Just rotate it to be face up. - if (image.imageOrientation != UIImageOrientationUp) { - UIGraphicsBeginImageContextWithOptions(image.size, false, image.scale); - [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)]; - image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - } - - // Dismiss popover on iPad - if (IPAD) { - [VIEW(ImagePickerView).popoverController dismissPopoverAnimated:TRUE]; - } - [self chooseImageQuality:image assetId:phAssetId]; -} - - -- (void)imagePickerDelegateVideo:(NSURL*)url info:(NSDictionary *)info { - NSURL * mediaURL = [info objectForKey:UIImagePickerControllerMediaURL]; - [SVProgressHUD show]; - AVAsset *video = [AVAsset assetWithURL:mediaURL]; - AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:video presetName:AVAssetExportPresetMediumQuality]; - exportSession.shouldOptimizeForNetworkUse = YES; - exportSession.outputFileType = AVFileTypeMPEG4; - - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); - NSString *documentsDirectory = [paths objectAtIndex:0]; - - NSString *localname = [[[mediaURL absoluteString] md5] stringByAppendingString:@".mp4"]; - NSURL *compressedVideoUrl=[[NSURL fileURLWithPath:documentsDirectory] URLByAppendingPathComponent:localname]; - exportSession.outputURL = compressedVideoUrl; - [exportSession exportAsynchronouslyWithCompletionHandler:^{ - dispatch_async(dispatch_get_main_queue(), ^{ - [SVProgressHUD dismiss]; - UIImage* image = [UIChatBubbleTextCell getImageFromVideoUrl:compressedVideoUrl]; - [_fileContext addObject:[NSData dataWithContentsOfURL:compressedVideoUrl] name:localname type:@"video" image:image]; - [self refreshImageDrawer]; - }); - }]; - - BOOL saveToGallery = [ConfigManager.instance lpConfigBoolForKeyWithKey:@"auto_write_to_gallery_preference"]; - - if (![info valueForKey:UIImagePickerControllerReferenceURL] && saveToGallery) { - [self writeVideoToGallery:mediaURL]; - } -} - -+ (void)writeMediaToGallery:(NSString *)name fileType:(NSString *)fileType { - if (![LinphoneManager.instance lpConfigBoolForKey:@"vfs_enabled_mode"]) { - NSString *filePath = [LinphoneManager validFilePath:name]; - NSFileManager *fileManager = [NSFileManager defaultManager]; - if ([fileManager fileExistsAtPath:filePath]) { - NSData* data = [NSData dataWithContentsOfFile:filePath]; - - // define a block , not called immediately. To avoid crash when saving photo before PHAuthorizationStatusNotDetermined. - void (^block)(void)= ^ { - if ([fileType isEqualToString:@"image"] ) { - // we're finished, save the image and update the message - UIImage *image = [UIImage imageWithData:data]; - if (!image) { - ChatConversationView *view = VIEW(ChatConversationView); - [view showFileDownloadError]; - return; - } - __block PHObjectPlaceholder *placeHolder; - [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ - PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAssetFromImage:image]; - placeHolder = [request placeholderForCreatedAsset]; - } completionHandler:^(BOOL success, NSError *error) { - dispatch_async(dispatch_get_main_queue(), ^{ - if (error) { - LOGE(@"Cannot save image data downloaded [%@]", [error localizedDescription]); - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Transfer error", nil) - message:NSLocalizedString(@"Cannot write image to photo library",nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; - } else { - LOGI(@"Image saved to [%@]", [placeHolder localIdentifier]); - } - }); - }]; - } else if([fileType isEqualToString:@"video"]) { - __block PHObjectPlaceholder *placeHolder; - [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ - PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAssetFromVideoAtFileURL:[NSURL fileURLWithPath:filePath]]; - placeHolder = [request placeholderForCreatedAsset]; - } completionHandler:^(BOOL success, NSError * _Nullable error) { - dispatch_async(dispatch_get_main_queue(), ^{ - if (error) { - LOGE(@"Cannot save video data downloaded [%@]", [error localizedDescription]); - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Transfer error", nil) - message:NSLocalizedString(@"Cannot write video to photo library", nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; - } else { - LOGI(@"video saved to [%@]", [placeHolder localIdentifier]); - } - }); - }]; - } - }; - - // When you save an image or video to a photo library, make sure that it is allowed. Otherwise, there will be a backup error. - if ([PHPhotoLibrary authorizationStatus] == PHAuthorizationStatusAuthorized) { - block(); - } else { - [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { - dispatch_async(dispatch_get_main_queue(), ^{ - if ([PHPhotoLibrary authorizationStatus] == PHAuthorizationStatusAuthorized) { - block(); - } else { - [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Photo's permission", nil) message:NSLocalizedString(@"Photo not authorized", nil) delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Continue", nil] show]; - } - }); - }]; - } - } - } -} - --(void) writeVideoToGallery:(NSURL *)url { - - NSString *localIdentifier; - PHFetchResult *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; - for (PHAssetCollection *assetCollection in assetCollections) { - if([[assetCollection localizedTitle] isEqualToString:[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"]] ){ - localIdentifier = assetCollection.localIdentifier; - break; - } - } - if(localIdentifier ){ - PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[localIdentifier] options:nil]; - PHAssetCollection *assetCollection = fetchResult.firstObject; - - [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ - PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:url]; - - PHAssetCollectionChangeRequest *assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection]; - [assetCollectionChangeRequest addAssets:@[[assetChangeRequest placeholderForCreatedAsset]]]; - } completionHandler:^(BOOL success, NSError *error) { - if (!success) { - NSLog(@"Error creating asset: %@", error); - } - }]; - }else{ - __block PHObjectPlaceholder *albumPlaceholder; - [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ - PHAssetCollectionChangeRequest *changeRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"]]; - albumPlaceholder = changeRequest.placeholderForCreatedAssetCollection; - } completionHandler:^(BOOL success, NSError *error) { - if (success) { - PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[albumPlaceholder.localIdentifier] options:nil]; - PHAssetCollection *assetCollection = fetchResult.firstObject; - - [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ - PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:url]; - PHAssetCollectionChangeRequest *assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection]; - [assetCollectionChangeRequest addAssets:@[[assetChangeRequest placeholderForCreatedAsset]]]; - } completionHandler:^(BOOL success, NSError *error) { - if (!success) { - NSLog(@"Error creating asset: %@", error); - } - }]; - } else { - NSLog(@"Error creating album: %@", error); - } - }]; - } -} - -- (void)tableViewIsScrolling { - // if user is scrolling in table view, we should hide the keyboard - if ([_messageField isFirstResponder]) { - [_messageField resignFirstResponder]; - } -} - -#pragma mark - Keyboard Event Functions - -- (void)keyboardWillHide:(NSNotification *)notif { - NSTimeInterval duration = [[[notif userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; - - int heightDiff = UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]) ? 55 : 105; - - [UIView animateWithDuration:duration - delay:0 - options:UIViewAnimationOptionBeginFromCurrentState - animations:^{ - CGFloat composeIndicatorCompensation = composingVisible ? _composeIndicatorView.frame.size.height : 0.0f; - - // Show TabBar and status bar and also top bar - - // somehow, it breaks rotation if we put that in the block above when rotating portrait -> landscape - // if (!UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) { - [PhoneMainView.instance hideTabBar:NO]; - // } - [PhoneMainView.instance hideStatusBar:NO]; - [PhoneMainView.instance fullScreen:NO]; - _topBar.alpha = 1.0; - - // Resize chat view - { - CGRect chatFrame = [_chatView frame]; - chatFrame.origin.y = _topBar.frame.origin.y + _topBar.frame.size.height; - chatFrame.size.height = [[self view] frame].size.height - chatFrame.origin.y; - [_chatView setFrame:chatFrame]; - } - - // Resize & Move table view - { - CGRect tableFrame = [_tableController.view frame]; - tableFrame.size.height = - [_messageView frame].origin.y - tableFrame.origin.y - composeIndicatorCompensation; - [_tableController.view setFrame:tableFrame]; - - - // Scroll to bottom - NSInteger lastSection = [_tableController.tableView numberOfSections] - 1; - if (lastSection >= 0) { - NSInteger lastRow = [_tableController.tableView numberOfRowsInSection:lastSection] - 1; - if (lastRow >= 0) { - [_tableController.tableView - scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:lastRow inSection:lastSection] - atScrollPosition:UITableViewScrollPositionBottom - animated:FALSE]; - } - } - } - - - if ([_fileContext count] > 0){ - // resizing imagesView - CGRect imagesFrame = [_imagesView frame]; - imagesFrame.origin.y = [_messageView frame].origin.y - heightDiff; - imagesFrame.size.height = heightDiff; - [_imagesView setFrame:imagesFrame]; - // resizing chatTable - CGRect tableViewFrame = [_tableController.tableView frame]; - tableViewFrame.size.height = imagesFrame.origin.y - tableViewFrame.origin.y; - [_tableController.tableView setFrame:tableViewFrame]; - } - if (_showVoiceRecorderView) - _vrView.hidden = true; // force recalculate - if (_showReplyView) - _replyView.hidden = true; // force recalculate - [self updateFramesInclRecordingAndReplyView]; - - } - completion:^(BOOL finished){ - }]; -} - -- (void)keyboardWillShow:(NSNotification *)notif { - NSTimeInterval duration = [[[notif userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; - - int heightDiff = UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]) ? 55 : 105; - - [UIView animateWithDuration:duration - delay:0 - options:UIViewAnimationOptionBeginFromCurrentState - animations:^{ - CGFloat composeIndicatorCompensation = composingVisible ? _composeIndicatorView.frame.size.height : 0.0f; - - CGRect endFrame = [[[notif userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; - - if (([[UIDevice currentDevice].systemVersion floatValue] < 8) && - UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation)) { - int width = endFrame.size.height; - endFrame.size.height = endFrame.size.width; - endFrame.size.width = width; - } - - // Hide TabBar and status bar and also top bar - [PhoneMainView.instance hideTabBar:YES]; - [PhoneMainView.instance hideStatusBar:YES]; - [PhoneMainView.instance fullScreen:YES]; - _topBar.alpha = 0.0; - - // Resize chat view - { - CGRect viewFrame = [[self view] frame]; - CGRect rect = PhoneMainView.instance.view.bounds; - CGPoint pos = {viewFrame.size.width, viewFrame.size.height}; - CGPoint gPos = - [self.view convertPoint:pos - toView:[UIApplication sharedApplication] - .keyWindow.rootViewController.view]; // Bypass IOS bug on landscape mode - float diff = (rect.size.height - gPos.y - endFrame.size.height); - if (diff > 0) - diff = 0; - CGRect chatFrame = [_chatView frame]; - chatFrame.origin.y = 0; - chatFrame.size.height = viewFrame.size.height - chatFrame.origin.y + diff; - [_chatView setFrame:chatFrame]; - } - - // Resize & Move table view - { - CGRect tableFrame = _tableController.view.frame; - tableFrame.size.height = - [_messageView frame].origin.y - tableFrame.origin.y - composeIndicatorCompensation; - [_tableController.view setFrame:tableFrame]; - - } - - if ([_fileContext count] > 0){ - // resizing imagesView - CGRect imagesFrame = [_imagesView frame]; - imagesFrame.origin.y = [_messageView frame].origin.y - heightDiff; - imagesFrame.size.height = heightDiff; - [_imagesView setFrame:imagesFrame]; - // resizing chatTable - CGRect tableViewFrame = [_tableController.tableView frame]; - tableViewFrame.size.height = imagesFrame.origin.y - tableViewFrame.origin.y; - [_tableController.tableView setFrame:tableViewFrame]; - - } - - // Scroll - NSInteger lastSection = [_tableController.tableView numberOfSections] - 1; - if (lastSection >= 0) { - NSInteger lastRow = [_tableController.tableView numberOfRowsInSection:lastSection] - 1; - if (lastRow >= 0) { - [_tableController.tableView - scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:lastRow inSection:lastSection] - atScrollPosition:UITableViewScrollPositionBottom - animated:FALSE]; - } - } - if (_showVoiceRecorderView) - _vrView.hidden = true; // force recalculate - if (_showReplyView) - _replyView.hidden = true; // force recalculate - [self updateFramesInclRecordingAndReplyView]; - - - } - completion:^(BOOL finished){ - }]; -} - -#pragma mark - chat room callbacks - -void on_chat_room_state_changed(LinphoneChatRoom *cr, LinphoneChatRoomState newState) { - ChatConversationView *view = (__bridge ChatConversationView *)linphone_chat_room_cbs_get_user_data(linphone_chat_room_get_current_callbacks(cr)); - [view configureMessageField]; -} - -void on_chat_room_subject_changed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { - ChatConversationView *view = (__bridge ChatConversationView *)linphone_chat_room_cbs_get_user_data(linphone_chat_room_get_current_callbacks(cr)); - const char *subject = linphone_chat_room_get_subject(cr) ?: linphone_event_log_get_subject(event_log); - if (subject) { - view.addressLabel.text = [NSString stringWithUTF8String:subject]; - [view.tableController addEventEntry:(LinphoneEventLog *)event_log]; - [view.tableController scrollToBottom:true]; - if (IPAD) { - [VIEW(ChatsListView).tableController loadData]; - } - } -} - -void on_chat_room_participant_added(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { - ChatConversationView *view = (__bridge ChatConversationView *)linphone_chat_room_cbs_get_user_data(linphone_chat_room_get_current_callbacks(cr)); - [view.tableController addEventEntry:(LinphoneEventLog *)event_log]; - [view updateParticipantLabel]; - [view.tableController scrollToBottom:true]; -} - -void on_chat_room_participant_removed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { - ChatConversationView *view = (__bridge ChatConversationView *)linphone_chat_room_cbs_get_user_data(linphone_chat_room_get_current_callbacks(cr)); - [view.tableController addEventEntry:(LinphoneEventLog *)event_log]; - [view updateParticipantLabel]; - [view.tableController scrollToBottom:true]; - UIImage *image = [FastAddressBook imageForSecurityLevel:linphone_chat_room_get_security_level(cr)]; - [view.encryptedButton setImage:image forState:UIControlStateNormal]; -} - -void on_chat_room_participant_admin_status_changed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { - ChatConversationView *view = (__bridge ChatConversationView *)linphone_chat_room_cbs_get_user_data(linphone_chat_room_get_current_callbacks(cr)); - [view.tableController addEventEntry:(LinphoneEventLog *)event_log]; - [view.tableController scrollToBottom:true]; -} - -void on_chat_room_chat_message_received(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { - ChatConversationView *view = (__bridge ChatConversationView *)linphone_chat_room_cbs_get_user_data(linphone_chat_room_get_current_callbacks(cr)); - - LinphoneChatMessage *chat = linphone_event_log_get_chat_message(event_log); - if (!chat) - return; - - BOOL hasFile = FALSE; - // if auto_download is available and file is downloaded - if ((linphone_core_get_max_size_for_auto_download_incoming_files(LC) > -1) && linphone_chat_message_get_file_transfer_information(chat)) - hasFile = TRUE; - - if (!linphone_chat_message_is_file_transfer(chat) && !linphone_chat_message_is_text(chat) && !hasFile) /*probably an imdn*/ - return; - - 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]; - - if (isDisplayingBottomOfTable) { - [view.tableController scrollToBottom:TRUE]; - } else { - [[view.tableController scrollBadge] setHidden:FALSE]; - 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) { - ChatConversationView *view = (__bridge ChatConversationView *)linphone_chat_room_cbs_get_user_data(linphone_chat_room_get_current_callbacks(cr)); - [view.tableController addEventEntry:(LinphoneEventLog *)event_log]; - [view.tableController scrollToBottom:true]; - - if (IPAD) - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneMessageReceived object:view]; -} - -void on_chat_room_is_composing_received(LinphoneChatRoom *cr, const LinphoneAddress *remoteAddr, bool_t isComposing) { - ChatConversationView *view = (__bridge ChatConversationView *)linphone_chat_room_cbs_get_user_data(linphone_chat_room_get_current_callbacks(cr)); - BOOL composing = linphone_chat_room_is_remote_composing(cr) || bctbx_list_size(linphone_chat_room_get_composing_addresses(cr)) > 0; - [view setComposingVisible:composing withDelay:0.3]; -} - -void on_chat_room_conference_joined(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { - ChatConversationView *view = (__bridge ChatConversationView *)linphone_chat_room_cbs_get_user_data(linphone_chat_room_get_current_callbacks(cr)); - [view configureForRoom:false]; - [view.tableController scrollToBottom:true]; - if (IPAD) - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneMessageReceived object:nil]; -} - -void on_chat_room_conference_left(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { - ChatConversationView *view = (__bridge ChatConversationView *)linphone_chat_room_cbs_get_user_data(linphone_chat_room_get_current_callbacks(cr)); - [view.tableController addEventEntry:(LinphoneEventLog *)event_log]; - [view.tableController scrollToBottom:true]; -} - -- (void)goToDeviceListView { - DevicesListView *view = VIEW(DevicesListView); - view.room = _chatRoom; - [PhoneMainView.instance popToView:view.compositeViewDescription]; -} - -void on_chat_room_conference_alert(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { - ChatConversationView *view = (__bridge ChatConversationView *)linphone_chat_room_cbs_get_user_data(linphone_chat_room_get_current_callbacks(cr)); - [view.tableController addEventEntry:(LinphoneEventLog *)event_log]; - [view.tableController scrollToBottom:true]; - UIImage *image = [FastAddressBook imageForSecurityLevel:linphone_chat_room_get_security_level(cr)]; - [view.encryptedButton setImage:image forState:UIControlStateNormal]; -} - -- (void)openFileWithURLs:(NSMutableArray*)urls index:(NSInteger)currentIndex -{ - //create the Quicklook controller. - QLPreviewController *qlController = [[QLPreviewController alloc] init]; - self.FileDataSource = [[FileDataSource alloc] initWithFiles:urls]; - - qlController.dataSource = self.FileDataSource; - qlController.currentPreviewItemIndex = currentIndex; - qlController.delegate = self; - - //present the document. - [self presentViewController:qlController animated:YES completion:nil]; -} - -- (void)openFileWithURL:(NSURL *)url -{ - [self openFileWithURLs:[NSMutableArray arrayWithObject:url] index:0]; -} - -- (void)previewControllerDidDismiss:(QLPreviewController *)controller -{ - // QuickLook: When done button is pushed - [PhoneMainView.instance fullScreen:NO]; -} - -+ (NSData *)getFileData: (NSString *)name { - NSString *filePath = [LinphoneManager validFilePath:name]; - return [NSData dataWithContentsOfFile:filePath]; -} - -+ (NSURL *)getFileUrl: (NSString *)name { - NSString *filePath = [LinphoneManager validFilePath:name]; - return [NSURL fileURLWithPath:filePath]; -} - -+ (void)writeFileInImagesDirectory:(NSData *)data name:(NSString *)name { - NSString *filePath = [[LinphoneManager imagesDirectory] stringByAppendingPathComponent:name]; - if (name || [name isEqualToString:@""]) { - LOGW(@"try to write file in %@", filePath); - } - [[NSFileManager defaultManager] createFileAtPath:filePath - contents:data - attributes:nil]; -} - -- (NSURL *)getICloudFileUrl:(NSString *)name { - if (@available(iOS 11.0, *)) { - return [NSURL fileURLWithPath:[LinphoneManager documentFile:name]]; - } - - NSFileManager *fileManager = [NSFileManager defaultManager]; - NSURL *icloudPath = [[fileManager URLForUbiquityContainerIdentifier:nil] URLByAppendingPathComponent:@"Documents"]; - - if (icloudPath) { - if (![fileManager fileExistsAtPath:icloudPath.path isDirectory:nil]) { - LOGI(@"Create directory"); - [fileManager createDirectoryAtURL:icloudPath withIntermediateDirectories:YES attributes:nil error:nil]; - } - - return [icloudPath URLByAppendingPathComponent:name]; - } - - return nil; -} - -- (void)deleteFileWithUuid:(NSUUID *)uuid { - [_fileContext deleteContentWithUuid:uuid]; - [self refreshImageDrawer]; -} - -- (void)clearMessageView { - [_messageField setText:@""]; - if (!_fileContext) _fileContext = [[FileContext alloc] init]; - [_fileContext clear]; - - [self refreshImageDrawer]; -} - -- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { - return [_fileContext count]; -} - - -- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { - return UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]) ? CGSizeMake(60, 60) : CGSizeMake(120, 120); -} - -- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { - UIImageViewDeletable *imgView = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([UIImageViewDeletable class]) forIndexPath:indexPath]; - CGRect imgFrame = imgView.frame; - imgFrame.origin.y = 5; - if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) { - imgFrame.size.height = 60; - } else { - imgFrame.size.height = 120; - } - - [imgView.image setImage:[UIImage resizeImage:[_fileContext.previewsArray objectAtIndex:[indexPath item]] withMaxWidth:imgFrame.size.width andMaxHeight:imgFrame.size.height]]; - [imgView setUuid:[_fileContext.uuidsArray objectAtIndex:[indexPath item]]]; - [imgView setDeleteDelegate:self]; - [imgView setFrame:imgFrame]; - [self setSendButtonState]; - return imgView; -} - -- (void)refreshImageDrawer { - int heightDiff = UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]) ? 65 : 125; - - if ([_fileContext count] == 0) { - [UIView animateWithDuration:0 - delay:0 - options:UIViewAnimationOptionBeginFromCurrentState - animations:^{ - // resizing imagesView - CGRect imagesFrame = [_imagesView frame]; - imagesFrame.origin.y = [_messageView frame].origin.y; - imagesFrame.size.height = 0; - [_imagesView setFrame:imagesFrame]; - // resizing chatTable - CGRect tableViewFrame = [_tableController.tableView frame]; - tableViewFrame.size.height = imagesFrame.origin.y - tableViewFrame.origin.y; - [_tableController.tableView setFrame:tableViewFrame]; - [self updateFramesInclRecordingAndReplyView]; - } - completion:nil]; - [self setSendButtonState]; - } else { - // resizing imagesView - CGRect imagesFrame = [_imagesView frame]; - imagesFrame.origin.y = [_messageView frame].origin.y - heightDiff; - imagesFrame.size.height = heightDiff; - [_imagesView setFrame:imagesFrame]; - // resizing chatTable - CGRect tableViewFrame = [_tableController.tableView frame]; - tableViewFrame.size.height = imagesFrame.origin.y - tableViewFrame.origin.y; - [_tableController.tableView setFrame:tableViewFrame]; - [self updateFramesInclRecordingAndReplyView]; - [_imagesCollectionView reloadData]; - } -} - -- (void)showFileDownloadError { - UIAlertController *errView = [UIAlertController - alertControllerWithTitle:NSLocalizedString(@"File download error", nil) - message:NSLocalizedString(@"Error while downloading the file.\n" - @"The file is probably encrypted.\n" - @"Please retry to download this file after activating LIME.", - nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"OK" - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *action){ - }]; - - [errView addAction:defaultAction]; - [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; -} - -+ (NSString *)getKeyFromFileType:(NSString *)fileType fileName:(NSString *)name{ - if ([fileType isEqualToString:@"video"]) { - return @"localvideo"; - } else if ([fileType isEqualToString:@"image"] || [name hasSuffix:@"JPG"] || [name hasSuffix:@"PNG"] || [name hasSuffix:@"jpg"] || [name hasSuffix:@"png"]) { - return @"localimage"; - } - return @"localfile"; -} - -/* There are three cases: auto download in foreground, auto download in background, on click download*/ -+ (void)autoDownload:(LinphoneChatMessage *)message { - ChatConversationView *view = VIEW(ChatConversationView); - LinphoneContent *content = linphone_chat_message_get_file_transfer_information(message); - NSString *name = [NSString stringWithUTF8String:linphone_content_get_name(content)]; - NSString *fileType = [NSString stringWithUTF8String:linphone_content_get_type(content)]; - NSString *key = [ChatConversationView getKeyFromFileType:fileType fileName:name]; - - [LinphoneManager setValueInMessageAppData:name forKey:key inMessage:message]; - dispatch_async(dispatch_get_main_queue(), ^{ - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneMessageReceived object:view]; - if (![VFSUtil vfsEnabledWithGroupName:kLinphoneMsgNotificationAppGroupId] && [ConfigManager.instance lpConfigBoolForKeyWithKey:@"auto_write_to_gallery_preference"]) { - [ChatConversationView writeMediaToGallery:name fileType:fileType]; - } - }); -} - --(void) documentMenu:(UIDocumentMenuViewController *)documentMenu didPickDocumentPicker:(UIDocumentPickerViewController *)documentPicker { - documentPicker.delegate = self; - [PhoneMainView.instance presentViewController:documentPicker animated:YES completion:nil]; -} - --(void) documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url { - [url startAccessingSecurityScopedResource]; - NSFileCoordinator *co =[[NSFileCoordinator alloc] init]; - NSError *error = nil; - [co coordinateReadingItemAtURL:url options:0 error:&error byAccessor:^(NSURL * _Nonnull newURL) { - UIImage *image = [UIChatBubbleTextCell getImageFromFileName:[newURL lastPathComponent] forReplyBubble:false]; - [_fileContext addObject:[NSData dataWithContentsOfURL:newURL] name:[newURL lastPathComponent] type:@"file" image:image]; - [self refreshImageDrawer]; - }]; - [url stopAccessingSecurityScopedResource]; -} - -+(UIImage *)getBasicImage { - UIColor *color=[UIColor grayColor]; - CGRect frame = CGRectMake(0, 0, 200, 200); - UIGraphicsBeginImageContext(frame.size); - CGContextRef context = UIGraphicsGetCurrentContext(); - CGContextSetFillColorWithColor(context, [color CGColor]); - CGContextFillRect(context, frame); - UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - return image; -} - -+(UIImage*)drawText:(NSString*)text image:(UIImage *)image textSize:(CGFloat)textSize -{ - UIFont *font = [UIFont boldSystemFontOfSize:textSize]; - UIGraphicsBeginImageContext(image.size); - [image drawInRect:CGRectMake(0,0,image.size.width,image.size.height)]; - CGRect rect = CGRectMake(0, 30, image.size.width, image.size.height); - [[UIColor whiteColor] set]; - [text drawInRect:CGRectIntegral(rect) withFont:font]; - UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - return newImage; -} - -// Popup menu --(void) addOrGoToContact:(const LinphoneAddress *)contactAddress { - Contact *contact = [FastAddressBook getContactWithAddress:contactAddress]; - - if (contact) { - ContactDetailsView *view = VIEW(ContactDetailsView); - [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; - [ContactSelection setSelectionMode:ContactSelectionModeNone]; - [view setContact:contact]; - } else { - char *lAddress = linphone_address_as_string_uri_only(contactAddress); - if (lAddress != NULL) { - NSString *normSip = [NSString stringWithUTF8String:lAddress]; - normSip = [normSip hasPrefix:@"sip:"] ? [normSip substringFromIndex:4] : normSip; - normSip = [normSip hasPrefix:@"sips:"] ? [normSip substringFromIndex:5] : normSip; - [ContactSelection setAddAddress:normSip]; - [ContactSelection setSelectionMode:ContactSelectionModeEdit]; - [ContactSelection enableSipFilter:FALSE]; - [PhoneMainView.instance changeCurrentView:ContactsListView.compositeViewDescription]; - ms_free(lAddress); - } - } -} - --(void) showAddressAndIdentityPopup { - - char *localAddress = linphone_address_as_string(linphone_chat_room_get_local_address(_chatRoom)); - char *peerAddress = linphone_address_as_string(linphone_chat_room_get_peer_address(_chatRoom)); - NSString *infoMsg = [NSString stringWithFormat:@"Chat room id:\n%s\nLocal account:\n%s", peerAddress, localAddress]; - ms_free(localAddress); - ms_free(peerAddress); - - UIAlertController *popupView = - [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Chatroom debug infos", nil) - message:infoMsg - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Copy to clipboard", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *action) { - UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; - pasteboard.string = infoMsg; - }]; - - [popupView addAction:defaultAction]; - [self presentViewController:popupView animated:YES completion:nil]; - -} - --(BOOL) canAdminEphemeral:(const LinphoneChatRoom *)cr { - if (!cr || !isEncrypted) return FALSE; - - // 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))); -} - -- (void) setupPopupMenu { - _popupMenu.dataSource = self; - _popupMenu.delegate = self; - _tableController.editButton.hidden = true; - _popupMenu.layer.shadowColor = [UIColor lightGrayColor].CGColor; - _popupMenu.layer.shadowOpacity = 0.5; - _popupMenu.layer.shadowOffset = CGSizeZero; - _popupMenu.layer.shadowRadius = 10; - _popupMenu.layer.masksToBounds = false; - _toggleMenuButton.hidden = false; - _popupMenu.tableFooterView = [UIView new]; - _popupMenu.separatorStyle = UITableViewCellSeparatorStyleNone; - [_popupMenu reloadData]; -} - --(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - [self onToggleMenu:nil]; - - int firstIndex = isOneToOne ? 0 : 1; - - if (!isOneToOne && indexPath.row == 0) { //Schedule meeting - [ConferenceViewModelBridge scheduleFromGroupChatWithCChatRoom:_chatRoom]; - [PhoneMainView.instance popToView:ConferenceSchedulingView.compositeViewDescription]; - } - - if (indexPath.row == firstIndex) { - if (isOneToOne) { - if (isEncrypted) { - LinphoneAddress* contactAddress = linphone_address_clone(linphone_participant_get_address(bctbx_list_nth_data(linphone_chat_room_get_participants(_chatRoom), 0))); - linphone_address_clean(contactAddress); - [self addOrGoToContact:contactAddress]; - linphone_address_unref(contactAddress); - } else { - [self addOrGoToContact:linphone_chat_room_get_peer_address(_chatRoom)]; - } - } else { - [self displayGroupInfo]; - } - } - - if (isEncrypted && indexPath.row == 1+firstIndex) { - [self goToDeviceListView]; - } - - BOOL canEphemeral = [self canAdminEphemeral:_chatRoom]; - if (canEphemeral && indexPath.row == 2+firstIndex) { - EphemeralSettingsView *view = VIEW(EphemeralSettingsView); - view.room = _chatRoom; - [PhoneMainView.instance popToView:view.compositeViewDescription]; - } - if ((!isEncrypted && indexPath.row == 1+firstIndex) || (isEncrypted && indexPath.row == 3+firstIndex)) { - [LinphoneManager setChatroomPushEnabled:_chatRoom withPushEnabled:![LinphoneManager getChatroomPushEnabled:_chatRoom]]; - [_popupMenu reloadData]; - } - - if ((!isEncrypted && indexPath.row == 2+firstIndex) || (isEncrypted && indexPath.row == 4+firstIndex)) { - [_tableController onEditClick:nil]; - [self onEditionChangeClick:nil]; - } - - if ((isEncrypted && ((!canEphemeral && indexPath.row == 4+firstIndex)||(canEphemeral && indexPath.row == 5+firstIndex))) - || (!isEncrypted && indexPath.row == 3+firstIndex)) { - [self showAddressAndIdentityPopup]; - } -} - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 1; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - int nbRows = 3; - - if ([LinphoneManager.instance lpConfigIntForKey:@"debugenable_preference"] == 1) // DEBOGUE == ALL - ++nbRows; - - if (!isEncrypted) - return nbRows; - else - ++nbRows; - - if ([self canAdminEphemeral:_chatRoom]) - ++nbRows; - - if (!isOneToOne) // schedule meeting - ++nbRows; - - return nbRows; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell *cell = [[UITableViewCell alloc] init]; - - if (!_chatRoom) { - // Workaround to avoid crash in background for release 4.7. This shouldn't happen though, so there may be a deeper issue not found yet - return cell; - } - - int firstIndex = isOneToOne ? 0 : 1; - - if (!isOneToOne && indexPath.row == 0) { - cell.imageView.image = [UIImage imageNamed:@"menu_voip_meeting_schedule"]; - cell.textLabel.text = NSLocalizedString(@"Schedule a meeting",nil); - } - - if (indexPath.row == firstIndex) { - if (isOneToOne) { - Contact *contact; - if (isEncrypted) { - LinphoneAddress * contactAddress = linphone_address_clone(linphone_participant_get_address(bctbx_list_nth_data(linphone_chat_room_get_participants(_chatRoom), 0))); - linphone_address_clean(contactAddress); - contact = [FastAddressBook getContactWithAddress:contactAddress]; - linphone_address_unref(contactAddress); - } else { - contact = [FastAddressBook getContactWithAddress:linphone_chat_room_get_peer_address(_chatRoom)]; - } - if (contact == nil) { - cell.imageView.image = [UIImage imageNamed:@"contact_add_default.png"]; - cell.textLabel.text = NSLocalizedString(@"Add to contacts",nil); - } else { - cell.imageView.image = [UIImage imageNamed:@"contacts_all_default.png"]; - cell.textLabel.text = NSLocalizedString(@"Go to contact",nil); - } - } else { - cell.imageView.image = [UIImage imageNamed:@"chat_group_informations.png"]; - cell.textLabel.text = NSLocalizedString(@"Group infos",nil); - } - } - - if (isEncrypted && indexPath.row == 1+firstIndex) { - cell.imageView.image = [UIImage imageNamed:@"menu_security_default.png"]; - cell.textLabel.text = NSLocalizedString(@"Conversation's devices",nil); - } - - bool canEphemeral = [self canAdminEphemeral:_chatRoom]; - if (canEphemeral && indexPath.row == 2+firstIndex) { - cell.imageView.image = [LinphoneUtils resizeImage:[UIImage imageNamed:@"ephemeral_messages_default.png"] newSize:CGSizeMake(20, 25)]; - cell.textLabel.text = NSLocalizedString(@"Ephemeral messages",nil); - } - - if ((isEncrypted && indexPath.row == 3+firstIndex) || (!isEncrypted && indexPath.row == 1+firstIndex)) { - if ([LinphoneManager getChatroomPushEnabled:_chatRoom]) { - cell.imageView.image = [UIImage imageNamed:@"menu_notifications_off.png"]; - cell.textLabel.text = NSLocalizedString(@"Mute notifications",nil); - } else { - cell.imageView.image = [UIImage imageNamed:@"menu_notifications_on.png"]; - cell.textLabel.text = NSLocalizedString(@"Un-mute notifications",nil); - } - } - - if ((isEncrypted && indexPath.row == 4+firstIndex) || (!isEncrypted && indexPath.row == 2+firstIndex)) { - cell.imageView.image = [UIImage imageNamed:@"delete_default.png"]; - cell.textLabel.text = NSLocalizedString(@"Delete messages",nil); - } - - if ((isEncrypted && ((!canEphemeral && indexPath.row == 4+firstIndex)||(canEphemeral && indexPath.row == 5+firstIndex))) - || (!isEncrypted && indexPath.row == 3+firstIndex)) { - cell.imageView.image = [UIImage imageNamed:@"chat_group_informations.png"]; - cell.textLabel.text = NSLocalizedString(@"Debug infos",nil); - } - - UIImageView * icon = [[UIImageView alloc] initWithFrame:CGRectMake(tableView.frame.size.width-37, 7, 30, 30)]; - icon.contentMode = UIViewContentModeScaleAspectFit; - icon.image = cell.imageView.image; - [cell.contentView addSubview:icon]; - cell.imageView.image = nil; - - return cell; -} -- (IBAction)onToggleMenu:(id)sender { - _popupMenu.hidden = !_popupMenu.hidden; - if (!_popupMenu.hidden) - [_popupMenu selectRowAtIndexPath:nil animated:false scrollPosition:UITableViewScrollPositionNone]; -} - -// Voice recording - -- (IBAction)onVrDelete:(id)sender { - [self cancelVoiceRecording]; - [self stopVoiceRecordPlayer]; -} - -- (IBAction)onvrPlayPauseStop:(id)sender { - if (_isVoiceRecording) { - [self stopVoiceRecording]; - } else { - if (_isPlayingVoiceRecording) - [self stopVoiceRecordPlayer]; - else - [self playRecordedMessage]; - } -} - -- (IBAction)onVrStart:(id)sender { - if (_isVoiceRecording) { - [self stopVoiceRecording]; - } else { - [self startVoiceRecording]; - } -} - --(void) createVoiceRecorder { - LinphoneRecorderParams *p = linphone_core_create_recorder_params(LC); - linphone_recorder_params_set_file_format(p, LinphoneRecorderFileFormatMkv); - _voiceRecorder = linphone_core_create_recorder(LC, p); -} - --(void) cancelVoiceRecording { - [[UIApplication sharedApplication] setIdleTimerDisabled:false]; - _showVoiceRecorderView = false; - _toggleRecord.selected = false; - [self updateFramesInclRecordingAndReplyView]; - _isPendingVoiceRecord = false; - _isVoiceRecording = false; - if (_voiceRecorder && linphone_recorder_get_state(_voiceRecorder) != LinphoneRecorderClosed) { - linphone_recorder_close(_voiceRecorder); - const char *recordingFile = linphone_recorder_get_file(_voiceRecorder); - if (recordingFile) { - [AppManager removeFileWithFile:[NSString stringWithUTF8String:recordingFile]]; - } - } - [self setSendButtonState]; -} - --(void) stopVoiceRecording { - [[UIApplication sharedApplication] setIdleTimerDisabled:false]; - if (_voiceRecorder && linphone_recorder_get_state(_voiceRecorder) == LinphoneRecorderRunning) { - LOGI(@"[Chat Message Sending] Pausing / closing voice recorder"); - linphone_recorder_pause(_voiceRecorder); - linphone_recorder_close(_voiceRecorder); - _vrDurationLabel.text = [self formattedDuration:linphone_recorder_get_duration(_voiceRecorder)]; - } - _isVoiceRecording = false; - if ([LinphoneManager.instance lpConfigBoolForKey:@"voice_recording_send_right_away" withDefault:false]) { - [self onSendClick:nil]; - } - [_vrPlayButton setImage:[UIImage imageNamed:@"vr_play"] forState:UIControlStateNormal]; - _toggleRecord.selected = false; - _vrWaveMask.frame = CGRectZero; - [_vrRecordTimer invalidate]; - _isPendingVoiceRecord = linphone_recorder_get_duration(_voiceRecorder) > 0; - [self setSendButtonState]; - -} - --(void) startVoiceRecording { - [[UIApplication sharedApplication] setIdleTimerDisabled:true]; - - if (!_voiceRecorder) - [self createVoiceRecorder]; - [CallManager.instance activateAudioSession]; - _toggleRecord.selected = true; - [_vrPlayButton setImage:[UIImage imageNamed:@"vr_stop"] forState:UIControlStateNormal]; - - - _showVoiceRecorderView = true; - [self updateFramesInclRecordingAndReplyView]; - _isVoiceRecording = true; - _vrWaveMaskPlayer.frame = CGRectZero; - - switch (linphone_recorder_get_state(_voiceRecorder)) { - case LinphoneRecorderClosed: { - 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); - break; - }; - case LinphoneRecorderRunning: { - LOGW(@"[Chat Message Sending] Recorder is already recording"); - break; - } - case LinphoneRecorderPaused: { - LOGW(@"[Chat Message Sending] Recorder isn't closed, resuming recording"); - linphone_recorder_start(_voiceRecorder); - } - } - _vrWaveMask.frame = _vrWave.frame; - _vrDurationLabel.text = [self formattedDuration:linphone_recorder_get_duration(_voiceRecorder)]; - _vrRecordTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 - target:self - selector:@selector(voiceRecordTimerUpdate) - userInfo:nil - repeats:YES]; - - -} - --(void) voiceRecordTimerUpdate { - int recorderDuration = linphone_recorder_get_duration(_voiceRecorder); - if (recorderDuration > [LinphoneManager.instance lpConfigIntForKey:@"voice_recording_max_duration" withDefault:60000]) { - LOGW(@"[Chat Message Sending] Max duration for voice recording exceeded, stopping. (max = %d)",[LinphoneManager.instance lpConfigIntForKey:@"voice_recording_max_duration" withDefault:60000]); - [self stopVoiceRecording]; - } else { - _vrDurationLabel.text = [self formattedDuration:linphone_recorder_get_duration(_voiceRecorder)]; - CGRect r = _vrWaveMask.frame; - r.origin.x += 30; - r.size.width -= 30; - if (r.origin.x > _vrWave.frame.size.width) { - r = _vrWave.frame; - _vrWaveMask.frame = r; - } else { - [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{ - _vrWaveMask.frame = r; - }completion:^(BOOL finished) {}]; - } - } -} - -// Playback Shared Player (new recording & chat bubble) - -- (void) initSharedPlayer { - LOGI(@"[Voice Message] Creating shared player"); - _sharedVoicePlayer = linphone_core_create_local_player(LC, [CallManager.instance getSpeakerSoundCard].UTF8String, nil, nil); - LinphonePlayerCbs *cbs = linphone_factory_create_player_cbs(linphone_factory_get()); - linphone_player_cbs_set_eof_reached(cbs, on_shared_player_eof_reached); - linphone_player_cbs_set_user_data(cbs, (__bridge void*)self); - linphone_player_add_callbacks(_sharedVoicePlayer, cbs); -} - --(void) startSharedPlayer:(const char *)path { - LOGI(@"[Voice Message] Starting shared player path = %s",path); - if (linphone_player_get_user_data(_sharedVoicePlayer)) { - LOGI(@"[Voice Message] a play was requested (%s), but there is already one going (%s)",path,(const char *)linphone_player_get_user_data(_sharedVoicePlayer) ); - NSDictionary* userInfo = @{@"path": [NSString stringWithUTF8String:linphone_player_get_user_data(_sharedVoicePlayer)]}; - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneVoiceMessagePlayerLostFocus object:nil userInfo:userInfo]; - } - [CallManager.instance changeRouteToSpeaker]; - linphone_player_set_user_data(_sharedVoicePlayer, (void *)path); - linphone_player_open(_sharedVoicePlayer, path); - linphone_player_start(_sharedVoicePlayer); -} - --(void) stopSharedPlayer { - LOGI(@"[Voice Message] Stopping shared player path = %s",linphone_player_get_user_data(_sharedVoicePlayer) ? (const char *)linphone_player_get_user_data(_sharedVoicePlayer) : "nil"); - linphone_player_pause(_sharedVoicePlayer); - linphone_player_seek(_sharedVoicePlayer,0); - linphone_player_close(_sharedVoicePlayer); - linphone_player_set_user_data(_sharedVoicePlayer, nil); -} - --(BOOL) sharedPlayedIsPlaying:(const char *)path { - return path && linphone_player_get_user_data(_sharedVoicePlayer) && !strcmp(path,linphone_player_get_user_data(_sharedVoicePlayer)); -} - -void on_shared_player_eof_reached(LinphonePlayer *p) { - LOGI(@"[Voice Message] End of file reached for player"); - const char * currentPlayedFile = (const char *) linphone_player_get_user_data(p); - if (currentPlayedFile) { - NSDictionary* userInfo = @{@"path": [NSString stringWithUTF8String:currentPlayedFile]}; - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneVoiceMessagePlayerEOF object:nil userInfo:userInfo]; - } -} - -// Playback of new recordings - --(void) playRecordedMessage { - [_vrPlayButton setImage:[UIImage imageNamed:@"vr_stop"] forState:UIControlStateNormal]; - _vrDurationLabel.text = [self formattedDuration:linphone_player_get_duration(_sharedVoicePlayer)]; - _vrWaveMask.frame = CGRectZero; - CGRect r = CGRectZero; - r.size.height = _vrInnerView.frame.size.height; - _vrWaveMaskPlayer.frame = r; - _vrPlayerTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 - target:self - selector:@selector(voicePlayTimerUpdate) - userInfo:nil - repeats:YES]; - [self startSharedPlayer:linphone_recorder_get_file(_voiceRecorder)]; - [self animPlayerOnce]; - _isPlayingVoiceRecording = true; -} - --(void) voicePlayTimerUpdate { - _vrDurationLabel.text = [self formattedDuration:linphone_player_get_duration(_sharedVoicePlayer)]; - [self animPlayerOnce]; -} - --(void) animPlayerOnce { - CGRect r = _vrWaveMaskPlayer.frame; - r.size.width += _vrInnerView.frame.size.width / ((linphone_player_get_duration(_sharedVoicePlayer) / 1000)+1) ; - if (r.size.width > _vrInnerView.frame.size.width) { - r.size.width = _vrInnerView.frame.size.width; - } - [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{ - _vrWaveMaskPlayer.frame = r; - }completion:^(BOOL finished) {}]; -} - --(void) endVoicePlayingIfDoingSO:(NSNotification *)notif { - if (_isPlayingVoiceRecording) - [self stopVoiceRecordPlayer]; -} - --(void) stopVoiceRecordPlayer { - [self stopSharedPlayer]; - [_vrPlayButton setImage:[UIImage imageNamed:@"vr_play"] forState:UIControlStateNormal]; - _isPlayingVoiceRecording = false; - [_vrPlayerTimer invalidate]; - _vrWaveMaskPlayer.frame = CGRectZero; -} - --(NSString *)formattedDuration:(long)valueMs { - return [NSString stringWithFormat:@"%02ld:%02ld", valueMs/ 60000, (valueMs % 60000) / 1000 ]; -} - --(void) updateFramesInclRecordingAndReplyView { // place below the messages table. - BOOL showHideVoice = _showVoiceRecorderView != !_vrView.hidden; - if (showHideVoice) - _vrView.hidden = !_showVoiceRecorderView; - - CGRect vrFrame = _vrView.frame; - CGRect tableFrame = _tableController.tableView.frame; - if (showHideVoice) { - tableFrame.size.height = _showVoiceRecorderView ? tableFrame.size.height - vrFrame.size.height : tableFrame.size.height + vrFrame.size.height; - _tableController.tableView.frame = tableFrame; - [_tableController.tableView reloadData]; - } - vrFrame.origin.y = tableFrame.origin.y+tableFrame.size.height; - _vrView.frame = vrFrame; - - BOOL showHideReply = _showReplyView != !_replyView.hidden; - if (showHideReply) - _replyView.hidden = !_showReplyView; - - CGRect repFrame = _replyView.frame; - tableFrame = _tableController.tableView.frame; - if (showHideReply) { - tableFrame.size.height = _showReplyView ? tableFrame.size.height - repFrame.size.height : tableFrame.size.height + repFrame.size.height; - _tableController.tableView.frame = tableFrame; - [_tableController.tableView reloadData]; - } - repFrame.origin.y = _showVoiceRecorderView ? vrFrame.origin.y + vrFrame.size.height : tableFrame.origin.y+tableFrame.size.height; - _replyView.frame = repFrame; - -} - --(void) stopAllPlays { - if (linphone_player_get_user_data(_sharedVoicePlayer)) { - NSDictionary* userInfo = @{@"path": [NSString stringWithUTF8String:linphone_player_get_user_data(_sharedVoicePlayer)]}; - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneVoiceMessagePlayerLostFocus object:nil userInfo:userInfo]; - } -} - -// send button state - --(void) setSendButtonState { - _sendButton.enabled = !_isVoiceRecording && ((_isPendingVoiceRecord && linphone_recorder_get_duration(_voiceRecorder) > 0) || [[_messageField text] length] > 0 || _fileContext.count > 0); -} - - -// Reply - --(void) closePendingReply { - if (_replyBubble != nil) { - _showReplyView = false; - [_replyBubble.view removeFromSuperview]; - [self updateFramesInclRecordingAndReplyView]; - _replyBubble = nil; - } -} - --(void) initiateReplyViewForMessage:(LinphoneChatMessage *)message { - if (_replyBubble != nil) - [self closePendingReply]; - _replyBubble = [[UIChatReplyBubbleView alloc] initWithNibName:@"UIChatReplyBubbleView" bundle:nil]; - [self addChildViewController:_replyBubble]; - [_replyView addSubview:_replyBubble.view]; - [_replyBubble didMoveToParentViewController:self]; - [_replyBubble configureForMessage:message withDimissBlock:^{ - [self closePendingReply]; - } hideDismiss:false withClickBlock:^{}]; - _showReplyView = true; - [self updateFramesInclRecordingAndReplyView]; - [self.tableController scrollToMessage:message]; - [self.messageField becomeFirstResponder]; -} - --(void) handlePendingTransferIfAny { - if (self.pendingForwardMessage) { - LinphoneChatMessage *message = self.pendingForwardMessage; - self.pendingForwardMessage = nil; - UIConfirmationDialog *d = [UIConfirmationDialog ShowWithMessage:NSLocalizedString(@"Transfer this message to this conversation ?",nil) - cancelMessage:nil - confirmMessage:NSLocalizedString(@"TRANSFER",nil) - onCancelClick:^() {} - onConfirmationClick:^() { - linphone_chat_message_send(linphone_chat_room_create_forward_message(_chatRoom, message)); - linphone_chat_message_unref(message); - }]; - d.forwardImage.hidden = NO; - [d setSpecialColor]; - } -} - - -@end diff --git a/Classes/ChatsListTableView.h b/Classes/ChatsListTableView.h deleted file mode 100644 index 5a49bf983..000000000 --- a/Classes/ChatsListTableView.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#include "linphone/linphonecore.h" -#include "UICheckBoxTableView.h" - -@interface ChatsListTableView : UICheckBoxTableView - -@property (nonatomic) NSInteger nbOfChatRoomToDelete; -@property (nonatomic) bctbx_list_t *chatRooms; -@property (weak, nonatomic) IBOutlet UIView *waitView; -@property bctbx_list_t *data; - - -- (void)loadData; -- (void)markCellAsRead:(LinphoneChatRoom *)chatRoom; -- (void)updateEventEntry:(LinphoneChatMessage *)msg; -@end diff --git a/Classes/ChatsListTableView.m b/Classes/ChatsListTableView.m deleted file mode 100644 index 33b970598..000000000 --- a/Classes/ChatsListTableView.m +++ /dev/null @@ -1,338 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "ChatsListTableView.h" -#import "UIChatCell.h" -#import "FileTransferDelegate.h" -#import "linphoneapp-Swift.h" -#import "linphone/linphonecore.h" -#import "PhoneMainView.h" -#import "Utils.h" -#import "SVProgressHUD.h" - - -@implementation ChatsListTableView - -#pragma mark - Lifecycle Functions - -- (instancetype)init { - self = super.init; - if (self) { - _data = nil; - _nbOfChatRoomToDelete = 0; - _waitView.hidden = TRUE; - } - return self; -} - - -- (void)dealloc { - bctbx_list_free(_data); -} - -#pragma mark - ViewController Functions - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - self.tableView.accessibilityIdentifier = @"Chat list"; - [self loadData]; - _chatRooms = NULL; - - NSDictionary* userInfo; - [NSNotificationCenter.defaultCenter addObserver:self - selector: @selector(receivePresenceNotification:) - name: @"LinphoneFriendPresenceUpdate" - object: userInfo]; -} - --(void) receivePresenceNotification:(NSNotification*)notification -{ - if ([notification.name isEqualToString:@"LinphoneFriendPresenceUpdate"]) - { - NSDictionary* userInfo = notification.userInfo; - NSString* friend = (NSString*)userInfo[@"friend"]; - - for (int i = 0; i < bctbx_list_size(_data); i++) - { - LinphoneChatRoom *chatRoom = (LinphoneChatRoom *)bctbx_list_nth_data(_data, i); - - bctbx_list_t *participants = linphone_chat_room_get_participants(chatRoom); - if (linphone_chat_room_get_nb_participants(chatRoom) == 1) { - LinphoneParticipant *firstParticipant = participants ? (LinphoneParticipant *)participants->data : NULL; - - char *curi = linphone_address_as_string_uri_only(linphone_participant_get_address(firstParticipant)); - NSString *uri = [NSString stringWithUTF8String:curi]; - - LinphoneChatRoomCapabilitiesMask capabilities = linphone_chat_room_get_capabilities(chatRoom); - bool oneToOne = capabilities & LinphoneChatRoomCapabilitiesOneToOne; - if(oneToOne && [uri isEqual:friend]){ - NSIndexPath* indexPath = [NSIndexPath indexPathForRow:i inSection:0]; - NSArray* indexArray = [NSArray arrayWithObjects:indexPath, nil]; - [self.tableView reloadRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationFade]; - } - } - } - } -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - // we cannot do that in viewWillAppear because we will change view while previous transition - // was not finished, leading to "[CALayer retain]: message sent to deallocated instance" error msg - /* - if (IPAD && [self totalNumberOfItems] > 0) { - [PhoneMainView.instance changeCurrentView:ChatConversationView.compositeViewDescription]; - } - */ -} - -- (void)viewWillDisappear:(BOOL)animated { - while (_chatRooms) { - LinphoneChatRoom *chatRoom = (LinphoneChatRoom *)_chatRooms->data; - if (!chatRoom) - continue; - - - LinphoneChatRoomCbs *cbs = linphone_chat_room_get_current_callbacks(chatRoom); - if (cbs) {// If the view is getting changed while a chatroom deletion is in progress, the callbacks may already have been deleted despite the chatroom still being there, causing a potential crash. - linphone_chat_room_remove_callbacks(chatRoom, cbs); - } - _chatRooms = _chatRooms->next; - } - - [[NSNotificationCenter defaultCenter] removeObserver:self name:@"LinphoneFriendPresenceUpdate" object:nil]; - [AvatarBridge removeAllObserver]; -} - -- (void)layoutSubviews { - [self.tableView layoutSubviews]; - - CGSize contentSize = self.tableView.contentSize; - contentSize.width = self.tableView.bounds.size.width; - self.tableView.contentSize = contentSize; -} - -#pragma mark - - -static int sorted_history_comparison(LinphoneChatRoom *to_insert, LinphoneChatRoom *elem) { - time_t new = linphone_chat_room_get_last_update_time(to_insert); - time_t old = linphone_chat_room_get_last_update_time(elem); - if (new < old) - return 1; - else if (new > old) - return -1; - - return 0; -} - -- (MSList *)sortChatRooms { - MSList *sorted = nil; - const MSList *unsorted = linphone_core_get_chat_rooms(LC); - const MSList *iter = unsorted; - - while (iter) { - // store last message in user data - LinphoneChatRoom *chat_room = iter->data; - sorted = bctbx_list_insert_sorted(sorted, chat_room, (bctbx_compare_func)sorted_history_comparison); - iter = iter->next; - } - return sorted; -} - -- (void)loadData { - if (_data) bctbx_list_free(_data); - _data = [self sortChatRooms]; - [super loadData]; - - /* - if (IPAD) { - int idx = bctbx_list_index(_data, VIEW(ChatConversationView).chatRoom); - // if conversation view is using a chatroom that does not exist anymore, update it - if (idx != -1) { - NSIndexPath *indexPath = [NSIndexPath indexPathForRow:idx inSection:0]; - [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; - } else if ([LinphoneManager.instance lpConfigBoolForKey:@"create_chat" withDefault:FALSE]) { - // if create chat, show the empty chat - [LinphoneManager.instance lpConfigSetBool:FALSE forKey:@"create_chat"]; - } else if (![self selectFirstRow]) { - ChatConversationCreateView *view = VIEW(ChatConversationCreateView); - [view fragmentCompositeDescription]; - view.tableController.notFirstTime = FALSE; - view.isForVoipConference = FALSE; - [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; - } - } - */ -} - -- (void)updateEventEntry:(LinphoneChatMessage *)msg { - int idx = bctbx_list_index(_data, linphone_chat_message_get_chat_room(msg)); - NSIndexPath *indexPath = [NSIndexPath indexPathForRow:idx inSection:0]; - if (idx < 0) { - LOGW(@"event entry doesn't exist"); - return; - } - [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:FALSE]; -} - -- (void)markCellAsRead:(LinphoneChatRoom *)chatRoom { - int idx = bctbx_list_index(_data, VIEW(ChatConversationView).chatRoom); - NSIndexPath *indexPath = [NSIndexPath indexPathForRow:idx inSection:0]; - /* - if (IPAD) { - UIChatCell *cell = (UIChatCell *)[self.tableView cellForRowAtIndexPath:indexPath]; - [cell updateUnreadBadge]; - } - */ -} - -#pragma mark - UITableViewDataSource Functions - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 1; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return bctbx_list_size(_data); -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - static NSString *kCellId = @"UIChatCell"; - UIChatCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId]; - if (cell == nil) - cell = [[UIChatCell alloc] initWithIdentifier:kCellId]; - - if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground) { - return cell; - } - - [cell setChatRoom:(LinphoneChatRoom *)bctbx_list_nth_data(_data, (int)[indexPath row])]; - [super accessoryForCell:cell atPath:indexPath]; - BOOL forwardMode = VIEW(ChatConversationViewSwift).pendingForwardMessage != nil; - cell.forwardIcon.hidden = !forwardMode; - if (forwardMode) { - cell.ephemeral.hidden = true; - cell.imdmIcon.hidden = true; - } - - return cell; -} - -- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(nonnull NSIndexPath *)indexPath { - return 86.0; -} - -#pragma mark - UITableViewDelegate Functions - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - [super tableView:tableView didSelectRowAtIndexPath:indexPath]; - if ([self isEditing]) - return; - - LinphoneChatRoom *chatRoom = (LinphoneChatRoom *)bctbx_list_nth_data(_data, (int)[indexPath row]); - [PhoneMainView.instance goToChatRoomSwift:chatRoom]; -} - -void deletion_chat_room_state_changed(LinphoneChatRoom *cr, LinphoneChatRoomState newState) { - LinphoneChatRoomCbs *cbs = linphone_chat_room_get_current_callbacks(cr); - ChatsListTableView *view =cbs ? ((__bridge ChatsListTableView *)linphone_chat_room_cbs_get_user_data(cbs) ?: NULL) : NULL; - if (!view) - return; - - if (newState == LinphoneChatRoomStateDeleted || newState == LinphoneChatRoomStateTerminationFailed) { - linphone_chat_room_remove_callbacks(cr, cbs); - view.chatRooms = bctbx_list_remove(view.chatRooms, cr); - view.nbOfChatRoomToDelete--; - } - - if (view.nbOfChatRoomToDelete == 0) { - // will force a call to [self loadData] - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneMessageReceived object:view]; - view.waitView.hidden = TRUE; - [SVProgressHUD dismiss]; - } -} - -- (void) deleteChatRooms { - _waitView.hidden = FALSE; - [SVProgressHUD show]; - bctbx_list_t *chatRooms = bctbx_list_copy(_chatRooms); - while (chatRooms) { - LinphoneChatRoom *chatRoom = (LinphoneChatRoom *)chatRooms->data; - if (!chatRoom) - continue; - - _nbOfChatRoomToDelete++; - LinphoneChatRoomCbs *cbs = linphone_factory_create_chat_room_cbs(linphone_factory_get()); - linphone_chat_room_cbs_set_state_changed(cbs, deletion_chat_room_state_changed); - linphone_chat_room_cbs_set_user_data(cbs, (__bridge void*)self); - linphone_chat_room_add_callbacks(chatRoom, cbs); - - FileTransferDelegate *ftdToDelete = nil; - for (FileTransferDelegate *ftd in [LinphoneManager.instance fileTransferDelegates]) { - if (linphone_chat_message_get_chat_room(ftd.message) == chatRoom) { - ftdToDelete = ftd; - break; - } - } - [ftdToDelete cancel]; - - // Re-enable push notification after deleting the chatroom, in order to get the notification if we are re-invited, or for secure 1-to-1 chatrooms. - [LinphoneManager setChatroomPushEnabled:chatRoom withPushEnabled:TRUE]; - linphone_core_delete_chat_room(LC, chatRoom); - chatRooms = chatRooms->next; - } -} - -- (void)tableView:(UITableView *)tableView - commitEditingStyle:(UITableViewCellEditingStyle)editingStyle - forRowAtIndexPath:(NSIndexPath *)indexPath { - if (editingStyle == UITableViewCellEditingStyleDelete) { - LinphoneChatRoom *chatRoom = (LinphoneChatRoom *)bctbx_list_nth_data(_data, (int)[indexPath row]); - NSString *msg = (LinphoneChatRoomCapabilitiesOneToOne & linphone_chat_room_get_capabilities(chatRoom)) - ? [NSString stringWithFormat:NSLocalizedString(@"Do you want to delete this conversation?", nil)] - : [NSString stringWithFormat:NSLocalizedString(@"Do you want to leave and delete this conversation?", nil)]; - [UIConfirmationDialog ShowWithMessage:msg - cancelMessage:nil - confirmMessage:nil - onCancelClick:^() {} - onConfirmationClick:^() { - _chatRooms = bctbx_list_new((void *)chatRoom); - [self deleteChatRooms]; - }]; - } -} - -- (void)removeSelectionUsing:(void (^)(NSIndexPath *))remover { - _chatRooms = NULL; - // we must iterate through selected items in reverse order - [self.selectedItems sortUsingComparator:^(NSIndexPath *obj1, NSIndexPath *obj2) { - return [obj2 compare:obj1]; - }]; - NSArray *copy = [[NSArray alloc] initWithArray:self.selectedItems]; - for (NSIndexPath *indexPath in copy) { - LinphoneChatRoom *chatRoom = (LinphoneChatRoom *)bctbx_list_nth_data(_data, (int)[indexPath row]); - _chatRooms = bctbx_list_append(_chatRooms, chatRoom); - } - [self deleteChatRooms]; - [self.selectedItems removeAllObjects]; - [self setEditing:NO animated:YES]; -} - -@end diff --git a/Classes/ChatsListView.h b/Classes/ChatsListView.h deleted file mode 100644 index c9598fcbe..000000000 --- a/Classes/ChatsListView.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UIToggleButton.h" - -#import "ChatsListTableView.h" -#import "UICompositeView.h" -#import "UIBackToCallButton.h" - -@interface ChatsListView : UIViewController { -} - -@property(nonatomic, strong) IBOutlet ChatsListTableView *tableController; -@property(weak, nonatomic) IBOutlet UIButton *addButton; -@property (weak, nonatomic) IBOutlet UIButton *addGroupChatButton; -@property(weak, nonatomic) IBOutlet UIBackToCallButton *backToCallButton; -@property (weak, nonatomic) IBOutlet UIView *waitView; -@property (weak, nonatomic) IBOutlet UIInterfaceStyleButton *toggleSelectionButton; -@property (weak, nonatomic) IBOutlet UILabel *forwardTitle; -@property (weak, nonatomic) IBOutlet UIInterfaceStyleButton *cancelForwardButton; - - -- (IBAction)onAddGroupChatClick:(id)event; -- (IBAction)onAddClick:(id)event; -- (IBAction)onChatRoomSwiftClick:(id)event; -- (IBAction)onEditionChangeClick:(id)sender; -- (IBAction)onDeleteClick:(id)sender; - --(void) mediaSharing; - -@end diff --git a/Classes/ChatsListView.m b/Classes/ChatsListView.m deleted file mode 100644 index 812809e08..000000000 --- a/Classes/ChatsListView.m +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "ChatsListView.h" -#import "PhoneMainView.h" - -#import "ChatConversationCreateView.h" -#import "linphoneapp-Swift.h" -@implementation ChatsListView - -#pragma mark - ViewController Functions - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(textReceivedEvent:) - name:kLinphoneMessageReceived - object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(callUpdateEvent:) - name:kLinphoneCallUpdate - object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(ephemeralDeleted:) - name:kLinphoneEphemeralMessageDeletedInRoom - object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(displayModeChanged) - name:kDisplayModeChanged - object:nil]; - [_backToCallButton update]; - self.tableController.waitView = _waitView; - [self setEditing:NO]; - LinphoneAccount *defaultAccount = linphone_core_get_default_account(LC); - _addGroupChatButton.hidden = !(defaultAccount && linphone_account_params_get_conference_factory_uri(linphone_account_get_params(defaultAccount))); - [_toggleSelectionButton setImage:[UIImage imageNamed:@"select_all_default.png"] forState:UIControlStateSelected]; - - // For testing crashlytics - /*UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; - button.frame = CGRectMake(20, 50, 100, 30); - [button setTitle:@"Crash" forState:UIControlStateNormal]; - [button addTarget:self action:@selector(crashButtonTapped:) - forControlEvents:UIControlEventTouchUpInside]; - [self.view addSubview:button];*/ - - [self mediaSharing]; - -} - -- (void)mediaSharing{ - BOOL forwardMode; - - NSString* groupName = [NSString stringWithFormat:@"group.%@.linphoneExtension",[[NSBundle mainBundle] bundleIdentifier]]; - NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:groupName]; - NSDictionary *dict = [defaults valueForKey:@"photoData"]; - NSDictionary *dictFile = [defaults valueForKey:@"icloudData"]; - NSDictionary *dictUrl = [defaults valueForKey:@"url"]; - if(dict||dictFile||dictUrl) VIEW(ChatConversationViewSwift).sharingMedia = TRUE; - - if(VIEW(ChatConversationViewSwift).sharingMedia == false){ - forwardMode = VIEW(ChatConversationViewSwift).pendingForwardMessage != nil; - }else{ - forwardMode = VIEW(ChatConversationViewSwift).sharingMedia != false; - } - _tableController.editButton.hidden = forwardMode; - if(VIEW(ChatConversationViewSwift).sharingMedia == false){ - _forwardTitle.text = NSLocalizedString(@"Select a discussion or create a new one",nil); - } - else{ - _forwardTitle.text = NSLocalizedString(@"Select or create a conversation to share the file(s)",nil); - } - _forwardTitle.hidden = !forwardMode; - _cancelForwardButton.hidden = !forwardMode; - - _tableController.tableView.frame = CGRectMake(0, 66 + (forwardMode ? _forwardTitle.frame.size.height : 0), _tableController.tableView.frame.size.width, self.view.frame.size.height - 66 - ( forwardMode ? _forwardTitle.frame.size.height : 0 )); - _addButton.frame = CGRectMake(forwardMode ? 82 : 0 , _addButton.frame.origin.y, _addButton.frame.size.width, _addButton.frame.size.height); - _addGroupChatButton.frame = CGRectMake(forwardMode ? 164 : 82 , _addGroupChatButton.frame.origin.y, _addGroupChatButton.frame.size.width, _addGroupChatButton.frame.size.height); -} - -- (void)displayModeChanged{ - [self.tableController.tableView reloadData]; -} - -- (void)ephemeralDeleted:(NSNotification *)notif { - //LinphoneChatRoom *r =[[notif.userInfo objectForKey:@"room"] intValue]; - [self.tableController loadData]; -} - - -- (void)viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; - - [NSNotificationCenter.defaultCenter removeObserver:self]; - self.view = NULL; -} - -#pragma mark - Event Functions - -- (void)textReceivedEvent:(NSNotification *)notif { - [_tableController loadData]; -} - -- (void)callUpdateEvent:(NSNotification *)notif { - [_backToCallButton update]; -} - -#pragma mark - UICompositeViewDelegate Functions - -static UICompositeViewDescription *compositeDescription = nil; - -+ (UICompositeViewDescription *)compositeViewDescription { - if (compositeDescription == nil) { - compositeDescription = [[UICompositeViewDescription alloc] init:self.class - statusBar:StatusBarView.class - tabBar:TabBarView.class - sideMenu:SideMenuView.class - fullscreen:false - isLeftFragment:YES - fragmentWith:ChatConversationCreateView.class]; - } - return compositeDescription; -} - -- (UICompositeViewDescription *)compositeViewDescription { - return self.class.compositeViewDescription; -} - -#pragma mark - Action Functions - -- (void)newChatCreate:(BOOL)isGroup { - ChatConversationCreateView *view = VIEW(ChatConversationCreateView); - [view fragmentCompositeDescription]; - view.isForEditing = false; - view.isGroupChat = isGroup; - view.tableController.notFirstTime = FALSE; - view.isForVoipConference = FALSE; - [view.tableController.contactsGroup removeAllObjects]; - [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; -} - -- (IBAction)onAddGroupChatClick:(id)event { - [self newChatCreate:TRUE]; - //if (IPAD) - //[NSNotificationCenter.defaultCenter postNotificationName:kLinphoneChatCreateViewChange object:VIEW(ChatConversationCreateView) userInfo:nil]; -} - -- (IBAction)onChatRoomSwiftClick:(id)event { - [PhoneMainView.instance changeCurrentView:ChatConversationViewSwift.compositeViewDescription]; -} - -- (IBAction)onAddClick:(id)event { - [self newChatCreate:FALSE]; - //if (IPAD) - //[NSNotificationCenter.defaultCenter postNotificationName:kLinphoneChatCreateViewChange object:VIEW(ChatConversationCreateView) userInfo:nil]; -} - -- (IBAction)onEditionChangeClick:(id)sender { - _addButton.hidden = _addGroupChatButton.hidden = self.tableController.isEditing; - [_backToCallButton update]; -} - -- (IBAction)onDeleteClick:(id)sender { - BOOL group = false; - NSArray *copy = [[NSArray alloc] initWithArray:_tableController.selectedItems]; - for (NSIndexPath *indexPath in copy) { - LinphoneChatRoom *chatRoom = (LinphoneChatRoom *)bctbx_list_nth_data(_tableController.data, (int)[indexPath row]); - if (LinphoneChatRoomCapabilitiesConference & linphone_chat_room_get_capabilities(chatRoom)) { - group = true; - break; - } - } - NSString *msg = group - ? [NSString stringWithFormat:NSLocalizedString(@"Do you want to leave and delete the selected conversations?", nil)] - : [NSString stringWithFormat:NSLocalizedString(@"Do you want to delete the selected conversations?", nil)]; - [UIConfirmationDialog ShowWithMessage:msg - cancelMessage:nil - confirmMessage:nil - onCancelClick:^() { - [self onEditionChangeClick:nil]; - } - onConfirmationClick:^() { - [_tableController removeSelectionUsing:nil]; - [self onEditionChangeClick:nil]; - }]; -} - -- (IBAction)crashButtonTapped:(id)sender { - assert(NO); -} - -- (IBAction)onCancelForwardClicked:(id)sender { - VIEW(ChatConversationViewSwift).sharingMedia = false; - VIEW(ChatConversationViewSwift).pendingForwardMessage = nil; - NSString* groupName = [NSString stringWithFormat:@"group.%@.linphoneExtension",[[NSBundle mainBundle] bundleIdentifier]]; - NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:groupName]; - [defaults removeObjectForKey:@"photoData"]; - [defaults removeObjectForKey:@"icloudData"]; - [defaults removeObjectForKey:@"url"]; - [PhoneMainView.instance popCurrentView]; -} - - - -@end diff --git a/Classes/Contact.h b/Classes/Contact.h deleted file mode 100644 index 46e664337..000000000 --- a/Classes/Contact.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import -#import -#include - -@interface Contact : NSObject - -//@property(nonatomic, readonly) ABRecordRef person; -@property(nonatomic, readonly) CNContact *person; -@property(nonatomic, readonly) LinphoneFriend *friend; - -@property(nonatomic, retain) NSString *identifier; -@property(nonatomic, retain) NSString *firstName; -@property(nonatomic, retain) NSString *lastName; -@property(nonatomic, retain) NSString *organizationName; -@property(nonatomic, retain) NSString *displayName; -@property(nonatomic, strong) NSMutableArray *sipAddresses; -@property(nonatomic, strong) NSMutableArray *emails; -@property(nonatomic, strong) NSMutableArray *phones; -@property BOOL createdFromLdapOrProvisioning; -@property BOOL added; - -- (void)setAvatar:(UIImage *)avatar; -- (UIImage *)avatar; -- (NSString *)displayName; - -- (instancetype)initWithCNContact:(CNContact *)contact; -- (instancetype)initWithFriend:(LinphoneFriend *) friend; -- (void)reloadFriend; -- (void)clearFriend; - -- (BOOL)setSipAddress:(NSString *)sip atIndex:(NSInteger)index; -- (BOOL)setEmail:(NSString *)email atIndex:(NSInteger)index; -- (BOOL)setPhoneNumber:(NSString *)phone atIndex:(NSInteger)index; - -- (BOOL)addSipAddress:(NSString *)sip; -- (BOOL)addEmail:(NSString *)email; -- (BOOL)addPhoneNumber:(NSString *)phone; - -- (BOOL)removeSipAddressAtIndex:(NSInteger)index; -- (BOOL)removePhoneNumberAtIndex:(NSInteger)index; -- (BOOL)removeEmailAtIndex:(NSInteger)index; - -- (NSMutableArray*)getSipAddressesWithoutDuplicatePhoneNumbers; -@end diff --git a/Classes/Contact.m b/Classes/Contact.m deleted file mode 100644 index 19f021d20..000000000 --- a/Classes/Contact.m +++ /dev/null @@ -1,516 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "Contact.h" -#import "ContactsListView.h" - -@implementation Contact - -- (instancetype)initWithCNContact:(CNContact *)acncontact { - return [self initWithPerson:acncontact andFriend:NULL]; -} - -- (instancetype)initWithFriend:(LinphoneFriend *)afriend { - return [self initWithPerson:NULL andFriend:afriend]; -} - -- (instancetype)initWithPerson:(CNContact *)acncontact - andFriend:(LinphoneFriend *)afriend { - self = [super init]; - _person = acncontact; - _friend = afriend ? linphone_friend_ref(afriend) : NULL; - _added = FALSE; - _createdFromLdapOrProvisioning = FALSE; - _phones = [[NSMutableArray alloc] init]; - _sipAddresses = [[NSMutableArray alloc] init]; - _emails = [[NSMutableArray alloc] init]; - if (_person) { - _identifier = _person.identifier; - _firstName = _person.givenName; - _lastName = _person.familyName; - _organizationName = _person.organizationName; - _displayName = [NSString stringWithFormat:@"%@ %@", _firstName, _lastName]; - for (CNLabeledValue *phoneNumber in _person.phoneNumbers) { - [_phones addObject:phoneNumber.value.stringValue]; - } - if ([_person respondsToSelector:NSSelectorFromString( CNInstantMessageAddressUsernameKey)] || [_person respondsToSelector:NSSelectorFromString(CNContactInstantMessageAddressesKey)]) { - if (_person.instantMessageAddresses != NULL) { - for (CNLabeledValue *sipAddr in _person.instantMessageAddresses) { - if ([FastAddressBook isSipAddress:sipAddr]) { - NSString *username = sipAddr.value.username; - [_sipAddresses addObject:username]; - } - } - } - } - - for (CNLabeledValue *email in _person.emailAddresses) { - [_emails addObject:email.value]; - } - const char *key = [NSString stringWithFormat:@"ab%@", acncontact.identifier].UTF8String; - // try to find friend associated with that person - if (_friend){ - linphone_friend_unref(_friend); - _friend = nil; - } - _friend = linphone_friend_list_find_friend_by_ref_key(linphone_core_get_default_friend_list(LC), key); - if (!_friend) { - _friend = linphone_core_create_friend(LC); - linphone_friend_set_ref_key(_friend, key); - linphone_friend_set_name(_friend, [NSString stringWithFormat:@"%@%@", _firstName ? _firstName : @"", _lastName ? [_firstName ? @" " : @"" stringByAppendingString:_lastName] : @""] .UTF8String); - for (NSString *sipAddr in _sipAddresses) { - LinphoneAddress *addr = linphone_core_interpret_url_2(LC, sipAddr.UTF8String, true); - if (addr) { - linphone_address_set_display_name(addr, [self displayName].UTF8String); - linphone_friend_add_address(_friend, addr); - linphone_address_destroy(addr); - } - } - for (NSString *phone in _phones) { - linphone_friend_add_phone_number(_friend, phone.UTF8String); - } - if (_organizationName) { - linphone_friend_set_organization(_friend, [_organizationName UTF8String]); - } - if (_friend) { - linphone_friend_enable_subscribes(_friend, FALSE); - linphone_friend_set_inc_subscribe_policy(_friend, LinphoneSPDeny); - linphone_core_add_friend(LC, _friend); - } - }else linphone_friend_ref(_friend); - } else if (_friend) { - [self loadFriend]; - } else { - LOGE(@"Contact cannot be initialized"); - return nil; - } - - /* LOGI(@"Contact %@ %@ initialized with %d phones, %d sip, %d emails", - self.firstName ?: @"", self.lastName ?: @"", self.phones.count, - self.sipAddresses.count, self.emails.count); - */ - return self; -} - -- (void)dealloc { - if (_friend) { - linphone_friend_unref(_friend); - } - _person = nil; - _friend = NULL; -} - -#pragma mark - Getters -- (UIImage *)avatar { - @try { - if (_person) - return [UIImage imageWithData:_person.imageData]; - } @catch (NSException *e) { - LOGE(@"CNContact imageData CNPropertyNotFetchedException : %@", e); - } - return nil; -} - -- (NSString *)displayName { - if (_friend) { - const char *friend_name = linphone_friend_get_name(_friend); - if (friend_name) - return [NSString stringWithUTF8String:friend_name]; - } - - if (_person) { - NSString *lFirstName = _person.givenName; - NSString *lLocalizedFirstName = [FastAddressBook localizedLabel:lFirstName]; - NSString *compositeName = _person.nickname; - NSString *lLastName = _person.familyName; - NSString *lLocalizedLastName = [FastAddressBook localizedLabel:lLastName]; - NSString *lOrganization = _person.organizationName; - NSString *lLocalizedOrganization = [FastAddressBook localizedLabel:lOrganization]; - - if (compositeName && ![compositeName isEqualToString:@""]) - return compositeName; - if (lLocalizedFirstName || lLocalizedLastName) - return [NSString stringWithFormat:@"%@ %@", lLocalizedFirstName, lLocalizedLastName]; - return (NSString *)lLocalizedOrganization; - } - - BOOL firstName = _firstName && ![_firstName isEqualToString:@""]; - BOOL lastName = _lastName && ![_lastName isEqualToString:@""]; - if (lastName || firstName) { - NSMutableString *str = NULL; - if (firstName) { - str = [_firstName copy]; - if (lastName) - [str appendFormat:@" %@", _lastName]; - return str; - } - str = [_lastName copy]; - return str; - } - - return NSLocalizedString(@"Unknown", nil); -} - -#pragma mark - Setters - -- (void)setAvatar:(UIImage *)avatar { - if (!_person) { - LOGW(@"%s: Cannot do it when using LinphoneFriend, skipping", __FUNCTION__); - return; - } - - NSData *imageAvatar = UIImageJPEGRepresentation(avatar, 0.9f); - [_person setValue:imageAvatar forKey:CNContactImageDataKey]; -} - -- (void)setFirstName:(NSString *)firstName { - BOOL ret = FALSE; - if ([firstName isEqualToString:_firstName]) - return; - - if (_friend) - ret = linphone_friend_set_name(_friend, [NSString stringWithFormat:@"%@ %@", firstName,_person.familyName].UTF8String); - - if (_person) { - [_person setValue:firstName forKey:CNContactGivenNameKey]; - [_person setValue:[NSString stringWithFormat:@"%@ %@", firstName, _person.familyName] forKey:CNContactNicknameKey]; - ret = TRUE; - } - - if (ret) { - _firstName = firstName; - _displayName = [NSString stringWithFormat:@"%@ %@", firstName, _person.familyName]; - } -} - -- (void)setLastName:(NSString *)lastName { - BOOL ret = FALSE; - if ([lastName isEqualToString:_lastName]) - return; - - if (_friend) - ret = linphone_friend_set_name(_friend, [NSString stringWithFormat:@"%@ %@", _person.givenName, lastName].UTF8String); - - if (_person) { - [_person setValue:lastName forKey:CNContactFamilyNameKey]; - [_person setValue:[NSString stringWithFormat:@"%@ %@", _person.givenName, lastName] forKey:CNContactNicknameKey]; - ret = TRUE; - } - - if (ret) { - _lastName = lastName; - _displayName = [NSString stringWithFormat:@"%@ %@", _person.givenName, lastName]; - } -} - -- (BOOL)setSipAddress:(NSString *)sip atIndex:(NSInteger)index { - if (!_person || [sip isEqualToString:@" "]) { - LOGW(@"%s: Cannot do it when using LinphoneFriend, skipping", __FUNCTION__); - return FALSE; - } - - NSString *normSip = [sip hasPrefix:@" "] ? [sip substringFromIndex:1] : sip; - normSip = [normSip hasPrefix:@"sip:"] ? [normSip substringFromIndex:4] : normSip; - CNInstantMessageAddress *cNSipMsgAddr = [[CNInstantMessageAddress alloc] initWithUsername:normSip service:@"SIP"]; - CNLabeledValue *sipAddress = [CNLabeledValue labeledValueWithLabel:NULL value:cNSipMsgAddr]; - NSMutableArray *> *tmpSipAddresses = [_person.instantMessageAddresses mutableCopy]; - if ((index + 1) > [_person.instantMessageAddresses count]) - [tmpSipAddresses addObject:sipAddress]; - else - [tmpSipAddresses replaceObjectAtIndex:index withObject:sipAddress]; - - [_person setValue:tmpSipAddresses forKey:CNContactInstantMessageAddressesKey]; - _sipAddresses[index] = normSip; - return TRUE; -} - -- (BOOL)setPhoneNumber:(NSString *)phone atIndex:(NSInteger)index { - if (!_person) { - LOGW(@"%s: Cannot do it when using LinphoneFriend, skipping", __FUNCTION__); - return FALSE; - } - - CNLabeledValue *mobileNumber = [CNLabeledValue labeledValueWithLabel:CNLabelPhoneNumberMobile value:[CNPhoneNumber phoneNumberWithStringValue:phone]]; - NSMutableArray *> *tmpPhoneNumbers = [_person.phoneNumbers mutableCopy]; - if ((index + 1) > [_person.phoneNumbers count]) - [tmpPhoneNumbers addObject:mobileNumber]; - else - [tmpPhoneNumbers replaceObjectAtIndex:index withObject:mobileNumber]; - - [_person setValue:tmpPhoneNumbers forKey:CNContactPhoneNumbersKey]; - _phones[index] = phone; - return TRUE; -} - -- (BOOL)setEmail:(NSString *)email atIndex:(NSInteger)index { - if (!_person) { - LOGW(@"%s: Cannot do it when using LinphoneFriend, skipping", __FUNCTION__); - return FALSE; - } - - CNLabeledValue *emailAddress = [CNLabeledValue labeledValueWithLabel:NULL value:email]; - NSMutableArray *> *tmpEmailAddress = [_person.emailAddresses mutableCopy]; - if ((index + 1) > [_person.emailAddresses count]) - [tmpEmailAddress addObject:emailAddress]; - else - [tmpEmailAddress replaceObjectAtIndex:index withObject:emailAddress]; - - [_person setValue:tmpEmailAddress forKey:CNContactEmailAddressesKey]; - _emails[index] = email; - return TRUE; -} - -- (BOOL)addSipAddress:(NSString *)sip { - BOOL ret = TRUE; - NSString *normSip = NULL; - if (sip == NULL || [sip isEqualToString:@""]) - return FALSE; - - if (![sip isEqualToString:@" "]) { - if (_person) { - normSip = [sip containsString:@"@"] ? [sip componentsSeparatedByString:@"@"][0] : sip; - CNInstantMessageAddress *cNSipMsgAddr; - cNSipMsgAddr = [[CNInstantMessageAddress alloc] initWithUsername:normSip service:@"SIP"]; //service:[normSip componentsSeparatedByString:@"@"][1]]; - CNLabeledValue *sipAddress = [CNLabeledValue labeledValueWithLabel:NULL value:cNSipMsgAddr]; - NSMutableArray *> *tmpSipAddresses = [_person.instantMessageAddresses mutableCopy]; - [tmpSipAddresses addObject:sipAddress]; - [_person setValue:tmpSipAddresses forKey:CNContactInstantMessageAddressesKey]; - ret = TRUE; - } else { - LinphoneAddress *addr = linphone_core_interpret_url_2(LC, sip.UTF8String, true) ?: linphone_address_new(sip.UTF8String); - if (!addr) - return FALSE; - - linphone_friend_add_address(_friend, addr); - linphone_address_destroy(addr); - // ensure that it was added by checking list size - ret = (bctbx_list_size(linphone_friend_get_addresses(_friend)) == _sipAddresses.count + 1); - } - } - - if (ret) { - if ([sip hasPrefix:@" "]) - [_sipAddresses addObject:[sip substringFromIndex:1]]; - else - [_sipAddresses addObject:sip]; - } - - return ret; -} - -- (BOOL)addPhoneNumber:(NSString *)phone { - BOOL ret = TRUE; - if (phone == NULL || [phone isEqualToString:@""]) - return FALSE; - - if (![phone isEqualToString:@" "]){ - if (_person) { - CNLabeledValue *mobileNumber = [CNLabeledValue labeledValueWithLabel:CNLabelPhoneNumberMobile - value:[CNPhoneNumber phoneNumberWithStringValue:phone]]; - NSMutableArray *>*tmpPhoneNumbers = [_person.phoneNumbers mutableCopy]; - [tmpPhoneNumbers addObject:mobileNumber]; - [_person setValue:tmpPhoneNumbers forKey:CNContactPhoneNumbersKey]; - ret = TRUE; - } else { - char *cphone = ms_strdup(phone.UTF8String); - if (!cphone) - return FALSE; - - linphone_friend_add_phone_number(_friend, cphone); - phone = [NSString stringWithUTF8String:cphone]; - ms_free(cphone); - // ensure that it was added by checking list size - ret = (bctbx_list_size(linphone_friend_get_phone_numbers( _friend)) == _phones.count + 1); - } - } - - if (ret) - [_phones addObject:phone]; - - return ret; -} - -- (BOOL)addEmail:(NSString *)email { - if (email == NULL || [email isEqualToString:@""]) - return FALSE; - - if (![email isEqualToString:@" "]) { - if (!_person) { - LOGW(@"%s: Cannot do it when using LinphoneFriend, skipping", __FUNCTION__); - return FALSE; - } - - CNLabeledValue *emailAddress = [CNLabeledValue labeledValueWithLabel:NULL value:email]; - NSMutableArray *> *tmpEmailAddress = [_person.emailAddresses mutableCopy]; - [tmpEmailAddress addObject:emailAddress]; - [_person setValue:tmpEmailAddress forKey:CNContactEmailAddressesKey]; - } - - [_emails addObject:email]; - return TRUE; -} - -- (BOOL)removeSipAddressAtIndex:(NSInteger)index { - BOOL ret = FALSE; - if (_person) { - NSMutableArray *>*tmpSipAddress = [_person.instantMessageAddresses mutableCopy]; - if ([tmpSipAddress count] > index) { - [tmpSipAddress removeObjectAtIndex:index]; - [_person setValue:tmpSipAddress forKey:CNContactInstantMessageAddressesKey]; - } - ret = TRUE; - } else { - LinphoneAddress *addr = linphone_core_interpret_url_2(LC, ((NSString *)_sipAddresses[index]).UTF8String, true); - if (!addr) - return FALSE; - - linphone_friend_remove_address(_friend, addr); - linphone_address_destroy(addr); - // ensure that it was destroyed by checking list size - ret = (bctbx_list_size(linphone_friend_get_addresses(_friend)) + 1 == _sipAddresses.count); - } - - if (ret) - [_sipAddresses removeObjectAtIndex:index]; - - return ret; -} - -- (BOOL)removePhoneNumberAtIndex:(NSInteger)index { - BOOL ret = FALSE; - if (_person && _person.phoneNumbers.count > 0) { - NSMutableArray *> *tmpPhoneNumbers = [_person.phoneNumbers mutableCopy]; - if ([tmpPhoneNumbers count] > index) { - [tmpPhoneNumbers removeObjectAtIndex:index]; - [_person setValue:tmpPhoneNumbers forKey:CNContactPhoneNumbersKey]; - } - ret = TRUE; - } else { - const char *phone = ((NSString *)_phones[index]).UTF8String; - linphone_friend_remove_phone_number(_friend, phone); - // ensure that it was destroyed by checking list size - ret = (bctbx_list_size(linphone_friend_get_phone_numbers(_friend)) + 1 == _phones.count); - } - if (ret) - [_phones removeObjectAtIndex:index]; - - return ret; -} - -- (BOOL)removeEmailAtIndex:(NSInteger)index { - if (!_person || _person.phoneNumbers.count == 0) { - LOGW(@"%s: Cannot do it when using LinphoneFriend, skipping", __FUNCTION__); - return FALSE; - } - - NSMutableArray *> *tmpEmailAddresses = [_person.emailAddresses mutableCopy]; - if ([tmpEmailAddresses count] > index) { - [tmpEmailAddresses removeObjectAtIndex:index]; - [_person setValue:tmpEmailAddresses forKey:CNContactEmailAddressesKey]; - } - - [_emails removeObjectAtIndex:index]; - return TRUE; -} - - -#pragma mark - LinphoneFriend utils - -- (void)loadFriend { - // First and Last name - _firstName = [NSString stringWithUTF8String:linphone_friend_get_name(_friend) ?: ""]; - _lastName = nil; - - // Phone numbers - _phones = [[NSMutableArray alloc] init]; - MSList *numbers = linphone_friend_get_phone_numbers(_friend); - while (numbers) { - NSString *phone = [NSString stringWithUTF8String:numbers->data]; - [_phones addObject:phone]; - numbers = numbers->next; - } - - // SIP (IM) - _sipAddresses = [[NSMutableArray alloc] init]; - const MSList *sips = linphone_friend_get_addresses(_friend); - while (sips) { - LinphoneAddress *addr = sips->data; - char *uri = linphone_address_as_string_uri_only(addr); - NSString *sipaddr = [NSString stringWithUTF8String:uri]; - [_sipAddresses addObject:sipaddr]; - ms_free(uri); - sips = sips->next; - } - - // Email - no support for LinphoneFriend - _emails = [[NSMutableArray alloc] init]; -} - -- (void)reloadFriend { - const char *key = [NSString stringWithFormat:@"ab%@", _person.identifier].UTF8String; - // try to find friend associated with that person - _friend = linphone_friend_list_find_friend_by_ref_key(linphone_core_get_default_friend_list(LC), key); - if (!_friend) { - _friend = linphone_core_create_friend(LC); - linphone_friend_set_ref_key(_friend, key); - linphone_friend_set_name(_friend, [NSString stringWithFormat:@"%@%@", _firstName ? _firstName : @"", _lastName ? [_firstName ? @" " : @"" stringByAppendingString:_lastName] : @""] .UTF8String); - for (NSString *sipAddr in _sipAddresses) { - LinphoneAddress *addr = linphone_core_interpret_url_2(LC, sipAddr.UTF8String, true); - if (addr) { - linphone_address_set_display_name(addr, [self displayName].UTF8String); - linphone_friend_add_address(_friend, addr); - linphone_address_destroy(addr); - } - } - for (NSString *phone in _phones) { - linphone_friend_add_phone_number(_friend, phone.UTF8String); - } - if (_friend) { - linphone_friend_enable_subscribes(_friend, FALSE); - linphone_friend_set_inc_subscribe_policy(_friend, LinphoneSPDeny); - linphone_core_add_friend(LC, _friend); - } - } else linphone_friend_ref(_friend); -} - -- (void)clearFriend { - if (_friend) linphone_friend_unref(_friend); - _friend = NULL; -} - -- (NSMutableArray*)getSipAddressesWithoutDuplicatePhoneNumbers { - NSMutableArray* resAdresses = [[NSMutableArray alloc] init]; - - for (NSString *address in _sipAddresses) { - LinphoneAddress *addr = linphone_core_interpret_url_2(LC, [address UTF8String], YES); - bool isFoundInPhones = false; - if (addr && linphone_address_get_username(addr)) { - for (NSString *phoneNb in _phones) { - if ([phoneNb isEqualToString:[NSString stringWithUTF8String:linphone_address_get_username(addr)]]) { - isFoundInPhones = true; - break; - } - } - } - if (!isFoundInPhones) [resAdresses addObject:address]; - } - - return resAdresses; -} -@end diff --git a/Classes/ContactDetailsTableView.h b/Classes/ContactDetailsTableView.h deleted file mode 100644 index 38ab1c19a..000000000 --- a/Classes/ContactDetailsTableView.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import - -#import "Contact.h" -#import "LinphoneUI/UIToggleButton.h" - -typedef enum _ContactSections { - ContactSections_None = 0, // first section is empty because we cannot set header for first section - ContactSections_FirstName, - ContactSections_LastName, - ContactSections_Organization, - ContactSections_Sip, - ContactSections_Number, - ContactSections_Email, - ContactSections_MAX -} ContactSections; - -@interface ContactDetailsTableView : UITableViewController - -@property(strong, nonatomic) Contact *contact; -@property(weak, nonatomic) IBOutlet UIToggleButton *editButton; - -- (void)addPhoneField:(NSString *)number; -- (void)addSipField:(NSString *)address; -- (void)addEmailField:(NSString *)address; -- (void)setContact:(Contact *)contact; -@property (weak, nonatomic) UIView *waitView; - -@end diff --git a/Classes/ContactDetailsTableView.m b/Classes/ContactDetailsTableView.m deleted file mode 100644 index 15c0bb13e..000000000 --- a/Classes/ContactDetailsTableView.m +++ /dev/null @@ -1,463 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "ContactDetailsTableView.h" -#import "PhoneMainView.h" -#import "UIContactDetailsCell.h" -#import "Utils.h" -#import "OrderedDictionary.h" - -@implementation ContactDetailsTableView - -#pragma mark - Property Functions - -- (NSMutableArray *)getSectionData:(NSInteger)section { - if (section == ContactSections_Number) { - return _contact.phones; - } else if (section == ContactSections_Sip) { - return _contact.sipAddresses; - } else if (section == ContactSections_Email) { - if ([LinphoneManager.instance - lpConfigBoolForKey:@"show_contacts_emails_preference"] == - true) { - return _contact.emails; - } - } - return nil; -} - -- (void)removeEmptyEntry:(UITableView *)tableview section:(NSInteger)section animated:(BOOL)animated { - NSMutableArray *sectionDict = [self getSectionData:section]; - for (NSInteger i = sectionDict.count - 1; i >= 0; i--) { - NSString *value = sectionDict[i]; - if (value.length == 0) { - [self removeEntry:tableview indexPath:[NSIndexPath indexPathForRow:i inSection:section] animated:animated]; - } - } -} - -- (void)removeEntry:(UITableView *)tableview indexPath:(NSIndexPath *)path animated:(BOOL)animated { - bool rmed = YES; - if (path.section == ContactSections_Number) { - rmed = [_contact removePhoneNumberAtIndex:path.row]; - } else if (path.section == ContactSections_Sip) { - rmed = [_contact removeSipAddressAtIndex:path.row]; - } else if (path.section == ContactSections_Email) { - rmed = [_contact removeEmailAtIndex:path.row]; - } else { - rmed = NO; - } - - if (rmed) { - [tableview deleteRowsAtIndexPaths:@[ path ] - withRowAnimation:animated ? UITableViewRowAnimationFade : UITableViewRowAnimationNone]; - } else { - LOGW(@"Cannot remove entry at path %@, skipping", path); - } -} - -- (void)addEntry:(UITableView *)tableview section:(NSInteger)section animated:(BOOL)animated value:(NSString *)value { - bool added = FALSE; - if (section == ContactSections_Number) { - if ([_contact.phones count] == [_contact.person.phoneNumbers count]) - added = [_contact addPhoneNumber:value]; - } else if (section == ContactSections_Sip) { - if ([_contact.sipAddresses count] == [self countSipAddressFromCNContact:_contact.person]) //[_contact.person.instantMessageAddresses count]) - added = [_contact addSipAddress:value]; - } else if (section == ContactSections_Email) { - if ([_contact.emails count] == - [_contact.person.emailAddresses count]) - added = [_contact addEmail:value]; - } - if (added) { - NSUInteger count = [self getSectionData:section].count; - [tableview - insertRowsAtIndexPaths:@[ [NSIndexPath indexPathForRow:count - 1 - inSection:section] ] - withRowAnimation:animated ? UITableViewRowAnimationFade - : UITableViewRowAnimationNone]; - } else { - LOGW(@"Cannot add entry '%@' in section %d, skipping", value, - section); - } -} - --(NSInteger)countSipAddressFromCNContact:(CNContact*) mCNContact{ - NSInteger count = 0; - if (mCNContact.instantMessageAddresses != NULL) { - for (CNLabeledValue *sipAddr in mCNContact.instantMessageAddresses) { - if ([FastAddressBook isSipAddress:sipAddr]) - count++; - } - } - return count; -} - - -- (void)setContact:(Contact *)acontact { - // if (acontact == _contact) - // return; - _contact = acontact; - [self loadData]; -} - -- (void)addPhoneField:(NSString *)number { - ContactSections i = 0; - while (i != ContactSections_MAX && i != ContactSections_Number) - ++i; - [self addEntry:[self tableView] section:i animated:FALSE value:number]; -} - -- (void)addSipField:(NSString *)address { - ContactSections i = 0; - while (i != ContactSections_MAX && i != ContactSections_Sip) - ++i; - [self addEntry:[self tableView] section:i animated:FALSE value:address]; -} - -- (void)addEmailField:(NSString *)address { - ContactSections i = 0; - while (i != ContactSections_MAX && i != ContactSections_Email) - ++i; - [self addEntry:[self tableView] section:i animated:FALSE value:address]; -} - -- (BOOL)isValid { - BOOL hasName = (_contact.firstName.length + _contact.lastName.length + _contact.organizationName.length > 0); - BOOL hasAddr = - (_contact.phones.count + _contact.sipAddresses.count) > 0; - return hasName && hasAddr; -} - -#pragma mark - UITableViewDataSource Functions - -- (void)loadData { - [self.tableView reloadData]; -} - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return ContactSections_MAX; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - if (section == ContactSections_FirstName || section == ContactSections_LastName || section == ContactSections_Organization) { - /*first and last name only when editting */ - return (self.tableView.isEditing) ? 1 : 0; - } else if (section == ContactSections_Sip) { - return [_contact getSipAddressesWithoutDuplicatePhoneNumbers].count; - } else if (section == ContactSections_Number) { - return _contact.phones.count; - } else if (section == ContactSections_Email) { - BOOL showEmails = [LinphoneManager.instance - lpConfigBoolForKey:@"show_contacts_emails_preference"]; - return showEmails ? _contact.emails.count : 0; - } - return 0; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - static NSString *kCellId = @"UIContactDetailsCell"; - UIContactDetailsCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId]; - if (cell == nil) { - cell = [[UIContactDetailsCell alloc] initWithIdentifier:kCellId]; - cell.waitView = _waitView; - [cell.editTextfield setDelegate:self]; - } - - cell.selectionStyle = UITableViewCellSelectionStyleNone; - - cell.indexPath = indexPath; - [cell hideDeleteButton:NO]; - [cell.editTextfield setKeyboardType:UIKeyboardTypeDefault]; - NSString *value = @""; - if (indexPath.section == ContactSections_FirstName) { - value = _contact.firstName; - [cell hideDeleteButton:YES]; - } else if (indexPath.section == ContactSections_LastName) { - value = _contact.lastName; - [cell hideDeleteButton:YES]; - } else if (indexPath.section == ContactSections_Organization) { - value = _contact.organizationName; - [cell hideDeleteButton:YES]; - } else if ([indexPath section] == ContactSections_Number) { - value = _contact.phones[indexPath.row]; - [cell.editTextfield setKeyboardType:UIKeyboardTypePhonePad]; - } else if ([indexPath section] == ContactSections_Sip) { - value = _contact.sipAddresses[indexPath.row]; - LinphoneAddress *addr = NULL; - if ([LinphoneManager.instance - lpConfigBoolForKey:@"contact_display_username_only"] && - (addr = linphone_core_interpret_url_2(LC, [value UTF8String], YES))) { - value = - [NSString stringWithCString:linphone_address_get_username(addr) - encoding:[NSString defaultCStringEncoding]]; - linphone_address_destroy(addr); - } - [cell.editTextfield setKeyboardType:UIKeyboardTypeASCIICapable]; - } else if ([indexPath section] == ContactSections_Email) { - value = _contact.emails[indexPath.row]; - [cell.editTextfield setKeyboardType:UIKeyboardTypeEmailAddress]; - } - if ([value hasPrefix:@" "]) - value = [value substringFromIndex:1]; - [cell setAddress:value]; - cell.contentView.userInteractionEnabled = false; - - return cell; -} - -- (void)tableView:(UITableView *)tableView - commitEditingStyle:(UITableViewCellEditingStyle)editingStyle - forRowAtIndexPath:(NSIndexPath *)indexPath { - [LinphoneUtils findAndResignFirstResponder:[self tableView]]; - if (editingStyle == UITableViewCellEditingStyleInsert) { - [tableView beginUpdates]; - [self addEntry:tableView - section:[indexPath section] - animated:TRUE - value:@" "]; - [tableView endUpdates]; - } else if (editingStyle == UITableViewCellEditingStyleDelete) { - [tableView beginUpdates]; - [self removeEntry:tableView indexPath:indexPath animated:TRUE]; - [tableView endUpdates]; - } -} - -#pragma mark - UITableViewDelegate Functions - -- (void)setEditing:(BOOL)editing animated:(BOOL)animated { - BOOL showEmails = [LinphoneManager.instance lpConfigBoolForKey:@"show_contacts_emails_preference"]; - if (editing) { - // add phone/SIP/email entries so that the user can add new data - for (int section = 0; section < [self numberOfSectionsInTableView:[self tableView]]; ++section) { - if (section == ContactSections_Number || section == ContactSections_Sip || - (showEmails && section == ContactSections_Email)) { - [self addEntry:self.tableView section:section animated:animated value:@""]; - } - } - _editButton.enabled = [self isValid]; - } else { - [LinphoneUtils findAndResignFirstResponder:[self tableView]]; - // remove empty phone numbers - for (int section = 0; section < [self numberOfSectionsInTableView:[self tableView]]; ++section) { - // remove phony entries that were not filled by the user - if (section == ContactSections_Number || section == ContactSections_Sip || - (showEmails && section == ContactSections_Email)) { - - [self removeEmptyEntry:self.tableView section:section animated:NO]; - } - } - _editButton.enabled = YES; - } - // order is imported here: empty rows must be deleted before table change editing mode - [super setEditing:editing animated:animated]; - - [self loadData]; -} - -- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { - NSString *text = nil; - BOOL canAddEntry = self.tableView.isEditing; - NSString *addEntryName = nil; - if (section == ContactSections_FirstName && self.tableView.isEditing) { - text = NSLocalizedString(@"First name", nil); - canAddEntry = NO; - } else if (section == ContactSections_LastName && self.tableView.isEditing) { - text = NSLocalizedString(@"Last name", nil); - canAddEntry = NO; - } else if (section == ContactSections_Organization && self.tableView.isEditing) { - text = NSLocalizedString(@"Organization", nil); - canAddEntry = NO; - } else if ([self getSectionData:section].count > 0 || self.tableView.isEditing) { - if (section == ContactSections_Number) { - text = NSLocalizedString(@"Phone numbers", nil); - addEntryName = NSLocalizedString(@"Add new phone number", nil); - } else if (section == ContactSections_Sip && !_contact.createdFromLdapOrProvisioning) { - text = NSLocalizedString(@"SIP addresses", nil); - addEntryName = NSLocalizedString(@"Add new SIP address", nil); - } else if (section == ContactSections_Email && - [LinphoneManager.instance lpConfigBoolForKey:@"show_contacts_emails_preference"]) { - text = NSLocalizedString(@"Email addresses", nil); - addEntryName = NSLocalizedString(@"Add new email", nil); - } - } - - if (!text) { - return nil; - } - - CGRect frame = CGRectMake(0, 0, tableView.frame.size.width, 30); - UIView *tempView = [[UIView alloc] initWithFrame:frame]; - if (@available(iOS 13, *)) { - tempView.backgroundColor = [UIColor systemBackgroundColor]; - } else { - tempView.backgroundColor = [UIColor whiteColor]; - } - - UILabel *tempLabel = [[UILabel alloc] initWithFrame:frame]; - tempLabel.backgroundColor = [UIColor clearColor]; - tempLabel.textColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"color_E.png"]]; - tempLabel.text = text.uppercaseString; - tempLabel.textAlignment = NSTextAlignmentCenter; - tempLabel.font = [UIFont systemFontOfSize:15]; - tempLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; - [tempView addSubview:tempLabel]; - - if (canAddEntry) { - frame.origin.x = (tableView.frame.size.width - 30 /*image size*/) / 2 - 5 /*right offset*/; - UIIconButton *tempAddButton = [[UIIconButton alloc] initWithFrame:frame]; - [tempAddButton setImage:[UIImage imageNamed:@"add_field_default.png"] forState:UIControlStateNormal]; - [tempAddButton setImage:[UIImage imageNamed:@"add_field_over.png"] forState:UIControlStateHighlighted]; - [tempAddButton setImage:[UIImage imageNamed:@"add_field_over.png"] forState:UIControlStateSelected]; - [tempAddButton addTarget:self action:@selector(onAddClick:) forControlEvents:UIControlEventTouchUpInside]; - tempAddButton.tag = section; - tempAddButton.accessibilityLabel = addEntryName; - tempAddButton.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin; - [tempView addSubview:tempAddButton]; - } - - return tempView; -} - -- (void)onAddClick:(id)sender { - NSInteger section = ((UIButton *)sender).tag; - UITableView *tableView = VIEW(ContactDetailsView).tableController.tableView; - NSInteger count = [self.tableView numberOfRowsInSection:section]; - NSIndexPath *indexPath = [NSIndexPath indexPathForRow:count inSection:section]; - [tableView.dataSource tableView:tableView - commitEditingStyle:UITableViewCellEditingStyleInsert - forRowAtIndexPath:indexPath]; -} - -- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView - editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { - return UITableViewCellEditingStyleNone; -} - -- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { - if (tableView.isEditing) { - return 44; - } else { - return 88; - } -} -- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { - return 1e-5; -} - -- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { - if (section == 0 || - (!self.tableView.isEditing && (section == ContactSections_FirstName || section == ContactSections_LastName || section == ContactSections_LastName))) { - return 1e-5; - } - return [self tableView:tableView viewForHeaderInSection:section].frame.size.height; -} - -#pragma mark - UITextFieldDelegate Functions - -- (BOOL)textFieldShouldReturn:(UITextField *)textField { - [textField resignFirstResponder]; - return YES; -} - -- (void)textFieldUpdated:(UITextField *)textField { - UIView *view = [textField superview]; - while (view != nil && ![view isKindOfClass:[UIContactDetailsCell class]]) - view = [view superview]; - if (view != nil) { - UIContactDetailsCell *cell = (UIContactDetailsCell *)view; - // we cannot use indexPathForCell method here because if the cell is not visible anymore, - // it will return nil.. - NSIndexPath *path = [self.tableView indexPathForCell:cell]; // [self.tableView indexPathForCell:cell]; - ContactSections sect = (ContactSections)[path section]; - NSString *value = [textField text]; - - switch (sect) { - case ContactSections_FirstName: - _contact.firstName = value; - break; - case ContactSections_LastName: - _contact.lastName = value; - break; - case ContactSections_Organization: - _contact.organizationName = value; - break; - case ContactSections_Sip: - [_contact setSipAddress:value atIndex:path.row]; - value = _contact.sipAddresses[path.row]; // in case of reformatting - break; - case ContactSections_Email: - [_contact setEmail:value atIndex:path.row]; - value = _contact.emails[path.row]; // in case of reformatting - break; - case ContactSections_Number: - [_contact setPhoneNumber:value atIndex:path.row]; - value = - _contact.phones[path.row]; // in case of - // reformatting - break; - case ContactSections_MAX: - case ContactSections_None: - break; - } - cell.editTextfield.text = value; - _editButton.enabled = [self isValid]; - } -} - -- (void)textFieldDidEndEditing:(UITextField *)textField { - [self textFieldUpdated:textField]; - // TODO reload current contact -} - -- (BOOL)textField:(UITextField *)textField - shouldChangeCharactersInRange:(NSRange)range - replacementString:(NSString *)string { -#if 0 - // every time we modify contact entry, we must check if we can enable "edit" button - UIView *view = [textField superview]; - while (view != nil && ![view isKindOfClass:[UIContactDetailsCell class]]) - view = [view superview]; - - UIContactDetailsCell *cell = (UIContactDetailsCell *)view; - // we cannot use indexPathForCell method here because if the cell is not visible anymore, - // it will return nil.. - NSIndexPath *path = cell.indexPath; - - _editButton.enabled = NO; - for (ContactSections s = ContactSections_Sip; !_editButton.enabled && s <= ContactSections_Number; s++) { - for (int i = 0; !_editButton.enabled && i < [self tableView:self.tableView numberOfRowsInSection:s]; i++) { - NSIndexPath *cellpath = [NSIndexPath indexPathForRow:i inSection:s]; - if ([cellpath isEqual:path]) { - _editButton.enabled = (textField.text.length > 0); - } else { - UIContactDetailsCell *cell = - (UIContactDetailsCell *)[self tableView:self.tableView cellForRowAtIndexPath:cellpath]; - _editButton.enabled = (cell.editTextfield.text.length > 0); - } - } - } -#else - [self textFieldUpdated:textField]; -#endif - return YES; -} - -@end diff --git a/Classes/ContactDetailsView.h b/Classes/ContactDetailsView.h deleted file mode 100644 index 41893770c..000000000 --- a/Classes/ContactDetailsView.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UICompositeView.h" -#import "UIToggleButton.h" -#import "ContactDetailsTableView.h" -#import "UIRoundedImageView.h" -#import "ImagePickerView.h" - -@interface ContactDetailsView : TPMultiLayoutViewController { - BOOL inhibUpdate; -} - -@property(nonatomic, assign, setter=setContact:) Contact *contact; -@property(nonatomic) Contact *tmpContact; -@property(nonatomic, strong) IBOutlet ContactDetailsTableView *tableController; -@property(nonatomic, strong) IBOutlet UIToggleButton *editButton; -@property(nonatomic, strong) IBOutlet UIButton *backButton; -@property(nonatomic, strong) IBOutlet UIButton *cancelButton; -@property(weak, nonatomic) IBOutlet UIImageView *avatarImage; -@property(weak, nonatomic) IBOutlet UILabel *nameLabel; -@property(weak, nonatomic) IBOutlet UILabel *organizationLabel; -@property(weak, nonatomic) IBOutlet UIToggleButton *deleteButton; -@property(weak, nonatomic) IBOutlet UIScrollView *contentView; -@property(weak, nonatomic) IBOutlet UILabel *emptyLabel; -@property BOOL isAdding; -@property (weak, nonatomic) IBOutlet UIView *waitView; - -- (IBAction)onBackClick:(id)event; -- (IBAction)onCancelClick:(id)event; -- (IBAction)onEditClick:(id)event; -- (IBAction)onDeleteClick:(id)sender; -- (IBAction)onAvatarClick:(id)sender; - - -- (void)updateBackOrCancelButton; -- (void)newContact; -- (void)newContact:(NSString *)address; -- (void)editContact:(Contact *)contact; -- (void)editContact:(Contact *)contact address:(NSString *)address; -- (void)setContact:(Contact *)contact; -- (void)resetContact; -@end diff --git a/Classes/ContactDetailsView.m b/Classes/ContactDetailsView.m deleted file mode 100644 index 66ce967ec..000000000 --- a/Classes/ContactDetailsView.m +++ /dev/null @@ -1,661 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "ContactDetailsView.h" -#import "PhoneMainView.h" -#import "UIContactDetailsCell.h" -#import "linphoneapp-Swift.h" - -@implementation ContactDetailsView - -#pragma mark - Lifecycle Functions - -- (id)init { - self = [super initWithNibName:NSStringFromClass(self.class) bundle:[NSBundle mainBundle]]; - if (self != nil) { - inhibUpdate = FALSE; - [NSNotificationCenter.defaultCenter - addObserver:self - selector:@selector(onAddressBookUpdate:) - name:kLinphoneAddressBookUpdate - object:nil]; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(onAddressBookUpdate:) - name:CNContactStoreDidChangeNotification - object:nil]; - } - return self; -} - -- (void)dealloc { - [NSNotificationCenter.defaultCenter removeObserver:self]; -} - -#pragma mark - - -- (void)onAddressBookUpdate:(NSNotification *)k { - if (!inhibUpdate && ![_tableController isEditing] && - (PhoneMainView.instance.currentView == self.compositeViewDescription) && - (_nameLabel.text == PhoneMainView.instance.currentName)) { - [self resetData]; - } -} - -- (void)resetData { - if (self.isEditing) { - [self setEditing:FALSE]; - } - - LOGI(@"Reset data to contact %p", _contact); - [_avatarImage setImage:[FastAddressBook imageForContact:_contact]]; - [_tableController setContact:_contact]; - _emptyLabel.hidden = YES; - _avatarImage.hidden = !_emptyLabel.hidden; - _deleteButton.hidden = !_emptyLabel.hidden; - _editButton.hidden = !_emptyLabel.hidden; -} - -- (void)removeContact { - inhibUpdate = TRUE; - [[LinphoneManager.instance fastAddressBook] deleteContact:_contact]; - inhibUpdate = FALSE; - - if (IPAD) { - ContactsListView *view = VIEW(ContactsListView); - if (![view .tableController selectFirstRow]) { - [self setContact:nil]; - } - } - - [PhoneMainView.instance popCurrentView]; -} - -- (void)saveData { - if (_contact == NULL) { - [PhoneMainView.instance popCurrentView]; - return; - } - PhoneMainView.instance.currentName = _contact.displayName; - _nameLabel.text = PhoneMainView.instance.currentName; - _organizationLabel.text = _contact.organizationName; - - // fix no sipaddresses in contact.friend - const MSList *sips = linphone_friend_get_addresses(_contact.friend); - while (sips) { - linphone_friend_remove_address(_contact.friend, sips->data); - sips = sips->next; - } - - for (NSString *sipAddr in _contact.sipAddresses) { - LinphoneAddress *addr = linphone_core_interpret_url_2(LC, sipAddr.UTF8String, true); - if (addr) { - linphone_friend_add_address(_contact.friend, addr); - linphone_address_destroy(addr); - } - } - [LinphoneManager.instance.fastAddressBook saveContact:_contact]; -} - -- (void)selectContact:(Contact *)acontact andReload:(BOOL)reload { - if (self.isEditing) { - [self setEditing:FALSE]; - } - - _contact = acontact; - _emptyLabel.hidden = (_contact != NULL); - _avatarImage.hidden = !_emptyLabel.hidden; - _deleteButton.hidden = !_emptyLabel.hidden || [_contact createdFromLdapOrProvisioning]; - _editButton.hidden = !_emptyLabel.hidden || [_contact createdFromLdapOrProvisioning]; - - [_avatarImage setImage:[FastAddressBook imageForContact:_contact]]; - [ContactDisplay setDisplayNameLabel:_nameLabel forContact:_contact]; - _organizationLabel.text = _contact.organizationName; - [_tableController setContact:_contact]; - - if (reload) { - [self setEditing:TRUE animated:FALSE]; - } -} - -- (void)modifyTmpContact:(Contact *)acontact { - if (_tmpContact) { - _tmpContact = nil; - } - if (!acontact) { - return; - } - @synchronized(LinphoneManager.instance.fastAddressBook) { - _tmpContact = [[Contact alloc] - initWithCNContact:[LinphoneManager.instance.fastAddressBook - getCNContactFromContact:acontact]]; - } -} - -- (void)addCurrentContactContactField:(NSString *)address { - LinphoneAddress *linphoneAddress = linphone_core_interpret_url_2(LC, address.UTF8String, true); - NSString *username = - linphoneAddress ? [NSString stringWithUTF8String:linphone_address_get_username(linphoneAddress)] : address; - - if (([username rangeOfString:@"@"].length > 0) && - ([LinphoneManager.instance lpConfigBoolForKey:@"show_contacts_emails_preference"] == true)) { - [_tableController addEmailField:username]; - } else if ((linphone_account_is_phone_number(NULL, [username UTF8String])) && - ([LinphoneManager.instance lpConfigBoolForKey:@"save_new_contacts_as_phone_number"] == true)) { - [_tableController addPhoneField:username]; - } else { - [_tableController addSipField:address]; - } - if (linphoneAddress) { - linphone_address_destroy(linphoneAddress); - } - [self setEditing:TRUE]; - [[_tableController tableView] reloadData]; -} - -- (void)newContact { - _isAdding = TRUE; - CNContact *contact = [[CNContact alloc] init]; - [self selectContact:[[Contact alloc] initWithCNContact:contact] - andReload:YES]; -} - -- (void)newContact:(NSString *)address { - CNContact *contact = [[CNContact alloc] init]; - Contact *mContact = [[Contact alloc] initWithCNContact:contact]; - [self selectContact:mContact andReload:NO]; - [self addCurrentContactContactField:address]; - // force to restart server subscription to add new contact into the list - [LinphoneManager.instance becomeActive]; -} - -- (void)editContact:(Contact *)acontact { - [self modifyTmpContact:acontact]; - [self selectContact:acontact andReload:YES]; -} - -- (void)editContact:(Contact *)acontact address:(NSString *)address { - [self modifyTmpContact:acontact]; - [self selectContact:acontact andReload:NO]; - [self addCurrentContactContactField:address]; -} - -- (void)setContact:(Contact *)acontact { - [self selectContact:acontact andReload:NO]; -} - -- (void)resetContact { - if (self.tmpContact) { - _contact.firstName = _tmpContact.firstName.copy; - _contact.lastName = _tmpContact.lastName.copy; - while (_contact.sipAddresses.count > 0) { - [_contact removeSipAddressAtIndex:0]; - } - NSInteger nbSipAd = 0; - while (_tmpContact.sipAddresses.count > nbSipAd) { - [_contact addSipAddress:_tmpContact.sipAddresses[nbSipAd]]; - nbSipAd++; - } - while (_contact.phones.count > 0) { - [_contact removePhoneNumberAtIndex:0]; - } - NSInteger nbPhone = 0; - while (_tmpContact.phones.count > nbPhone) { - [_contact addPhoneNumber:_tmpContact.phones[nbPhone]]; - nbPhone++; - } - while (_contact.emails.count > 0) { - [_contact removeEmailAtIndex:0]; - } - NSInteger nbEmail = 0; - while (_tmpContact.emails.count > nbEmail) { - [_contact addEmail:_tmpContact.emails[nbEmail]]; - nbEmail++; - } - self.tmpContact = NULL; - [self saveData]; - } -} - -#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]; - - // if we use fragments, remove back button - if (IPAD) { - _backButton.hidden = YES; - _backButton.alpha = 0; - } - - [self setContact:NULL]; - - _tableController.tableView.accessibilityIdentifier = @"Contact table"; - - [_editButton setImage:[UIImage imageNamed:@"valid_disabled.png"] - forState:(UIControlStateDisabled | UIControlStateSelected)]; - - UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] - initWithTarget:self - action:@selector(dismissKeyboards)]; - - [self.view addGestureRecognizer:tap]; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - _waitView.hidden = YES; - _editButton.hidden = ([ContactSelection getSelectionMode] != ContactSelectionModeEdit && - [ContactSelection getSelectionMode] != ContactSelectionModeNone); - [_tableController.tableView addObserver:self forKeyPath:@"contentSize" options:0 context:NULL]; - _tableController.waitView = _waitView; - if (!IPAD && !self.tableController.isEditing) - self.tmpContact = NULL; - - [[NSNotificationCenter defaultCenter] addObserver: self - selector: @selector(deviceOrientationDidChange:) - name: UIDeviceOrientationDidChangeNotification - object: nil]; - if (IPAD && self.contact == NULL) { - _editButton.hidden = TRUE; - _deleteButton.hidden = TRUE; - } else if (self.contact != NULL && self.contact.createdFromLdapOrProvisioning) { - _editButton.hidden = TRUE; - _deleteButton.hidden = TRUE; - } - PhoneMainView.instance.currentName = _nameLabel.text; - // Update presence for contact - for (NSInteger j = 0; j < [self.tableController.tableView numberOfSections]; ++j) { - for (NSInteger i = 0; i < [self.tableController.tableView numberOfRowsInSection:j]; ++i) { - [(UIContactDetailsCell *)[self.tableController.tableView - cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:j]] shouldHideLinphoneImageOfAddress]; - } - } - [_editButton setImage:[UIImage imageNamed:@"valid_default.png"] forState:UIControlStateSelected]; - - [self updateBackOrCancelButton]; - [self recomputeTableViewSize:FALSE]; - - NSDictionary* userInfo; - [NSNotificationCenter.defaultCenter addObserver:self - selector: @selector(receivePresenceNotification:) - name: @"LinphoneFriendPresenceUpdate" - object: userInfo]; -} - --(void) receivePresenceNotification:(NSNotification*)notification -{ - if ([notification.name isEqualToString:@"LinphoneFriendPresenceUpdate"]) - { - [self resetData]; - } -} - -- (void)deviceOrientationDidChange:(NSNotification*)notif { - if (IPAD) { - if (self.contact == NULL || (self.contact.firstName == NULL && self.contact.lastName == NULL)) { - if (! self.tableController.isEditing) { - _editButton.hidden = TRUE; - _deleteButton.hidden = TRUE; - _avatarImage.hidden = TRUE; - _emptyLabel.hidden = FALSE; - } - } - } - - if (self.contact != NULL && self.contact.createdFromLdapOrProvisioning) { - _editButton.hidden = TRUE; - _deleteButton.hidden = TRUE; - } - _nameLabel.hidden = self.tableController.isEditing; - _organizationLabel.hidden = self.tableController.isEditing; - [self updateBackOrCancelButton]; - [self recomputeTableViewSize:self.tableController.isEditing]; -} - -- (void)viewWillDisappear:(BOOL)animated { - if (_tableController && _tableController.tableView && [_tableController.tableView observationInfo]) { - [_tableController.tableView removeObserver:self forKeyPath:@"contentSize"]; - } - [super viewWillDisappear:animated]; - PhoneMainView.instance.currentName = NULL; - if (!_tableController.isEditing) { - [self resetContact]; - } - - BOOL rm = TRUE; - for (NSString *sip in _contact.sipAddresses) { - if (![sip isEqualToString:@""]) { - rm = FALSE; - break; - } - } - if (rm) { - for (NSString *phone in _contact.phones) { - if (![phone isEqualToString:@""]) { - rm = FALSE; - break; - } - } - } - if (rm) { - [LinphoneManager.instance.fastAddressBook deleteContact:_contact]; - } - - [[NSNotificationCenter defaultCenter] removeObserver:self name:@"LinphoneFriendPresenceUpdate" object:nil]; - [AvatarBridge removeAllObserver]; -} - -#pragma mark - UICompositeViewDelegate Functions - -static UICompositeViewDescription *compositeDescription = nil; - -+ (UICompositeViewDescription *)compositeViewDescription { - if (compositeDescription == nil) { - compositeDescription = [[UICompositeViewDescription alloc] init:self.class - statusBar:StatusBarView.class - tabBar:TabBarView.class - sideMenu:SideMenuView.class - fullscreen:false - isLeftFragment:NO - fragmentWith:ContactsListView.class]; - } - return compositeDescription; -} - -- (UICompositeViewDescription *)compositeViewDescription { - return self.class.compositeViewDescription; -} - -#pragma mark - - -- (void)setEditing:(BOOL)editing { - [self setEditing:editing animated:NO]; -} - -- (void)setEditing:(BOOL)editing animated:(BOOL)animated { - [super setEditing:editing animated:animated]; - if (editing) { - _editButton.hidden = FALSE; - _deleteButton.hidden = FALSE; - _avatarImage.hidden = FALSE; - } else { - _editButton.hidden = TRUE; - _deleteButton.hidden = TRUE; - _avatarImage.hidden = TRUE; - } - - if (animated) { - [UIView beginAnimations:nil context:nil]; - [UIView setAnimationDuration:1.0]; - } - [_tableController setEditing:editing animated:animated]; - if (editing) { - [_editButton setOn]; - } else { - [_editButton setOff]; - } - _cancelButton.hidden = !editing; - _backButton.hidden = editing; - _nameLabel.hidden = editing; - _organizationLabel.hidden = editing; - [ContactDisplay setDisplayNameLabel:_nameLabel forContact:_contact]; - _organizationLabel.text = _contact.organizationName; - - [self recomputeTableViewSize:editing]; - - if (animated) { - [UIView commitAnimations]; - } -} - -- (void)recomputeTableViewSize:(BOOL)editing { - CGRect frame = _tableController.tableView.frame; - if ([self viewIsCurrentlyPortrait] && !editing) { - frame.origin.y = _organizationLabel.frame.origin.y + _organizationLabel.frame.size.height; - } else { - frame.origin.y = _avatarImage.frame.size.height + _avatarImage.frame.origin.y; - } - - frame.size.height = _tableController.tableView.contentSize.height; - _tableController.tableView.frame = frame; - [self recomputeContentViewSize]; -} - -- (void)observeValueForKeyPath:(NSString *)keyPath - ofObject:(id)object - change:(NSDictionary *)change - context:(void *)context { - CGRect frame = _tableController.tableView.frame; - frame.size = _tableController.tableView.contentSize; - _tableController.tableView.frame = frame; - [self recomputeContentViewSize]; -} - -- (void)recomputeContentViewSize { - _contentView.contentSize = - CGSizeMake(_tableController.tableView.frame.size.width + _tableController.tableView.frame.origin.x, - _tableController.tableView.frame.size.height + _tableController.tableView.frame.origin.y); -} - -#pragma mark - Action Functions - -- (IBAction)onCancelClick:(id)event { - [self dismissKeyboards]; - if (!_isAdding) { - _contact.firstName = _tmpContact.firstName.copy; - _contact.lastName = _tmpContact.lastName.copy; - _contact.avatar = _tmpContact.avatar.copy; - [_avatarImage setImage:[FastAddressBook imageForContact:_contact]]; - - while (_contact.sipAddresses.count > 0) { - [_contact removeSipAddressAtIndex:0]; - } - NSInteger nbSipAd = 0; - if (_tmpContact.sipAddresses) { - while (_tmpContact.sipAddresses.count > nbSipAd) { - [_contact addSipAddress:_tmpContact.sipAddresses[nbSipAd]]; - nbSipAd++; - } - } - while (_contact.phones.count > 0) { - if (_contact.phones[0] != NULL && ![_contact.phones[0] isEqualToString:@" "]) { - [_contact removePhoneNumberAtIndex:0]; - } else { - // remove empty index - [_contact.phones removeObjectAtIndex:0]; - } - } - NSInteger nbPhone = 0; - if (_tmpContact.phones != NULL) { - while (_tmpContact.phones.count > nbPhone) { - [_contact addPhoneNumber:_tmpContact.phones[nbPhone]]; - nbPhone++; - } - } - while (_contact.emails.count > 0) { - [_contact removeEmailAtIndex:0]; - } - NSInteger nbEmail = 0; - if (_tmpContact.emails != NULL) { - while (_tmpContact.emails.count > nbEmail) { - [_contact addEmail:_tmpContact.emails[nbEmail]]; - nbEmail++; - } - } - // [self saveData]; - } else { - [LinphoneManager.instance.fastAddressBook deleteContact:_contact]; - } - - [self setEditing:FALSE]; - if (IPAD) { - _emptyLabel.hidden = !_isAdding; - _avatarImage.hidden = !_emptyLabel.hidden; - _deleteButton.hidden = !_emptyLabel.hidden; - _editButton.hidden = !_emptyLabel.hidden; - } else { - if (_isAdding) { - [PhoneMainView.instance popCurrentView]; - } else { - _avatarImage.hidden = FALSE; - _deleteButton.hidden = FALSE; - _editButton.hidden = FALSE; - } - } - - self.tmpContact = NULL; - if (_isAdding) { - [PhoneMainView.instance - popToView:ContactsListView.compositeViewDescription]; - _isAdding = FALSE; - } -} - -- (IBAction)onBackClick:(id)event { - if ([ContactSelection getSelectionMode] == ContactSelectionModeEdit) { - [ContactSelection setSelectionMode:ContactSelectionModeNone]; - } - - NSString* previous = [PhoneMainView.instance getPreviousViewName]; - if ([previous isEqualToString:@"HistoryDetailsView"]) { - HistoryDetailsView *view = VIEW(HistoryDetailsView); - [PhoneMainView.instance popToView:view.compositeViewDescription]; - } else { - ContactsListView *view = VIEW(ContactsListView); - [PhoneMainView.instance popToView:view.compositeViewDescription]; - } -} - -- (IBAction)onEditClick:(id)event { - if (_tableController.isEditing) { - [LinphoneManager.instance setContactsUpdated:TRUE]; - [self setEditing:FALSE]; - if(![self hasDuplicateContactOf:_contact]){ - [self saveData]; - _isAdding = FALSE; - self.tmpContact = NULL; - _avatarImage.hidden = FALSE; - _deleteButton.hidden = FALSE; - _editButton.hidden = FALSE; - }else{ - LOGE(@"====>>>> Duplicated Contacts detected !!!"); - [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Contact error", nil) message:NSLocalizedString(@"Contact duplicate", nil) delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Continue", nil] show]; - } - } else { - [self modifyTmpContact:_contact]; - [self setEditing:TRUE]; - } -} - -- (IBAction)onDeleteClick:(id)sender { - NSString *msg = NSLocalizedString(@"Do you want to delete selected contact?\nIt will also be deleted from your phone's address book.", nil); - [UIConfirmationDialog ShowWithMessage:msg - cancelMessage:nil - confirmMessage:nil - onCancelClick:nil - onConfirmationClick:^() { - if (_tableController.isEditing) { - [self onCancelClick:sender]; - } - [self removeContact]; - [self dismissKeyboards]; - }]; -} - -- (IBAction)onAvatarClick:(id)sender { - [LinphoneUtils findAndResignFirstResponder:self.view]; - if (_tableController.isEditing) { - [ImagePickerView SelectImageFromDevice:self atPosition:_avatarImage inView:self.view withDocumentMenuDelegate:nil]; - } -} - -- (void)dismissKeyboards { - NSArray *cells = [self.tableController.tableView visibleCells]; - for (UIContactDetailsCell *cell in cells) { - UIView * txt = cell.editTextfield; - if ([txt isKindOfClass:[UITextField class]] && [txt isFirstResponder]) { - [txt resignFirstResponder]; - } - } -} - -- (BOOL) hasDuplicateContactOf:(Contact*) contactToCheck{ - CNContactStore *store = [[CNContactStore alloc] init]; - NSArray *keysToFetch = @[ - CNContactEmailAddressesKey, CNContactPhoneNumbersKey, - CNContactInstantMessageAddressesKey, CNInstantMessageAddressUsernameKey, - CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPostalAddressesKey, - CNContactIdentifierKey, CNContactImageDataKey, CNContactNicknameKey - ]; - CNMutableContact *mCNContact = - [[store unifiedContactWithIdentifier:contactToCheck.identifier keysToFetch:keysToFetch error:nil] mutableCopy]; - if(mCNContact == NULL){ - for(NSString *address in contactToCheck.sipAddresses){ - NSString *name = [FastAddressBook normalizeSipURI:address use_prefix:TRUE]; - if([LinphoneManager.instance.fastAddressBook.addressBookMap objectForKey:name]){ - return TRUE; - } - } - return FALSE; - }else{ - return FALSE; - } -} - - -#pragma mark - Image picker delegate - -- (void)imagePickerDelegateImage:(UIImage *)image info:(NSDictionary *)info { - // When getting image from the camera, it may be 90° rotated due to orientation - // (image.imageOrientation = UIImageOrientationRight). Just rotate it to be face up. - if (image.imageOrientation != UIImageOrientationUp) { - UIGraphicsBeginImageContextWithOptions(image.size, false, image.scale); - [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)]; - image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - } - - // Dismiss popover on iPad - if (IPAD) { - [VIEW(ImagePickerView).popoverController dismissPopoverAnimated:TRUE]; - } - - [_contact setAvatar:image]; - - [_avatarImage setImage:[FastAddressBook imageForContact:_contact]]; -} - -- (void)imagePickerDelegateVideo:(NSURL*)url info:(NSDictionary *)info { - return; -} - -@end diff --git a/Classes/ContactsListTableView.h b/Classes/ContactsListTableView.h deleted file mode 100644 index adf5a87b6..000000000 --- a/Classes/ContactsListTableView.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import - -#import "UICheckBoxTableView.h" - -#import "OrderedDictionary.h" - -@interface ContactsListTableView : UICheckBoxTableView { - @private - OrderedDictionary *addressBookMap; -} -@property(atomic) BOOL reloadMagicSearch; -- (void)loadData; -- (void)loadDataWithFilter:(NSString *)filter; -- (void)removeAllContacts; - -@end diff --git a/Classes/ContactsListTableView.m b/Classes/ContactsListTableView.m deleted file mode 100644 index 2e612f5d4..000000000 --- a/Classes/ContactsListTableView.m +++ /dev/null @@ -1,397 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "linphoneapp-Swift.h" -#import "ContactsListTableView.h" -#import "UIContactCell.h" -#import "LinphoneManager.h" -#import "PhoneMainView.h" -#import "Utils.h" - -@implementation ContactsListTableView - -#pragma mark - Lifecycle Functions - -- (void)initContactsTableViewController { - addressBookMap = [[OrderedDictionary alloc] init]; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(onAddressBookUpdate:) - name:CNContactStoreDidChangeNotification - object:nil]; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(onMagicSearchFinished:) - name:kLinphoneMagicSearchFinished - object:nil]; -} - -- (void)onAddressBookUpdate:(NSNotification *)k { - if ((![MagicSearchSingleton.instance isSearchOngoing] && (PhoneMainView.instance.currentView == ContactsListView.compositeViewDescription)) || (IPAD && PhoneMainView.instance.currentView == ContactDetailsView.compositeViewDescription)) { - [self loadData]; - } -} - -- (void)onMagicSearchFinished:(NSNotification *)k { - [self buildContactTable]; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - if (IPAD) { - if (![self selectFirstRow]) { - ContactDetailsView *view = VIEW(ContactDetailsView); - [view setContact:nil]; - } - } - NSDictionary* userInfo; - [NSNotificationCenter.defaultCenter addObserver:self - selector: @selector(receivePresenceNotification:) - name: @"LinphoneFriendPresenceUpdate" - object: userInfo]; -} - --(void)viewWillDisappear:(BOOL)animated{ - [super viewWillDisappear:animated]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:@"LinphoneFriendPresenceUpdate" object:nil]; - [AvatarBridge removeAllObserver]; -} - --(void)viewDidDisappear:(BOOL)animated{ - [super viewDidDisappear:animated]; -} - --(void) receivePresenceNotification:(NSNotification*)notification -{ - if ([notification.name isEqualToString:@"LinphoneFriendPresenceUpdate"]) - { - NSDictionary* userInfo = notification.userInfo; - NSString* friend = (NSString*)userInfo[@"friend"]; - - NSArray *indexPathsVisible = self.tableView.indexPathsForVisibleRows; - - for (int i = 0; i < indexPathsVisible.count; i++) - { - NSMutableArray *subAr = [addressBookMap objectForKey:[addressBookMap keyAtIndex:indexPathsVisible[i].section]]; - Contact *contact = subAr[indexPathsVisible[i].row]; - - if (contact.sipAddresses.count > 0){ - for (NSString *sip in contact.sipAddresses) { - NSString *uri = [@"sip:" stringByAppendingString:sip]; - - if([uri isEqual:friend]){ - NSIndexPath* indexPath = indexPathsVisible[i]; - NSArray* indexArray = [NSArray arrayWithObjects:indexPath, nil]; - [self.tableView reloadRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationFade]; - } - } - }else if (contact.phones.count > 0){ - for (NSString *phone in contact.phones) { - NSString *uri = phone; - - if([uri isEqual:friend]){ - NSIndexPath* indexPath = indexPathsVisible[i]; - NSArray* indexArray = [NSArray arrayWithObjects:indexPath, nil]; - [self.tableView reloadRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationFade]; - } - } - } - } - } -} - -- (id)init { - self = [super init]; - if (self) { - [self initContactsTableViewController]; - } - _reloadMagicSearch = TRUE; - return self; -} - -- (id)initWithCoder:(NSCoder *)decoder { - self = [super initWithCoder:decoder]; - if (self) { - [self initContactsTableViewController]; - } - return self; -} - -- (void)dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [self removeAllContacts]; -} - -- (void)removeAllContacts { - for (NSInteger j = 0; j < [self.tableView numberOfSections]; ++j) { - for (NSInteger i = 0; i < [self.tableView numberOfRowsInSection:j]; ++i) { - [[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:j]] setContact:nil]; - } - } -} - -#pragma mark - - -static int ms_strcmpfuz(const char *fuzzy_word, const char *sentence) { - if (!fuzzy_word || !sentence) { - return fuzzy_word == sentence; - } - const char *c = fuzzy_word; - const char *within_sentence = sentence; - for (; c != NULL && *c != '\0' && within_sentence != NULL; ++c) { - within_sentence = strchr(within_sentence, *c); - // Could not find c character in sentence. Abort. - if (within_sentence == NULL) { - break; - } - // since strchr returns the index of the matched char, move forward - within_sentence++; - } - - // If the whole fuzzy was found, returns 0. Otherwise returns number of characters left. - return (int)(within_sentence != NULL ? 0 : fuzzy_word + strlen(fuzzy_word) - c); -} - -- (NSString *)displayNameForContact:(Contact *)person { - NSString *name = person.displayName; - if (name != nil && [name length] > 0 && ![name isEqualToString:NSLocalizedString(@"Unknown", nil)]) { - - // Sort contacts by first letter. We need to translate the name to ASCII first, because of UTF-8 - // issues. For instance expected order would be: Alberta(A tilde) before ASylvano. - NSData *name2ASCIIdata = [name dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; - NSString *name2ASCII = [[NSString alloc] initWithData:name2ASCIIdata encoding:NSASCIIStringEncoding]; - return name2ASCII; - } - return NSLocalizedString(@"Unknown", nil); -} - -- (void)buildContactTable { - @synchronized(addressBookMap) { - //Set all contacts from ContactCell to nil - for (NSInteger j = 0; j < [self.tableView numberOfSections]; ++j) - { - for (NSInteger i = 0; i < [self.tableView numberOfRowsInSection:j]; ++i) - { - [[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:j]] setContact:nil]; - } - } - // Reset Address book - [addressBookMap removeAllObjects]; - - NSMutableArray *subAr = [NSMutableArray new]; - [addressBookMap insertObject:subAr forKey:@"" selector:@selector(caseInsensitiveCompare:)]; - // - - NSArray *searchResults = [MagicSearchSingleton.instance getLastSearchContacts]; - - for (Contact *contact in searchResults) { - NSMutableString *name = [[NSMutableString alloc] initWithString: [self displayNameForContact:contact]]; - if (name != nil) { - NSString *firstChar = [[name substringToIndex:1] uppercaseString]; - // Put in correct subAr - if ([firstChar characterAtIndex:0] < 'A' || [firstChar characterAtIndex:0] > 'Z') { - firstChar = @"#"; - } - NSMutableArray *subAr = [addressBookMap objectForKey:firstChar]; - if (subAr == nil) { - subAr = [[NSMutableArray alloc] init]; - [addressBookMap insertObject:subAr forKey:firstChar selector:@selector(caseInsensitiveCompare:)]; - } - NSUInteger idx = [subAr indexOfObject:contact inSortedRange:(NSRange){0, subAr.count} options:NSBinarySearchingInsertionIndex usingComparator:^NSComparisonResult( Contact *_Nonnull obj1, Contact *_Nonnull obj2) { - return [[self displayNameForContact:obj1] compare:[self displayNameForContact:obj2] options:NSCaseInsensitiveSearch]; - }]; - if (![subAr containsObject:contact]) { - [subAr insertObject:contact atIndex:idx]; - } - } - } - [super loadData]; - } - // since we refresh the tableview, we must perform this on main - // thread - dispatch_async(dispatch_get_main_queue(), ^(void) { - if (IPAD) { - if (!([self totalNumberOfItems] > 0)) { - ContactDetailsView *view = VIEW(ContactDetailsView); - [view setContact:nil]; - } - } - }); - _reloadMagicSearch = FALSE; -} - -- (void)loadData { - if (_reloadMagicSearch) { - NSString *domain = @""; - if ([ContactSelection getSipFilterEnabled]) { - LinphoneAccount *defaultAccount = linphone_core_get_default_account(LC); - if (defaultAccount) { - domain = [NSString stringWithUTF8String:linphone_account_params_get_domain(linphone_account_get_params(defaultAccount))]; - } - } - int sourceFlags = LinphoneMagicSearchSourceFriends | LinphoneMagicSearchSourceLdapServers; - [MagicSearchSingleton.instance searchForContactsWithDomain:domain sourceFlags:sourceFlags clearCache:[LinphoneManager.instance getContactsUpdated]]; - [LinphoneManager.instance setContactsUpdated:FALSE]; - } else { - [self buildContactTable]; - } -} - -- (void)loadDataWithFilter: (NSString *)filter { - LOGI(@"Load search contact list"); - _reloadMagicSearch = _reloadMagicSearch || [filter length]==0 || ![[MagicSearchSingleton.instance currentFilter] isEqualToString:filter]; - [MagicSearchSingleton.instance setCurrentFilter:filter]; - [self loadData]; -} - -#pragma mark - UITableViewDataSource Functions - -- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { - return [addressBookMap allKeys]; -} - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return [addressBookMap count]; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return [(OrderedDictionary *)[addressBookMap objectForKey:[addressBookMap keyAtIndex:section]] count]; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - NSString *kCellId = NSStringFromClass(UIContactCell.class); - UIContactCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId]; - if (cell == nil) { - cell = [[UIContactCell alloc] initWithIdentifier:kCellId]; - } - NSMutableArray *subAr = [addressBookMap objectForKey:[addressBookMap keyAtIndex:[indexPath section]]]; - Contact *contact = subAr[indexPath.row]; - - // Cached avatar - UIImage *image = [FastAddressBook imageForContact:contact]; - [cell.avatarImage setImage:image]; - [cell setContact:contact]; - [super accessoryForCell:cell atPath:indexPath]; - cell.contentView.userInteractionEnabled = false; - - return cell; -} - -- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { - CGRect frame = CGRectMake(0, 0, tableView.frame.size.width, tableView.sectionHeaderHeight); - UIView *tempView = [[UIView alloc] initWithFrame:frame]; - if (@available(iOS 13, *)) { - tempView.backgroundColor = [UIColor systemBackgroundColor]; - } else { - tempView.backgroundColor = [UIColor whiteColor]; - } - - UILabel *tempLabel = [[UILabel alloc] initWithFrame:frame]; - tempLabel.backgroundColor = [UIColor clearColor]; - tempLabel.textColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"color_A.png"]]; - tempLabel.text = [addressBookMap keyAtIndex:section]; - tempLabel.textAlignment = NSTextAlignmentCenter; - tempLabel.font = [UIFont boldSystemFontOfSize:17]; - tempLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; - [tempView addSubview:tempLabel]; - - return tempView; -} - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - [super tableView:tableView didSelectRowAtIndexPath:indexPath]; - if (![self isEditing]) { - NSMutableArray *subAr = [addressBookMap objectForKey:[addressBookMap keyAtIndex:[indexPath section]]]; - Contact *contact = subAr[indexPath.row]; - - // Go to Contact details view - ContactDetailsView *view = VIEW(ContactDetailsView); - [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; - if (([ContactSelection getSelectionMode] != ContactSelectionModeEdit) || !([ContactSelection getAddAddress])) { - [view setContact:contact]; - } else { - if (IPAD) { - [view resetContact]; - view.isAdding = FALSE; - } - [view editContact:contact address:[ContactSelection getAddAddress]]; - } - } -} - -- (void)tableView:(UITableView *)tableView - commitEditingStyle:(UITableViewCellEditingStyle)editingStyle - forRowAtIndexPath:(NSIndexPath *)indexPath { - if (editingStyle == UITableViewCellEditingStyleDelete) { - [NSNotificationCenter.defaultCenter removeObserver:self]; - - NSString *msg = NSLocalizedString(@"Do you want to delete selected contact?\nIt will also be deleted from your phone's address book.", nil); - [UIConfirmationDialog ShowWithMessage:msg - cancelMessage:nil - confirmMessage:nil - onCancelClick:nil - onConfirmationClick:^() { - [tableView beginUpdates]; - - NSString *firstChar = [addressBookMap keyAtIndex:[indexPath section]]; - NSMutableArray *subAr = [addressBookMap objectForKey:firstChar]; - Contact *contact = subAr[indexPath.row]; - [subAr removeObjectAtIndex:indexPath.row]; - if (subAr.count == 0) { - [addressBookMap removeObjectForKey:firstChar]; - [tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] - withRowAnimation:UITableViewRowAnimationFade]; - } - UIContactCell* cell = [self.tableView cellForRowAtIndexPath:indexPath]; - [cell setContact:NULL]; - [[LinphoneManager.instance fastAddressBook] deleteContact:contact]; - [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; - [tableView endUpdates]; - - [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(onAddressBookUpdate:) - name:kLinphoneAddressBookUpdate - object:nil]; - [self loadData]; - }]; - } -} - -- (void)removeSelectionUsing:(void (^)(NSIndexPath *))remover { - [super removeSelectionUsing:^(NSIndexPath *indexPath) { - [NSNotificationCenter.defaultCenter removeObserver:self]; - - NSString *firstChar = [addressBookMap keyAtIndex:[indexPath section]]; - NSMutableArray *subAr = [addressBookMap objectForKey:firstChar]; - Contact *contact = subAr[indexPath.row]; - [subAr removeObjectAtIndex:indexPath.row]; - if (subAr.count == 0) { - [addressBookMap removeObjectForKey:firstChar]; - } - UIContactCell* cell = [self.tableView cellForRowAtIndexPath:indexPath]; - [cell setContact:NULL]; - [[LinphoneManager.instance fastAddressBook] deleteContact:contact]; - - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(onAddressBookUpdate:) - name:kLinphoneAddressBookUpdate - object:nil]; - }]; -} - -@end diff --git a/Classes/ContactsListView.h b/Classes/ContactsListView.h deleted file mode 100644 index 23835b8c8..000000000 --- a/Classes/ContactsListView.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UICompositeView.h" -#import "ContactsListTableView.h" -#import "UIInterfaceStyleButton.h" - -typedef enum _ContactSelectionMode { ContactSelectionModeNone, ContactSelectionModeEdit } ContactSelectionMode; - -@interface ContactSelection : NSObject { -} - -+ (void)setSelectionMode:(ContactSelectionMode)selectionMode; -+ (ContactSelectionMode)getSelectionMode; -+ (void)setAddAddress:(NSString *)address; -+ (NSString *)getAddAddress; -/*! - * Filters contacts by SIP domain. - * @param enabled Wether SIP domain filter is enabled - */ -+ (void)enableSipFilter:(BOOL)enabled; - -/*! - * Wether SIP domain filter is enabled - * @return the filter used, or nil if none. - */ -+ (BOOL)getSipFilterEnabled; - -@end - -@interface ContactsListView : UIViewController - -@property(strong, nonatomic) IBOutlet ContactsListTableView *tableController; -@property(strong, nonatomic) IBOutlet UIView *topBar; -@property(strong, nonatomic) IBOutlet UIView *switchView; -@property(nonatomic, strong) IBOutlet UIButton *allButton; -@property(nonatomic, strong) IBOutlet UIButton *linphoneButton; -@property(nonatomic, strong) IBOutlet UIButton *addButton; -@property(nonatomic, strong) IBOutlet UIButton *deleteButton; -@property(strong, nonatomic) IBOutlet UISearchBar *searchBar; -@property(weak, nonatomic) IBOutlet UIImageView *selectedButtonImage; -@property (weak, nonatomic) IBOutlet UIInterfaceStyleButton *toggleSelectionButton; -@property (weak, nonatomic) IBOutlet UILabel *loadingLabel; -@property (weak, nonatomic) IBOutlet UIView *loadingView; -@property (weak, nonatomic) IBOutlet UILabel *ldapMoreResultsLabel; - -- (IBAction)onAllClick:(id)event; -- (IBAction)onLinphoneClick:(id)event; -- (IBAction)onAddContactClick:(id)event; -- (IBAction)onDeleteClick:(id)sender; -- (IBAction)onEditionChangeClick:(id)sender; - -@end diff --git a/Classes/ContactsListView.m b/Classes/ContactsListView.m deleted file mode 100644 index 829b32acc..000000000 --- a/Classes/ContactsListView.m +++ /dev/null @@ -1,356 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "linphoneapp-Swift.h" -#import "PhoneMainView.h" - -@implementation ContactSelection - -static ContactSelectionMode sSelectionMode = ContactSelectionModeNone; -static NSString *sAddAddress = nil; -static BOOL bSipFilterEnabled = FALSE; -static BOOL addAddressFromOthers = FALSE; - -+ (void)setSelectionMode:(ContactSelectionMode)selectionMode { - sSelectionMode = selectionMode; -} - -+ (ContactSelectionMode)getSelectionMode { - return sSelectionMode; -} - -+ (void)setAddAddress:(NSString *)address { - sAddAddress = address; - addAddressFromOthers = true; -} - -+ (NSString *)getAddAddress { - return sAddAddress; -} - -+ (void)enableSipFilter:(BOOL)enabled { - bSipFilterEnabled = enabled; -} - -+ (BOOL)getSipFilterEnabled { - return bSipFilterEnabled; -} - -@end - -@implementation ContactsListView - -@synthesize tableController; -@synthesize allButton; -@synthesize linphoneButton; -@synthesize addButton; -@synthesize deleteButton; -@synthesize topBar; - -typedef enum { ContactsAll, ContactsLinphone, ContactsMAX } ContactsCategory; - -#pragma mark - UICompositeViewDelegate Functions - -static UICompositeViewDescription *compositeDescription = nil; - -+ (UICompositeViewDescription *)compositeViewDescription { - if (compositeDescription == nil) { - compositeDescription = [[UICompositeViewDescription alloc] init:self.class - statusBar:StatusBarView.class - tabBar:TabBarView.class - sideMenu:SideMenuView.class - fullscreen:false - isLeftFragment:YES - fragmentWith:ContactDetailsView.class]; - } - return compositeDescription; -} - -- (UICompositeViewDescription *)compositeViewDescription { - return self.class.compositeViewDescription; -} - -#pragma mark - ViewController Functions - -- (void)viewDidLoad { - NSLog(@"Debuglog viewDidLoad"); - [super viewDidLoad]; - _searchBar.text = [MagicSearchSingleton.instance currentFilter]; - tableController.tableView.accessibilityIdentifier = @"Contacts table"; - - if (![[PhoneMainView.instance getPreviousViewName] isEqualToString:@"ContactDetailsView"]) { - _searchBar.text = @""; - } - - if ([LinphoneManager.instance lpConfigBoolForKey:@"only_show_sip_contacts_list"]) { - _switchView.hidden = true; - [self changeView:ContactsLinphone]; - } else if ([LinphoneManager.instance lpConfigBoolForKey:@"hide_sip_contacts_list"]){ - _switchView.hidden = true; - [self changeView:ContactsAll]; - } else { - [self changeView:ContactsAll]; - } - - UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] - initWithTarget:self - action:@selector(dismissKeyboards)]; - - [tap setDelegate:self]; - [self.view addGestureRecognizer:tap]; -} - -- (void)viewWillAppear:(BOOL)animated { - - NSLog(@"Debuglog viewWillAppear"); - [super viewWillAppear:animated]; - _searchBar.showsCancelButton = (_searchBar.text.length > 0); - - int y = _searchBar.frame.origin.y + _searchBar.frame.size.height; - [tableController.tableView setFrame:CGRectMake(tableController.tableView.frame.origin.x, - y, - tableController.tableView.frame.size.width, - tableController.tableView.frame.size.height)]; - [tableController.emptyView setFrame:CGRectMake(tableController.emptyView.frame.origin.x, - y, - tableController.emptyView.frame.size.width, - tableController.emptyView.frame.size.height)]; - - if (tableController.isEditing) { - tableController.editing = NO; - } - [self refreshButtons]; - [_toggleSelectionButton setImage:[UIImage imageNamed:@"select_all_default.png"] forState:UIControlStateSelected]; - if ([LinphoneManager.instance lpConfigBoolForKey:@"hide_linphone_contacts" inSection:@"app"]) { - self.linphoneButton.hidden = TRUE; - self.selectedButtonImage.hidden = TRUE; - } - - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(onMagicSearchStarted:) - name:kLinphoneMagicSearchStarted - object:nil]; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(onMagicSearchFinished:) - name:kLinphoneMagicSearchFinished - object:nil]; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(onMagicSearchMoreAvailable:) - name:kLinphoneMagicSearchMoreAvailable - object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(displayModeChanged) - name:kDisplayModeChanged - object:nil]; -} - -- (void)onMagicSearchStarted:(NSNotification *)k { - _loadingView.hidden = FALSE; -} -- (void)onMagicSearchFinished:(NSNotification *)k { - _loadingView.hidden = TRUE; -} -- (void)onMagicSearchMoreAvailable:(NSNotification *)k { - _ldapMoreResultsLabel.hidden = FALSE; -} - -- (void)viewDidAppear:(BOOL)animated { - NSLog(@"Debuglog viewDidAppear"); - [super viewDidAppear:animated]; - if (![FastAddressBook isAuthorized]) { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Address book", nil) - message:NSLocalizedString(@"You must authorize the application to have access to address book.\n" - "Toggle the application in Settings > Privacy > Contacts", - nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Continue", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; - [PhoneMainView.instance popCurrentView]; - } - - // show message toast when add contact from address - if ([ContactSelection getAddAddress] != nil && addAddressFromOthers) { - UIAlertController *infoView = [UIAlertController - alertControllerWithTitle:NSLocalizedString(@"Info", nil) - message:NSLocalizedString(@"Select a contact or create a new one.",nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"OK" - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *action){ - }]; - - [infoView addAction:defaultAction]; - addAddressFromOthers = FALSE; - [PhoneMainView.instance presentViewController:infoView animated:YES completion:nil]; - } -} - -- (void) viewWillDisappear:(BOOL)animated { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - self.view = NULL; - [self.tableController removeAllContacts]; -} - -#pragma mark - - -- (void)changeView:(ContactsCategory)view { - NSLog(@"Debuglog changeView"); - CGRect frame = _selectedButtonImage.frame; - if (view == ContactsAll && !allButton.selected) { - //REQUIRED TO RELOAD WITH FILTER - [LinphoneManager.instance setContactsUpdated:TRUE]; - frame.origin.x = allButton.frame.origin.x; - [ContactSelection enableSipFilter:FALSE]; - allButton.selected = TRUE; - linphoneButton.selected = FALSE; - [tableController setReloadMagicSearch:TRUE]; - [tableController loadDataWithFilter: _searchBar.text]; - } else if (view == ContactsLinphone && !linphoneButton.selected) { - //REQUIRED TO RELOAD WITH FILTER - [LinphoneManager.instance setContactsUpdated:TRUE]; - frame.origin.x = linphoneButton.frame.origin.x; - [ContactSelection enableSipFilter:TRUE]; - linphoneButton.selected = TRUE; - allButton.selected = FALSE; - [tableController setReloadMagicSearch:TRUE]; - [tableController loadDataWithFilter: _searchBar.text]; - } - _selectedButtonImage.frame = frame; - if ([LinphoneManager.instance lpConfigBoolForKey:@"hide_linphone_contacts" inSection:@"app"]) { - allButton.selected = FALSE; - } -} - -- (void)refreshButtons { - [addButton setHidden:![LinphoneManager.instance lpConfigBoolForKey:@"enable_native_address_book"] || [LinphoneManager.instance lpConfigBoolForKey:@"read_only_native_address_book"]]; - if ([LinphoneManager.instance lpConfigBoolForKey:@"read_only_native_address_book"]) { - addButton.hidden = true; - deleteButton.hidden = true; - } - [self changeView:[ContactSelection getSipFilterEnabled] ? ContactsLinphone : ContactsAll]; -} - -#pragma mark - Action Functions - -- (IBAction)onAllClick:(id)event { - [self changeView:ContactsAll]; -} - -- (IBAction)onLinphoneClick:(id)event { - [self changeView:ContactsLinphone]; -} - -- (IBAction)onAddContactClick:(id)event { - ContactDetailsView *view = VIEW(ContactDetailsView); - [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; - view.isAdding = TRUE; - if ([ContactSelection getAddAddress] == nil) { - [view newContact]; - } else { - [view newContact:[ContactSelection getAddAddress]]; - } -} - -- (void)displayModeChanged{ - [self.tableController.tableView reloadData]; -} - -- (IBAction)onDeleteClick:(id)sender { - NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"Do you want to delete selected contacts?\nThey will also be deleted from your phone's address book.", nil)]; - [LinphoneManager.instance setContactsUpdated:TRUE]; - [UIConfirmationDialog ShowWithMessage:msg - cancelMessage:nil - confirmMessage:nil - onCancelClick:^() { - [self onEditionChangeClick:nil]; - } - onConfirmationClick:^() { - [tableController removeSelectionUsing:nil]; - [tableController loadData]; - [self onEditionChangeClick:nil]; - }]; -} - -- (IBAction)onEditionChangeClick:(id)sender { - allButton.hidden = linphoneButton.hidden = _selectedButtonImage.hidden = addButton.hidden = self.tableController.isEditing; - if ([LinphoneManager.instance lpConfigBoolForKey:@"enable_native_address_book"]) { - addButton.hidden = self.tableController.isEditing; - } - if ([LinphoneManager.instance lpConfigBoolForKey:@"read_only_native_address_book"]) { - addButton.hidden = true; - deleteButton.hidden = true; - } -} - -- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { - searchBar.text = @""; - [LinphoneManager.instance setContactsUpdated:TRUE]; - [self searchBar:searchBar textDidChange:@""]; - - [searchBar resignFirstResponder]; -} - -- (void)dismissKeyboards { - if ([self.searchBar isFirstResponder]){ - [self.searchBar resignFirstResponder]; - } -} - -#pragma mark - searchBar delegate - -- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { - NSLog(@"Debuglog textdidchange"); - if (![searchText isEqualToString:[MagicSearchSingleton.instance currentFilter]]) { - if (searchText.length == 0) { - [LinphoneManager.instance setContactsUpdated:TRUE]; - } - _ldapMoreResultsLabel.hidden = TRUE; - [tableController loadDataWithFilter:searchText]; - } -} - -- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar { - [searchBar setShowsCancelButton:FALSE animated:TRUE]; -} - -- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { - [searchBar setShowsCancelButton:TRUE animated:TRUE]; -} - -- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { - [searchBar resignFirstResponder]; -} - -#pragma mark - GestureRecognizerDelegate - -- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch -{ - return NO; -} - -@end diff --git a/Classes/CountryListView.h b/Classes/CountryListView.h deleted file mode 100755 index c20ed1a0f..000000000 --- a/Classes/CountryListView.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import "PhoneMainView.h" - -@protocol CountryListViewDelegate -- (void)didSelectCountry:(NSDictionary *)country; -@end - -@interface CountryListView : UIViewController - -@property (nonatomic, weak) iddelegate; -@property(strong, nonatomic) UISearchController *searchController; - -- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope; - -- (IBAction)onCancelClick:(id)sender; - -+ (NSDictionary *)countryWithIso:(NSString*)iso; - -+ (NSDictionary *)countryWithCountryCode:(NSString*)cc; - -@end diff --git a/Classes/CountryListView.m b/Classes/CountryListView.m deleted file mode 100755 index aaf221d0a..000000000 --- a/Classes/CountryListView.m +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "CountryListView.h" -#import "linphone/linphonecore_utils.h" - -@interface CountryListView () - -@property (strong, nonatomic) IBOutlet UITableView *tableView; -@property (strong, nonatomic) NSArray *searchResults; - -@end - -@implementation CountryListView - -static NSMutableArray * dataRows = nil; - -+ (NSArray*) getData { - if (!dataRows) { - dataRows = [[NSMutableArray alloc] init]; - const bctbx_list_t *dialPlans = linphone_dial_plan_get_all_list(); - while (dialPlans) { - LinphoneDialPlan* dial_plan = (LinphoneDialPlan*)dialPlans->data; - [dataRows addObject:@{ - @"name":[NSString stringWithUTF8String:linphone_dial_plan_get_country(dial_plan)], - @"iso":[NSString stringWithUTF8String:linphone_dial_plan_get_iso_country_code(dial_plan)], - @"code":[NSString stringWithFormat:@"+%s",linphone_dial_plan_get_country_calling_code(dial_plan)], - @"phone_length":@(linphone_dial_plan_get_national_number_length(dial_plan)) - }]; - dialPlans = dialPlans->next; - } - } - return dataRows; -} -#pragma mark - UICompositeViewDelegate Functions - -static UICompositeViewDescription *compositeDescription = nil; - -+ (UICompositeViewDescription *)compositeViewDescription { - if (compositeDescription == nil) { - compositeDescription = [[UICompositeViewDescription alloc] init:self.class - statusBar:StatusBarView.class - tabBar:nil - sideMenu:SideMenuView.class - fullscreen:false - isLeftFragment:YES - fragmentWith:nil]; - } - return compositeDescription; -} - -- (UICompositeViewDescription *)compositeViewDescription { - return self.class.compositeViewDescription; -} - -#pragma mark - Other - -- (void)viewDidLoad { - [super viewDidLoad]; - - _searchResults = [[NSArray alloc] init]; - self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; - self.searchController.searchResultsUpdater = self; - self.searchController.searchBar.delegate = self; - self.searchController.obscuresBackgroundDuringPresentation = false; - [self.searchController.searchBar sizeToFit]; - self.tableView.tableHeaderView = self.searchController.searchBar; - [_tableView reloadData]; -} - -- (void)viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; - if (self.searchController.active) { - self.searchController.active = NO; - [self.searchController.searchBar removeFromSuperview]; - } -} -#pragma mark - UITableView Datasource - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 1; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - if (self.searchController.active){ - return _searchResults.count; - }else{ - return [self.class getData].count; - } -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - static NSString *cellIdentifier = @"Cell"; - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; - if(cell == nil) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier]; - } - - if (self.searchController.active) { - cell.textLabel.text = [[_searchResults objectAtIndex:indexPath.row] valueForKey:@"name"]; - cell.detailTextLabel.text = [[_searchResults objectAtIndex:indexPath.row] valueForKey:@"code"]; - }else{ - cell.textLabel.text = [[[self.class getData] objectAtIndex:indexPath.row] valueForKey:@"name"]; - cell.detailTextLabel.text = [[[self.class getData] objectAtIndex:indexPath.row] valueForKey:@"code"]; - } - return cell; -} - -#pragma mark - UITableView Delegate methods - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - [tableView deselectRowAtIndexPath:indexPath animated:YES]; - if ([_delegate respondsToSelector:@selector(didSelectCountry:)]) { - NSDictionary* dict = nil; - if (self.searchController.active) { - dict = [_searchResults objectAtIndex:indexPath.row]; - }else{ - dict = [[self.class getData] objectAtIndex:indexPath.row]; - } - - [self.delegate didSelectCountry:dict]; - } - [PhoneMainView.instance popCurrentView]; -} - -#pragma mark - searchController delegate - -- (void)updateSearchResultsForSearchController:(UISearchController *)searchController { - [self filterContentForSearchText:self.searchController.searchBar.text scope:@""]; - dispatch_async(dispatch_get_main_queue(), ^{ - [self.tableView reloadData]; - }); -} - -#pragma mark - Filtering - -- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope{ - NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[c] %@ or code contains %@", searchText, searchText]; - _searchResults = [[self.class getData] filteredArrayUsingPredicate:predicate]; -} - -- (IBAction)onCancelClick:(id)sender { - [PhoneMainView.instance popCurrentView]; -} - -+ (NSDictionary *)countryWithIso:(NSString *)iso { - for (NSDictionary *dict in [self.class getData]) { - if ([[dict objectForKey:@"iso"] isEqualToString:iso.uppercaseString]) { - return dict; - } - } - return nil; -} - -+ (NSDictionary *)countryWithCountryCode:(NSString *)cc { - for (NSDictionary *dict in [self.class getData]) { - if ([[dict objectForKey:@"code"] isEqualToString:cc.uppercaseString]) { - return dict; - } - } - return nil; -} - -@end diff --git a/Classes/DevicesListView.h b/Classes/DevicesListView.h deleted file mode 100644 index f399f59f8..000000000 --- a/Classes/DevicesListView.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import "UICompositeView.h" - -@interface DevicesMenuEntry : NSObject { -@public - LinphoneParticipant *participant; - LinphoneParticipantDevice *device; - BOOL isFirst; - BOOL isUnique; - BOOL isMyself; - NSInteger index; - BOOL isListOpen; - NSString *displayName; -}; - -@end - -@interface DevicesListView : UIViewController - -@property (weak, nonatomic) IBOutlet UILabel *addressLabel; -@property (weak, nonatomic) IBOutlet UITableView *tableView; - -@property(nonatomic) LinphoneChatRoom *room; -@property NSMutableArray *devicesMenuEntries; - -- (IBAction)onBackClick:(id)sender; - -@end diff --git a/Classes/DevicesListView.m b/Classes/DevicesListView.m deleted file mode 100644 index 10c38e7c7..000000000 --- a/Classes/DevicesListView.m +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "linphoneapp-Swift.h" -#import "DevicesListView.h" -#import "PhoneMainView.h" -#import "UIDeviceCell.h" - -@implementation DevicesMenuEntry -- (id)init:(LinphoneParticipantDevice *)dev isMe:(BOOL)isMe isFirst:(BOOL)first isUnique:(BOOL)unique index:(NSInteger)idx{ - if ((self = [super init])) { - device = dev; - isMyself = isMe; - isFirst = first; - isUnique = unique; - index = idx; - isListOpen = FALSE; - } - return self; -} - -@end - -@implementation DevicesListView -#pragma mark - UICompositeViewDelegate Functions - -static UICompositeViewDescription *compositeDescription = nil; - -+ (UICompositeViewDescription *)compositeViewDescription { - if (compositeDescription == nil) { - compositeDescription = [[UICompositeViewDescription alloc] init:self.class - statusBar:StatusBarView.class - tabBar:TabBarView.class - sideMenu:SideMenuView.class - fullscreen:false - isLeftFragment:NO - fragmentWith:ChatsListView.class]; - } - return compositeDescription; -} - -- (UICompositeViewDescription *)compositeViewDescription { - return self.class.compositeViewDescription; -} - -#pragma mark - ViewController Functions -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - _tableView.dataSource = self; - _tableView.delegate = self; - bctbx_list_t *participants = linphone_chat_room_get_participants(_room); - _devicesMenuEntries = [NSMutableArray array]; - if (linphone_chat_room_get_capabilities(_room) & LinphoneChatRoomCapabilitiesOneToOne) { - LinphoneParticipant *firstParticipant = participants ? (LinphoneParticipant *)participants->data : NULL; - const LinphoneAddress *addr = firstParticipant ? linphone_participant_get_address(firstParticipant) : linphone_chat_room_get_peer_address(_room); - [ContactDisplay setDisplayNameLabel:_addressLabel forAddress:addr]; - } else { - _addressLabel.text = [NSString stringWithUTF8String:linphone_chat_room_get_subject(_room) ?: LINPHONE_DUMMY_SUBJECT]; - _addressLabel.text = [NSString stringWithFormat:NSLocalizedString(@"%@'s devices", nil), _addressLabel.text]; - } - - LinphoneParticipant *participant; - for (int i=0; idisplayName = lab.text; - entry->participant = participant; - [_devicesMenuEntries addObject:entry]; - bctbx_list_free(devices); - } - - LinphoneParticipant *me = linphone_chat_room_get_me(_room); - bctbx_list_t *devices = linphone_participant_get_devices(me); - DevicesMenuEntry *entry = [[DevicesMenuEntry alloc] init:(LinphoneParticipantDevice *)bctbx_list_nth_data(devices, 0) isMe:TRUE isFirst:TRUE isUnique:(bctbx_list_size(devices)<2) index:bctbx_list_size(participants)]; - entry->participant = me; - [_devicesMenuEntries addObject:entry]; - bctbx_list_free(devices); - - bctbx_list_free(participants); - - _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; - [_tableView reloadData]; -} - -#pragma mark - Action Functions -- (IBAction)onBackClick:(id)sender { - ChatConversationViewSwift *view = VIEW(ChatConversationViewSwift); - [PhoneMainView.instance popToView:view.compositeViewDescription]; -} - -#pragma mark - TableView - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 1; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return [_devicesMenuEntries count]; -} - -- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(nonnull NSIndexPath *)indexPath -{ - return 56.0; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath -{ - NSString *kCellId = NSStringFromClass(UIDeviceCell.class); - UIDeviceCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId]; - if (cell == nil) { - cell = [[UIDeviceCell alloc] initWithIdentifier:kCellId]; - } - DevicesMenuEntry *entry = [_devicesMenuEntries objectAtIndex:indexPath.row]; - if (entry->isFirst) { - entry->isMyself ? cell.deviceLabel.text = NSLocalizedString(@"Me", nil) : [ContactDisplay setDisplayNameLabel:cell.deviceLabel forAddress:linphone_participant_get_address(entry->participant)]; - } - cell.device = entry->device; - cell.isFirst = entry->isFirst; - cell.isUnique = entry->isUnique; - cell.isListOpen = entry->isListOpen; - [cell update]; - - return cell; -} - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - DevicesMenuEntry *entry = [_devicesMenuEntries objectAtIndex:indexPath.row]; - if (entry->isUnique || !entry->isFirst) { - if (!entry->device) { - LOGE(@"Can not call, because the device is null."); - [_tableView reloadData]; - } else { - const LinphoneAddress *addr = linphone_participant_device_get_address(entry->device); - [CallManager.instance startCallWithAddr:(LinphoneAddress *)addr isSas:TRUE isVideo:false isConference:false]; - } - } else { - bctbx_list_t *devices = linphone_participant_get_devices(entry->participant); - if (entry->isListOpen) { - entry->isListOpen = FALSE; - [_devicesMenuEntries replaceObjectAtIndex:indexPath.row withObject:entry]; - for (int i=0; i< bctbx_list_size(devices); i++) { - [_devicesMenuEntries removeObjectAtIndex:indexPath.row+1]; - } - } else { - entry->isListOpen = TRUE; - [_devicesMenuEntries replaceObjectAtIndex:indexPath.row withObject:entry]; - LinphoneParticipantDevice *device; - for (int i=0; iisMyself isFirst:FALSE isUnique:FALSE index:entry->index]; - [_devicesMenuEntries insertObject:tempEntry atIndex:indexPath.row+i+1]; - } - } - bctbx_list_free(devices); - [_tableView reloadData]; - } -} - -@end diff --git a/Classes/DevicesListView.xib b/Classes/DevicesListView.xib deleted file mode 100644 index c0e97cabe..000000000 --- a/Classes/DevicesListView.xib +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/DialerView.h b/Classes/DialerView.h deleted file mode 100644 index 808900397..000000000 --- a/Classes/DialerView.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UICompositeView.h" - -#import "UICamSwitch.h" -#import "UICallButton.h" -#import "UIDigitButton.h" - -@interface DialerView - : TPMultiLayoutViewController { -} - - -@property(nonatomic, strong) IBOutlet UITextField *addressField; -@property(nonatomic, strong) IBOutlet UIButton *addContactButton; -@property(nonatomic, strong) IBOutlet UICallButton *callButton; -@property(nonatomic, strong) IBOutlet UIButton *backButton; -@property(weak, nonatomic) IBOutlet UIButton *backspaceButton; - -@property(nonatomic, strong) IBOutlet UIDigitButton *oneButton; -@property(nonatomic, strong) IBOutlet UIDigitButton *twoButton; -@property(nonatomic, strong) IBOutlet UIDigitButton *threeButton; -@property(nonatomic, strong) IBOutlet UIDigitButton *fourButton; -@property(nonatomic, strong) IBOutlet UIDigitButton *fiveButton; -@property(nonatomic, strong) IBOutlet UIDigitButton *sixButton; -@property(nonatomic, strong) IBOutlet UIDigitButton *sevenButton; -@property(nonatomic, strong) IBOutlet UIDigitButton *eightButton; -@property(nonatomic, strong) IBOutlet UIDigitButton *nineButton; -@property(nonatomic, strong) IBOutlet UIDigitButton *starButton; -@property(nonatomic, strong) IBOutlet UIDigitButton *zeroButton; -@property(nonatomic, strong) IBOutlet UIDigitButton *hashButton; -@property(nonatomic, strong) IBOutlet UIView *backgroundView; -@property(nonatomic, strong) IBOutlet UIView *videoPreview; -@property(nonatomic, strong) IBOutlet UICamSwitch *videoCameraSwitch; -@property(weak, nonatomic) IBOutlet UIView *padView; - -- (IBAction)onAddContactClick:(id)event; -- (IBAction)onBackClick:(id)event; -- (IBAction)onAddressChange:(id)sender; -- (IBAction)onBackspaceClick:(id)sender; - -- (void)setAddress:(NSString *)address; - -@end diff --git a/Classes/DialerView.m b/Classes/DialerView.m deleted file mode 100644 index c7f0da9b5..000000000 --- a/Classes/DialerView.m +++ /dev/null @@ -1,461 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "LinphoneManager.h" -#import "PhoneMainView.h" -#import "linphoneapp-Swift.h" - - -@implementation DialerView - -#pragma mark - UICompositeViewDelegate Functions - -static UICompositeViewDescription *compositeDescription = nil; - -+ (UICompositeViewDescription *)compositeViewDescription { - if (compositeDescription == nil) { - compositeDescription = [[UICompositeViewDescription alloc] init:self.class - statusBar:StatusBarView.class - tabBar:TabBarView.class - sideMenu:SideMenuView.class - fullscreen:false - isLeftFragment:YES - fragmentWith:nil]; - compositeDescription.darkBackground = true; - } - return compositeDescription; -} - -- (UICompositeViewDescription *)compositeViewDescription { - return self.class.compositeViewDescription; -} - -#pragma mark - ViewController Functions - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - - _padView.hidden = - !IPAD && UIInterfaceOrientationIsLandscape(PhoneMainView.instance.mainViewController.currentOrientation); - - // Set observer - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(callUpdateEvent:) - name:kLinphoneCallUpdate - object:nil]; - - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(coreUpdateEvent:) - name:kLinphoneCoreUpdate - object:nil]; - - // Update on show - LinphoneManager *mgr = LinphoneManager.instance; - LinphoneCall *call = linphone_core_get_current_call(LC); - LinphoneCallState state = (call != NULL) ? linphone_call_get_state(call) : 0; - [self callUpdate:call state:state]; - - if (IPAD) { - BOOL videoEnabled = linphone_core_video_display_enabled(LC); - BOOL previewPref = [mgr lpConfigBoolForKey:@"preview_preference"]; - - if (videoEnabled && previewPref) { - linphone_core_set_native_preview_window_id(LC, (__bridge void *)(_videoPreview)); - - if (!linphone_core_video_preview_enabled(LC)) { - linphone_core_enable_video_preview(LC, TRUE); - } - - [_backgroundView setHidden:FALSE]; - [_videoCameraSwitch setHidden:FALSE]; - } else { - linphone_core_set_native_preview_window_id(LC, NULL); - linphone_core_enable_video_preview(LC, FALSE); - [_backgroundView setHidden:TRUE]; - [_videoCameraSwitch setHidden:TRUE]; - } - } else { - linphone_core_enable_video_preview(LC, FALSE); - } - [_addressField setText:@""]; -} - -- (void)viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; - [NSNotificationCenter.defaultCenter removeObserver:self]; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - [_zeroButton setDigit:'0']; - [_oneButton setDigit:'1']; - [_twoButton setDigit:'2']; - [_threeButton setDigit:'3']; - [_fourButton setDigit:'4']; - [_fiveButton setDigit:'5']; - [_sixButton setDigit:'6']; - [_sevenButton setDigit:'7']; - [_eightButton setDigit:'8']; - [_nineButton setDigit:'9']; - [_starButton setDigit:'*']; - [_hashButton setDigit:'#']; - - [_addressField setAdjustsFontSizeToFitWidth:TRUE]; // Not put it in IB: issue with placeholder size - - UILongPressGestureRecognizer *backspaceLongGesture = - [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onBackspaceLongClick:)]; - [_backspaceButton addGestureRecognizer:backspaceLongGesture]; - - UILongPressGestureRecognizer *zeroLongGesture = - [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onZeroLongClick:)]; - [_zeroButton addGestureRecognizer:zeroLongGesture]; - - UILongPressGestureRecognizer *oneLongGesture = - [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onOneLongClick:)]; - [_oneButton addGestureRecognizer:oneLongGesture]; - - UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] - initWithTarget:self - action:@selector(dismissKeyboards)]; - - [self.view addGestureRecognizer:tap]; - - if (IPAD) { - if (LinphoneManager.instance.frontCamId != nil) { - // only show camera switch button if we have more than 1 camera - [_videoCameraSwitch setHidden:FALSE]; - } - } - - LinphoneAccount *defaultAccount = linphone_core_get_default_account(LC); - if (!(defaultAccount && linphone_account_params_get_conference_factory_uri(linphone_account_get_params(defaultAccount)))){ - [_addContactButton setImage:[UIImage imageNamed:@"contact_add_default"] forState:UIControlStateNormal]; - _addContactButton.imageView.contentMode = UIViewContentModeScaleAspectFit; - _addContactButton.enabled = true; - }else{ - [_addContactButton setImage:[UIImage imageNamed:@"voip_conference_new"] forState:UIControlStateNormal]; - _addContactButton.imageView.contentMode = UIViewContentModeScaleAspectFit; - _addContactButton.enabled = true; - } -} - -- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation - duration:(NSTimeInterval)duration { - [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; - switch (toInterfaceOrientation) { - case UIInterfaceOrientationPortrait: - [_videoPreview setTransform:CGAffineTransformMakeRotation(0)]; - break; - case UIInterfaceOrientationPortraitUpsideDown: - [_videoPreview setTransform:CGAffineTransformMakeRotation(M_PI)]; - break; - case UIInterfaceOrientationLandscapeLeft: - [_videoPreview setTransform:CGAffineTransformMakeRotation(M_PI / 2)]; - break; - case UIInterfaceOrientationLandscapeRight: - [_videoPreview setTransform:CGAffineTransformMakeRotation(-M_PI / 2)]; - break; - default: - break; - } - CGRect frame = self.view.frame; - frame.origin = CGPointMake(0, 0); - _videoPreview.frame = frame; - _padView.hidden = !IPAD && UIInterfaceOrientationIsLandscape(toInterfaceOrientation); - if (linphone_core_get_calls_nb(LC)) { - _backButton.hidden = FALSE; - _addContactButton.hidden = TRUE; - } else { - _backButton.hidden = TRUE; - _addContactButton.hidden = FALSE; - } -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - [LinphoneManager.instance shouldPresentLinkPopup]; -} - -#pragma mark - Event Functions - -- (void)callUpdateEvent:(NSNotification *)notif { - LinphoneCall *call = [[notif.userInfo objectForKey:@"call"] pointerValue]; - LinphoneCallState state = [[notif.userInfo objectForKey:@"state"] intValue]; - [self callUpdate:call state:state]; -} - -- (void)coreUpdateEvent:(NSNotification *)notif { - @try { - if (IPAD) { - if (linphone_core_video_display_enabled(LC) && linphone_core_video_preview_enabled(LC)) { - linphone_core_set_native_preview_window_id(LC, (__bridge void *)(_videoPreview)); - [_backgroundView setHidden:FALSE]; - [_videoCameraSwitch setHidden:FALSE]; - } else { - linphone_core_set_native_preview_window_id(LC, NULL); - [_backgroundView setHidden:TRUE]; - [_videoCameraSwitch setHidden:TRUE]; - } - } - } @catch (NSException *exception) { - if ([exception.name isEqualToString:@"LinphoneCoreException"]) { - LOGE(@"Core already destroyed"); - return; - } - LOGE(@"Uncaught exception : %@", exception.description); - abort(); - } -} - -#pragma mark - Debug Functions -- (void)presentMailViewWithTitle:(NSString *)subject forRecipients:(NSArray *)recipients attachLogs:(BOOL)attachLogs { - if ([MFMailComposeViewController canSendMail]) { - MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init]; - if (controller) { - controller.mailComposeDelegate = self; - [controller setSubject:subject]; - [controller setToRecipients:recipients]; - - if (attachLogs) { - char *filepath = linphone_core_compress_log_collection(); - if (filepath == NULL) { - LOGE(@"Cannot sent logs: file is NULL"); - return; - } - - NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"]; - NSString *filename = [appName stringByAppendingString:@".gz"]; - NSString *mimeType = @"text/plain"; - - if ([filename hasSuffix:@".gz"]) { - mimeType = @"application/gzip"; - filename = [appName stringByAppendingString:@".gz"]; - } else { - LOGE(@"Unknown extension type: %@, cancelling email", filename); - return; - } - [controller setMessageBody:NSLocalizedString(@"Application logs", nil) isHTML:NO]; - [controller addAttachmentData:[NSData dataWithContentsOfFile:[NSString stringWithUTF8String:filepath]] - mimeType:mimeType - fileName:filename]; - - ms_free(filepath); - } - self.modalPresentationStyle = UIModalPresentationPageSheet; - [self.view.window.rootViewController presentViewController:controller - animated:TRUE - completion:^{ - }]; - } - - } else { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:subject - message:NSLocalizedString(@"Error: no mail account configured", - nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; - } -} - -- (BOOL)displayDebugPopup:(NSString *)address { - LinphoneManager *mgr = LinphoneManager.instance; - NSString *debugAddress = [mgr lpConfigStringForKey:@"debug_popup_magic" withDefault:@""]; - if ((![debugAddress isEqualToString:@""] && [address isEqualToString:debugAddress]) || [_addressField.text isEqual: @"#1234#"]) { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Debug", nil) - message:NSLocalizedString(@"Choose an action", nil) - preferredStyle:UIAlertControllerStyleAlert]; - - int debugLevel = [LinphoneManager.instance lpConfigIntForKey:@"debugenable_preference"]; - BOOL debugEnabled = (debugLevel >= ORTP_DEBUG && debugLevel < ORTP_ERROR); - - if (debugEnabled) { - UIAlertAction* continueAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Send logs", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - NSString *appName = - [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"]; - NSString *logsAddress = [mgr lpConfigStringForKey:@"debug_popup_email" withDefault:@""]; - [self presentMailViewWithTitle:appName forRecipients:@[ logsAddress ] attachLogs:true]; - }]; - [errView addAction:continueAction]; - } - NSString *actionLog = - (debugEnabled ? NSLocalizedString(@"Disable logs", nil) : NSLocalizedString(@"Enable logs", nil)); - - UIAlertAction* logAction = [UIAlertAction actionWithTitle:actionLog - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - int newDebugLevel = debugEnabled ? 0 : ORTP_DEBUG; - [LinphoneManager.instance lpConfigSetInt:newDebugLevel forKey:@"debugenable_preference"]; - [Log enableLogs:newDebugLevel]; - }]; - [errView addAction:logAction]; - - UIAlertAction* configAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"View config file", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - TextViewer *view = VIEW(TextViewer); - LpConfig *conf = LinphoneManager.instance.configDb; - char *config = linphone_config_dump(conf); - view.textViewer = [NSString stringWithUTF8String: config]; - view.textNameViewer = @""; - [PhoneMainView.instance popToView:view.compositeViewDescription]; - }]; - - [errView addAction:configAction]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - - [self presentViewController:errView animated:YES completion:nil]; - return true; - } - return false; -} - -#pragma mark - - -- (void)callUpdate:(LinphoneCall *)call state:(LinphoneCallState)state { - BOOL callInProgress = (linphone_core_get_calls_nb(LC) > 0); - _addContactButton.hidden = callInProgress; - _backButton.hidden = !callInProgress; - [_callButton updateIcon]; -} - -- (void)setAddress:(NSString *)address { - [_addressField setText:address]; -} - -#pragma mark - UITextFieldDelegate Functions - -- (BOOL)textField:(UITextField *)textField - shouldChangeCharactersInRange:(NSRange)range - replacementString:(NSString *)string { - //[textField performSelector:@selector() withObject:nil afterDelay:0]; - return YES; -} - -- (BOOL)textFieldShouldReturn:(UITextField *)textField { - if (textField == _addressField) { - [_addressField resignFirstResponder]; - } - if (textField.text.length > 0) { - LinphoneAddress *addr = [LinphoneUtils normalizeSipOrPhoneAddress:textField.text]; - [LinphoneManager.instance call:addr]; - if (addr) - linphone_address_destroy(addr); - } - return YES; -} - -#pragma mark - MFComposeMailDelegate - -- (void)mailComposeController:(MFMailComposeViewController *)controller - didFinishWithResult:(MFMailComposeResult)result - error:(NSError *)error { - [controller dismissViewControllerAnimated:TRUE completion:nil]; - [self.navigationController setNavigationBarHidden:TRUE animated:FALSE]; -} - -#pragma mark - Action Functions - -- (IBAction)onAddContactClick:(id)event { - LinphoneAccount *defaultAccount = linphone_core_get_default_account(LC); - if (!(defaultAccount && linphone_account_params_get_conference_factory_uri(linphone_account_get_params(defaultAccount)))){ - [ContactSelection setSelectionMode:ContactSelectionModeEdit]; - [ContactSelection setAddAddress:[_addressField text]]; - [ContactSelection enableSipFilter:FALSE]; - [PhoneMainView.instance changeCurrentView:ContactsListView.compositeViewDescription]; - }else{ - ConferenceSchedulingView *view = VIEW(ConferenceSchedulingView); - [view resetViewModel]; - [PhoneMainView.instance changeCurrentView:ConferenceSchedulingView.compositeViewDescription]; - } -} - -- (IBAction)onBackClick:(id)event { - [PhoneMainView.instance popToView:[CallsViewModelBridge callViewToDisplay]]; -} - -- (IBAction)onAddressChange:(id)sender { - if ([_addressField.text isEqual: @"#1234#"]) { - [self displayDebugPopup:_addressField.text]; - _addressField.text = @""; - } - LinphoneAccount *defaultAccount = linphone_core_get_default_account(LC); - if (!(defaultAccount && linphone_account_params_get_audio_video_conference_factory_address(linphone_account_get_params(defaultAccount)))){ - [_addContactButton setImage:[UIImage imageNamed:@"contact_add_default"] forState:UIControlStateNormal]; - _addContactButton.enabled = ([[_addressField text] length] > 0); - if ([_addressField.text length] == 0) { - [self.view endEditing:YES]; - } - }else{ - [_addContactButton setImage:[UIImage imageNamed:@"voip_conference_new"] forState:UIControlStateNormal]; - _addContactButton.enabled = true; - } -} - -- (IBAction)onBackspaceClick:(id)sender { - if ([_addressField.text length] > 0) { - [_addressField setText:[_addressField.text substringToIndex:[_addressField.text length] - 1]]; - } -} - -- (void)onBackspaceLongClick:(id)sender { - [_addressField setText:@""]; -} - -- (void)onZeroLongClick:(id)sender { - // replace last character with a '+' - NSString *newAddress = - [[_addressField.text substringToIndex:[_addressField.text length] - 1] stringByAppendingString:@"+"]; - [_addressField setText:newAddress]; - linphone_core_stop_dtmf(LC); -} - -- (void)onOneLongClick:(id)sender { - LinphoneManager *lm = LinphoneManager.instance; - NSString *voiceMail = [lm lpConfigStringForKey:@"voice_mail_uri"]; - LinphoneAddress *addr = [LinphoneUtils normalizeSipOrPhoneAddress:voiceMail]; - if (addr) { - linphone_address_set_display_name(addr, NSLocalizedString(@"Voice mail", nil).UTF8String); - [lm call:addr]; - linphone_address_destroy(addr); - } else { - LOGE(@"Cannot call voice mail because URI not set or invalid!"); - } - linphone_core_stop_dtmf(LC); -} - -- (void)dismissKeyboards { - [self.addressField resignFirstResponder]; -} -@end diff --git a/Classes/EphemeralSettingsView.h b/Classes/EphemeralSettingsView.h deleted file mode 100644 index 0bab2880c..000000000 --- a/Classes/EphemeralSettingsView.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import "UICompositeView.h" - - - -@interface EphemeralSettingsView : TPMultiLayoutViewController - -@property (weak, nonatomic) IBOutlet UITableView *tableView; -@property (weak, nonatomic) IBOutlet UIImageView *icon; -@property (weak, nonatomic) IBOutlet UILabel *explanations; -@property (weak, nonatomic) IBOutlet UILabel *titleText; -@property(nonatomic) LinphoneChatRoom *room; -@property(nonatomic) long selectedIndex; - -- (IBAction)onBackClick:(id)sender; - -@end diff --git a/Classes/EphemeralSettingsView.m b/Classes/EphemeralSettingsView.m deleted file mode 100644 index 3956a0e93..000000000 --- a/Classes/EphemeralSettingsView.m +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "EphemeralSettingsView.h" -#import "PhoneMainView.h" -#import "UIDeviceCell.h" -#import "linphoneapp-Swift.h" - - - -@implementation EphemeralSettingsView -#pragma mark - UICompositeViewDelegate Functions - -static UICompositeViewDescription *compositeDescription = nil; - -+ (UICompositeViewDescription *)compositeViewDescription { - if (compositeDescription == nil) { - compositeDescription = [[UICompositeViewDescription alloc] init:self.class - statusBar:StatusBarView.class - tabBar:TabBarView.class - sideMenu:SideMenuView.class - fullscreen:false - isLeftFragment:NO - fragmentWith:ChatsListView.class]; - } - return compositeDescription; -} - -- (UICompositeViewDescription *)compositeViewDescription { - return self.class.compositeViewDescription; -} - -#pragma mark - ViewController Functions - - - --(void) viewDidLoad { - [super viewDidLoad]; - self.tableView.tableHeaderView = ({ - UIView *line = [[UIView alloc] - initWithFrame:CGRectMake(0, 0, - self.tableView.frame.size.width, 1 / UIScreen.mainScreen.scale)]; - line.backgroundColor = self.tableView.separatorColor; - line; - }); - self.tableView.tintColor = UIColorFromRGB(0x96c11f); - self.explanations.text = NSLocalizedString(@"Messages will be deleted on both ends once they have been read and after the selected timeout.", nil); - self.titleText.text = NSLocalizedString(@"Ephemeral messages", nil); - -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - _tableView.dataSource = self; - _tableView.delegate = self; - [self setIndexBasedOnRoomSetting]; - [_tableView reloadData]; -} - -#pragma mark - Action Functions -- (IBAction)onBackClick:(id)sender { - ChatConversationViewSwift *view = VIEW(ChatConversationViewSwift); - [PhoneMainView.instance popToView:view.compositeViewDescription]; -} - - -- (IBAction)onSaveClick:(id)sender { - [self setRoomSettingsBasedOnIndex]; - ChatConversationViewSwift *view = VIEW(ChatConversationViewSwift); - [PhoneMainView.instance popToView:view.compositeViewDescription]; -} - -#pragma mark - TableView - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 1; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return 6; -} - - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell *cell = [[UITableViewCell alloc] init]; - - switch(indexPath.row) { - case 0:cell.textLabel.text = NSLocalizedString(@"Disabled",nil);break; - case 1:cell.textLabel.text = NSLocalizedString(@"1 minute",nil);break; - case 2:cell.textLabel.text = NSLocalizedString(@"1 hour",nil);break; - case 3:cell.textLabel.text = NSLocalizedString(@"1 day",nil);break; - case 4:cell.textLabel.text = NSLocalizedString(@"3 days",nil);break; - case 5:cell.textLabel.text = NSLocalizedString(@"1 week",nil);break; - } - if (indexPath.row == _selectedIndex) { - cell.accessoryType = UITableViewCellAccessoryCheckmark; - cell.textLabel.font = [UIFont fontWithDescriptor:[cell.textLabel.font.fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold] - size:cell.textLabel.font.pointSize]; - } - return cell; -} - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - _selectedIndex = indexPath.row; - [_tableView reloadData]; -} - -#pragma mark - BL Functions - --(void) setIndexBasedOnRoomSetting { - if (!linphone_chat_room_ephemeral_enabled(_room)) { - _selectedIndex = 0; - }else if (linphone_chat_room_get_ephemeral_lifetime(_room) == 60) { - _selectedIndex = 1; - }else if (linphone_chat_room_get_ephemeral_lifetime(_room) == 3600) { - _selectedIndex = 2; - }else if (linphone_chat_room_get_ephemeral_lifetime(_room) == 86400) { - _selectedIndex = 3; - }else if (linphone_chat_room_get_ephemeral_lifetime(_room) == 3*86400) { - _selectedIndex = 4; - }else if (linphone_chat_room_get_ephemeral_lifetime(_room) == 7*86400) { - _selectedIndex = 5; - } -} - --(void) setRoomSettingsBasedOnIndex { - if (_selectedIndex == 0) { - linphone_chat_room_enable_ephemeral(_room, false); - return; - } - - linphone_chat_room_enable_ephemeral(_room, true); - switch (_selectedIndex) { - case 1: linphone_chat_room_set_ephemeral_lifetime(_room, 60);break; - case 2: linphone_chat_room_set_ephemeral_lifetime(_room, 3600);break; - case 3: linphone_chat_room_set_ephemeral_lifetime(_room, 86400);break; - case 4: linphone_chat_room_set_ephemeral_lifetime(_room, 3*86400);break; - case 5: linphone_chat_room_set_ephemeral_lifetime(_room, 7*86400);break; - } - -} - -@end diff --git a/Classes/EphemeralSettingsView.xib b/Classes/EphemeralSettingsView.xib deleted file mode 100644 index d5bdf2a17..000000000 --- a/Classes/EphemeralSettingsView.xib +++ /dev/null @@ -1,218 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/FirstLoginView.h b/Classes/FirstLoginView.h deleted file mode 100644 index 1a1f8e7b9..000000000 --- a/Classes/FirstLoginView.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UICompositeView.h" -#import "UIAssistantTextField.h" - -@interface FirstLoginView : TPMultiLayoutViewController { - LinphoneAccountCreator *account_creator; -} - -- (IBAction)onLoginClick:(id)sender; -- (IBAction)onSiteClick:(id)sender; - -@property(nonatomic, strong) IBOutlet UIButton *loginButton; -@property(nonatomic, strong) IBOutlet UIButton *siteButton; -@property(nonatomic, strong) IBOutlet UIAssistantTextField *usernameField; -@property(nonatomic, strong) IBOutlet UIAssistantTextField *passwordField; -@property(nonatomic, strong) IBOutlet UIView *waitView; -@property(weak, nonatomic) IBOutlet UIAssistantTextField *domainField; - -@end diff --git a/Classes/FirstLoginView.m b/Classes/FirstLoginView.m deleted file mode 100644 index b5f17f2da..000000000 --- a/Classes/FirstLoginView.m +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "LinphoneManager.h" -#import "FirstLoginView.h" -#import "LinphoneManager.h" -#import "PhoneMainView.h" -#import "Utils/XMLRPCHelper.h" - -@implementation FirstLoginView - -#pragma mark - UICompositeViewDelegate Functions - -static UICompositeViewDescription *compositeDescription = nil; - -+ (UICompositeViewDescription *)compositeViewDescription { - if (compositeDescription == nil) { - compositeDescription = [[UICompositeViewDescription alloc] init:self.class - statusBar:nil - tabBar:nil - sideMenu:nil - fullscreen:false - isLeftFragment:YES - fragmentWith:nil]; - } - return compositeDescription; -} - -- (UICompositeViewDescription *)compositeViewDescription { - return self.class.compositeViewDescription; -} - -#pragma mark - ViewController Functions - -- (void)viewDidLoad { - [super viewDidLoad]; - NSString *siteUrl = - [[LinphoneManager instance] lpConfigStringForKey:@"first_login_view_url"] ?: @"http://www.linphone.org"; - [_siteButton setTitle:siteUrl forState:UIControlStateNormal]; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - // Set observer - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(registrationUpdateEvent:) - name:kLinphoneRegistrationUpdate - object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(configureStateUpdateEvent:) - name:kLinphoneConfiguringStateUpdate - object:nil]; - - // Update on show - MSList *list = [LinphoneManager.instance createAccountsNotHiddenList]; - if (list != NULL) { - LinphoneAccount *account = (LinphoneAccount *)list->data; - if (account) { - [self registrationUpdate:linphone_account_get_state(account)]; - } - } - bctbx_list_free(list); - - if (account_creator) { - linphone_account_creator_unref(account_creator); - } - NSString *siteUrl = - [[LinphoneManager instance] lpConfigStringForKey:@"first_login_view_url"] ?: @"http://www.linphone.org"; - account_creator = linphone_account_creator_new([LinphoneManager getLc], siteUrl.UTF8String); - - [_usernameField - showError:[AssistantView - errorForLinphoneAccountCreatorUsernameStatus:LinphoneAccountCreatorUsernameStatusInvalid] - when:^BOOL(NSString *inputEntry) { - LinphoneAccountCreatorUsernameStatus s = - linphone_account_creator_set_username(account_creator, inputEntry.UTF8String); - _usernameField.errorLabel.text = [AssistantView errorForLinphoneAccountCreatorUsernameStatus:s]; - return s != LinphoneAccountCreatorUsernameStatusOk; - }]; - - [_passwordField - showError:[AssistantView - errorForLinphoneAccountCreatorPasswordStatus:LinphoneAccountCreatorPasswordStatusTooShort] - when:^BOOL(NSString *inputEntry) { - LinphoneAccountCreatorPasswordStatus s = - linphone_account_creator_set_password(account_creator, inputEntry.UTF8String); - _passwordField.errorLabel.text = [AssistantView errorForLinphoneAccountCreatorPasswordStatus:s]; - return s != LinphoneAccountCreatorUsernameStatusOk; - }]; - - [_domainField - showError:[AssistantView errorForLinphoneAccountCreatorDomainStatus:LinphoneAccountCreatorDomainInvalid] - when:^BOOL(NSString *inputEntry) { - LinphoneAccountCreatorDomainStatus s = - linphone_account_creator_set_domain(account_creator, inputEntry.UTF8String); - _domainField.errorLabel.text = [AssistantView errorForLinphoneAccountCreatorDomainStatus:s]; - return s != LinphoneAccountCreatorDomainOk; - }]; -} - -- (void)viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; - - // Remove observer - [[NSNotificationCenter defaultCenter] removeObserver:self name:kLinphoneRegistrationUpdate object:nil]; -} - -- (void)shouldEnableNextButton { - BOOL invalidInputs = NO; - for (UIAssistantTextField *field in @[ _usernameField, _passwordField, _domainField ]) { - invalidInputs |= (field.isInvalid || field.lastText.length == 0); - } - _loginButton.enabled = !invalidInputs; -} - -#pragma mark - Event Functions - -- (void)configureStateUpdateEvent:(NSNotification *)notif { - LinphoneConfiguringState state = [[notif.userInfo objectForKey:@"state"] intValue]; - switch (state) { - case LinphoneConfiguringFailed: { - [_waitView setHidden:true]; - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Configuration failed", nil) - message:NSLocalizedString(@"Cannot retrieve your configuration. Please check credentials or try again later", nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; - linphone_core_set_provisioning_uri([LinphoneManager getLc], NULL); - break; - } - default: - break; - } - if (account_creator) { - linphone_account_creator_unref(account_creator); - } - NSString *siteUrl = - [[LinphoneManager instance] lpConfigStringForKey:@"first_login_view_url"] ?: @"http://www.linphone.org"; - account_creator = linphone_account_creator_new([LinphoneManager getLc], siteUrl.UTF8String); -} - -- (void)registrationUpdateEvent:(NSNotification *)notif { - [self registrationUpdate:[[notif.userInfo objectForKey:@"state"] intValue]]; -} - -- (void)registrationUpdate:(LinphoneRegistrationState)state { - switch (state) { - case LinphoneRegistrationOk: { - [[LinphoneManager instance] lpConfigSetBool:FALSE forKey:@"enable_first_login_view_preference"]; - [_waitView setHidden:true]; - [PhoneMainView.instance changeCurrentView:DialerView.compositeViewDescription]; - break; - } - case LinphoneRegistrationNone: - case LinphoneRegistrationCleared: { - [_waitView setHidden:true]; - break; - } - case LinphoneRegistrationFailed: { - [_waitView setHidden:true]; - break; - } - case LinphoneRegistrationProgress: { - [_waitView setHidden:false]; - break; - } - default: - break; - } -} - -#pragma mark - Action Functions - -- (void)onSiteClick:(id)sender { - NSURL *url = [NSURL URLWithString:_siteButton.titleLabel.text]; - [[UIApplication sharedApplication] openURL:url]; - return; -} - -- (void)onLoginClick:(id)sender { - if (!linphone_core_is_network_reachable(LC)) { - [PhoneMainView.instance presentViewController:[LinphoneUtils networkErrorView:@"configure an account"] animated:YES completion:nil]; - return; - } - - _waitView.hidden = NO; - - void (^onSuccesssCallBack)(NSString *) = ^(NSString *url) { - if (url) { - linphone_core_set_provisioning_uri(LC, url.UTF8String); - [LinphoneManager.instance resetLinphoneCore]; - } else { - _waitView.hidden = YES; - } - }; - - [XMLRPCHelper.self sendXMLRPCRequestWithParams:@"get_remote_provisioning_filename" - withParams:@[ _usernameField.text, _passwordField.text, _domainField.text ] - onSuccess:onSuccesssCallBack]; -} - -#pragma mark - UITextFieldDelegate Functions - -- (BOOL)textFieldShouldReturn:(UITextField *)textField { - [textField resignFirstResponder]; - if (textField.returnKeyType == UIReturnKeyNext) { - if (textField == _usernameField) { - [_domainField becomeFirstResponder]; - } else if (textField == _domainField) { - [_passwordField becomeFirstResponder]; - } - } else if (textField.returnKeyType == UIReturnKeyDone) { - [_loginButton sendActionsForControlEvents:UIControlEventTouchUpInside]; - } - - return YES; -} - -- (void)textFieldDidEndEditing:(UITextField *)textField { - UIAssistantTextField *atf = (UIAssistantTextField *)textField; - [atf textFieldDidEndEditing:atf]; -} - -- (BOOL)textField:(UITextField *)textField - shouldChangeCharactersInRange:(NSRange)range - replacementString:(NSString *)string { - UIAssistantTextField *atf = (UIAssistantTextField *)textField; - [atf textField:atf shouldChangeCharactersInRange:range replacementString:string]; - [self shouldEnableNextButton]; - return YES; -} - -@end diff --git a/Classes/FloatingScrollDownButton.swift b/Classes/FloatingScrollDownButton.swift deleted file mode 100644 index eda8f77e3..000000000 --- a/Classes/FloatingScrollDownButton.swift +++ /dev/null @@ -1,123 +0,0 @@ -// -// FloatingScrollDownButton.swift -// linphone -// -// Created by QuentinArguillere on 27/01/2022. -// - -import Foundation -import UIKit - -extension ChatConversationTableViewSwift { - - private enum Constants { - static let trailingValue: CGFloat = 30.0 - static let leadingValue: CGFloat = 85.0 - static let buttonHeight: CGFloat = 16.0 - static let buttonWidth: CGFloat = 16.0 - } - - /* - override func viewDidLoad() { - super.viewDidLoad() - - tableView.tableFooterView = UIView() - } - - override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - createFloatingButton() - } - */ - - override func viewDidDisappear(_ animated: Bool) { - super.viewDidAppear(animated) - self.floatingScrollButton?.removeFromSuperview() - self.floatingScrollBackground?.removeFromSuperview() - } - - func createFloatingButton() { - self.floatingScrollButton = UIButton(type: .custom) - self.floatingScrollBackground = UIButton(type: .custom) - self.floatingScrollButton?.translatesAutoresizingMaskIntoConstraints = false - self.floatingScrollBackground?.translatesAutoresizingMaskIntoConstraints = false - constrainFloatingButtonToWindow() - var imageFloatingScrollButton = UIImage() - if #available(iOS 13.0, *) { - imageFloatingScrollButton = UIImage(named: "scroll_to_bottom_default")!.withTintColor(.darkGray) - } else { - imageFloatingScrollButton = UIImage(named: "scroll_to_bottom_default")! - } - self.floatingScrollButton?.setImage(imageFloatingScrollButton, for: .normal) - self.floatingScrollButton?.isHidden = true; - self.floatingScrollBackground?.backgroundColor = .lightGray - self.floatingScrollBackground?.layer.cornerRadius = 25 - self.floatingScrollBackground?.isHidden = true; - - self.floatingScrollButton?.onClick(action: { - self.scrollToBottomButtonAction() - }) - self.floatingScrollBackground?.onClick(action: { - self.scrollToBottomButtonAction() - }) - addBadgeToButton(badge: nil) - } - - private func constrainFloatingButtonToWindow() { - DispatchQueue.main.async { - guard let keyWindow = self.view, - let floatingButton = self.floatingScrollButton else { return } - keyWindow.addSubview(self.floatingScrollBackground!) - keyWindow.addSubview(floatingButton) - keyWindow.trailingAnchor.constraint(equalTo: floatingButton.trailingAnchor, constant: Constants.trailingValue).isActive = true - - floatingButton.bottomAnchor.constraint(equalTo: keyWindow.bottomAnchor, constant: -25).isActive = true - - floatingButton.widthAnchor.constraint(equalToConstant: - Constants.buttonWidth).isActive = true - floatingButton.heightAnchor.constraint(equalToConstant: - Constants.buttonHeight).isActive = true - self.floatingScrollBackground?.centerYAnchor.constraint(equalTo: floatingButton.centerYAnchor).isActive = true - self.floatingScrollBackground?.centerXAnchor.constraint(equalTo: floatingButton.centerXAnchor).isActive = true - self.floatingScrollBackground!.widthAnchor.constraint(equalToConstant: - Constants.buttonHeight*3).isActive = true - self.floatingScrollBackground!.heightAnchor.constraint(equalToConstant: - Constants.buttonHeight*3).isActive = true - } - } - - @IBAction private func scrollToBottomButtonAction() { - scrollToBottom(animated: false) - } - - - private func addBadgeToButton(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) + 34 + horizontal!) - let y = -(Double(badgeSize.height) / 2) - 38 + 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/HistoryDetailsTableView.h b/Classes/HistoryDetailsTableView.h deleted file mode 100644 index 04ab6cceb..000000000 --- a/Classes/HistoryDetailsTableView.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "linphone/linphonecore.h" - -@interface HistoryDetailsTableView : UITableViewController { - @private - NSMutableArray *callLogs; -} -- (void)loadDataForAddress:(const LinphoneAddress *)peer; - -@end diff --git a/Classes/HistoryDetailsTableView.m b/Classes/HistoryDetailsTableView.m deleted file mode 100644 index bd2140b8a..000000000 --- a/Classes/HistoryDetailsTableView.m +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "HistoryDetailsTableView.h" -#import "LinphoneManager.h" -#import "Utils.h" -#import "linphoneapp-Swift.h" - -@implementation HistoryDetailsTableView - -- (void)loadDataForAddress:(const LinphoneAddress *)peer { - if (callLogs == nil) { - callLogs = [[NSMutableArray alloc] init]; - } else { - [callLogs removeAllObjects]; - } - - if (peer) { - LinphoneAccount *acc = linphone_core_get_default_account(LC); - if (acc) { - const bctbx_list_t *logs = linphone_account_get_call_logs_for_address(acc, peer); - while (logs != NULL) { - LinphoneCallLog *log = (LinphoneCallLog *)logs->data; - if (linphone_address_weak_equal(linphone_call_log_get_remote_address(log), peer)) { - [callLogs addObject:[NSValue valueWithPointer:log]]; - } - logs = bctbx_list_next(logs); - } - } - } - [[self tableView] reloadData]; -} - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 1; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return [callLogs count]; -} - -- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { - CGRect frame = CGRectMake(0, 0, tableView.frame.size.width, 44); - UIView *tempView = [[UIView alloc] initWithFrame:frame]; - if (@available(iOS 13, *)) { - tempView.backgroundColor = [UIColor systemBackgroundColor]; - } else { - tempView.backgroundColor = [UIColor whiteColor]; - } - - UILabel *tempLabel = [[UILabel alloc] initWithFrame:frame]; - tempLabel.backgroundColor = [UIColor clearColor]; - tempLabel.textColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"color_E.png"]]; - tempLabel.text = NSLocalizedString(@"Calls", nil); - tempLabel.textAlignment = NSTextAlignmentCenter; - tempLabel.font = [UIFont boldSystemFontOfSize:17]; - tempLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; - [tempView addSubview:tempLabel]; - - return tempView; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - static NSString *kCellId = @"UITableViewCell"; - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId]; - if (cell == nil) { - cell = [[UITableViewCell alloc] init]; - } - - LinphoneCallLog *log = [[callLogs objectAtIndex:[indexPath row]] pointerValue]; - int duration = linphone_call_log_get_duration(log); - time_t callTime = linphone_call_log_get_start_date(log); - cell.textLabel.textAlignment = NSTextAlignmentCenter; - [cell.textLabel - setText:[NSString stringWithFormat:@"%@ - %@", - [LinphoneUtils timeToString:callTime withFormat:LinphoneDateHistoryDetails], - [LinphoneUtils durationToString:duration]]]; - BOOL outgoing = (linphone_call_log_get_dir(log) == LinphoneCallOutgoing); - - if ([SwiftUtil isCallLogMissedWithCLog:log]) { - cell.imageView.image = [UIImage imageNamed:@"call_missed.png"]; - } else if (outgoing) { - cell.imageView.image = [UIImage imageNamed:@"call_outgoing.png"]; - } else { - cell.imageView.image = [UIImage imageNamed:@"call_incoming.png"]; - } - cell.contentView.userInteractionEnabled = false; - - return cell; -} - -@end diff --git a/Classes/HistoryDetailsView.h b/Classes/HistoryDetailsView.h deleted file mode 100644 index 4b434b55d..000000000 --- a/Classes/HistoryDetailsView.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#include "linphone/linphonecore.h" - -#import -#import "UICompositeView.h" -#import "HistoryDetailsTableView.h" -#import "UIRoundedImageView.h" - -@interface HistoryDetailsView : TPMultiLayoutViewController { - @private - LinphoneCallLog *callLog; -} -@property(weak, nonatomic) IBOutlet UIButton *backButton; -@property(weak, nonatomic) IBOutlet UILabel *contactLabel; -@property(nonatomic, strong) IBOutlet UIImageView *avatarImage; -@property(nonatomic, strong) IBOutlet UILabel *addressLabel; -@property(nonatomic, strong) IBOutlet UIButton *addContactButton; -@property(nonatomic, copy, setter=setCallLogId:) NSString *callLogId; -@property(weak, nonatomic) IBOutlet UIView *headerView; -@property(strong, nonatomic) IBOutlet HistoryDetailsTableView *tableView; -@property(weak, nonatomic) IBOutlet UILabel *emptyLabel; -@property (weak, nonatomic) IBOutlet UIView *waitView; -@property (weak, nonatomic) IBOutlet UIRoundedImageView *linphoneImage; -@property (weak, nonatomic) IBOutlet UIView *optionsView; -@property(weak, nonatomic) IBOutlet UIButton *chatButton; -@property (weak, nonatomic) IBOutlet UIView *encryptedChatView; - -- (IBAction)onBackClick:(id)event; -- (IBAction)onAddContactClick:(id)event; -- (IBAction)onCallClick:(id)event; -- (IBAction)onChatClick:(id)event; -- (IBAction)onEncryptedChatClick:(id)sender; -- (void)setCallLogId:(NSString *)acallLogId; - -@end diff --git a/Classes/HistoryDetailsView.m b/Classes/HistoryDetailsView.m deleted file mode 100644 index 1231f23cf..000000000 --- a/Classes/HistoryDetailsView.m +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "HistoryDetailsView.h" -#import "PhoneMainView.h" -#import "FastAddressBook.h" -#import "linphoneapp-Swift.h" - -@implementation HistoryDetailsView - -#pragma mark - UICompositeViewDelegate Functions - -static UICompositeViewDescription *compositeDescription = nil; - -+ (UICompositeViewDescription *)compositeViewDescription { - if (compositeDescription == nil) { - compositeDescription = [[UICompositeViewDescription alloc] init:self.class - statusBar:StatusBarView.class - tabBar:TabBarView.class - sideMenu:SideMenuView.class - fullscreen:false - isLeftFragment:NO - fragmentWith:HistoryListView.class]; - } - return compositeDescription; -} - -- (UICompositeViewDescription *)compositeViewDescription { - return self.class.compositeViewDescription; -} - -#pragma mark - Property Functions - -- (void)setCallLogId:(NSString *)acallLogId { - _callLogId = [acallLogId copy]; - [self update]; -} - -#pragma mark - ViewController Functions - -- (void)viewDidLoad { - [super viewDidLoad]; - - // if we use fragments, remove back button - if (IPAD) { - _backButton.hidden = YES; - _backButton.alpha = 0; - - } - - UITapGestureRecognizer *headerTapGesture = - [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onContactClick:)]; - [_headerView addGestureRecognizer:headerTapGesture]; -} - -- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { - _chatButton.hidden = [LinphoneManager.instance lpConfigBoolForKey:@"force_lime_chat_rooms"] || [LinphoneManager.instance lpConfigBoolForKey:@"disable_chat_feature"]; - [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; - [self update]; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - _waitView.hidden = YES; - [self update]; - - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(update) - name:kLinphoneAddressBookUpdate - object:nil]; - - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(coreUpdateEvent:) - name:kLinphoneCoreUpdate - object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver: self - selector: @selector(deviceOrientationDidChange:) - name: UIDeviceOrientationDidChangeNotification - object: nil]; - - NSDictionary* userInfo; - [NSNotificationCenter.defaultCenter addObserver:self - selector: @selector(receivePresenceNotification:) - name: @"LinphoneFriendPresenceUpdate" - object: userInfo]; -} - --(void) receivePresenceNotification:(NSNotification*)notification -{ - if ([notification.name isEqualToString:@"LinphoneFriendPresenceUpdate"]) - { - [self update]; - } -} - -- (void)viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; - [NSNotificationCenter.defaultCenter removeObserver:self]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:@"LinphoneFriendPresenceUpdate" object:nil]; - [AvatarBridge removeAllObserver]; -} - -#pragma mark - Event Functions - -- (void)coreUpdateEvent:(NSNotification *)notif { - @try { - [self update]; - } - @catch (NSException *exception) { - if ([exception.name isEqualToString:@"LinphoneCoreException"]) { - LOGE(@"Core already destroyed"); - return; - } - LOGE(@"Uncaught exception : %@", exception.description); - abort(); - } -} - -- (void) deviceOrientationDidChange:(NSNotification*) notif { - [self update]; -} - -#pragma mark - - -- (void)update { - // Look for the call log - callLog = NULL; - if (_callLogId) { - const MSList *list = linphone_core_get_call_logs(LC); - while (list != NULL) { - LinphoneCallLog *log = (LinphoneCallLog *)list->data; - const char *cid = linphone_call_log_get_call_id(log); - if (cid != NULL && [_callLogId isEqualToString:[NSString stringWithUTF8String:cid]]) { - callLog = log; - break; - } - list = list->next; - } - } - - // Pop if callLog is null - if (callLog == NULL) { - _emptyLabel.hidden = NO; - _addContactButton.hidden = YES; - return; - } - - _emptyLabel.hidden = YES; - - const LinphoneAddress *addr = linphone_call_log_get_remote_address(callLog); - _addContactButton.hidden = ([FastAddressBook getContactWithAddress:addr] != nil); - [ContactDisplay setDisplayNameLabel:_contactLabel forAddress:addr withAddressLabel:_addressLabel]; - [_avatarImage setImage:[FastAddressBook imageForAddress:addr]]; - Contact *contact = [FastAddressBook getContactWithAddress:addr]; - const LinphonePresenceModel *model = contact.friend ? linphone_friend_get_presence_model(contact.friend) : NULL; - _linphoneImage.hidden = [LinphoneManager.instance lpConfigBoolForKey:@"hide_linphone_contacts" inSection:@"app"] || - ! ((model && linphone_presence_model_get_basic_status(model) == LinphonePresenceBasicStatusOpen) || [FastAddressBook contactHasValidSipDomain:contact]); - LinphoneAccount *defaultAccount = linphone_core_get_default_account(LC); - [self shouldHideEncryptedChatView:defaultAccount && linphone_account_params_get_conference_factory_uri(linphone_account_get_params(defaultAccount)) && model && linphone_presence_model_has_capability(model, LinphoneFriendCapabilityLimeX3dh)]; - char *addrURI = linphone_address_as_string_uri_only(addr); - ms_free(addrURI); - - [_tableView loadDataForAddress:(callLog ? linphone_call_log_get_remote_address(callLog) : NULL)]; -} - -- (void)shouldHideEncryptedChatView:(BOOL)hasLime { - _encryptedChatView.hidden = !hasLime || [LinphoneManager.instance lpConfigBoolForKey:@"disable_chat_feature"]; - CGRect newFrame = _optionsView.frame; - if (!hasLime) { - newFrame.origin.x = _encryptedChatView.frame.size.width * 2/3; - - } else { - newFrame.origin.x = 0; - } - _optionsView.frame = newFrame; -} - -#pragma mark - Action Functions - -- (IBAction)onBackClick:(id)event { - HistoryListView *view = VIEW(HistoryListView); - [PhoneMainView.instance popToView:view.compositeViewDescription]; -} - -- (IBAction)onContactClick:(id)event { - const LinphoneAddress *addr = linphone_call_log_get_remote_address(callLog); - Contact *contact = [FastAddressBook getContactWithAddress:addr]; - if (contact) { - ContactDetailsView *view = VIEW(ContactDetailsView); - [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; - [ContactSelection setSelectionMode:ContactSelectionModeNone]; - [view setContact:contact]; - } -} - -- (IBAction)onAddContactClick:(id)event { - const LinphoneAddress *addr = linphone_call_log_get_remote_address(callLog); - char *lAddress = linphone_address_as_string_uri_only(addr); - if (lAddress != NULL) { - NSString *normSip = [NSString stringWithUTF8String:lAddress]; - normSip = [normSip hasPrefix:@"sip:"] ? [normSip substringFromIndex:4] : normSip; - [ContactSelection setAddAddress:normSip]; - [ContactSelection setSelectionMode:ContactSelectionModeEdit]; - [ContactSelection enableSipFilter:FALSE]; - [PhoneMainView.instance changeCurrentView:ContactsListView.compositeViewDescription]; - ms_free(lAddress); - } -} - -- (IBAction)onCallClick:(id)event { - const LinphoneAddress *addr = linphone_call_log_get_remote_address(callLog); - [LinphoneManager.instance call:addr]; -} - -- (IBAction)onChatClick:(id)event { - const LinphoneAddress *addr = linphone_call_log_get_remote_address(callLog); - [LinphoneManager.instance lpConfigSetBool:TRUE forKey:@"create_chat"]; - [PhoneMainView.instance getOrCreateOneToOneChatRoom:addr waitView:_waitView isEncrypted:FALSE]; -} - -- (IBAction)onEncryptedChatClick:(id)sender { - const LinphoneAddress *addr = linphone_call_log_get_remote_address(callLog); - [LinphoneManager.instance lpConfigSetBool:TRUE forKey:@"create_chat"]; - [PhoneMainView.instance getOrCreateOneToOneChatRoom:addr waitView:_waitView isEncrypted:TRUE]; -} - -@end diff --git a/Classes/HistoryListTableView.h b/Classes/HistoryListTableView.h deleted file mode 100644 index 2f9af3fc5..000000000 --- a/Classes/HistoryListTableView.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UICheckBoxTableView.h" - -@interface HistoryListTableView : UICheckBoxTableView { -} - -@property(nonatomic, assign) BOOL missedFilter; -@property(nonatomic, assign) BOOL confFilter; - - -@property(strong, nonatomic) NSMutableDictionary *sections; -@property(strong, nonatomic) NSMutableArray *sortedDays; - -- (void)removeFIlters; -@end diff --git a/Classes/HistoryListTableView.m b/Classes/HistoryListTableView.m deleted file mode 100644 index 8b60b0c6d..000000000 --- a/Classes/HistoryListTableView.m +++ /dev/null @@ -1,367 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "HistoryListTableView.h" -#import "UIHistoryCell.h" -#import "LinphoneManager.h" -#import "PhoneMainView.h" -#import "Utils.h" -#import "linphoneapp-Swift.h" - - -@implementation HistoryListTableView - -@synthesize missedFilter,confFilter; - -#pragma mark - Lifecycle Functions - -- (void)initHistoryTableViewController { - missedFilter = false; - confFilter = false; -} - -- (id)init { - self = [super init]; - if (self) { - [self initHistoryTableViewController]; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)decoder { - self = [super initWithCoder:decoder]; - if (self) { - [self initHistoryTableViewController]; - } - return self; -} - -#pragma mark - ViewController Functions - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(loadData) - name:kLinphoneAddressBookUpdate - object:nil]; - - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(loadData) - name:kLinphoneCallUpdate - object:nil]; - - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(coreUpdateEvent:) - name:kLinphoneCoreUpdate - object:nil]; - [self loadData]; - NSDictionary* userInfo; - [NSNotificationCenter.defaultCenter addObserver:self - selector: @selector(receivePresenceNotification:) - name: @"LinphoneFriendPresenceUpdate" - object: userInfo]; -} - --(void) receivePresenceNotification:(NSNotification*)notification -{ - if ([notification.name isEqualToString:@"LinphoneFriendPresenceUpdate"]) - { - NSDictionary* userInfo = notification.userInfo; - NSString* friend = (NSString*)userInfo[@"friend"]; - - const MSList *list = linphone_core_get_call_logs(LC); - int i = 0; - while (list != NULL) { - LinphoneCallLog *log = (LinphoneCallLog *)list->data; - const char *curi = linphone_address_as_string_uri_only(linphone_call_log_get_remote_address(log)); - NSString *uri = [NSString stringWithUTF8String:curi]; - - if([uri isEqual:friend]){ - NSIndexPath* indexPath = [NSIndexPath indexPathForRow:i inSection:0]; - NSArray* indexArray = [NSArray arrayWithObjects:indexPath, nil]; - [self.tableView reloadRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationFade]; - } - i = i + 1; - list = list->next; - } - } -} - -- (void)viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; - - [NSNotificationCenter.defaultCenter removeObserver:self name:kLinphoneAddressBookUpdate object:nil]; - [NSNotificationCenter.defaultCenter removeObserver:self name:kLinphoneCoreUpdate object:nil]; - [NSNotificationCenter.defaultCenter removeObserver:self name:kLinphoneCallUpdate object:nil]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:@"LinphoneFriendPresenceUpdate" object:nil]; - [AvatarBridge removeAllObserver]; -} - -#pragma mark - Event Functions - -- (void)coreUpdateEvent:(NSNotification *)notif { - @try { - // Invalid all pointers - [self loadData]; - } - @catch (NSException *exception) { - if ([exception.name isEqualToString:@"LinphoneCoreException"]) { - LOGE(@"Core already destroyed"); - return; - } - LOGE(@"Uncaught exception : %@", exception.description); - abort(); - } -} - -#pragma mark - Property Functions - -- (void)setMissedFilter:(BOOL)amissedFilter { - if (missedFilter == amissedFilter) { - return; - } - missedFilter = amissedFilter; - if (missedFilter) { - confFilter = false; - } - [self loadData]; -} - -- (void)setConfFilter:(BOOL)aconfFilter { - if (confFilter == aconfFilter) { - return; - } - confFilter = aconfFilter; - if (confFilter) { - missedFilter = false; - } - [self loadData]; -} - -- (void)removeFIlters { - confFilter = false; - missedFilter = false; - [self loadData]; -} - - -#pragma mark - UITableViewDataSource Functions - -- (NSDate *)dateAtBeginningOfDayForDate:(NSDate *)inputDate { - NSCalendar *calendar = [NSCalendar currentCalendar]; - NSTimeZone *timeZone = [NSTimeZone systemTimeZone]; - [calendar setTimeZone:timeZone]; - NSDateComponents *dateComps = - [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:inputDate]; - - dateComps.hour = dateComps.minute = dateComps.second = 0; - return [calendar dateFromComponents:dateComps]; -} - -- (void)loadData { - for (id day in self.sections.allKeys) { - for (id log in self.sections[day]) { - linphone_call_log_unref([log pointerValue]); - } - } - - const bctbx_list_t *logs = linphone_core_get_call_logs(LC); - self.sections = [NSMutableDictionary dictionary]; - while (logs != NULL) { - LinphoneCallLog *log = (LinphoneCallLog *)logs->data; - BOOL keepIt = (!missedFilter || [SwiftUtil isCallLogMissedWithCLog:log]) && (!confFilter||linphone_call_log_was_conference(log)) ; - if (keepIt) { - NSDate *startDate = [self - dateAtBeginningOfDayForDate:[NSDate - dateWithTimeIntervalSince1970:linphone_call_log_get_start_date(log)]]; - NSMutableArray *eventsOnThisDay = [self.sections objectForKey:startDate]; - if (eventsOnThisDay == nil) { - eventsOnThisDay = [NSMutableArray array]; - [self.sections setObject:eventsOnThisDay forKey:startDate]; - } - - linphone_call_log_set_user_data(log, NULL); - - // if this contact was already the previous entry, do not add it twice - LinphoneCallLog *prev = [eventsOnThisDay lastObject] ? [[eventsOnThisDay lastObject] pointerValue] : NULL; - if (!linphone_call_log_was_conference(log) && prev && linphone_address_weak_equal(linphone_call_log_get_remote_address(prev), - linphone_call_log_get_remote_address(log))) { - bctbx_list_t *list = linphone_call_log_get_user_data(prev); - list = bctbx_list_append(list, linphone_call_log_ref(log)); - linphone_call_log_set_user_data(prev, list); - } else { - [eventsOnThisDay addObject:[NSValue valueWithPointer:linphone_call_log_ref(log)]]; - } - } - logs = bctbx_list_next(logs); - } - - [self computeSections]; - - [super loadData]; - - if (IPAD) { - if (![self selectFirstRow]) { - HistoryDetailsView *view = VIEW(HistoryDetailsView); - [view setCallLogId:nil]; - } - } -} - -- (void)computeSections { - NSArray *unsortedDays = [self.sections allKeys]; - _sortedDays = [[NSMutableArray alloc] - initWithArray:[unsortedDays sortedArrayUsingComparator:^NSComparisonResult(NSDate *d1, NSDate *d2) { - return [d2 compare:d1]; // reverse order - }]]; -} - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return _sortedDays.count; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - NSArray *logs = [_sections objectForKey:_sortedDays[section]]; - return logs.count; -} - -- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { - CGRect frame = CGRectMake(0, 0, tableView.frame.size.width, 44); - UIView *tempView = [[UIView alloc] initWithFrame:frame]; - if (@available(iOS 13, *)) { - tempView.backgroundColor = [UIColor systemBackgroundColor]; - } else { - tempView.backgroundColor = [UIColor whiteColor]; - } - - UILabel *tempLabel = [[UILabel alloc] initWithFrame:frame]; - tempLabel.backgroundColor = [UIColor clearColor]; - tempLabel.textColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"color_A.png"]]; - NSDate *eventDate = _sortedDays[section]; - NSDate *currentDate = [self dateAtBeginningOfDayForDate:[NSDate date]]; - if ([eventDate isEqualToDate:currentDate]) { - tempLabel.text = NSLocalizedString(@"TODAY", nil); - } else if ([eventDate isEqualToDate:[currentDate dateByAddingTimeInterval:-3600 * 24]]) { - tempLabel.text = NSLocalizedString(@"YESTERDAY", nil); - } else { - tempLabel.text = [LinphoneUtils timeToString:eventDate.timeIntervalSince1970 withFormat:LinphoneDateHistoryList] - .uppercaseString; - } - tempLabel.textAlignment = NSTextAlignmentCenter; - tempLabel.font = [UIFont boldSystemFontOfSize:17]; - tempLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; - [tempView addSubview:tempLabel]; - - return tempView; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - static NSString *kCellId = @"UIHistoryCell"; - UIHistoryCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId]; - if (cell == nil) { - cell = [[UIHistoryCell alloc] initWithIdentifier:kCellId]; - } - - id logId = [_sections objectForKey:_sortedDays[indexPath.section]][indexPath.row]; - LinphoneCallLog *log = [logId pointerValue]; - [cell setCallLog:log]; - [super accessoryForCell:cell atPath:indexPath]; - cell.contentView.userInteractionEnabled = false; - return cell; -} - -#pragma mark - UITableViewDelegate Functions - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - [super tableView:tableView didSelectRowAtIndexPath:indexPath]; - if (![self isEditing]) { - id log = [_sections objectForKey:_sortedDays[indexPath.section]][indexPath.row]; - LinphoneCallLog *callLog = [log pointerValue]; - if (callLog != NULL) { - if (IPAD) { - UIHistoryCell *cell = (UIHistoryCell *)[self tableView:tableView cellForRowAtIndexPath:indexPath]; - [cell onDetails:self]; - } else { - if (linphone_call_log_was_conference(callLog)) { - LinphoneConferenceInfo *confInfo = linphone_call_log_get_conference_info(callLog); - if (linphone_conference_info_get_state(confInfo) == LinphoneConferenceInfoStateCancelled) { - [ConferenceViewModelBridge showCancelledMeetingWithCConferenceInfo:confInfo]; - return; - } - ConferenceWaitingRoomView *view = VIEW(ConferenceWaitingRoomView); - [view setDetailsWithSubject:[NSString stringWithUTF8String:linphone_conference_info_get_subject(confInfo)] url:[NSString stringWithUTF8String:linphone_address_as_string(linphone_conference_info_get_uri(confInfo))] conferenceInfo:(confInfo)]; - [PhoneMainView.instance changeCurrentView:ConferenceWaitingRoomView.compositeViewDescription]; - } else { - const LinphoneAddress *addr = linphone_call_log_get_remote_address(callLog); - [tableView deselectRowAtIndexPath:indexPath animated:NO]; - [LinphoneManager.instance call:addr]; - } - } - } - } -} - -- (void)tableView:(UITableView *)tableView - commitEditingStyle:(UITableViewCellEditingStyle)editingStyle - forRowAtIndexPath:(NSIndexPath *)indexPath { - if (editingStyle == UITableViewCellEditingStyleDelete) { - [tableView beginUpdates]; - id log = [_sections objectForKey:_sortedDays[indexPath.section]][indexPath.row]; - LinphoneCallLog *callLog = [log pointerValue]; - MSList *count = linphone_call_log_get_user_data(callLog); - while (count) { - linphone_core_remove_call_log(LC, count->data); - count = count->next; - } - linphone_core_remove_call_log(LC, callLog); - linphone_call_log_unref(callLog); - [[_sections objectForKey:_sortedDays[indexPath.section]] removeObject:log]; - if (((NSArray *)[_sections objectForKey:_sortedDays[indexPath.section]]).count == 0) { - [_sections removeObjectForKey:_sortedDays[indexPath.section]]; - [_sortedDays removeObjectAtIndex:indexPath.section]; - [tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] - withRowAnimation:UITableViewRowAnimationFade]; - } - - [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] - withRowAnimation:UITableViewRowAnimationFade]; - [tableView endUpdates]; - } -} - -- (void)removeSelectionUsing:(void (^)(NSIndexPath *))remover { - [super removeSelectionUsing:^(NSIndexPath *indexPath) { - id log = [_sections objectForKey:_sortedDays[indexPath.section]][indexPath.row]; - LinphoneCallLog *callLog = [log pointerValue]; - MSList *count = linphone_call_log_get_user_data(callLog); - while (count) { - linphone_core_remove_call_log(LC, count->data); - count = count->next; - } - linphone_core_remove_call_log(LC, callLog); - linphone_call_log_unref(callLog); - [[_sections objectForKey:_sortedDays[indexPath.section]] removeObject:log]; - if (((NSArray *)[_sections objectForKey:_sortedDays[indexPath.section]]).count == 0) { - [_sections removeObjectForKey:_sortedDays[indexPath.section]]; - [_sortedDays removeObjectAtIndex:indexPath.section]; - } - }]; -} - -@end diff --git a/Classes/HistoryListView.h b/Classes/HistoryListView.h deleted file mode 100644 index 9e1a176bb..000000000 --- a/Classes/HistoryListView.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UICompositeView.h" -#import "HistoryListTableView.h" -#import "UIToggleButton.h" -#import "UIInterfaceStyleButton.h" - -@interface HistoryListView : UIViewController { -} - -@property(nonatomic, strong) IBOutlet HistoryListTableView *tableController; - -@property(nonatomic, strong) IBOutlet UIButton *allButton; -@property(nonatomic, strong) IBOutlet UIButton *missedButton; -@property (weak, nonatomic) IBOutlet UIInterfaceStyleButton *conferenceButton; -@property(weak, nonatomic) IBOutlet UIImageView *selectedButtonImage; -@property (weak, nonatomic) IBOutlet UIInterfaceStyleButton *toggleSelectionButton; - -- (IBAction)onAllClick:(id)event; -- (IBAction)onMissedClick:(id)event; -- (IBAction)onDeleteClick:(id)event; -- (IBAction)onEditionChangeClick:(id)sender; - -@end diff --git a/Classes/HistoryListView.m b/Classes/HistoryListView.m deleted file mode 100644 index 58e0333f8..000000000 --- a/Classes/HistoryListView.m +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "HistoryListView.h" -#import "PhoneMainView.h" -#import "LinphoneUI/UIHistoryCell.h" - -@implementation HistoryListView - -typedef enum _HistoryView { History_All, History_Missed, History_Conference, History_MAX } HistoryView; - -#pragma mark - UICompositeViewDelegate Functions - -static UICompositeViewDescription *compositeDescription = nil; - -+ (UICompositeViewDescription *)compositeViewDescription { - if (compositeDescription == nil) { - compositeDescription = [[UICompositeViewDescription alloc] init:self.class - statusBar:StatusBarView.class - tabBar:TabBarView.class - sideMenu:SideMenuView.class - fullscreen:false - isLeftFragment:YES - fragmentWith:HistoryDetailsView.class]; - } - return compositeDescription; -} - -- (UICompositeViewDescription *)compositeViewDescription { - return self.class.compositeViewDescription; -} - -#pragma mark - ViewController Functions - --(void) viewDidLoad { - [super viewDidLoad]; - _conferenceButton.imageView.contentMode = UIViewContentModeScaleAspectFit; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - - if ([_tableController isEditing]) { - [_tableController setEditing:FALSE animated:FALSE]; - } - [self changeView:History_All]; - [self onEditionChangeClick:nil]; - - // Reset missed call - linphone_core_reset_missed_calls_count(LC); - // Fake event - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneCallUpdate object:self]; - [_toggleSelectionButton setImage:[UIImage imageNamed:@"select_all_default.png"] forState:UIControlStateSelected]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(displayModeChanged) - name:kDisplayModeChanged - object:nil]; -} - -- (void) viewWillDisappear:(BOOL)animated { - self.view = NULL; - [NSNotificationCenter.defaultCenter removeObserver:self]; -} - -#pragma mark - - - -- (void)changeView:(HistoryView)view { - CGRect frame = _selectedButtonImage.frame; - if (view == History_All) { - frame.origin.x = _allButton.frame.origin.x; - _allButton.selected = TRUE; - [_tableController removeFIlters]; - _missedButton.selected = FALSE; - _conferenceButton.selected = false; - } else if (view == History_Conference) { - frame.origin.x = _conferenceButton.frame.origin.x; - _conferenceButton.selected = TRUE; - [_tableController setConfFilter:true]; - _missedButton.selected = FALSE; - _allButton.selected = FALSE; - } else { - frame.origin.x = _missedButton.frame.origin.x; - _missedButton.selected = TRUE; - [_tableController setMissedFilter:TRUE]; - _allButton.selected = FALSE; - _conferenceButton.selected = false; - } - _selectedButtonImage.frame = frame; -} - -- (void)displayModeChanged{ - [self.tableController.tableView reloadData]; -} - -#pragma m ~ark - Action Functions - -- (IBAction)onAllClick:(id)event { - [self changeView:History_All]; -} - -- (IBAction)onMissedClick:(id)event { - [self changeView:History_Missed]; -} - -- (IBAction)onConferenceClick:(id)sender { - [self changeView:History_Conference]; -} - -- (IBAction)onDeleteClick:(id)event { - NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"Do you want to delete selected logs?", nil)]; - [UIConfirmationDialog ShowWithMessage:msg - cancelMessage:nil - confirmMessage:nil - onCancelClick:^() { - [self onEditionChangeClick:nil]; - } - onConfirmationClick:^() { - [_tableController removeSelectionUsing:nil]; - [_tableController loadData]; - [self onEditionChangeClick:nil]; - }]; -} - -- (IBAction)onEditionChangeClick:(id)sender { - _allButton.hidden = _missedButton.hidden = _selectedButtonImage.hidden = self.tableController.isEditing; -} - -@end diff --git a/Classes/ImagePickerView.h b/Classes/ImagePickerView.h deleted file mode 100644 index cfa8d8307..000000000 --- a/Classes/ImagePickerView.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UICompositeView.h" - -@protocol ImagePickerDelegate - -- (void)imagePickerDelegateImage:(UIImage *)image info:(NSString *)phAssetId; -- (void)imagePickerDelegateVideo:(NSURL*)url info:(NSDictionary *)info; -@end - -@interface ImagePickerView : UIViewController { - @private - UIImagePickerController *pickerController; -} - -@property(nonatomic, strong) id imagePickerDelegate; -@property(nonatomic) UIImagePickerControllerSourceType sourceType; -@property(nonatomic, copy) NSArray *mediaTypes; -@property(nonatomic) BOOL allowsEditing; -@property(nonatomic, readonly) UIPopoverController *popoverController; - -+ (void)SelectImageFromDevice:(id)delegate - atPosition:(UIView *)ipadPopoverView - inView:(UIView *)ipadView - withDocumentMenuDelegate:(id)documentMenuDelegate; - -@end diff --git a/Classes/ImagePickerView.m b/Classes/ImagePickerView.m deleted file mode 100644 index 932c21b7f..000000000 --- a/Classes/ImagePickerView.m +++ /dev/null @@ -1,414 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import "ImagePickerView.h" -#import "PhoneMainView.h" -#import "SVProgressHUD.h" -#import "ShareViewController.h" -#import "linphoneapp-Swift.h" -#import - - -@implementation ImagePickerView - -@synthesize imagePickerDelegate; -@synthesize sourceType; -@synthesize mediaTypes; -@synthesize allowsEditing; -@synthesize popoverController; - -#pragma mark - Lifecycle Functions - -- (id)init { - self = [super init]; - if (self != nil) { - pickerController = [[UIImagePickerController alloc] init]; - if (IPAD) { - popoverController = [[UIPopoverController alloc] initWithContentViewController:pickerController]; - } - } - return self; -} - -- (BOOL) shouldAutorotate{ - return NO; -} - -#if __IPHONE_OS_VERSION_MAX_ALLOWED < 90000 -- (NSUInteger)supportedInterfaceOrientations { - return UIInterfaceOrientationMaskPortrait; -} -#else -- (UIInterfaceOrientationMask)supportedInterfaceOrientations{ - return UIInterfaceOrientationMaskPortrait; -} -#endif - -#pragma mark - UICompositeViewDelegate Functions - -static UICompositeViewDescription *compositeDescription = nil; - -+ (UICompositeViewDescription *)compositeViewDescription { - if (compositeDescription == nil) { - compositeDescription = [[UICompositeViewDescription alloc] init:self.class - statusBar:StatusBarView.class - tabBar:nil - sideMenu:SideMenuView.class - fullscreen:false - isLeftFragment:NO - fragmentWith:nil]; - compositeDescription.darkBackground = false; - } - return compositeDescription; -} - -- (UICompositeViewDescription *)compositeViewDescription { - return self.class.compositeViewDescription; -} - -#pragma mark - ViewController Functions - -- (void)viewDidLoad { - [super viewDidLoad]; - - [self.view setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight]; - if (popoverController == nil) { - [pickerController.view setFrame:[self.view bounds]]; - [self.view addSubview:[pickerController view]]; - } else { - [popoverController setDelegate:self]; - } - [pickerController setDelegate:self]; -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - if (popoverController != nil) { - [popoverController presentPopoverFromRect:CGRectZero - inView:self.view - permittedArrowDirections:UIPopoverArrowDirectionAny - animated:FALSE]; - } - [[UIApplication sharedApplication] setStatusBarHidden:NO]; // Fix UIImagePickerController status bar hide - [[UIApplication sharedApplication] - setStatusBarStyle:UIStatusBarStyleDefault]; // Fix UIImagePickerController status bar style change - - [PhoneMainView.instance hideStatusBar:YES]; - - //Prevent rotation of camera - NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait]; - [[UIDevice currentDevice] setValue:value forKey:@"orientation"]; -} - -- (void)viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; - if (popoverController != nil) { - [popoverController dismissPopoverAnimated:NO]; - } - - [PhoneMainView.instance hideStatusBar:NO]; -} - -#pragma mark - Property Functions - -- (BOOL)allowsEditing { - return pickerController.allowsEditing; -} - -- (void)setAllowsEditing:(BOOL)aallowsEditing { - pickerController.allowsEditing = aallowsEditing; -} - -- (UIImagePickerControllerSourceType)sourceType { - return pickerController.sourceType; -} - -- (void)setSourceType:(UIImagePickerControllerSourceType)asourceType { - pickerController.sourceType = asourceType; -} - -- (NSArray *)mediaTypes { - return pickerController.mediaTypes; -} - -- (void)setMediaTypes:(NSArray *)amediaTypes { - pickerController.mediaTypes = amediaTypes; -} - -#pragma mark - - -- (void)dismiss { - if ([[PhoneMainView.instance currentView] equal:ImagePickerView.compositeViewDescription]) { - [PhoneMainView.instance popCurrentView]; - } -} - -#pragma mark - UIImagePickerControllerDelegate Functions - -- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { - - dispatch_async(dispatch_get_main_queue(), ^{ - - [self dismiss]; - - NSString *type = [info objectForKey:UIImagePickerControllerMediaType]; - if ([type isEqualToString:(NSString *)kUTTypeVideo] || - [type isEqualToString:(NSString *)kUTTypeMovie]) { - NSURL *urlvideo = [info objectForKey:UIImagePickerControllerMediaURL]; - if(urlvideo != nil && self.imagePickerDelegate != nil) { - [imagePickerDelegate imagePickerDelegateVideo:urlvideo info:info]; - } - } else { - NSURL *alassetURL = [info objectForKey:UIImagePickerControllerReferenceURL]; - PHAsset *phasset = nil; - // when photo from camera, it hasn't be saved - if (alassetURL) { - PHFetchResult *phFetchResult = [PHAsset fetchAssetsWithALAssetURLs:@[alassetURL] options:nil]; - phasset = [phFetchResult firstObject]; - } - BOOL saveToGallery = [ConfigManager.instance lpConfigBoolForKeyWithKey:@"auto_write_to_gallery_preference"]; - UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage] ? [info objectForKey:UIImagePickerControllerEditedImage] : [info objectForKey:UIImagePickerControllerOriginalImage]; - if (!phasset && saveToGallery) { - [self writeImageToGallery:image]; - return; - } - [self passImageToDelegate:image PHAssetId:saveToGallery ? [phasset localIdentifier] : nil]; - } - }); - -} - - --(void) writeImageToGallery:(UIImage *)image { - - NSString *localIdentifier; - [SVProgressHUD show]; - - PHFetchResult *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; - __block PHObjectPlaceholder *placeHolder; - - for (PHAssetCollection *assetCollection in assetCollections) { - if([[assetCollection localizedTitle] isEqualToString:[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"]] ){ - localIdentifier = assetCollection.localIdentifier; - break; - } - } - - if(localIdentifier ){ - PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[localIdentifier] options:nil]; - PHAssetCollection *assetCollection = fetchResult.firstObject; - - [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ - PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image]; - PHAssetCollectionChangeRequest *assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection]; - [assetCollectionChangeRequest addAssets:@[[assetChangeRequest placeholderForCreatedAsset]]]; - placeHolder = [assetChangeRequest placeholderForCreatedAsset]; - } completionHandler:^(BOOL success, NSError *error) { - dispatch_async(dispatch_get_main_queue(), ^{ - [SVProgressHUD dismiss]; - if (!success) { - NSLog(@"Error creating asset: %@", error); - } else { - [self passImageToDelegate:image PHAssetId:[placeHolder localIdentifier]]; - } - }); - }]; - }else{ - __block PHObjectPlaceholder *albumPlaceholder; - [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ - PHAssetCollectionChangeRequest *changeRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"]]; - albumPlaceholder = changeRequest.placeholderForCreatedAssetCollection; - } completionHandler:^(BOOL success, NSError *error) { - if (success) { - PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[albumPlaceholder.localIdentifier] options:nil]; - PHAssetCollection *assetCollection = fetchResult.firstObject; - - [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ - PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image]; - PHAssetCollectionChangeRequest *assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection]; - [assetCollectionChangeRequest addAssets:@[[assetChangeRequest placeholderForCreatedAsset]]]; - placeHolder = [assetChangeRequest placeholderForCreatedAsset]; - } completionHandler:^(BOOL success, NSError *error) { - dispatch_async(dispatch_get_main_queue(), ^{ - - [SVProgressHUD dismiss]; - if (!success) { - NSLog(@"Error creating asset: %@", error); - } else { - [self passImageToDelegate:image PHAssetId:[placeHolder localIdentifier]]; - } - }); - }]; - } else { - [SVProgressHUD dismiss]; - NSLog(@"Error creating album: %@", error); - } - }]; - - } -} - - -- (void) passImageToDelegate:(UIImage *)image PHAssetId:(NSString *)assetId { - if (imagePickerDelegate != nil) { - [imagePickerDelegate imagePickerDelegateImage:image info:(NSString *)assetId]; - } -} -/* - if (imagePickerDelegate != nil) { - [imagePickerDelegate imagePickerDelegateImage:image info:(__bridge NSDictionary *)contextInfo]; - } -} -*/ -- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { - [self dismiss]; -} - -- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)apopoverController { - [self dismiss]; - return TRUE; -} - -- (void)navigationController:(UINavigationController *)navigationController - willShowViewController:(UIViewController *)viewController - animated:(BOOL)animated { - - if ([navigationController isKindOfClass:[UIImagePickerController class]]) { - [[UIApplication sharedApplication] setStatusBarHidden:NO]; // Fix UIImagePickerController status bar hide - [[UIApplication sharedApplication] - setStatusBarStyle:UIStatusBarStyleBlackOpaque]; // Fix UIImagePickerController status bar style change - } -} - -+ (void)SelectImageFromDevice:(id)delegate - atPosition:(UIView *)ipadPopoverView - inView:(UIView *)ipadView - withDocumentMenuDelegate:(id)documentMenuDelegate { - void (^block)(UIImagePickerControllerSourceType) = ^(UIImagePickerControllerSourceType type) { - ImagePickerView *view = VIEW(ImagePickerView); - view.sourceType = type; - - // Displays a control that allows the user to choose picture or - // movie capture, if both are available: - view.mediaTypes = [NSArray arrayWithObjects:(NSString *)kUTTypeMovie,(NSString *)kUTTypeImage,nil]; - - // Hides the controls for moving & scaling pictures, or for - // trimming movies. To instead show the controls, use YES. - view.allowsEditing = NO; - view.imagePickerDelegate = delegate; - - if (IPAD && ipadView && ipadPopoverView) { - UIView *iterview = ipadPopoverView; - CGRect ipadPopoverPosition = iterview.frame; - do { - ipadPopoverPosition = - [iterview.superview convertRect:ipadPopoverPosition toView:iterview.superview.superview]; - iterview = iterview.superview; - } while (iterview && iterview.superview != ipadView); - [view.popoverController presentPopoverFromRect:ipadPopoverPosition - inView:ipadView - permittedArrowDirections:UIPopoverArrowDirectionAny - animated:FALSE]; - } else { - [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; - } - }; - if ([PHPhotoLibrary authorizationStatus] == PHAuthorizationStatusAuthorized) { - DTActionSheet *sheet = [[DTActionSheet alloc] initWithTitle:NSLocalizedString(@"Select the source", nil)]; - if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { - [sheet addButtonWithTitle:NSLocalizedString(@"Camera", nil) - block:^() { - if([AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo] != AVAuthorizationStatusAuthorized ) { - [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Camera's permission", nil) message:NSLocalizedString(@"Camera not authorized", nil) delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Continue", nil] show]; - return; - } - block(UIImagePickerControllerSourceTypeCamera); - }]; - } - if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { - [sheet addButtonWithTitle:NSLocalizedString(@"Photo library", nil) - block:^() { - block(UIImagePickerControllerSourceTypePhotoLibrary); - }]; - } - - if (documentMenuDelegate) { - [sheet addButtonWithTitle:NSLocalizedString(@"Document",nil) block:^(){ - [self pickDocumentForDelegate:documentMenuDelegate]; - }]; - } - [sheet addCancelButtonWithTitle:NSLocalizedString(@"Cancel", nil) block:nil]; - - [sheet showInView:PhoneMainView.instance.view]; - } else { - [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { - dispatch_async(dispatch_get_main_queue(), ^{ - if ([PHPhotoLibrary authorizationStatus] == PHAuthorizationStatusAuthorized) { - DTActionSheet *sheet = [[DTActionSheet alloc] initWithTitle:NSLocalizedString(@"Select the source", nil)]; - if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { - [sheet addButtonWithTitle:NSLocalizedString(@"Camera", nil) - block:^() { - if([AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo] != AVAuthorizationStatusAuthorized ) { - [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Camera's permission", nil) message:NSLocalizedString(@"Camera not authorized", nil) delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Continue", nil] show]; - return; - } - block(UIImagePickerControllerSourceTypeCamera); - }]; - } - if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { - [sheet addButtonWithTitle:NSLocalizedString(@"Photo library", nil) - block:^() { - block(UIImagePickerControllerSourceTypePhotoLibrary); - }]; - } - if (documentMenuDelegate) { - [sheet addButtonWithTitle:NSLocalizedString(@"Document",nil) block:^(){ - [self pickDocumentForDelegate:documentMenuDelegate]; - }]; - } - [sheet addCancelButtonWithTitle:NSLocalizedString(@"Cancel", nil) block:nil]; - - [sheet showInView:PhoneMainView.instance.view]; - } else { - [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Photo's permission", nil) message:NSLocalizedString(@"Photo not authorized", nil) delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Continue", nil] show]; - } - }); - }]; - } -} - -+(void) pickDocumentForDelegate:(id)documentMenuDelegate { - UIDocumentPickerViewController *documentProviderMenu = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:SUPPORTED_EXTENTIONS inMode:UIDocumentPickerModeImport]; - ChatConversationView *chatView = VIEW(ChatConversationView); - documentProviderMenu.delegate = chatView; - if (IPAD) { - /* On iPad the activity view controller will be displayed as a popover using the new UIPopoverPresentationController, it requires that you specify an anchor point for the presentation of the popover using one of the three following properties: barButtonItem, sourceView, sourceRect */ - ChatConversationView *chatView = VIEW(ChatConversationView); - documentProviderMenu.popoverPresentationController.sourceView = chatView.view; - CGRect frame = documentProviderMenu.popoverPresentationController.sourceRect; - CGRect topBarFrame = chatView.topBar.frame; - documentProviderMenu.popoverPresentationController.sourceRect = CGRectMake(topBarFrame.origin.x + topBarFrame.size.width/2, topBarFrame.origin.y + topBarFrame.size.height, frame.size.width, frame.size.height); - } - dispatch_async(dispatch_get_main_queue(), ^ { - [PhoneMainView.instance presentViewController:documentProviderMenu animated:YES completion:nil]; - }); -} - -@end diff --git a/Classes/ImageView.h b/Classes/ImageView.h deleted file mode 100644 index 93857f44a..000000000 --- a/Classes/ImageView.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UICompositeView.h" - -@interface UIImageScrollView : UIScrollView - -@property(nonatomic, strong) UIImage *image; -@property(readonly) IBOutlet UIImageView *imageView; - -@end - -@interface ImageView : UIViewController { -} - -@property(nonatomic, strong) IBOutlet UIImageScrollView *scrollView; -@property(nonatomic, strong) UIImage *image; -@property(nonatomic, strong) IBOutlet UIButton *backButton; - -- (IBAction)onBackClick:(id)sender; - -@end diff --git a/Classes/ImageView.m b/Classes/ImageView.m deleted file mode 100644 index ebdb0e037..000000000 --- a/Classes/ImageView.m +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "ImageView.h" -#import "PhoneMainView.h" - -@implementation UIImageScrollView - -@synthesize image; -@synthesize imageView; - -#pragma mark - Lifecycle Functions - -- (void)initUIImageScrollView { - imageView = [[UIImageView alloc] init]; - self.delegate = self; - [self addSubview:imageView]; -} - -- (id)init { - self = [super init]; - if (self != nil) { - [self initUIImageScrollView]; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)aDecoder { - self = [super initWithCoder:aDecoder]; - if (self != nil) { - [self initUIImageScrollView]; - } - return self; -} - -- (id)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self != nil) { - [self initUIImageScrollView]; - } - return self; -} - -#pragma mark - ViewController Functions - -- (void)layoutSubviews { - [super layoutSubviews]; - // center the image as it becomes smaller than the size of the screen - CGSize boundsSize = self.bounds.size; - CGRect frameToCenter = imageView.frame; - - // center horizontally - if (frameToCenter.size.width < boundsSize.width) - frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width) / 2; - else - frameToCenter.origin.x = 0; - - // center vertically - if (frameToCenter.size.height < boundsSize.height) - frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height) / 2; - else - frameToCenter.origin.y = 0; - - imageView.frame = frameToCenter; -} - -#pragma mark - Property Functions - -- (void)setImage:(UIImage *)aimage { - self.minimumZoomScale = 0; - self.zoomScale = 1; - - CGRect rect = CGRectMake(0, 0, aimage.size.width, aimage.size.height); - imageView.image = aimage; - imageView.frame = rect; - self.contentSize = rect.size; - [self zoomToRect:rect animated:FALSE]; - self.minimumZoomScale = self.zoomScale; -} - -- (UIImage *)image { - return imageView.image; -} - -#pragma mark - UIScrollViewDelegate Functions - -- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { - return imageView; -} - -@end - -@implementation ImageView - -@synthesize scrollView; -@synthesize backButton; -@synthesize image; - -#pragma mark - UICompositeViewDelegate Functions - -static UICompositeViewDescription *compositeDescription = nil; - -+ (UICompositeViewDescription *)compositeViewDescription { - if (compositeDescription == nil) { - compositeDescription = [[UICompositeViewDescription alloc] init:self.class - statusBar:StatusBarView.class - tabBar:nil - sideMenu:SideMenuView.class - fullscreen:false - isLeftFragment:NO - fragmentWith:nil]; - } - return compositeDescription; -} - -- (UICompositeViewDescription *)compositeViewDescription { - return self.class.compositeViewDescription; -} - -#pragma mark - Property Functions - -- (void)setImage:(UIImage *)aimage { - scrollView.image = aimage; -} - -- (UIImage *)image { - return scrollView.image; -} - -#pragma mark - Action Functions - -- (IBAction)onBackClick:(id)sender { - if ([[PhoneMainView.instance currentView] equal:ImageView.compositeViewDescription]) { - [PhoneMainView.instance popCurrentView]; - } -} - -@end diff --git a/Classes/InAppProductsManager.h b/Classes/InAppProductsManager.h deleted file mode 100644 index 8735c07ed..000000000 --- a/Classes/InAppProductsManager.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import - -#define kIAPNotReady @"IAPNotReady" // startup status, manager is not ready yet -#define kIAPReady @"IAPReady" // no data -#define kIAPPurchaseTrying @"IAPPurchaseTrying" // data: product_id -#define kIAPPurchaseCancelled @"IAPPurchaseCancelled" // data: product_id -#define kIAPPurchaseFailed @"IAPPurchaseFailed" // data: product_id, error_msg -#define kIAPPurchaseSucceeded @"IAPPurchaseSucceeded" // data: product_id, expires_date -#define kIAPPurchaseExpired @"IAPPurchaseExpired" // data: product_id, expires_date -#define kIAPRestoreFailed @"IAPRestoreFailed" // data: error_msg -#define kIAPRestoreSucceeded @"IAPRestoreSucceeded" // no data -#define kIAPReceiptFailed @"IAPReceiptFailed" // data: error_msg -#define kIAPReceiptSucceeded @"IAPReceiptSucceeded" // no data -typedef NSString *IAPPurchaseNotificationStatus; - -// InAppProductsManager take care of any in app purchase accessible within Linphone -// In order to use it, you must configure your linphonerc configuration correctly, such as: -//[in_app_purchase] -// enabled=1 -// paid_account_id=test.autorenew_7days -// receipt_validation_url=https://www.linphone.org/inapp.php -// products_list=test.autorenew_7days -// expiry_check_period = 86400 -// warn_before_expiry_period = 604800 -// Note: in Sandbox mode (test), autorenewal expire time is speed up (see -// http://stackoverflow.com/questions/8815271/what-expiry-date-should-i-see-for-in-app-purchase-in-the-application-sandbox) -// so that 7 days renewal is only 3 minutes and: -// 1 week = 3 minutes -// 1 month = 5 minutes -// 2 months = 10 minutes -// 3 months = 15 minutes -// 6 months = 30 minutes -// 1 year = 1 hour - -@interface InAppProductsManager : NSObject { - NSString *latestReceiptMD5; - time_t lastCheck; - time_t expiryTime; -} - -@property(nonatomic, strong) IAPPurchaseNotificationStatus status; -@property(nonatomic, strong) NSMutableArray *productsAvailable; -@property(nonatomic, strong) NSMutableArray *productsIDPurchased; -//Period of time between each expiration check. Default value is given in linphonerc. -@property time_t checkPeriod; -//Period of time before expiration during which we warn the user about the need to renew the account. -@property time_t warnBeforeExpiryPeriod; -//The notification category to use for displaying notification related to account expiry. -@property NSString *notificationCategory; - -// TRUE when in app purchase capability is available - not modified during runtime -@property(readonly) BOOL enabled; -// TRUE when manager is correctly set up - must first retrieve products available and validate current receipt on our -// server -@property(readonly) BOOL initialized; -// TRUE if manager is available for usage - will be FALSE if an operation is already in progress or if not initialized -// or not enabled -@property(readonly) BOOL available; - -// TRUE if accountActivate was started but we did not receive response from server yet -@property(readonly) BOOL accountActivationInProgress; - -// TRUE if accountActivate activated -@property(readonly) BOOL accountActivated; - -- (BOOL)isPurchasedWithID:(NSString *)productId; -// Purchase an account. You should not use this if manager is not available yet. -/*- (BOOL)purchaseAccount:(NSString *)phoneNumber - withPassword:(NSString *)password - andEmail:(NSString *)email - monthly:(BOOL)monthly; -*/ -// Purchase a product. You should not use this if manager is not available yet. -- (BOOL)purchaseWithID:(NSString *)productID; -// Activate purchased account. -//- (BOOL)activateAccount:(NSString *)phoneNumber; -// Check if account is activated. -//- (BOOL)checkAccountActivated:(NSString *)phoneNumber; - -// restore user purchases. You should not use this if manager is not available yet. Must be at a user action ONLY. -- (BOOL)restore; -// retrieve purchases on our server. You should not use this if manager is not available yet. -// Warning: on first run, this will open a popup to user to provide iTunes Store credentials -- (BOOL)retrievePurchases; - -//Check if account is about to expire, and if yes launch a notification. -- (void)check; - -// deal with xmlrpc response -//- (void)dealWithXmlRpcResponse:(LinphoneXmlRpcRequest *)request; - -@end diff --git a/Classes/InAppProductsManager.m b/Classes/InAppProductsManager.m deleted file mode 100644 index c1754f470..000000000 --- a/Classes/InAppProductsManager.m +++ /dev/null @@ -1,588 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "InAppProductsManager.h" -#import "ShopView.h" - -// In app purchase are not supported by the Simulator -#import "XMLRPCHelper.h" -#import "LinphoneManager.h" -#import "PhoneMainView.h" -#import "StoreKit/StoreKit.h" - -@interface InAppProductsManager () -@property(strong, nonatomic) NSDate *expirationDate; -@property(strong, nonatomic) NSDictionary *accountCreationData; - -@end - - - -@implementation InAppProductsManager - -@synthesize checkPeriod; -@synthesize warnBeforeExpiryPeriod; -@synthesize notificationCategory; - -// LINPHONE_CAPABILITY_INAPP_PURCHASE must be defined in Linphone Build Settings -#if 1 - -- (instancetype)init { - if ((self = [super init]) != nil) { - _enabled = (([SKPaymentQueue canMakePayments]) && - ([LinphoneManager.instance lpConfigBoolForKey:@"enabled" inSection:@"in_app_purchase"])); - _initialized = false; - _available = false; - _accountActivationInProgress = false; - checkPeriod = [LinphoneManager.instance lpConfigIntForKey:@"expiry_check_period" inSection:@"in_app_purchase"]; - warnBeforeExpiryPeriod = [LinphoneManager.instance lpConfigIntForKey:@"warn_before_expiry_period" inSection:@"in_app_purchase"]; - lastCheck = 0; - - [XMLRPCHelper.self initArray]; - //========// for test only - // int testExpiry = [LinphoneManager.instance lpConfigIntForKey:@"expiry_time_test" - // inSection:@"in_app_purchase"]; - // if (testExpiry > 0){ - // expiryTime = time(NULL) + testExpiry; - //}else expiryTime = 0; - //========// - if (_enabled) { - // self.xmlrpc = [[InAppProductsXMLRPCDelegate alloc] init]; - _status = kIAPNotReady; - [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; - [self loadProducts]; - [self checkAccountExpirationDate]; - [self checkAccountTrial]; - [self checkAccountExpired]; - } - //[self check]; - } - return self; -} - -#pragma mark Public API - -- (BOOL)isPurchasedWithID:(NSString *)productID { - if (!_enabled) - return FALSE; - - for (NSString *prod in _productsIDPurchased) { - NSDate *now = [[NSDate alloc] init]; - // since multiple ID represent the same product, we must not check it - if (/*[prod isEqual: productID] &&*/ [self.expirationDate earlierDate:now] == now) { - bool isBought = true; - LOGE(@"%@ is %s bought.", prod, isBought ? "" : "NOT"); - return isBought; - } - } - return false; -} - -- (BOOL)purchaseWithID:(NSString *)productID { - if (!_enabled || !_initialized || !_available) { - NSDictionary *dict = @{ - @"product_id" : productID, - @"error_msg" : NSLocalizedString(@"Cannot purchase anything yet, please try again later.", nil) - }; - [self postNotificationforStatus:kIAPPurchaseFailed withDict:dict]; - return FALSE; - } - SKProduct *prod = [self productIDAvailable:productID]; - if (prod) { - // Display waitview on click - UIWindow *window = [[UIApplication sharedApplication] keyWindow]; - UIView *topView = window.rootViewController.view; - UIView *waitview = (UIView *)[topView viewWithTag:288]; - [waitview setHidden:FALSE]; - - NSDictionary *dict = @{ @"product_id" : productID }; - [self postNotificationforStatus:kIAPPurchaseTrying withDict:dict]; - SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:prod]; - _available = false; - [[SKPaymentQueue defaultQueue] addPayment:payment]; - [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; - return TRUE; - } else { - NSDictionary *dict = @{ @"product_id" : productID, @"error_msg" : @"Product not available" }; - [self postNotificationforStatus:kIAPPurchaseFailed withDict:dict]; - return FALSE; - } -} - -- (BOOL)restore { - if (!_enabled || !_initialized || !_available) { - NSDictionary *dict = @{ @"error_msg" : NSLocalizedString(@"In apps not ready yet", nil) }; - [self postNotificationforStatus:kIAPRestoreFailed withDict:dict]; - return FALSE; - } - LOGI(@"Restoring user purchases..."); - // force new query of our server - latestReceiptMD5 = nil; - _available = false; - [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; - return TRUE; -} - -- (BOOL)retrievePurchases { - if (!_enabled | !_initialized | !_available) { - NSDictionary *dict = @{ @"error_msg" : NSLocalizedString(@"In apps not ready yet", nil) }; - [self postNotificationforStatus:kIAPRestoreFailed withDict:dict]; - return FALSE; - } else if ([[self getPhoneNumber] length] == 0) { - LOGW(@"Not retrieving purchase since not account configured yet"); - return FALSE; - } else { - _available = false; - [self validateReceipt:nil]; - return TRUE; - } -} - -#pragma mark ProductListLoading - -- (void)loadProducts { - NSArray *list = [[[LinphoneManager.instance lpConfigStringForKey:@"products_list" inSection:@"in_app_purchase"] - stringByReplacingOccurrencesOfString:@" " - withString:@""] componentsSeparatedByString:@","]; - - _productsIDPurchased = [[NSMutableArray alloc] initWithCapacity:0]; - - SKProductsRequest *productsRequest = - [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithArray:list]]; - productsRequest.delegate = self; - [productsRequest start]; -} - -- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { - _productsAvailable = [NSMutableArray arrayWithArray:response.products]; - - LOGI(@"Found %lu products available", (unsigned long)_productsAvailable.count); - _initialized = true; - if (response.invalidProductIdentifiers.count > 0) { - for (NSString *invalidIdentifier in response.invalidProductIdentifiers) { - LOGW(@"Found product Identifier with invalid ID '%@'", invalidIdentifier); - } - } else { - _available = true; - [self postNotificationforStatus:kIAPReady withDict:nil]; - } -} - -- (void)request:(SKRequest *)request didFailWithError:(NSError *)error { - LOGE(@"Impossible to retrieve list of products: %@", [error localizedDescription]); - // well, let's retry... - [self loadProducts]; -} - -#pragma mark Other - -- (SKProduct *)productIDAvailable:(NSString *)productID { - if (!_enabled || !_initialized) - return nil; - for (SKProduct *product in _productsAvailable) { - if ([product.productIdentifier compare:productID options:NSLiteralSearch] == NSOrderedSame) { - return product; - } - } - return nil; -} - -- (void)requestDidFinish:(SKRequest *)request { - if ([request isKindOfClass:[SKReceiptRefreshRequest class]]) { - NSURL *receiptUrl = [[NSBundle mainBundle] appStoreReceiptURL]; - if ([[NSFileManager defaultManager] fileExistsAtPath:[receiptUrl path]]) { - LOGI(@"App Receipt exists"); - [self validateReceipt:nil]; - } else { - // This can happen if the user cancels the login screen for the store. - // If we get here it means there is no receipt and an attempt to get it failed because the user cancelled - // the login. - LOGF(@"Receipt request done but there is no receipt"); - } - } -} - -#pragma mark Receipt management - -- (NSString *)getReceipt { - NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; - // Test whether the receipt is present at the above URL - if (![[NSFileManager defaultManager] fileExistsAtPath:[receiptURL path]]) { - // We are probably in sandbox environment, trying to retrieve it... - return nil; - } - - NSString *receiptBase64 = [[NSData dataWithContentsOfURL:receiptURL] base64EncodedStringWithOptions:0]; - LOGI(@"Found appstore receipt %@", [receiptBase64 md5]); - [self saveReceiptTemp:receiptBase64]; - return receiptBase64; -} - -/** - Save Receipt temporarily until xmlrpc server request completed and confirmation sent -**/ -- (void)saveReceiptTemp:(NSString *)receipt { - LOGE(@"===>>> saveReceiptTemp : TmpReceipt"); - [LinphoneManager.instance lpConfigSetString:receipt forKey:@"save_tmp_receipt" inSection:@"in_app_purchase"]; -} - -/** - reset Receipt to empty after xmlrpc request confirmation received - **/ -- (void)removeTmpReceipt:(NSString *)receipt { - LOGE(@"===>>> removeReceiptTemp : TmpReceipt"); - if ([LinphoneManager.instance lpConfigStringForKey:@"save_tmp_receipt" inSection:@"in_app_purchase"]) - [LinphoneManager.instance lpConfigSetString:@"0" forKey:@"save_tmp_receipt" inSection:@"in_app_purchase"]; -} - -/** - get temp Receipt to retry xmlrpc request - **/ -- (NSString *)getTmpReceipt { - LOGE(@"===>>> getReceiptTemp : TmpReceipt"); - return [LinphoneManager.instance lpConfigStringForKey:@"save_tmp_receipt" inSection:@"in_app_purchase"]; -} - -- (void)validateReceipt:(SKPaymentTransaction *)transaction { - NSString *receiptBase64 = [self getReceipt]; - if (receiptBase64 == nil) { - SKRequest *req = [[SKReceiptRefreshRequest alloc] init]; - LOGI(@"Receipt not found yet, trying to retrieve it..."); - req.delegate = self; - [req start]; - return; - } - // Hide waiting view - UIWindow *window = [[UIApplication sharedApplication] keyWindow]; - UIView *topView = window.rootViewController.view; - UIView *waitview = (UIView *)[topView viewWithTag:288]; - [waitview setHidden:TRUE]; - // only check the receipt if it has changed - if (latestReceiptMD5 == nil || ![latestReceiptMD5 isEqualToString:[receiptBase64 md5]]) { - [self updateAccountExpirationDate:receiptBase64]; - latestReceiptMD5 = [receiptBase64 md5]; - LOGI(@"XMLRPC query "); - } else { - LOGW(@"Not checking receipt since it has already been done!"); - _available = true; - } -} - -#pragma mark Getters - -- (NSString *)getPhoneNumber { - NSString *phoneNumber = @""; - LinphoneAccount *defaultAccount = linphone_core_get_default_account(LC); - if (defaultAccount) { - const LinphoneAddress *identity = linphone_account_params_get_identity_address(linphone_account_get_params(defaultAccount)); - if (identity) { - phoneNumber = [NSString stringWithUTF8String:linphone_address_get_username(identity)]; - } - } - return phoneNumber; -} - -- (NSString *)getPassword { - NSString *pass; - LinphoneAccount *defaultAccount = linphone_core_get_default_account(LC); - if (defaultAccount && - strcmp([LinphoneManager.instance lpConfigStringForKey:@"domain_name" - inSection:@"app" - withDefault:@"sip.linphone.org"] - .UTF8String, - linphone_account_params_get_domain(linphone_account_get_params(defaultAccount))) == 0) { - const LinphoneAuthInfo *info = linphone_account_find_auth_info(defaultAccount); - const char *tmpPass; - if (linphone_auth_info_get_passwd(info)) { - tmpPass = linphone_auth_info_get_passwd(info); - } else { - tmpPass = linphone_auth_info_get_ha1(info); - } - pass = [NSString stringWithFormat:@"%s", tmpPass]; - } - return pass; -} - -#pragma mark Payment management - -- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { - for (SKPaymentTransaction *transaction in transactions) { - switch (transaction.transactionState) { - case SKPaymentTransactionStatePurchasing: - break; - case SKPaymentTransactionStatePurchased: - case SKPaymentTransactionStateRestored: { - if (!_initialized) { - LOGW(@"Pending transactions before end of initialization, not verifying receipt"); - } else { - [self validateReceipt:transaction]; - } - [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; - break; - } - case SKPaymentTransactionStateDeferred: - LOGI(@"Waiting for parent approval..."); - // could do some UI stuff - break; - case SKPaymentTransactionStateFailed: { - _available = true; - [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; - if (transaction.error.code == SKErrorPaymentCancelled) { - LOGI(@"SKPaymentTransactionStateFailed: cancelled"); - NSDictionary *dict = @{ @"product_id" : transaction.payment.productIdentifier }; - [self postNotificationforStatus:kIAPPurchaseCancelled withDict:dict]; - } else { - NSString *errlast = - [NSString stringWithFormat:@"Purchase failed: %@.", transaction.error.localizedDescription]; - LOGE(@"SKPaymentTransactionStateFailed: %@", errlast); - NSDictionary *dict = - @{ @"product_id" : transaction.payment.productIdentifier, - @"error_msg" : errlast }; - [self postNotificationforStatus:kIAPPurchaseFailed withDict:dict]; - } - break; - } - } - } -} - -- (void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions { - for (SKPaymentTransaction *transaction in transactions) { - LOGD(@"%@ was removed from the payment queue.", transaction.payment.productIdentifier); - } -} - -- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error { - if (error.code != SKErrorPaymentCancelled) { - NSDictionary *dict = @{ @"error_msg" : [error localizedDescription] }; - [self postNotificationforStatus:kIAPRestoreFailed withDict:dict]; - } -} - -- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue { - LOGI(@"All restorable transactions have been processed by the payment queue."); -} - -- (void)postNotificationforStatus:(IAPPurchaseNotificationStatus)status withDict:(NSDictionary *)dict { - _status = status; - LOGI(@"Triggering notification for status %@", status); - [NSNotificationCenter.defaultCenter postNotificationName:status object:self userInfo:dict]; - if ([status isEqual:kIAPPurchaseFailed] || [status isEqual:kIAPPurchaseCancelled]) { - // Hide waiting view - UIWindow *window = [[UIApplication sharedApplication] keyWindow]; - UIView *topView = window.rootViewController.view; - UIView *waitview = (UIView *)[topView viewWithTag:288]; - [waitview setHidden:TRUE]; - } -} - -#pragma mark expiration notif - -- (void) presentNotification:(int64_t) remaining{ - if (notificationCategory == nil) return; - int days = (int)remaining / (3600 * 24); - NSString * expireText; - if (remaining >= 0){ - expireText = [NSString stringWithFormat:NSLocalizedString(@"Your account will expire in %i days.", nil), days]; - }else{ - expireText = [NSString stringWithFormat:NSLocalizedString(@"Your account has expired.", nil), days]; - } - - if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) { - UILocalNotification *notification = [[UILocalNotification alloc] init]; - if (notification) { - - notification.category = notificationCategory; - notification.repeatInterval = 0; - notification.applicationIconBadgeNumber = 1; - notification.alertBody = expireText; - - [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; - } - - }else{ - UIAlertController *alert = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Account expiring", nil) - message:expireText - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* buyAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Buy", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - [PhoneMainView.instance changeCurrentView:ShopView.compositeViewDescription]; - }]; - - UIAlertAction *laterAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Later", nil) - style:UIAlertActionStyleCancel - handler:^(UIAlertAction *action){ - // [alert dismissViewControllerAnimated:FALSE]; - }]; - - [alert addAction:buyAction]; - [alert addAction:laterAction]; - [PhoneMainView.instance presentViewController:alert animated:YES completion:nil]; - } -} - -- (void) check{ - if (!_available) return; - if (expiryTime == 0 || checkPeriod == 0) return; - - time_t now = time(NULL); - - if (now < lastCheck + checkPeriod) return; - if (now >= expiryTime - warnBeforeExpiryPeriod){ - lastCheck = now; - int64_t remaining = (int64_t)expiryTime - (int64_t)now; - [self presentNotification: remaining]; - } - - if (![[self getTmpReceipt] isEqualToString:@""]) { - LOGE(@"===>>> Check : getTmpReceipt != ''"); - [self updateAccountExpirationDate:[self getReceipt]]; - } -} - -#pragma mark Intermediate XMLRPC call method - -// Intermediate method to check XMLRPC account expiration date -- (BOOL)updateAccountExpirationDate:(NSString *)receiptBase64 { - return [self - callXmlrpcRequestWithParams:@"update_expiration_date" - onSuccess:^(NSString *response) { - if (response) { - // NSString *productID = [LinphoneManager.instance - // lpConfigStringForKey:@"paid_account_id" inSection:@"in_app_purchase"]; - LOGI(@"update_expiration_date callback - response: %@", response); - if ([response containsString:@"ERROR"]) { - LOGE(@"Failed with error %@", response); - NSString *errorMsg; - if ([response isEqualToString:@"ERROR_ACCOUNT_ALREADY_EXISTS"]) { - errorMsg = NSLocalizedString(@"This account is already connected.", nil); - } else if ([response isEqualToString:@"ERROR_UID_ALREADY_IN_USE"]) { - errorMsg = NSLocalizedString(@"You already own an account.", nil); - } else if ([response isEqualToString:@"ERROR_ACCOUNT_DOESNT_EXIST"]) { - errorMsg = NSLocalizedString(@"You have already purchased an account " - @"but it does not exist anymore.", - nil); - } else if ([response isEqualToString:@"ERROR_PURCHASE_CANCELLED"]) { - errorMsg = NSLocalizedString(@"You cancelled your account.", nil); - } else { - errorMsg = [NSString - stringWithFormat:NSLocalizedString(@"Unknown error (%@).", nil), response]; - } - // NSDictionary *dict = @{ @"product_id" : productID, @"error_msg" : - // errorMsg }; - //[self postNotificationforStatus:kIAPPurchaseFailed withDict:dict]; - - } else // remove temporarily receipt - [self removeTmpReceipt:receiptBase64]; - } - } - onError:NULL - extra:receiptBase64]; -} - -// Intermediate method to check XMLRPC account expiration date -- (BOOL)checkAccountExpirationDate { - return [self callXmlrpcRequestWithParams:@"get_account_expiration" - onSuccess:^(NSString *response) { - if (response) { - LOGI(@"get_account_expiration callback - response: %@", response); - if ([response containsString:@"ERROR_NO_EXPIRATION"]) { - expiryTime = 0; - } - } - } - onError:NULL - extra:NULL]; -} - -// Intermediate method to check XMLRPC account trial -- (BOOL)checkAccountTrial { - return [self callXmlrpcRequestWithParams:@"is_account_trial" - onSuccess:^(NSString *response) { - if (response) { - LOGI(@"is_account_trial callback - response: %@", response); - } - } - onError:NULL - extra:NULL]; -} - -// Intermediate method to check XMLRPC account expired -- (BOOL)checkAccountExpired { - return [self callXmlrpcRequestWithParams:@"is_account_expired" - onSuccess:^(NSString *response) { - if (response) { - LOGI(@"is_account_expired callback - response: %@", response); - } - } - onError:NULL - extra:NULL]; -} - -// Intermediate method to check check payload signature -- (BOOL)checkPayloadSignature { - return [self callXmlrpcRequestWithParams:@"check_payload_signature" - onSuccess:^(NSString *response) { - if (response) { - LOGI(@"check_payload_signature callback - response: %@", response); - } - } - onError:NULL - extra:NULL]; -} - -// Generic function to call sendXMLRPCRequestWithParams -- (BOOL)callXmlrpcRequestWithParams:(NSString *)method - onSuccess:(void (^)(NSString *))successBk - onError:(void (^)(NSString *req))errorBk - extra:(NSString *)extra { - if ([[self getPhoneNumber] length] > 0) { - NSString *phoneNumber = [self getPhoneNumber]; - NSString *password = [self getPassword]; - NSArray *args; - if (extra != NULL) - args = @[ phoneNumber, password, @"", extra ]; - else - args = @[ phoneNumber, password, @"" ]; - if (successBk && errorBk) - [XMLRPCHelper.self sendXMLRPCRequestWithParams:method withParams:args onSuccess:successBk onError:errorBk]; - else if (successBk) - [XMLRPCHelper.self sendXMLRPCRequestWithParams:method withParams:args onSuccess:successBk]; - else - [XMLRPCHelper.self sendXMLRPCRequestWithParams:method withParams:args]; - return TRUE; - - } else { - LOGW(@"No SIP URI configured, can't get account expiration date."); - return FALSE; - } -} - -#pragma mark Other -#else -- (void)postNotificationforStatus:(IAPPurchaseNotificationStatus)status { - _status = status; - [NSNotificationCenter.defaultCenter postNotificationName:status object:self userInfo:nil]; - LOGE(@"Not supported, triggering %@", status); -} - -#endif -@end diff --git a/Classes/LaunchScreen.h b/Classes/LaunchScreen.h deleted file mode 100644 index 0cacd9cff..000000000 --- a/Classes/LaunchScreen.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef LaunchScreen_h -#define LaunchScreen_h - - -#endif /* LaunchScreen_h */ -#import - -@interface LaunchScreen : UIView - -@end diff --git a/Classes/LaunchScreen.xib b/Classes/LaunchScreen.xib deleted file mode 100644 index 5f5e78517..000000000 --- a/Classes/LaunchScreen.xib +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/LinphoneAppDelegate.h b/Classes/LinphoneAppDelegate.h deleted file mode 100644 index 9a4768d11..000000000 --- a/Classes/LinphoneAppDelegate.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "LinphoneCoreSettingsStore.h" -#import -#import -#import - - -@interface LinphoneAppDelegate : NSObject { - @private - UIBackgroundTaskIdentifier bgStartId; - BOOL startedInBackground; - CLLocationManager* locationManager; -} - -@property (nonatomic, retain) UIAlertController *waitingIndicator; -@property (nonatomic, retain) NSString *configURL; -@property (nonatomic, strong) UIWindow* window; -@property BOOL onlyPortrait; -@property UIApplicationShortcutItem *shortcutItem; - -@end - diff --git a/Classes/LinphoneAppDelegate.m b/Classes/LinphoneAppDelegate.m deleted file mode 100644 index 5df5b27b7..000000000 --- a/Classes/LinphoneAppDelegate.m +++ /dev/null @@ -1,916 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "LinphoneAppDelegate.h" -#import "ContactDetailsView.h" -#import "ContactsListView.h" -#import "PhoneMainView.h" -#import "ShopView.h" - -#import "CoreTelephony/CTCallCenter.h" -#import "CoreTelephony/CTCall.h" - -#import "LinphoneCoreSettingsStore.h" - -#include "LinphoneManager.h" -#include "linphone/linphonecore.h" - -#import -#import -#import "linphoneapp-Swift.h" - -#import "SVProgressHUD.h" - - -#ifdef USE_CRASHLYTICS -#include "FIRApp.h" -#endif - -@implementation LinphoneAppDelegate - -@synthesize configURL; -@synthesize window; - -#pragma mark - Lifecycle Functions - -- (id)init { - self = [super init]; - if (self != nil) { - startedInBackground = FALSE; - } - _onlyPortrait = FALSE; - return self; - [[UIApplication sharedApplication] setDelegate:self]; -} - -#pragma mark - - -- (void)applicationDidEnterBackground:(UIApplication *)application { - LOGI(@"%@", NSStringFromSelector(_cmd)); - if([LinphoneManager.instance lpConfigBoolForKey:@"account_push_presence_preference"]){ - linphone_core_set_consolidated_presence(LC, LinphoneConsolidatedPresenceOffline); - } - if (linphone_core_get_global_state(LC) != LinphoneGlobalOff) { - [LinphoneManager.instance enterBackgroundMode]; - [LinphoneManager.instance.fastAddressBook clearFriends]; - if (PhoneMainView.instance.currentView == ChatConversationView.compositeViewDescription) { - ChatConversationView *view = VIEW(ChatConversationView); - [view removeCallBacks]; - [view.tableController setChatRoom:NULL]; - [view setChatRoom:NULL]; - } else if (PhoneMainView.instance.currentView == RecordingsListView.compositeViewDescription || PhoneMainView.instance.currentView == DevicesListView.compositeViewDescription) { - // To avoid crash - [PhoneMainView.instance changeCurrentView:DialerView.compositeViewDescription]; - } - - [CallManager.instance stopLinphoneCore]; - } - [SwiftUtil resetCachedAsset]; -} - -- (void)applicationWillEnterForeground:(UIApplication *)application { - LOGI(@"%@", NSStringFromSelector(_cmd)); - - [LinphoneManager.instance startLinphoneCore]; - [LinphoneManager.instance.fastAddressBook reloadFriends]; - [AvatarBridge clearFriends]; - if([LinphoneManager.instance lpConfigBoolForKey:@"account_push_presence_preference"]){ - linphone_core_set_consolidated_presence(LC, LinphoneConsolidatedPresenceOnline); - } - - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneMessageReceived object:nil]; - -} - -- (void)applicationWillResignActive:(UIApplication *)application { - LOGI(@"%@", NSStringFromSelector(_cmd)); - LinphoneCall *call = linphone_core_get_current_call(LC); - - NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:kLinphoneMsgNotificationAppGroupId]; - if (defaults) { - [defaults setBool:false forKey:@"appactive"]; - } - - if (!call) - return; - - /* save call context */ - [CallManager.instance setBackgroundContextCallWithCall:call]; - [CallManager.instance setBackgroundContextCameraIsEnabled:linphone_call_camera_enabled(call)]; - - const LinphoneCallParams *params = linphone_call_get_current_params(call); - if (linphone_call_params_video_enabled(params)) - linphone_call_enable_camera(call, false); -} - -- (void)applicationDidBecomeActive:(UIApplication *)application { - LOGI(@"%@", NSStringFromSelector(_cmd)); - if (!startedInBackground || PhoneMainView.instance.currentView == nil) { - startedInBackground = TRUE; - // initialize UI - [PhoneMainView.instance startUp]; - } - LinphoneManager *instance = LinphoneManager.instance; - [instance becomeActive]; - - NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:kLinphoneMsgNotificationAppGroupId]; - if (defaults) { - [defaults setBool:true forKey:@"appactive"]; - } - - if (instance.fastAddressBook.needToUpdate) { - //Update address book for external changes - if (PhoneMainView.instance.currentView == ContactsListView.compositeViewDescription || PhoneMainView.instance.currentView == ContactDetailsView.compositeViewDescription) { - [PhoneMainView.instance changeCurrentView:DialerView.compositeViewDescription]; - } - [instance.fastAddressBook fetchContactsInBackGroundThread]; - instance.fastAddressBook.needToUpdate = FALSE; - } - - LinphoneCall *call = linphone_core_get_current_call(LC); - - if (call) { - if (call == [CallManager.instance getBackgroundContextCall]) { - const LinphoneCallParams *params = - linphone_call_get_current_params(call); - if (linphone_call_params_video_enabled(params)) { - linphone_call_enable_camera(call, [CallManager.instance backgroundContextCameraIsEnabled]); - } - [CallManager.instance setBackgroundContextCallWithCall:nil]; - } else if (linphone_call_get_state(call) == LinphoneCallIncomingReceived) { - if ((floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max)) { - if ([LinphoneManager.instance lpConfigBoolForKey:@"autoanswer_notif_preference"]) { - linphone_call_accept(call); - } else { - [PhoneMainView.instance displayIncomingCall:call]; - } - } else { - // Click the call notification when callkit is disabled, show app view. - [PhoneMainView.instance displayIncomingCall:call]; - } - - // in this case, the ringing sound comes from the notification. - // To stop it we have to do the iOS7 ring fix... - [self fixRing]; - } - } - [LinphoneManager.instance.iapManager check]; - if (_shortcutItem) { - [self handleShortcut:_shortcutItem]; - _shortcutItem = nil; - } - -#if TARGET_IPHONE_SIMULATOR -#else - [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge) - completionHandler:^(BOOL granted, NSError *_Nullable error) { - if (error) - LOGD(error.description); - if (!granted) { - dispatch_async(dispatch_get_main_queue(), ^{ - UIAlertController *errView = - [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Push notification not allowed", nil) - message:NSLocalizedString(@"Push notifications are required to receive calls and messages.", nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"OK" - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *action){ - }]; - [errView addAction:defaultAction]; - [PhoneMainView.instance.mainViewController presentViewController:errView animated:YES completion:nil]; - }); - } else { - dispatch_async(dispatch_get_main_queue(), ^{ - [self configureUINotification]; - }); - } - - }]; -#endif - - - if ([UIDeviceBridge switchedDisplayMode]) { - [AvatarBridge prepareIt]; - [NSNotificationCenter.defaultCenter postNotificationName:kDisplayModeChanged object:nil]; - [PhoneMainView.instance.mainViewController removeEntryFromCache:ChatConversationCreateView.compositeViewDescription.name]; - [PhoneMainView.instance.mainViewController changeView:PhoneMainView.instance.currentView]; - [UIDeviceBridge notifyDisplayModeSwitch]; - } - -} - -#pragma deploymate push "ignored-api-availability" - - -- (void)configureUINotification { - if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) - return; - - LOGI(@"Connecting for UNNotifications"); - // Call category - UNNotificationAction *act_ans = - [UNNotificationAction actionWithIdentifier:@"Answer" - title:NSLocalizedString(@"Answer", nil) - options:UNNotificationActionOptionForeground]; - UNNotificationAction *act_dec = [UNNotificationAction actionWithIdentifier:@"Decline" - title:NSLocalizedString(@"Decline", nil) - options:UNNotificationActionOptionNone]; - UNNotificationCategory *cat_call = - [UNNotificationCategory categoryWithIdentifier:@"call_cat" - actions:[NSArray arrayWithObjects:act_ans, act_dec, nil] - intentIdentifiers:[[NSMutableArray alloc] init] - options:UNNotificationCategoryOptionCustomDismissAction]; - // Msg category - /* - UNTextInputNotificationAction *act_reply = - [UNTextInputNotificationAction actionWithIdentifier:@"Reply" - title:NSLocalizedString(@"Reply", nil) - options:UNNotificationActionOptionNone]; - UNNotificationAction *act_seen = - [UNNotificationAction actionWithIdentifier:@"Seen" - title:NSLocalizedString(@"Mark as seen", nil) - options:UNNotificationActionOptionNone]; - UNNotificationCategory *cat_msg = - [UNNotificationCategory categoryWithIdentifier:@"msg_cat" - actions:[NSArray arrayWithObjects:act_reply, act_seen, nil] - intentIdentifiers:[[NSMutableArray alloc] init] - options:UNNotificationCategoryOptionCustomDismissAction]; - */ - - // Video Request Category - UNNotificationAction *act_accept = - [UNNotificationAction actionWithIdentifier:@"Accept" - title:NSLocalizedString(@"Accept", nil) - options:UNNotificationActionOptionForeground]; - - UNNotificationAction *act_refuse = [UNNotificationAction actionWithIdentifier:@"Cancel" - title:NSLocalizedString(@"Cancel", nil) - options:UNNotificationActionOptionNone]; - UNNotificationCategory *video_call = - [UNNotificationCategory categoryWithIdentifier:@"video_request" - actions:[NSArray arrayWithObjects:act_accept, act_refuse, nil] - intentIdentifiers:[[NSMutableArray alloc] init] - options:UNNotificationCategoryOptionCustomDismissAction]; - - // ZRTP verification category - UNNotificationAction *act_confirm = [UNNotificationAction actionWithIdentifier:@"Confirm" - title:NSLocalizedString(@"Accept", nil) - options:UNNotificationActionOptionNone]; - - UNNotificationAction *act_deny = [UNNotificationAction actionWithIdentifier:@"Deny" - title:NSLocalizedString(@"Deny", nil) - options:UNNotificationActionOptionNone]; - UNNotificationCategory *cat_zrtp = - [UNNotificationCategory categoryWithIdentifier:@"zrtp_request" - actions:[NSArray arrayWithObjects:act_confirm, act_deny, nil] - intentIdentifiers:[[NSMutableArray alloc] init] - options:UNNotificationCategoryOptionCustomDismissAction]; - - //NSSet *categories = [NSSet setWithObjects:cat_call, cat_msg, video_call, cat_zrtp, nil]; - NSSet *categories = [NSSet setWithObjects:cat_call - , video_call, cat_zrtp, nil]; - [[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:categories]; - -} - -#pragma deploymate pop - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { -#ifdef USE_CRASHLYTICS - [FIRApp configure]; -#endif - [UNUserNotificationCenter currentNotificationCenter].delegate = self; - if ([VFSUtil vfsEnabledWithGroupName:kLinphoneMsgNotificationAppGroupId]) { - if (TARGET_IPHONE_SIMULATOR) { - LOGW(@"[VFS] Can not active for simulators."); - [VFSUtil setVfsEnabbledWithEnabled:false groupName:kLinphoneMsgNotificationAppGroupId]; - } else if (![VFSUtil activateVFSForFirstTime:false]) { - [VFSUtil log:@"[VFS] Error unable to activate." :OS_LOG_TYPE_ERROR]; - [VFSUtil setVfsEnabbledWithEnabled:false groupName:kLinphoneMsgNotificationAppGroupId]; - } - } - - UIApplication *app = [UIApplication sharedApplication]; - UIApplicationState state = app.applicationState; - - LinphoneManager *instance = [LinphoneManager instance]; - //init logs asapt - [Log enableLogs:[[LinphoneManager instance] lpConfigIntForKey:@"debugenable_preference"]]; - - - - - if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized) { - [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { - dispatch_async(dispatch_get_main_queue(), ^{ - if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized) { - [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Photo's permission", nil) message:NSLocalizedString(@"Photo not authorized", nil) delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Continue", nil] show]; - } - }); - }]; - } - - BOOL background_mode = [instance lpConfigBoolForKey:@"backgroundmode_preference"]; - BOOL start_at_boot = [instance lpConfigBoolForKey:@"start_at_boot_preference"]; - - if (state == UIApplicationStateBackground) { - // we've been woken up directly to background; - if (!start_at_boot || !background_mode) { - // autoboot disabled or no background, and no push: do nothing and wait for a real launch - //output a log with NSLog, because the ortp logging system isn't activated yet at this time - NSLog(@"Linphone launch doing nothing because start_at_boot or background_mode are not activated.", NULL); - return YES; - } - startedInBackground = true; - } - bgStartId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ - LOGW(@"Background task for application launching expired."); - [[UIApplication sharedApplication] endBackgroundTask:bgStartId]; - }]; - - [LinphoneManager.instance launchLinphoneCore]; - LinphoneManager.instance.iapManager.notificationCategory = @"expiry_notification"; - // initialize UI - [self.window makeKeyAndVisible]; - [RootViewManager setupWithPortrait:(PhoneMainView *)self.window.rootViewController]; - - if (bgStartId != UIBackgroundTaskInvalid) - [[UIApplication sharedApplication] endBackgroundTask:bgStartId]; - - //output what state the app is in. This will be used to see when the app is started in the background - LOGI(@"app launched with state : %li", (long)application.applicationState); - LOGI(@"FINISH LAUNCHING WITH OPTION : %@", launchOptions.description); - - UIApplicationShortcutItem *shortcutItem = [launchOptions objectForKey:@"UIApplicationLaunchOptionsShortcutItemKey"]; - if (shortcutItem) { - _shortcutItem = shortcutItem; - return NO; - } - - [PhoneMainView.instance.mainViewController getCachedController:SingleCallView.compositeViewDescription.name]; // This will create the single instance of the SingleCallView including listeneres - [PhoneMainView.instance.mainViewController getCachedController:ConferenceCallView.compositeViewDescription.name]; // This will create the single instance of the ConferenceCallView including listeneres - [CallsViewModelBridge setupCallsViewNavigation]; - return YES; -} - -- (void)applicationWillTerminate:(UIApplication *)application { - LOGI(@"%@", NSStringFromSelector(_cmd)); - if (PhoneMainView.instance.currentView == ChatConversationView.compositeViewDescription) { - ChatConversationView *view = VIEW(ChatConversationView); - [view.tableController setChatRoom:NULL]; - } - - LinphoneManager.instance.conf = TRUE; - linphone_core_terminate_all_calls(LC); - [CallManager.instance removeAllCallInfos]; - [LinphoneManager.instance destroyLinphoneCore]; -} - -- (BOOL)handleShortcut:(UIApplicationShortcutItem *)shortcutItem { - BOOL success = NO; - if ([shortcutItem.type isEqualToString:@"linphone.phone.action.newMessage"]) { - [VIEW(ChatConversationCreateView) fragmentCompositeDescription]; - [PhoneMainView.instance changeCurrentView:ChatConversationCreateView.compositeViewDescription]; - success = YES; - } - return success; -} - -- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler { - completionHandler([self handleShortcut:shortcutItem]); -} - -- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options{ - NSString *scheme = [[url scheme] lowercaseString]; - if ([scheme isEqualToString:@"linphone-config"]) { - NSString *encodedURL = - [[url absoluteString] stringByReplacingOccurrencesOfString:@"linphone-config:" withString:@""]; - self.configURL = [encodedURL stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - - BOOL auto_apply_provisioning = [LinphoneManager.instance lpConfigBoolForKey:@"auto_apply_provisioning_config_uri_handler" inSection:@"app" withDefault:FALSE]; - if (auto_apply_provisioning) { - [SVProgressHUD show]; - [self attemptRemoteConfiguration]; - [SVProgressHUD dismiss]; - } else { - NSString *msg = [NSString stringWithFormat:NSLocalizedString(@" Do you want to download and apply configuration from this URL?\n\n%@", nil), encodedURL]; - UIConfirmationDialog* remoteConfigurationDialog =[UIConfirmationDialog ShowWithMessage:msg - cancelMessage:nil - confirmMessage:NSLocalizedString(@"APPLY", nil) - onCancelClick:^() {} - onConfirmationClick:^() { - [SVProgressHUD show]; - [self attemptRemoteConfiguration]; - [SVProgressHUD dismiss]; - }]; - [remoteConfigurationDialog setSpecialColor]; - } - } else if([[url scheme] isEqualToString:@"message-linphone"]) { - if ([[PhoneMainView.instance currentView] equal:ChatsListView.compositeViewDescription]) { - VIEW(ChatConversationViewSwift).sharingMedia = TRUE; - ChatsListView *view = VIEW(ChatsListView); - [view mediaSharing]; - }else{ - [SVProgressHUD dismiss]; - VIEW(ChatConversationViewSwift).sharingMedia = TRUE; - [PhoneMainView.instance popToView:ChatsListView.compositeViewDescription]; - } - } else if ([scheme isEqualToString:@"sip"]||[scheme isEqualToString:@"sips"]) { - // remove "sip://" from the URI, and do it correctly by taking resourceSpecifier and removing leading and - // trailing "/" - NSString *sipUri = [[url resourceSpecifier] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"/"]]; - [CallManager.instance performActionWhenCoreIsOnAction:^(void) { - [LinphoneManager.instance call: [LinphoneUtils normalizeSipOrPhoneAddress:sipUri]]; - }]; - } else if ([scheme isEqualToString:@"linphone-widget"]) { - if ([[url host] isEqualToString:@"call_log"] && - [[url path] isEqualToString:@"/show"]) { - [VIEW(HistoryDetailsView) setCallLogId:[url query]]; - [PhoneMainView.instance changeCurrentView:HistoryDetailsView.compositeViewDescription]; - } else if ([[url host] isEqualToString:@"chatroom"] && [[url path] isEqualToString:@"/show"]) { - NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:url - resolvingAgainstBaseURL:NO]; - NSArray *queryItems = urlComponents.queryItems; - NSString *peerAddress = [self valueForKey:@"peer" fromQueryItems:queryItems]; - NSString *localAddress = [self valueForKey:@"local" fromQueryItems:queryItems]; - LinphoneAddress *peer = linphone_address_new(peerAddress.UTF8String); - LinphoneAddress *local = linphone_address_new(localAddress.UTF8String); - LinphoneChatRoom *cr = linphone_core_find_chat_room(LC, peer, local); - linphone_address_unref(peer); - linphone_address_unref(local); - // TODO : Find a better fix - VIEW(ChatConversationViewSwift).markAsRead = FALSE; - [PhoneMainView.instance goToChatRoomSwift:cr]; - } - } - return YES; -} - -// used for callkit. Called when active video. -- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray> * _Nullable))restorationHandler -{ - if ([userActivity.activityType isEqualToString:@"INStartAudioCallIntent"]) { // tel URI handler. - INInteraction *interaction = userActivity.interaction; - INStartAudioCallIntent *startAudioCallIntent = (INStartAudioCallIntent *)interaction.intent; - INPerson *contact = startAudioCallIntent.contacts[0]; - INPersonHandle *personHandle = contact.personHandle; - [CallManager.instance performActionWhenCoreIsOnAction:^(void) { - [LinphoneManager.instance call: [LinphoneUtils normalizeSipOrPhoneAddress:personHandle.value]]; - }]; - - } - - return YES; -} - -- (NSString *)valueForKey:(NSString *)key fromQueryItems:(NSArray *)queryItems { - NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name=%@", key]; - NSURLQueryItem *queryItem = [[queryItems filteredArrayUsingPredicate:predicate] firstObject]; - return queryItem.value; -} - -- (void)fixRing { - if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { - // iOS7 fix for notification sound not stopping. - // see http://stackoverflow.com/questions/19124882/stopping-ios-7-remote-notification-sound - [[UIApplication sharedApplication] setApplicationIconBadgeNumber:1]; - [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; - } -} - -- (BOOL)addLongTaskIDforCallID:(NSString *)callId { - if (!callId) - return FALSE; - - if ([callId isEqualToString:@""]) - return FALSE; - - NSDictionary *dict = LinphoneManager.instance.pushDict; - if ([[dict allKeys] indexOfObject:callId] != NSNotFound) - return FALSE; - - LOGI(@"Adding long running task for call id : %@ with index : 1", callId); - [dict setValue:[NSNumber numberWithInt:1] forKey:callId]; - return TRUE; -} - -- (LinphoneChatRoom *)findChatRoomForContact:(NSString *)contact { - const MSList *rooms = linphone_core_get_chat_rooms(LC); - const char *from = [contact UTF8String]; - while (rooms) { - const LinphoneAddress *room_from_address = linphone_chat_room_get_peer_address((LinphoneChatRoom *)rooms->data); - char *room_from = linphone_address_as_string_uri_only(room_from_address); - if (room_from && strcmp(from, room_from) == 0){ - ms_free(room_from); - return rooms->data; - } - if (room_from) ms_free(room_from); - rooms = rooms->next; - } - return NULL; -} - -#pragma mark - PushNotification Functions - -- (void)application:(UIApplication *)application - didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { - LOGI(@"[APNs] %@ : %@", NSStringFromSelector(_cmd), deviceToken); - dispatch_async(dispatch_get_main_queue(), ^{ - linphone_core_did_register_for_remote_push(LC, (__bridge void*)deviceToken); - }); -} - -- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { - LOGI(@"[APNs] %@ : %@", NSStringFromSelector(_cmd), [error localizedDescription]); - linphone_core_did_register_for_remote_push(LC, nil); -} - -#pragma mark - UNUserNotifications Framework - -- (void) userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler { - // If an app extension launch a user notif while app is in fg, it is catch by the app - NSString *category = [[[notification request] content] categoryIdentifier]; - if (category && [category isEqualToString:@"app_active"]) { - return; - } - - if (category && [category isEqualToString:@"msg_cat"] && [UIApplication sharedApplication].applicationState == UIApplicationStateActive) { - if ((PhoneMainView.instance.currentView == ChatsListView.compositeViewDescription)) - return; - - if (PhoneMainView.instance.currentView == ChatConversationViewSwift.compositeViewDescription) { - NSDictionary *userInfo = [[[notification request] content] userInfo]; - NSString *peerAddress = userInfo[@"peer_addr"]; - NSString *localAddress = userInfo[@"local_addr"]; - if (peerAddress && localAddress) { - LinphoneAddress *peer = linphone_core_create_address([LinphoneManager getLc], peerAddress.UTF8String); - LinphoneAddress *local = linphone_core_create_address([LinphoneManager getLc], localAddress.UTF8String); - LinphoneChatRoom *room = linphone_core_search_chat_room([LinphoneManager getLc], NULL, local, peer, NULL); - if (room == PhoneMainView.instance.currentRoom) return; - } - } - } - - completionHandler(UNNotificationPresentationOptionAlert); -} - --(void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { - LOGD(@"didReceiveRemoteNotification -- backgroundPush"); - - NSDictionary *customPayload = [userInfo objectForKey:@"customPayload"]; - if (customPayload && [customPayload objectForKey:@"token"]) { - [LinphoneManager.instance lpConfigSetString:[customPayload objectForKey:@"token"] forKey:@"account_creation_token" inSection:@"app"]; - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneAccountCreationAuthenticationTokenReceived object:nil]; - completionHandler(UIBackgroundFetchResultNewData); - } else { - if (linphone_core_get_global_state(LC) != LinphoneGlobalOn) { - [LinphoneManager.instance startLinphoneCore]; - [LinphoneManager.instance.fastAddressBook reloadFriends]; - } - - const MSList *accounts = linphone_core_get_account_list(LC); - while (accounts) { - LinphoneAccount *account = (LinphoneAccount *)accounts->data; - linphone_account_refresh_register(account); - accounts = accounts->next; - } - - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:kLinphoneMsgNotificationAppGroupId]; - NSMutableDictionary *chatroomsPushStatus = [[NSMutableDictionary alloc] initWithDictionary:[defaults dictionaryForKey:@"appactive"]]; - - if ([defaults boolForKey:@"appactive"] != TRUE) { - linphone_core_enter_background(LC); - if (linphone_core_get_calls_nb(LC) == 0) { - linphone_core_stop(LC); - } - } - completionHandler(UIBackgroundFetchResultNewData); - }); - } -} - -- (void)userNotificationCenter:(UNUserNotificationCenter *)center - didReceiveNotificationResponse:(UNNotificationResponse *)response - withCompletionHandler:(void (^)(void))completionHandler { - LOGD(@"UN : response received"); - LOGD(response.description); - - - if (![response.actionIdentifier isEqualToString:@"com.apple.UNNotificationDismissActionIdentifier"] && - [response.notification.request.content.userInfo objectForKey:@"missed_call"]) { - [PhoneMainView.instance changeCurrentView:VIEW(HistoryListView).compositeViewDescription]; - [PhoneMainView.instance.mainViewController didRotateFromInterfaceOrientation:PhoneMainView.instance.mainViewController.currentOrientation]; - return; - } - - startedInBackground = true; - - NSString *callId = (NSString *)[response.notification.request.content.userInfo objectForKey:@"CallId"]; - if (!callId) - return; - - LinphoneCall *call = [CallManager.instance findCallWithCallId:callId]; - - if ([response.actionIdentifier isEqual:@"Answer"]) { - // use the standard handler - [CallManager.instance acceptCallWithCall:call hasVideo:NO]; - linphone_call_accept(call); - } else if ([response.actionIdentifier isEqual:@"Decline"]) { - linphone_call_decline(call, LinphoneReasonDeclined); - } else if ([response.actionIdentifier isEqual:@"Reply"]) { - NSString *replyText = [(UNTextInputNotificationResponse *)response userText]; - NSString *peer_address = [response.notification.request.content.userInfo objectForKey:@"peer_addr"]; - NSString *local_address = [response.notification.request.content.userInfo objectForKey:@"local_addr"]; - LinphoneAddress *peer = linphone_address_new(peer_address.UTF8String); - LinphoneAddress *local = linphone_address_new(local_address.UTF8String); - LinphoneChatRoom *room = linphone_core_find_chat_room(LC, peer, local); - if(room) - [LinphoneManager.instance send:replyText toChatRoom:room]; - - linphone_address_unref(peer); - linphone_address_unref(local); - } else if ([response.actionIdentifier isEqual:@"Seen"]) { - NSString *peer_address = [response.notification.request.content.userInfo objectForKey:@"peer_addr"]; - NSString *local_address = [response.notification.request.content.userInfo objectForKey:@"local_addr"]; - LinphoneAddress *peer = linphone_address_new(peer_address.UTF8String); - LinphoneAddress *local = linphone_address_new(local_address.UTF8String); - LinphoneChatRoom *room = linphone_core_find_chat_room(LC, peer, local); - if (room) - [ChatConversationViewSwift markAsRead:room]; - - linphone_address_unref(peer); - linphone_address_unref(local); - } else if ([response.actionIdentifier isEqual:@"Cancel"]) { - LOGI(@"User declined video proposal"); - if (call != linphone_core_get_current_call(LC)) - return; - [CallManager.instance acceptVideoWithCall:call confirm:FALSE]; - } else if ([response.actionIdentifier isEqual:@"Accept"]) { - LOGI(@"User accept video proposal"); - if (call != linphone_core_get_current_call(LC)) - return; - - [[UNUserNotificationCenter currentNotificationCenter] removeAllDeliveredNotifications]; - [CallManager.instance acceptVideoWithCall:call confirm:TRUE]; - } else if ([response.actionIdentifier isEqual:@"Confirm"]) { - if (linphone_core_get_current_call(LC) == call) - linphone_call_set_authentication_token_verified(call, YES); - } else if ([response.actionIdentifier isEqual:@"Deny"]) { - if (linphone_core_get_current_call(LC) == call) - linphone_call_set_authentication_token_verified(call, NO); - } else if ([response.actionIdentifier isEqual:@"Call"]) { - return; - } else { // in this case the value is : com.apple.UNNotificationDefaultActionIdentifier or com.apple.UNNotificationDismissActionIdentifier - if ([response.notification.request.content.categoryIdentifier isEqual:@"call_cat"]) { - if ([response.actionIdentifier isEqualToString:@"com.apple.UNNotificationDismissActionIdentifier"]) - // clear notification - linphone_call_decline(call, LinphoneReasonDeclined); - else - [PhoneMainView.instance displayIncomingCall:call]; - } else if ([response.notification.request.content.categoryIdentifier isEqual:@"msg_cat"]) { - // prevent to go to chat room view when removing the notif - if (![response.actionIdentifier isEqualToString:@"com.apple.UNNotificationDismissActionIdentifier"]) { - NSString *peer_address = [response.notification.request.content.userInfo objectForKey:@"peer_addr"]; - NSString *local_address = [response.notification.request.content.userInfo objectForKey:@"local_addr"]; - LinphoneAddress *peer = linphone_address_new(peer_address.UTF8String); - LinphoneAddress *local = linphone_address_new(local_address.UTF8String); - LinphoneChatRoom *room = linphone_core_find_chat_room(LC, peer, local); - if (room) { - [PhoneMainView.instance resetBeforeGoToChatRoomSwift]; - [PhoneMainView.instance changeCurrentView:ChatsListView.compositeViewDescription]; - [PhoneMainView.instance goToChatRoomSwift:room]; - return; - } else { - [PhoneMainView.instance changeCurrentView:ChatsListView.compositeViewDescription]; - } - } - } else if ([response.notification.request.content.categoryIdentifier isEqual:@"video_request"]) { - if (!call) return; - NSTimer *videoDismissTimer = nil; - UIConfirmationDialog *sheet = [UIConfirmationDialog ShowWithMessage:response.notification.request.content.body - cancelMessage:nil - confirmMessage:NSLocalizedString(@"ACCEPT", nil) - onCancelClick:^() { - LOGI(@"User declined video proposal"); - if (call != linphone_core_get_current_call(LC)) - return; - [CallManager.instance acceptVideoWithCall:call confirm:FALSE]; - [videoDismissTimer invalidate]; - } - onConfirmationClick:^() { - LOGI(@"User accept video proposal"); - if (call != linphone_core_get_current_call(LC)) - return; - [CallManager.instance acceptVideoWithCall:call confirm:TRUE]; - [videoDismissTimer invalidate]; - } - inController:PhoneMainView.instance]; - - videoDismissTimer = [NSTimer scheduledTimerWithTimeInterval:30 - target:self - selector:@selector(dismissVideoActionSheet:) - userInfo:sheet - repeats:NO]; - } else if ([response.notification.request.content.categoryIdentifier isEqual:@"zrtp_request"]) { - if (!call) - return; - - NSString *code = [NSString stringWithUTF8String:linphone_call_get_authentication_token(call)]; - NSString *myCode; - NSString *correspondantCode; - if (linphone_call_get_dir(call) == LinphoneCallIncoming) { - myCode = [code substringToIndex:2]; - correspondantCode = [code substringFromIndex:2]; - } else { - correspondantCode = [code substringToIndex:2]; - myCode = [code substringFromIndex:2]; - } - NSString *message = [NSString stringWithFormat:NSLocalizedString(@"Confirm the following SAS with peer:\n" - @"Say : %@\n" - @"Your correspondant should say : %@", nil), myCode, correspondantCode]; - UIConfirmationDialog *securityDialog = [UIConfirmationDialog ShowWithMessage:message - cancelMessage:NSLocalizedString(@"DENY", nil) - confirmMessage:NSLocalizedString(@"ACCEPT", nil) - onCancelClick:^() { - if (linphone_core_get_current_call(LC) == call) - linphone_call_set_authentication_token_verified(call, NO); - } - onConfirmationClick:^() { - if (linphone_core_get_current_call(LC) == call) - linphone_call_set_authentication_token_verified(call, YES); - }]; - [securityDialog setSpecialColor]; - } else if ([response.notification.request.content.categoryIdentifier isEqual:@"lime"]) { - return; - } else { // Missed call - [PhoneMainView.instance changeCurrentView:HistoryListView.compositeViewDescription]; - } - } -} - -- (void)dismissVideoActionSheet:(NSTimer *)timer { - UIConfirmationDialog *sheet = (UIConfirmationDialog *)timer.userInfo; - [sheet dismiss]; -} - -#pragma mark - NSUser notifications -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wstrict-prototypes" - -- (void)application:(UIApplication *)application - handleActionWithIdentifier:(NSString *)identifier - forLocalNotification:(UILocalNotification *)notification - completionHandler:(void (^)(void))completionHandler { - - LinphoneCall *call = linphone_core_get_current_call(LC); - LOGI(@"%@", NSStringFromSelector(_cmd)); - if (floor(NSFoundationVersionNumber) < NSFoundationVersionNumber_iOS_9_0) { - LOGI(@"%@", NSStringFromSelector(_cmd)); - if ([notification.category isEqualToString:@"incoming_call"]) { - if ([identifier isEqualToString:@"answer"]) { - // use the standard handler - [CallManager.instance acceptCallWithCall:call hasVideo:NO]; - } else if ([identifier isEqualToString:@"decline"]) { - LinphoneCall *call = linphone_core_get_current_call(LC); - if (call) - linphone_call_decline(call, LinphoneReasonDeclined); - } - } else if ([notification.category isEqualToString:@"incoming_msg"]) { - if ([identifier isEqualToString:@"reply"]) { - // use the standard handler - [PhoneMainView.instance changeCurrentView:ChatsListView.compositeViewDescription]; - } else if ([identifier isEqualToString:@"mark_read"]) { - NSString *peer_address = [notification.userInfo objectForKey:@"peer_addr"]; - NSString *local_address = [notification.userInfo objectForKey:@"local_addr"]; - LinphoneAddress *peer = linphone_address_new(peer_address.UTF8String); - LinphoneAddress *local = linphone_address_new(local_address.UTF8String); - LinphoneChatRoom *room = linphone_core_find_chat_room(LC, peer, local); - if (room) - [ChatConversationViewSwift markAsRead:room]; - - linphone_address_unref(peer); - linphone_address_unref(local); - } - } - } - completionHandler(); -} - -- (void)application:(UIApplication *)application - handleActionWithIdentifier:(NSString *)identifier - forLocalNotification:(UILocalNotification *)notification - withResponseInfo:(NSDictionary *)responseInfo - completionHandler:(void (^)(void))completionHandler { - - LinphoneCall *call = linphone_core_get_current_call(LC); - if ([notification.category isEqualToString:@"incoming_call"]) { - if ([identifier isEqualToString:@"answer"]) { - // use the standard handler - [CallManager.instance acceptCallWithCall:call hasVideo:NO]; - } else if ([identifier isEqualToString:@"decline"]) { - LinphoneCall *call = linphone_core_get_current_call(LC); - if (call) - linphone_call_decline(call, LinphoneReasonDeclined); - } - } else if ([notification.category isEqualToString:@"incoming_msg"] && - [identifier isEqualToString:@"reply_inline"]) { - NSString *replyText = [responseInfo objectForKey:UIUserNotificationActionResponseTypedTextKey]; - NSString *peer_address = [responseInfo objectForKey:@"peer_addr"]; - NSString *local_address = [responseInfo objectForKey:@"local_addr"]; - LinphoneAddress *peer = linphone_address_new(peer_address.UTF8String); - LinphoneAddress *local = linphone_address_new(local_address.UTF8String); - LinphoneChatRoom *room = linphone_core_find_chat_room(LC, peer, local); - if (room) - [LinphoneManager.instance send:replyText toChatRoom:room]; - - linphone_address_unref(peer); - linphone_address_unref(local); - } - completionHandler(); -} -#pragma clang diagnostic pop -#pragma deploymate pop - -#pragma mark - Remote configuration Functions (URL Handler) - -- (void)ConfigurationStateUpdateEvent:(NSNotification *)notif { - LinphoneConfiguringState state = [[notif.userInfo objectForKey:@"state"] intValue]; - if (state == LinphoneConfiguringSuccessful) { - if (linphone_config_has_entry(LinphoneManager.instance.configDb, "misc", "max_calls")) { // Not doable on core on iOS (requires CallKit) -> flag moved to app section, and have app handle it in ProviderDelegate - linphone_config_set_int(LinphoneManager.instance.configDb, "app", "max_calls", linphone_config_get_int(LinphoneManager.instance.configDb,"misc", "max_calls",10)); - linphone_config_clean_entry(LinphoneManager.instance.configDb, "misc", "max_calls"); - - } - [NSNotificationCenter.defaultCenter removeObserver:self name:kLinphoneConfiguringStateUpdate object:nil]; - [_waitingIndicator dismissViewControllerAnimated:YES completion:nil]; - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Success", nil) - message:NSLocalizedString(@"Remote configuration successfully fetched and applied.", nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; - - [PhoneMainView.instance startUp]; - } - if (state == LinphoneConfiguringFailed) { - [NSNotificationCenter.defaultCenter removeObserver:self name:kLinphoneConfiguringStateUpdate object:nil]; - [_waitingIndicator dismissViewControllerAnimated:YES completion:nil]; - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Failure", nil) - message:NSLocalizedString(@"Failed configuring from the specified URL.", nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; - } -} - -- (void)attemptRemoteConfiguration { - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(ConfigurationStateUpdateEvent:) - name:kLinphoneConfiguringStateUpdate - object:nil]; - linphone_core_set_provisioning_uri(LC, [configURL UTF8String]); - [LinphoneManager.instance destroyLinphoneCore]; - [LinphoneManager.instance launchLinphoneCore]; - [LinphoneManager.instance.fastAddressBook fetchContactsInBackGroundThread]; -} - -#pragma mark - Prevent ImagePickerView from rotating - -- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { - if ([[(PhoneMainView*)self.window.rootViewController currentView] equal:ImagePickerView.compositeViewDescription] || _onlyPortrait) - { - //Prevent rotation of camera - NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait]; - [[UIDevice currentDevice] setValue:value forKey:@"orientation"]; - return UIInterfaceOrientationMaskPortrait; - } else return UIInterfaceOrientationMaskAllButUpsideDown; -} - -@end diff --git a/Classes/LinphoneCoreSettingsStore.h b/Classes/LinphoneCoreSettingsStore.h deleted file mode 100644 index b3e656704..000000000 --- a/Classes/LinphoneCoreSettingsStore.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import "IASKSettingsStore.h" - -#import "LinphoneManager.h" - -@interface LinphoneCoreSettingsStore : IASKAbstractSettingsStore { - @public - NSDictionary *dict; - NSDictionary *changedDict; -} - -- (void)transformLinphoneCoreToKeys; -- (void)transformAccountToKeys:(NSString *)username; -- (void)transformLdapToKeys:(NSString *)ldap_server; -- (void)removeAccount; -- (void)removeLdap; - -@end diff --git a/Classes/LinphoneCoreSettingsStore.m b/Classes/LinphoneCoreSettingsStore.m deleted file mode 100644 index 13e28207c..000000000 --- a/Classes/LinphoneCoreSettingsStore.m +++ /dev/null @@ -1,1246 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "linphoneapp-Swift.h" -#import "LinphoneCoreSettingsStore.h" -#import "Utils.h" -#import "PhoneMainView.h" - -#include "linphone/linphone_tunnel.h" -#include "linphone/lpconfig.h" -#include -#include - - -@implementation LinphoneCoreSettingsStore - -- (id)init { - self = [super init]; - if (self) { - dict = [[NSMutableDictionary alloc] init]; - changedDict = [[NSMutableDictionary alloc] init]; - } - return self; -} - -- (void)setCString:(const char *)value forKey:(NSString *)key { - id obj = @""; - if (value) - obj = [[NSString alloc] initWithCString:value encoding:NSUTF8StringEncoding]; - [self setObject:obj forKey:key]; -} - -- (NSString *)stringForKey:(NSString *)key { - return [self objectForKey:key]; -} - -- (void)setObject:(id)value forKey:(NSString *)key { - [dict setValue:value forKey:key]; - [changedDict setValue:[NSNumber numberWithBool:TRUE] forKey:key]; -} - -- (id)objectForKey:(NSString *)key { - return [dict valueForKey:key]; -} - -- (BOOL)valueChangedForKey:(NSString *)key { - return [[changedDict valueForKey:key] boolValue]; -} - -+ (int)validPort:(int)port { - if (port < 0) { - return 0; - } - if (port > 65535) { - return 65535; - } - return port; -} - -+ (BOOL)parsePortRange:(NSString *)text minPort:(int *)minPort maxPort:(int *)maxPort { - /*NSError *error = nil; - *minPort = -1; - *maxPort = -1; - NSRegularExpression *regex = - [NSRegularExpression regularExpressionWithPattern:@"([0-9]+)(([^0-9]+)([0-9]+))?" options:0 error:&error]; - if (error != NULL) - return FALSE; - NSArray *matches = [regex matchesInString:text options:0 range:NSMakeRange(0, [text length])]; - if ([matches count] == 1) { - NSTextCheckingResult *match = [matches objectAtIndex:0]; - bool range = [match rangeAtIndex:2].length > 0; - if (!range) { - NSRange rangeMinPort = [match rangeAtIndex:1]; - *minPort = [LinphoneCoreSettingsStore validPort:[[text substringWithRange:rangeMinPort] intValue]]; - *maxPort = *minPort; - return TRUE; - } else { - NSRange rangeMinPort = [match rangeAtIndex:1]; - *minPort = [LinphoneCoreSettingsStore validPort:[[text substringWithRange:rangeMinPort] intValue]]; - NSRange rangeMaxPort = [match rangeAtIndex:4]; - *maxPort = [LinphoneCoreSettingsStore validPort:[[text substringWithRange:rangeMaxPort] intValue]]; - if (*minPort > *maxPort) { - *minPort = *maxPort; - } - return TRUE; - } - }*/ - int err; - - err = sscanf(text.UTF8String, "%i - %i", minPort, maxPort); - if (err == 0) { - *minPort = *maxPort = -1; - } else if (err == 1) { - *maxPort = -1; - } - - // Minimal port allowed - if (*minPort < 1024) { - *minPort = -1; - } - // Maximal port allowed - if (*maxPort > 65535) { - *maxPort = -1; - } - // minPort must be inferior or equal to maxPort - if (*minPort > *maxPort) { - *maxPort = *minPort; - } - - return TRUE; -} - -- (void)transformCodecsToKeys:(const MSList *)codecs { - - const MSList *elem = codecs; - for (; elem != NULL; elem = elem->next) { - PayloadType *pt = (PayloadType *)elem->data; - NSString *pref = [LinphoneManager getPreferenceForCodec:pt->mime_type withRate:pt->clock_rate]; - if (pref) { - bool_t value = linphone_core_payload_type_enabled(LC, pt); - [self setBool:value forKey:pref]; - } else { - LOGW(@"Codec %s/%i supported by core is not shown in iOS app config view.", pt->mime_type, pt->clock_rate); - } - } -} - -- (void)transformAccountToKeys:(NSString *)username { - //const MSList *accountList = linphone_core_get_account_list(LC); - MSList *accountListToBeFreed = [LinphoneManager.instance createAccountsNotHiddenList]; - MSList *accountList = accountListToBeFreed; - while (username && accountList && - strcmp(username.UTF8String, - linphone_address_get_username(linphone_account_params_get_identity_address(linphone_account_get_params(accountList->data)))) != 0) { - accountList = accountList->next; - } - LinphoneAccount *account = NULL; - - // default values - { - [self setBool:NO forKey:@"account_pushnotification_preference"]; - [self setBool:NO forKey:@"account_bundle_mode_preference"]; - [self setObject:@"" forKey:@"account_mandatory_username_preference"]; - [self setObject:@"" forKey:@"account_mandatory_domain_preference"]; - [self setCString:"" forKey:@"account_display_name_preference"]; - [self setObject:@"" forKey:@"account_proxy_preference"]; - [self setObject:@"udp" forKey:@"account_transport_preference"]; - [self setBool:NO forKey:@"account_outbound_proxy_preference"]; - [self setBool:NO forKey:@"account_avpf_preference"]; - [self setBool:YES forKey:@"account_is_default_preference"]; - [self setBool:YES forKey:@"account_is_enabled_preference"]; - [self setCString:"" forKey:@"account_userid_preference"]; - [self setCString:"" forKey:@"account_mandatory_password_preference"]; - [self setCString:"" forKey:@"ha1_preference"]; - [self setCString:"" forKey:@"ha1_algo_preference"]; - [self setInteger:-1 forKey:@"account_expire_preference"]; - [self setInteger:-1 forKey:@"current_proxy_config_preference"]; - [self setCString:"" forKey:@"account_prefix_preference"]; - [self setBool:YES forKey:@"apply_international_prefix_for_calls_and_chats"]; - [self setBool:NO forKey:@"account_substitute_+_by_00_preference"]; - [self setBool:NO forKey:@"account_ice_preference"]; - [self setCString:"" forKey:@"account_stun_preference"]; - } - - if (accountList) { - account = accountList->data; - LinphoneAccountParams const *accountParams = linphone_account_get_params(account); - // root section - { - BOOL pushEnabled = linphone_account_params_get_push_notification_allowed(accountParams); - [self setBool:pushEnabled forKey:@"account_pushnotification_preference"]; - - BOOL bundleModeEnabled = linphone_account_params_rtp_bundle_enabled(accountParams); - [self setBool:bundleModeEnabled forKey:@"account_bundle_mode_preference"]; - - const LinphoneAddress *identity_addr = linphone_account_params_get_identity_address(accountParams); - const char *server_addr = linphone_account_params_get_server_addr(accountParams); - LinphoneAddress *proxy_addr = linphone_core_interpret_url_2(LC, server_addr, false); - if (identity_addr && proxy_addr) { - int port = linphone_address_get_port(proxy_addr); - - [self setCString:linphone_address_get_username(identity_addr) - forKey:@"account_mandatory_username_preference"]; - [self setCString:linphone_address_get_display_name(identity_addr) - forKey:@"account_display_name_preference"]; - [self setCString:linphone_address_get_domain(identity_addr) - forKey:@"account_mandatory_domain_preference"]; - if (strcmp(linphone_address_get_domain(identity_addr), linphone_address_get_domain(proxy_addr)) != 0 || - port > 0) { - char tmp[256] = {0}; - if (port > 0) { - snprintf(tmp, sizeof(tmp) - 1, "%s:%i", linphone_address_get_domain(proxy_addr), port); - } else - snprintf(tmp, sizeof(tmp) - 1, "%s", linphone_address_get_domain(proxy_addr)); - [self setCString:tmp forKey:@"account_proxy_preference"]; - } - const char *tname = "udp"; - 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"]; - } - - [self setBool:(linphone_account_params_get_routes_addresses(accountParams) != NULL) forKey:@"account_outbound_proxy_preference"]; - [self setBool:linphone_account_is_avpf_enabled(account) forKey:@"account_avpf_preference"]; - [self setBool:linphone_account_params_get_register_enabled(accountParams) forKey:@"account_is_enabled_preference"]; - [self setBool:(linphone_core_get_default_account(LC) == account) - forKey:@"account_is_default_preference"]; - - const LinphoneAuthInfo *ai = linphone_core_find_auth_info( - LC, NULL, [self stringForKey:@"account_mandatory_username_preference"].UTF8String, - [self stringForKey:@"account_mandatory_domain_preference"].UTF8String); - if (ai) { - [self setCString:linphone_auth_info_get_userid(ai) forKey:@"account_userid_preference"]; - [self setCString:linphone_auth_info_get_passwd(ai) forKey:@"account_mandatory_password_preference"]; - // hidden but useful if provisioned - [self setCString:linphone_auth_info_get_ha1(ai) forKey:@"ha1_preference"]; - [self setCString:linphone_auth_info_get_algorithm(ai) forKey:@"ha1_algo_preference"]; - } - - MSList *accountsList = [LinphoneManager.instance createAccountsNotHiddenList]; - int idx = (int)bctbx_list_index(linphone_core_get_account_list(LC), account); - [self setInteger:idx forKey:@"current_proxy_config_preference"]; - bctbx_list_free(accountsList); - - int expires = linphone_account_params_get_expires(accountParams); - [self setInteger:expires forKey:@"account_expire_preference"]; - - LinphoneNatPolicy *policy = linphone_account_params_get_nat_policy(accountParams); - if (policy) { - [self setBool:linphone_nat_policy_ice_enabled(policy) forKey:@"account_ice_preference"]; - [self setCString:linphone_nat_policy_get_stun_server(policy) forKey:@"account_stun_preference"]; - } - } - - // call section - { - const char *dial_prefix = linphone_account_params_get_international_prefix(accountParams); - [self setCString:dial_prefix forKey:@"account_prefix_preference"]; - BOOL apply_prefix = linphone_account_params_get_use_international_prefix_for_calls_and_chats(accountParams); - [self setBool:apply_prefix forKey:@"apply_international_prefix_for_calls_and_chats"]; - BOOL dial_escape_plus = linphone_account_params_get_dial_escape_plus_enabled(accountParams); - [self setBool:dial_escape_plus forKey:@"account_substitute_+_by_00_preference"]; - } - } - bctbx_list_free(accountListToBeFreed); -} - - -- (void)transformLdapToKeys:(NSString *)ldap_server { - const MSList *ldaps = linphone_core_get_ldap_list(LC); - while (ldap_server && ldaps && - strcmp(ldap_server.UTF8String, - linphone_ldap_params_get_server(linphone_ldap_get_params(ldaps->data))) != 0) { - ldaps = ldaps->next; - } - LinphoneLdap *ldap = NULL; - - // default values - { - [self setBool:YES forKey:@"ldap_enabled"]; - [self setObject:@"" forKey:@"ldap_server"]; - [self setObject:@"" forKey:@"ldap_bind_dn"]; - [self setObject:@"" forKey:@"ldap_password"]; - [self setObject:@"simple" forKey:@"ldap_auth_method"]; - [self setBool:YES forKey:@"ldap_tls_enabled"]; - [self setObject:@"default" forKey:@"ldap_certificates_verification_mode"]; - [self setObject:@"" forKey:@"ldap_filter"]; - [self setInteger:50 forKey:@"ldap_max_results"]; - [self setInteger:5 forKey:@"ldap_timeout"]; - [self setInteger:500 forKey:@"ldap_delay"]; - [self setInteger:3 forKey:@"ldap_min_chars"]; - [self setObject:@"" forKey:@"ldap_name_attribute"]; - [self setObject:@"" forKey:@"ldap_sip_attribute"]; - [self setObject:@"" forKey:@"ldap_sip_domain"]; - [self setBool:NO forKey:@"ldap_logs_enabled"]; - } - - if (ldaps) { - ldap = ldaps->data; - LinphoneLdapParams const *ldapParams = linphone_ldap_get_params(ldap); - - int idx = (int)bctbx_list_index(linphone_core_get_ldap_list(LC), ldap); - [self setInteger:idx forKey:@"current_ldap_index"]; - - [self setBool:linphone_ldap_params_get_enabled(ldapParams) forKey:@"ldap_enabled"]; - [self setCString:linphone_ldap_params_get_server(ldapParams) forKey:@"ldap_server"]; - [self setCString:linphone_ldap_params_get_bind_dn(ldapParams) forKey:@"ldap_bind_dn"]; - [self setCString:linphone_ldap_params_get_password(ldapParams) forKey:@"ldap_password"]; - [self setBool:linphone_ldap_params_tls_enabled(ldapParams) forKey:@"ldap_tls_enabled"]; - - switch (linphone_ldap_params_get_auth_method(ldapParams)) { - case LinphoneLdapAuthMethodSimple: - [self setObject:@"simple" forKey:@"ldap_auth_method"]; - break; - case LinphoneLdapAuthMethodAnonymous: - [self setObject:@"anonymous" forKey:@"ldap_auth_method"]; - break; - } - - switch (linphone_ldap_params_get_server_certificates_verification_mode(ldapParams)) { - case LinphoneLdapCertVerificationDefault: - [self setObject:@"default" forKey:@"ldap_certificates_verification_mode"]; - break; - case LinphoneLdapCertVerificationEnabled: - [self setObject:@"enabled" forKey:@"ldap_certificates_verification_mode"]; - break; - case LinphoneLdapCertVerificationDisabled: - [self setObject:@"disabled" forKey:@"ldap_certificates_verification_mode"]; - break; - } - - [self setCString:linphone_ldap_params_get_base_object(ldapParams) forKey:@"ldap_base_object"]; - [self setCString:linphone_ldap_params_get_filter(ldapParams) forKey:@"ldap_filter"]; - [self setInteger:linphone_ldap_params_get_max_results(ldapParams) forKey:@"ldap_max_results"]; - [self setInteger:linphone_ldap_params_get_timeout(ldapParams) forKey:@"ldap_timeout"]; - [self setInteger:linphone_ldap_params_get_delay(ldapParams) forKey:@"ldap_delay"]; - [self setInteger:linphone_ldap_params_get_min_chars(ldapParams) forKey:@"ldap_min_chars"]; - - - [self setCString:linphone_ldap_params_get_name_attribute(ldapParams) forKey:@"ldap_name_attribute"]; - [self setCString:linphone_ldap_params_get_sip_attribute(ldapParams) forKey:@"ldap_sip_attribute"]; - [self setCString:linphone_ldap_params_get_sip_domain(ldapParams) forKey:@"ldap_sip_domain"]; - - bool ldapLogsEnabled = linphone_ldap_params_get_debug_level(ldapParams) == LinphoneLdapDebugLevelVerbose; - [self setBool:ldapLogsEnabled forKey:@"ldap_logs_enabled"]; - } -} - -- (void)transformLinphoneCoreToKeys { - LinphoneManager *lm = LinphoneManager.instance; - - // root section - { - MSList *accountsListToBeFreed = [lm createAccountsNotHiddenList]; - MSList *accountsList = accountsListToBeFreed; - size_t count = bctbx_list_size(accountsList); - for (size_t i = 1; i <= count; i++, accountsList = accountsList->next) { - NSString *key = [NSString stringWithFormat:@"menu_account_%lu", i]; - LinphoneAccount *account = (LinphoneAccount *)accountsList->data; - [self setCString:linphone_address_get_username(linphone_account_params_get_identity_address(linphone_account_get_params(account))) - forKey:key]; - } - bctbx_free(accountsListToBeFreed); - - [self setBool:linphone_core_video_display_enabled(LC) forKey:@"enable_video_preference"]; - [self setBool:[LinphoneManager.instance lpConfigBoolForKey:@"auto_answer"] - forKey:@"enable_auto_answer_preference"]; - [self setBool:[lm lpConfigBoolForKey:@"account_mandatory_advanced_preference"] - forKey:@"account_mandatory_advanced_preference"]; - } - - // account section - { [self transformAccountToKeys:nil]; } - - // audio section - { - [self transformCodecsToKeys:linphone_core_get_audio_codecs(LC)]; - [self setFloat:linphone_core_get_playback_gain_db(LC) forKey:@"playback_gain_preference"]; - [self setFloat:linphone_core_get_mic_gain_db(LC) forKey:@"microphone_gain_preference"]; - [self setInteger:[lm lpConfigIntForKey:@"codec_bitrate_limit" - inSection:@"audio" - withDefault:kLinphoneAudioVbrCodecDefaultBitrate] - forKey:@"audio_codec_bitrate_limit_preference"]; - [self setInteger:[lm lpConfigIntForKey:@"voiceproc_preference" withDefault:1] forKey:@"voiceproc_preference"]; - [self setInteger:[lm lpConfigIntForKey:@"eq_active" inSection:@"sound" withDefault:0] forKey:@"eq_active"]; - } - - // video section - { - [self transformCodecsToKeys:linphone_core_get_video_codecs(LC)]; - - const LinphoneVideoPolicy *pol; - pol = linphone_core_get_video_policy(LC); - [self setBool:(pol->automatically_initiate) forKey:@"start_video_preference"]; - [self setBool:(pol->automatically_accept) forKey:@"accept_video_preference"]; - [self setBool:linphone_core_self_view_enabled(LC) forKey:@"self_video_preference"]; - BOOL previewEnabled = [lm lpConfigBoolForKey:@"preview_preference" withDefault:YES]; - [self setBool:IPAD && previewEnabled forKey:@"preview_preference"]; - - const char *preset = linphone_core_get_video_preset(LC); - [self setCString:preset ? preset : "default" forKey:@"video_preset_preference"]; - MSVideoSize vsize = linphone_core_get_preferred_video_size(LC); - int index; - if ((vsize.width == MS_VIDEO_SIZE_720P_W) && (vsize.height == MS_VIDEO_SIZE_720P_H)) { - index = 0; - } else if ((vsize.width == MS_VIDEO_SIZE_VGA_W) && (vsize.height == MS_VIDEO_SIZE_VGA_H)) { - index = 1; - } else { - index = 2; - } - [self setInteger:index forKey:@"video_preferred_size_preference"]; - [self setInteger:linphone_core_get_preferred_framerate(LC) forKey:@"video_preferred_fps_preference"]; - [self setInteger:linphone_core_get_download_bandwidth(LC) forKey:@"download_bandwidth_preference"]; - } - - // call section - { - - [self setBool:[lm lpConfigBoolForKey:@"use_device_ringtone"] forKey:@"use_device_ringtone"]; - - [self setBool:linphone_core_get_use_info_for_dtmf(LC) forKey:@"sipinfo_dtmf_preference"]; - [self setBool:linphone_core_get_use_rfc2833_for_dtmf(LC) forKey:@"rfc_dtmf_preference"]; - - [self setInteger:linphone_core_get_inc_timeout(LC) forKey:@"incoming_call_timeout_preference"]; - [self setInteger:linphone_core_get_in_call_timeout(LC) forKey:@"in_call_timeout_preference"]; - - [self setBool:[lm lpConfigBoolForKey:@"repeat_call_notification"] - forKey:@"repeat_call_notification_preference"]; - if (linphone_core_get_media_encryption(LC) == LinphoneMediaEncryptionNone) { - [self setBool:FALSE forKey:@"media_encrption_mandatory_preference"]; - linphone_core_set_media_encryption_mandatory(LC, FALSE); - } else { - [self setBool:linphone_core_is_media_encryption_mandatory(LC) forKey:@"media_encrption_mandatory_preference"]; - } - [self setBool:[lm lpConfigBoolForKey:@"pref_accept_early_media"] - forKey:@"pref_accept_early_media_preference"]; - } - - // chat section - { - [self setCString:linphone_core_get_file_transfer_server(LC) forKey:@"file_transfer_server_url_preference"]; - int maxSize = linphone_core_get_max_size_for_auto_download_incoming_files(LC); - [self setObject:maxSize==0 ? @"Always" : (maxSize==-1 ? @"Never" : @"Customize") forKey:@"auto_download_mode"]; - [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:NO] forKey:@"auto_write_to_gallery_mode"]; - } - - // network section - { - LinphoneNatPolicy *np = linphone_core_get_nat_policy(LC); - [self setBool:[lm lpConfigBoolForKey:@"edge_opt_preference" withDefault:NO] forKey:@"edge_opt_preference"]; - [self setBool:[lm lpConfigBoolForKey:@"wifi_only_preference" withDefault:NO] forKey:@"wifi_only_preference"]; - [self setCString:linphone_nat_policy_get_stun_server(np) forKey:@"stun_preference"]; - [self setBool:linphone_nat_policy_ice_enabled(np) forKey:@"ice_preference"]; - [self setBool:linphone_nat_policy_turn_enabled(np) forKey:@"turn_preference"]; - - [self setCString:linphone_nat_policy_get_stun_server_username(np) - forKey:@"turn_username"]; - - int random_port_preference = [lm lpConfigIntForKey:@"random_port_preference" withDefault:1]; - [self setInteger:random_port_preference forKey:@"random_port_preference"]; - int port = [lm lpConfigIntForKey:@"port_preference" withDefault:5060]; - [self setInteger:port forKey:@"port_preference"]; - { - int minPort, maxPort; - linphone_core_get_audio_port_range(LC, &minPort, &maxPort); - if (minPort != maxPort) - [self setObject:[NSString stringWithFormat:@"%d-%d", minPort, maxPort] forKey:@"audio_port_preference"]; - else - [self setObject:[NSString stringWithFormat:@"%d", minPort] forKey:@"audio_port_preference"]; - } - { - int minPort, maxPort; - linphone_core_get_video_port_range(LC, &minPort, &maxPort); - if (minPort != maxPort) - [self setObject:[NSString stringWithFormat:@"%d-%d", minPort, maxPort] forKey:@"video_port_preference"]; - else - [self setObject:[NSString stringWithFormat:@"%d", minPort] forKey:@"video_port_preference"]; - } - [self setBool:linphone_core_ipv6_enabled(LC) forKey:@"use_ipv6"]; - LinphoneMediaEncryption menc = linphone_core_get_media_encryption(LC); - const char *val; - switch (menc) { - case LinphoneMediaEncryptionSRTP: - val = "SRTP"; - break; - case LinphoneMediaEncryptionZRTP: - val = "ZRTP"; - break; - case LinphoneMediaEncryptionDTLS: - val = "DTLS"; - break; - case LinphoneMediaEncryptionNone: - val = "None"; - break; - } - [self setCString:val forKey:linphone_core_get_post_quantum_available() ? @"media_encryption_preference_pq_enabled" : @"media_encryption_preference"]; - [self setInteger:linphone_core_get_upload_bandwidth(LC) forKey:@"upload_bandwidth_preference"]; - [self setInteger:linphone_core_get_download_bandwidth(LC) forKey:@"download_bandwidth_preference"]; - [self setBool:linphone_core_adaptive_rate_control_enabled(LC) forKey:@"adaptive_rate_control_preference"]; - [self setObject:[lm lpConfigStringForKey:@"dns_server_ip"] forKey:@"dns_server_preference"]; - [self setCString:[lm lpConfigStringForKey:@"ssids" inSection:@"local_push"].UTF8String forKey:@"local_push_ssids"]; - - } - - // tunnel section - if (linphone_core_tunnel_available()) { - LinphoneTunnel *tunnel = linphone_core_get_tunnel(LC); - [self setObject:[lm lpConfigStringForKey:@"tunnel_mode_preference" withDefault:@"off"] - forKey:@"tunnel_mode_preference"]; - const MSList *configs = linphone_tunnel_get_servers(tunnel); - if (configs != NULL) { - LinphoneTunnelConfig *ltc = (LinphoneTunnelConfig *)configs->data; - [self setCString:linphone_tunnel_config_get_host(ltc) forKey:@"tunnel_address_preference"]; - [self setInteger:linphone_tunnel_config_get_port(ltc) forKey:@"tunnel_port_preference"]; - } else { - [self setCString:"" forKey:@"tunnel_address_preference"]; - [self setInteger:443 forKey:@"tunnel_port_preference"]; - } - } - - // contacts section - { - [self setInteger:[lm lpConfigBoolForKey:@"account_push_presence_preference" withDefault:YES] forKey:@"account_push_presence_preference"]; - if (linphone_core_ldap_available(LC)) { - [self transformLdapToKeys:nil]; - } - } - - // advanced section - { - [self setObject:[lm lpConfigStringForKey:@"debugenable_preference"] forKey:@"debugenable_preference"]; - [self setBool:ANIMATED forKey:@"animations_preference"]; - [self setBool:[lm lpConfigBoolForKey:@"backgroundmode_preference"] forKey:@"backgroundmode_preference"]; - [self setBool:[lm lpConfigBoolForKey:@"start_at_boot_preference"] forKey:@"start_at_boot_preference"]; - [self setBool:[lm lpConfigBoolForKey:@"screenshot_preference" withDefault:NO] forKey:@"screenshot_preference"]; - [self setBool:[lm lpConfigBoolForKey:@"autoanswer_notif_preference"] forKey:@"autoanswer_notif_preference"]; - [self setBool:[lm lpConfigBoolForKey:@"show_msg_in_notif" withDefault:YES] forKey:@"show_msg_in_notif"]; - [self setBool:[lm lpConfigBoolForKey:@"use_rls_presence" withDefault:YES] forKey:@"use_rls_presence"]; - [self setBool:[lm lpConfigBoolForKey:@"enable_first_login_view_preference"] - forKey:@"enable_first_login_view_preference"]; - [self setBool:[lm lpConfigBoolForKey:@"enable_broadcast_conference_feature" withDefault:NO] forKey:@"enable_broadcast_conference_feature"]; - LinphoneAddress *parsed = linphone_core_get_primary_contact_parsed(LC); - if (parsed != NULL) { - [self setCString:linphone_address_get_display_name(parsed) forKey:@"primary_displayname_preference"]; - [self setCString:linphone_address_get_username(parsed) forKey:@"primary_username_preference"]; - linphone_address_unref(parsed); - } - } - - changedDict = [[NSMutableDictionary alloc] init]; - - // Post event - NSDictionary *eventDic = [NSDictionary dictionaryWithObject:self forKey:@"settings"]; - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneLogsUpdate object:self userInfo:eventDic]; -} - -- (void)alertAccountError:(NSString *)error { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Error", nil) - message:error - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; -} - -- (void)synchronizeAccounts { - LOGI(@"Account changed, synchronizing."); - LinphoneManager *lm = LinphoneManager.instance; - LinphoneAccount *account = NULL; - LinphoneAccountParams *newAccountParams = NULL; - NSString *error = nil; - - int port_preference = [self integerForKey:@"port_preference"]; - - BOOL random_port_preference = [self boolForKey:@"random_port_preference"]; - [lm lpConfigSetInt:random_port_preference forKey:@"random_port_preference"]; - if (random_port_preference) { - port_preference = -1; - } - - LCSipTransports transportValue = {port_preference, port_preference, -1, -1}; - - // will also update the sip_*_port section of the config - if (linphone_core_set_sip_transports(LC, &transportValue)) { - LOGE(@"cannot set transport"); - } - - port_preference = linphone_core_get_sip_port(LC); - [self setInteger:port_preference forKey:@"port_preference"]; // Update back preference - - BOOL enable_ipv6 = [self boolForKey:@"use_ipv6"]; - [lm lpConfigSetBool:enable_ipv6 forKey:@"use_ipv6" inSection:@"sip"]; - LOGD(@"%@ IPV6", enable_ipv6 ? @"ENABLING" : @"DISABLING"); - linphone_core_enable_ipv6(LC, enable_ipv6); - - // configure sip account - - // mandatory parameters - NSString *username = [self stringForKey:@"account_mandatory_username_preference"]; - NSString *displayName = [self stringForKey:@"account_display_name_preference"]; - NSString *userID = [self stringForKey:@"account_userid_preference"]; - NSString *domain = [self stringForKey:@"account_mandatory_domain_preference"]; - NSString *transport = [self stringForKey:@"account_transport_preference"]; - NSString *accountHa1 = [self stringForKey:@"ha1_preference"]; - NSString *accountPassword = [self stringForKey:@"account_mandatory_password_preference"]; - NSString *accountAlgoPreference = [self stringForKey:@"ha1_algo_preference"]; - BOOL isOutboundProxy = [self boolForKey:@"account_outbound_proxy_preference"]; - BOOL use_avpf = [self boolForKey:@"account_avpf_preference"]; - BOOL is_default = [self boolForKey:@"account_is_default_preference"]; - BOOL is_enabled = [self boolForKey:@"account_is_enabled_preference"]; - BOOL use_ice = [self boolForKey:@"account_ice_preference"]; - NSString *stun_preference = [self stringForKey:@"account_stun_preference"]; - - if (username && [username length] > 0 && domain && [domain length] > 0) { - int expire = [self integerForKey:@"account_expire_preference"]; - BOOL pushnotification = [self boolForKey:@"account_pushnotification_preference"]; - BOOL bundlemode = [self boolForKey:@"account_bundle_mode_preference"]; - NSString *prefix = [self stringForKey:@"account_prefix_preference"]; - BOOL use_prefix = [self boolForKey:@"apply_international_prefix_for_calls_and_chats"]; - NSString *proxyAddress = [self stringForKey:@"account_proxy_preference"]; - - if ((!proxyAddress || [proxyAddress length] < 1) && domain) { - proxyAddress = domain; - } - - if (![proxyAddress hasPrefix:@"sip:"] && ![proxyAddress hasPrefix:@"sips:"]) { - proxyAddress = [NSString stringWithFormat:@"sip:%@", proxyAddress]; - } - - LinphoneAddress *proxy_addr = linphone_core_interpret_url_2(LC, proxyAddress.UTF8String, false); - - if (proxy_addr) { - LinphoneTransportType type = LinphoneTransportUdp; - if ([transport isEqualToString:@"tcp"]) - type = LinphoneTransportTcp; - else if ([transport isEqualToString:@"tls"]) - type = LinphoneTransportTls; - - linphone_address_set_transport(proxy_addr, type); - } - - MSList *accountList= [LinphoneManager.instance createAccountsNotHiddenList]; - account = bctbx_list_nth_data(accountList, - [self integerForKey:@"current_proxy_config_preference"]); - bctbx_free(accountList); - - // if account was deleted, it is not present anymore - if (account == NULL) - goto bad_proxy; - - - LinphoneAddress *linphoneAddress = linphone_address_clone(linphone_account_params_get_identity_address(linphone_account_get_params(account))); - 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); - if (user) { - linphone_address_set_username(linphoneAddress, user); - ms_free(user); - } - } - linphone_address_set_domain(linphoneAddress, [domain UTF8String]); - linphone_address_set_display_name(linphoneAddress, (displayName.length ? displayName.UTF8String : NULL)); - const char *password = [accountPassword UTF8String]; - const char *ha1 = [accountHa1 UTF8String]; - - newAccountParams = linphone_account_params_clone(linphone_account_get_params(account)); - - if (linphone_account_params_set_identity_address(newAccountParams, linphoneAddress) == -1) { - error = NSLocalizedString(@"Invalid username or domain", nil); - goto bad_proxy; - } - // use proxy as route if outbound_proxy is enabled - if (linphone_account_params_set_server_address(newAccountParams, proxy_addr) == -1) { - error = NSLocalizedString(@"Invalid proxy address", nil); - goto bad_proxy; - } - if (linphone_account_params_set_routes_addresses(newAccountParams, isOutboundProxy ? bctbx_list_new((void*)proxy_addr) : NULL) == -1) { - error = NSLocalizedString(@"Invalid route", nil); - goto bad_proxy; - } - - LinphoneNatPolicy *policy = linphone_account_params_get_nat_policy(newAccountParams) ?: linphone_core_create_nat_policy(LC); - linphone_nat_policy_enable_stun(policy, use_ice); // We always use STUN with ICE - linphone_nat_policy_enable_ice(policy, use_ice); - linphone_nat_policy_set_stun_server(policy, stun_preference.UTF8String); - linphone_account_params_set_nat_policy(newAccountParams, policy); - - linphone_account_params_set_international_prefix(newAccountParams, [prefix UTF8String]); - linphone_account_params_set_use_international_prefix_for_calls_and_chats(newAccountParams, use_prefix); - if ([self objectForKey:@"account_substitute_+_by_00_preference"]) { - bool substitute_plus_by_00 = [self boolForKey:@"account_substitute_+_by_00_preference"]; - linphone_account_params_set_dial_escape_plus_enabled(newAccountParams, substitute_plus_by_00); - } - - // use empty string "" instead of NULL to avoid being overwritten by default proxy config values - linphone_account_params_set_push_notification_allowed(newAccountParams, pushnotification); - linphone_account_params_enable_rtp_bundle(newAccountParams, bundlemode); - linphone_account_params_set_push_notification_allowed(newAccountParams, pushnotification); - linphone_account_params_set_remote_push_notification_allowed(newAccountParams, pushnotification); - - linphone_account_params_set_register_enabled(newAccountParams, is_enabled); - linphone_account_params_set_avpf_mode(newAccountParams, use_avpf); - linphone_account_params_set_expires(newAccountParams, expire); - - linphone_account_set_params(account, newAccountParams); - linphone_account_params_unref(newAccountParams); - if (is_default) { - linphone_core_set_default_account(LC, account); - } else if (linphone_core_get_default_account(LC) == account) { - linphone_core_set_default_account(LC, NULL); - } - - LinphoneAuthInfo *proxyAi = (LinphoneAuthInfo *)linphone_account_find_auth_info(account); - char *realm; - if (proxyAi) { - realm = ms_strdup(linphone_auth_info_get_realm(proxyAi)); - } else { - realm = NULL; - } - - // modify auth info only after finishing editting the proxy config, so that - // UNREGISTER succeed - if (proxyAi) { - linphone_core_remove_auth_info(LC, proxyAi); - } - if (strcmp(password,"") == 0) { - password = NULL; - } - - char *identity = linphone_address_as_string(linphoneAddress); - LinphoneAddress *from = linphone_core_interpret_url_2(LC, identity, false); - ms_free(identity); - if (from) { - const char *userid_str = (userID != nil) ? [userID UTF8String] : NULL; - LinphoneAuthInfo *info; - if (password) { - info = linphone_auth_info_new(linphone_address_get_username(from), userid_str, password, NULL, - linphone_account_params_get_realm(newAccountParams), - linphone_account_params_get_domain(newAccountParams)); - } else { - info = linphone_auth_info_new_for_algorithm(linphone_address_get_username(from) - , userid_str - , NULL - , ha1 - , realm ? realm : linphone_account_params_get_realm(newAccountParams), - linphone_account_params_get_domain(newAccountParams), [accountAlgoPreference UTF8String]); - } - - linphone_address_unref(from); - linphone_core_add_auth_info(LC, info); - linphone_auth_info_destroy(info); - ms_free(realm); - } - - bad_proxy: - if (linphoneAddress) - linphone_address_destroy(linphoneAddress); - - // in case of error, show an alert to the user - if (error != nil) { - if (newAccountParams != NULL) { // If we get here, then we're also sure that Account != NULL - - linphone_account_params_unref(newAccountParams); - } - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Error", nil) - message:error - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; - } - - } - // reload address book to prepend proxy config domain to contacts' phone number - [[LinphoneManager.instance fastAddressBook] fetchContactsInBackGroundThread]; -} - -- (void)synchronizeCodecs:(const MSList *)codecs { - PayloadType *pt; - const MSList *elem; - - for (elem = codecs; elem != NULL; elem = elem->next) { - pt = (PayloadType *)elem->data; - NSString *pref = [LinphoneManager getPreferenceForCodec:pt->mime_type withRate:pt->clock_rate]; - linphone_core_enable_payload_type(LC, pt, [self boolForKey:pref]); - } -} - -- (void)synchronizeLdap { - LOGI(@"LDAP config changed, synchronizing."); - - LinphoneLdap*ldap = bctbx_list_nth_data(linphone_core_get_ldap_list(LC), [self integerForKey:@"current_ldap_index"]); - if (!ldap) { - return; - } - - if ([self stringForKey:@"ldap_base_object"].length == 0) { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Error", nil) - message:@"LDAPResearch base must not be empty" - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; - return; - } - - LinphoneLdapParams *newLdapParams = linphone_ldap_params_clone(linphone_ldap_get_params(ldap)); - - // Connexion parameters - linphone_ldap_params_set_enabled(newLdapParams, [self boolForKey:@"ldap_enabled"]); - linphone_ldap_params_set_server(newLdapParams, [self stringForKey:@"ldap_server"].UTF8String); - linphone_ldap_params_set_bind_dn(newLdapParams, [self stringForKey:@"ldap_bind_dn"].UTF8String); - linphone_ldap_params_set_password(newLdapParams, [self stringForKey:@"ldap_password"].UTF8String); - - LinphoneLdapAuthMethod authMethod = [[self stringForKey:@"ldap_auth_method"] isEqualToString:@"simple"] ? LinphoneLdapAuthMethodSimple : LinphoneLdapAuthMethodAnonymous; - linphone_ldap_params_set_auth_method(newLdapParams, authMethod); - linphone_ldap_params_enable_tls(newLdapParams, [self boolForKey:@"ldap_tls_enabled"]); - - - LinphoneLdapCertVerificationMode certVerifMode = LinphoneLdapCertVerificationDefault; - NSString *certVerifModeStr = [self stringForKey:@"ldap_certificates_verification_mode"]; - if ([certVerifModeStr isEqualToString:@"enabled"]) - certVerifMode = LinphoneLdapCertVerificationEnabled; - else if ([certVerifModeStr isEqualToString:@"disabled"]) - certVerifMode = LinphoneLdapCertVerificationEnabled; - linphone_ldap_params_set_server_certificates_verification_mode(newLdapParams, certVerifMode); - - // Research parameters - linphone_ldap_params_set_base_object(newLdapParams, [self stringForKey:@"ldap_base_object"].UTF8String); - linphone_ldap_params_set_filter(newLdapParams, [self stringForKey:@"ldap_filter"].UTF8String); - linphone_ldap_params_set_max_results(newLdapParams, [self integerForKey:@"ldap_max_results"]); - linphone_ldap_params_set_timeout(newLdapParams, [self integerForKey:@"ldap_timeout"]); - linphone_ldap_params_set_delay(newLdapParams, [self integerForKey:@"ldap_delay"]); - linphone_ldap_params_set_min_chars(newLdapParams, [self integerForKey:@"ldap_min_chars"]); - - - - // Analysis parameters - linphone_ldap_params_set_name_attribute(newLdapParams, [self stringForKey:@"ldap_name_attribute"].UTF8String); - linphone_ldap_params_set_sip_attribute(newLdapParams, [self stringForKey:@"ldap_sip_attribute"].UTF8String); - linphone_ldap_params_set_sip_domain(newLdapParams, [self stringForKey:@"ldap_sip_domain"].UTF8String); - - // Miscellaneous parameters - LinphoneLdapDebugLevel debugLevel = [self boolForKey:@"ldap_logs_enabled"] ? LinphoneLdapDebugLevelVerbose : LinphoneLdapDebugLevelOff; - linphone_ldap_params_set_debug_level(newLdapParams, debugLevel); - - linphone_ldap_set_params(ldap, newLdapParams); -} - -- (BOOL)synchronize { - @try { - LinphoneManager *lm = LinphoneManager.instance; - - // root section - BOOL account_changed = NO; - for (NSString *key in self->changedDict) { - if ([key hasPrefix:@"account_"] && [self valueChangedForKey:key]) { - account_changed = YES; - break; - } - } - account_changed |= [self valueChangedForKey:@"port_preference"]; - account_changed |= [self valueChangedForKey:@"random_port_preference"]; - account_changed |= [self valueChangedForKey:@"use_ipv6"]; - - if (account_changed) - [self synchronizeAccounts]; - - bool enableVideo = [self boolForKey:@"enable_video_preference"]; - linphone_core_enable_video_capture(LC, enableVideo); - linphone_core_enable_video_display(LC, enableVideo); - - bool enableAutoAnswer = [self boolForKey:@"enable_auto_answer_preference"]; - [LinphoneManager.instance lpConfigSetBool:enableAutoAnswer forKey:@"auto_answer"]; - - // audio section - [self synchronizeCodecs:linphone_core_get_audio_codecs(LC)]; - - float playback_gain = [self floatForKey:@"playback_gain_preference"]; - linphone_core_set_playback_gain_db(LC, playback_gain); - - float mic_gain = [self floatForKey:@"microphone_gain_preference"]; - linphone_core_set_mic_gain_db(LC, mic_gain); - - [lm lpConfigSetInt:[self integerForKey:@"audio_codec_bitrate_limit_preference"] - forKey:@"codec_bitrate_limit" - inSection:@"audio"]; - - BOOL voice_processing = [self boolForKey:@"voiceproc_preference"]; - [lm lpConfigSetInt:voice_processing forKey:@"voiceproc_preference"]; - - BOOL equalizer = [self boolForKey:@"eq_active"]; - [lm lpConfigSetBool:equalizer forKey:@"eq_active" inSection:@"sound"]; - - [LinphoneManager.instance configureVbrCodecs]; - - NSString *au_device = @"AU: Audio Unit Receiver"; - if (!voice_processing) - au_device = @"AU: Audio Unit NoVoiceProc"; - - linphone_core_set_capture_device(LC, [au_device UTF8String]); - linphone_core_set_playback_device(LC, [au_device UTF8String]); - - // video section - [self synchronizeCodecs:linphone_core_get_video_codecs(LC)]; - - LinphoneVideoPolicy policy; - policy.automatically_initiate = [self boolForKey:@"start_video_preference"]; - policy.automatically_accept = [self boolForKey:@"accept_video_preference"]; - linphone_core_set_video_policy(LC, &policy); - linphone_core_enable_self_view(LC, [self boolForKey:@"self_video_preference"]); - BOOL preview_preference = IPAD && [self boolForKey:@"preview_preference"]; - [lm lpConfigSetInt:preview_preference forKey:@"preview_preference"]; - - NSString *videoPreset = [self stringForKey:@"video_preset_preference"]; - linphone_core_set_video_preset(LC, [videoPreset UTF8String]); - MSVideoSize vsize; - switch ([self integerForKey:@"video_preferred_size_preference"]) { - case 0: - MS_VIDEO_SIZE_ASSIGN(vsize, 720P); - break; - case 1: - MS_VIDEO_SIZE_ASSIGN(vsize, VGA); - break; - case 2: - default: - MS_VIDEO_SIZE_ASSIGN(vsize, QVGA); - break; - } - linphone_core_set_preferred_video_size(LC, vsize); - if (![videoPreset isEqualToString:@"custom"]) { - [self setInteger:0 forKey:@"video_preferred_fps_preference"]; - [self setInteger:0 forKey:@"download_bandwidth_preference"]; - } - linphone_core_set_preferred_framerate(LC, [self integerForKey:@"video_preferred_fps_preference"]); - linphone_core_set_download_bandwidth(LC, [self integerForKey:@"download_bandwidth_preference"]); - linphone_core_set_upload_bandwidth(LC, [self integerForKey:@"download_bandwidth_preference"]); - - // call section - linphone_core_set_use_rfc2833_for_dtmf(LC, [self boolForKey:@"rfc_dtmf_preference"]); - [lm lpConfigSetBool:[self boolForKey:@"use_device_ringtone"] forKey:@"use_device_ringtone"]; - [ProviderDelegate resetSharedProviderConfiguration]; - - linphone_core_set_use_info_for_dtmf(LC, [self boolForKey:@"sipinfo_dtmf_preference"]); - linphone_core_set_inc_timeout(LC, [self integerForKey:@"incoming_call_timeout_preference"]); - linphone_core_set_in_call_timeout(LC, [self integerForKey:@"in_call_timeout_preference"]); - [lm lpConfigSetString:[self stringForKey:@"voice_mail_uri_preference"] forKey:@"voice_mail_uri"]; - [lm lpConfigSetBool:[self boolForKey:@"repeat_call_notification_preference"] forKey:@"repeat_call_notification"]; - [lm lpConfigSetBool:[self boolForKey:@"pref_accept_early_media_preference"] forKey:@"pref_accept_early_media"]; - linphone_core_set_media_encryption_mandatory(LC, [self boolForKey:@"media_encrption_mandatory_preference"]); - - linphone_core_set_file_transfer_server(LC, [self stringForKey:@"file_transfer_server_url_preference"].UTF8String); - int maxSize; - NSString *downloadMode = [self stringForKey:@"auto_download_mode"]; - if ([downloadMode isEqualToString:@"Never"]) { - maxSize = -1; - } else if ([downloadMode isEqualToString:@"Always"]) { - maxSize = 0; - } else { - maxSize = [[self stringForKey:@"auto_download_incoming_files_max_size"] intValue]; - } - linphone_core_set_max_size_for_auto_download_incoming_files(LC, maxSize); - [lm lpConfigSetString:[self stringForKey:@"auto_download_mode"] forKey:@"auto_download_mode"]; - BOOL vfsPrefEnabled = [self boolForKey:@"vfs_enabled_mode"] || [VFSUtil vfsEnabledWithGroupName:kLinphoneMsgNotificationAppGroupId]; - if (vfsPrefEnabled && ![VFSUtil vfsEnabledWithGroupName:kLinphoneMsgNotificationAppGroupId]) { - if (TARGET_IPHONE_SIMULATOR) { - LOGW(@"[VFS] Can not active for simulators."); - [VFSUtil setVfsEnabbledWithEnabled:false groupName:kLinphoneMsgNotificationAppGroupId]; - [self setBool:FALSE forKey:@"vfs_enabled_mode"]; - } else if (![VFSUtil activateVFSForFirstTime:true]) { - [VFSUtil log:@"[VFS] Error unable to activate ! Warning disabling VFS enabled preference." :OS_LOG_TYPE_ERROR]; - [VFSUtil setVfsEnabbledWithEnabled:false groupName:kLinphoneMsgNotificationAppGroupId]; - [self setBool:FALSE forKey:@"vfs_enabled_mode"]; - } else { - [VFSUtil setVfsEnabbledWithEnabled:true groupName:kLinphoneMsgNotificationAppGroupId]; - [self setBool:TRUE forKey:@"vfs_enabled_mode"]; - } - } - [lm lpConfigSetBool:[self boolForKey:@"auto_write_to_gallery_mode"] forKey:@"auto_write_to_gallery_preference"]; - - // network section - BOOL edgeOpt = [self boolForKey:@"edge_opt_preference"]; - [lm lpConfigSetInt:edgeOpt forKey:@"edge_opt_preference"]; - - BOOL wifiOnly = [self boolForKey:@"wifi_only_preference"]; - [lm lpConfigSetInt:wifiOnly forKey:@"wifi_only_preference"]; - - LinphoneNatPolicy *LNP = linphone_core_get_nat_policy(LC); - - BOOL ice_preference = [self boolForKey:@"ice_preference"]; - linphone_nat_policy_enable_ice(LNP, ice_preference); - - linphone_nat_policy_enable_turn(LNP, [self boolForKey:@"turn_preference"]); - - NSString *stun_server = [self stringForKey:@"stun_preference"]; - if ([stun_server length] > 0) { - linphone_nat_policy_set_stun_server(LNP, [stun_server UTF8String]); - linphone_nat_policy_enable_stun(LNP, ice_preference); /*we always use STUN with ICE*/ - NSString *turn_username = [self stringForKey:@"turn_username"]; - NSString *turn_password = [self stringForKey:@"turn_password"]; - - if ([turn_username length] > 0) { - const LinphoneAuthInfo *turnAuthInfo = nil; - if ([turn_password length] > 0){ - turnAuthInfo = linphone_auth_info_new([turn_username UTF8String], NULL, [turn_password UTF8String], NULL, NULL, NULL); - linphone_core_add_auth_info(LC, turnAuthInfo); - } else - turnAuthInfo = linphone_core_find_auth_info(LC, NULL, [turn_username UTF8String], NULL); - - linphone_nat_policy_set_stun_server_username(LNP, [turn_username UTF8String]); - } - } else { - linphone_nat_policy_enable_stun(LNP, FALSE); - linphone_nat_policy_set_stun_server(LNP, NULL); - } - linphone_core_set_nat_policy(LC, LNP); - - NSString *audio_port_preference = [self stringForKey:@"audio_port_preference"]; - int audioMinPort, audioMaxPort; - [LinphoneCoreSettingsStore parsePortRange:audio_port_preference minPort:&audioMinPort maxPort:&audioMaxPort]; - linphone_core_set_audio_port_range(LC, audioMinPort, audioMaxPort); - - NSString *video_port_preference = [self stringForKey:@"video_port_preference"]; - int videoMinPort, videoMaxPort; - [LinphoneCoreSettingsStore parsePortRange:video_port_preference minPort:&videoMinPort maxPort:&videoMaxPort]; - linphone_core_set_video_port_range(LC, videoMinPort, videoMaxPort); - - NSString *menc = [self stringForKey:linphone_core_get_post_quantum_available() ? @"media_encryption_preference_pq_enabled" : @"media_encryption_preference"]; - if (menc && [menc compare:@"SRTP"] == NSOrderedSame) - linphone_core_set_media_encryption(LC, LinphoneMediaEncryptionSRTP); - else if (menc && [menc compare:@"ZRTP"] == NSOrderedSame) - linphone_core_set_media_encryption(LC, LinphoneMediaEncryptionZRTP); - else if (menc && [menc compare:@"DTLS"] == NSOrderedSame) - linphone_core_set_media_encryption(LC, LinphoneMediaEncryptionDTLS); - else { - linphone_core_set_media_encryption(LC, LinphoneMediaEncryptionNone); - [self setBool:FALSE forKey:@"media_encrption_mandatory_preference"]; - } - - linphone_core_enable_adaptive_rate_control(LC, [self boolForKey:@"adaptive_rate_control_preference"]); - - if ([self stringForKey:@"dns_server_preference"] != [lm lpConfigStringForKey:@"dns_server_ip"]) { - [lm lpConfigSetString:[self stringForKey:@"dns_server_preference"] forKey:@"dns_server_ip"]; - [lm setDnsServer]; - } - - [lm lpConfigSetString:[self stringForKey:@"local_push_ssids"] forKey:@"ssids" inSection:@"local_push"]; - /* if (@available(iOS 15.0, *)) { - [LocalPushManager.shared configureLocalPushWithCCoreConfig:lm.configDb]; - } else { - LOGW(@"Local push notifications not available for this ios version (iOS 15 minimum)"); - } */ - - - // tunnel section - if (linphone_core_tunnel_available()) { - NSString *lTunnelPrefMode = [self stringForKey:@"tunnel_mode_preference"]; - NSString *lTunnelPrefAddress = [self stringForKey:@"tunnel_address_preference"]; - int lTunnelPrefPort = [self integerForKey:@"tunnel_port_preference"]; - LinphoneTunnel *tunnel = linphone_core_get_tunnel(LC); - LinphoneTunnelMode mode = LinphoneTunnelModeDisable; - int lTunnelPort = 443; - if (lTunnelPrefPort) - lTunnelPort = lTunnelPrefPort; - - linphone_tunnel_clean_servers(tunnel); - if (lTunnelPrefAddress && [lTunnelPrefAddress length]) { - LinphoneTunnelConfig *ltc = linphone_tunnel_config_new(); - linphone_tunnel_config_set_host(ltc, [lTunnelPrefAddress UTF8String]); - linphone_tunnel_config_set_port(ltc, lTunnelPort); - linphone_tunnel_add_server(tunnel, ltc); - - if ([lTunnelPrefMode isEqualToString:@"off"]) - mode = LinphoneTunnelModeDisable; - else if ([lTunnelPrefMode isEqualToString:@"on"]) - mode = LinphoneTunnelModeEnable; - else if ([lTunnelPrefMode isEqualToString:@"auto"]) - mode = LinphoneTunnelModeAuto; - else - LOGE(@"Unexpected tunnel mode [%s]", [lTunnelPrefMode UTF8String]); - } - - [lm lpConfigSetString:lTunnelPrefMode forKey:@"tunnel_mode_preference"]; - linphone_tunnel_set_mode(tunnel, mode); - } - - // contacts section - BOOL push_presence = [self boolForKey:@"account_push_presence_preference"]; - if (push_presence) { - linphone_core_set_consolidated_presence([LinphoneManager getLc], LinphoneConsolidatedPresenceOnline); - } else { - linphone_core_set_consolidated_presence([LinphoneManager getLc], LinphoneConsolidatedPresenceOffline); - } - [lm lpConfigSetInt:push_presence forKey:@"account_push_presence_preference"]; - - BOOL ldap_changed = NO; - for (NSString *key in self->changedDict) { - if ([key hasPrefix:@"ldap_"] && [self valueChangedForKey:key]) { - ldap_changed = YES; - break; - } - } - if (ldap_changed) - [self synchronizeLdap]; - - // advanced section - BOOL animations = [self boolForKey:@"animations_preference"]; - [lm lpConfigSetInt:animations forKey:@"animations_preference"]; - - BOOL screenshot = [self boolForKey:@"screenshot_preference"]; - [lm lpConfigSetInt:screenshot forKey:@"screenshot_preference"]; - - BOOL broadcast = [self boolForKey:@"enable_broadcast_conference_feature"]; - [lm lpConfigSetInt:broadcast forKey:@"enable_broadcast_conference_feature"]; - - UIDevice *device = [UIDevice currentDevice]; - BOOL backgroundSupported = [device respondsToSelector:@selector(isMultitaskingSupported)] && [device isMultitaskingSupported]; - BOOL isbackgroundModeEnabled = backgroundSupported && [self boolForKey:@"backgroundmode_preference"]; - [lm lpConfigSetInt:isbackgroundModeEnabled forKey:@"backgroundmode_preference"]; - [lm lpConfigSetInt:[self integerForKey:@"start_at_boot_preference"] forKey:@"start_at_boot_preference"]; - [lm lpConfigSetInt:[self integerForKey:@"autoanswer_notif_preference"] forKey:@"autoanswer_notif_preference"]; - [lm lpConfigSetInt:[self integerForKey:@"show_msg_in_notif"] forKey:@"show_msg_in_notif"]; - - if ([self integerForKey:@"use_rls_presence"]) { - [self setInteger:0 forKey:@"use_rls_presence"]; - NSString *rls_uri = [lm lpConfigStringForKey:@"rls_uri" inSection:@"sip" withDefault:@"sips:rls@sip.linphone.org"]; - LinphoneAddress *rls_addr = linphone_address_new(rls_uri.UTF8String); - const char *rls_domain = linphone_address_get_domain(rls_addr); - - MSList *accountListToBeFreed = [LinphoneManager.instance createAccountsNotHiddenList]; - const MSList *accounts = accountListToBeFreed; - if (!accounts) // Enable it if no proxy config for first launch of app - [self setInteger:1 forKey:@"use_rls_presence"]; - else { - while (accounts) { - const char *proxy_domain = linphone_account_params_get_domain(linphone_account_get_params(accounts->data)); - if (strcmp(rls_domain, proxy_domain) == 0) { - [self setInteger:1 forKey:@"use_rls_presence"]; - break; - } - accounts = accounts->next; - } - } - linphone_address_unref(rls_addr); - bctbx_free(accountListToBeFreed); - } - - [lm lpConfigSetInt:[self integerForKey:@"use_rls_presence"] forKey:@"use_rls_presence"]; - linphone_core_enable_friend_list_subscription(LC, [self integerForKey:@"use_rls_presence"]); - - BOOL firstloginview = [self boolForKey:@"enable_first_login_view_preference"]; - [lm lpConfigSetInt:firstloginview forKey:@"enable_first_login_view_preference"]; - - NSString *displayname = [self stringForKey:@"primary_displayname_preference"]; - NSString *username = [self stringForKey:@"primary_username_preference"]; - LinphoneAddress *parsed = linphone_core_get_primary_contact_parsed(LC); - if (parsed != NULL) { - linphone_address_set_display_name(parsed, [displayname UTF8String]); - linphone_address_set_username(parsed, [username UTF8String]); - char *contact = linphone_address_as_string(parsed); - linphone_core_set_primary_contact(LC, contact); - ms_free(contact); - linphone_address_destroy(parsed); - } - [lm lpConfigSetInt:[self integerForKey:@"account_mandatory_advanced_preference"] forKey:@"account_mandatory_advanced_preference"]; - - changedDict = [[NSMutableDictionary alloc] init]; - - // Post event - NSDictionary *eventDic = [NSDictionary dictionaryWithObject:self forKey:@"settings"]; - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneSettingsUpdate object:self userInfo:eventDic]; - - return YES; - } @catch (NSException *exception) { - // may happen when application is terminated, since we are destroying the core - if ([exception.name isEqualToString:@"LinphoneCoreException"]) { - LOGE(@"Core already destroyed, settings not synchronized"); - return NO; - } - LOGE(@"Uncaught exception : %@", exception.description); - abort(); - } - return NO; -} - -- (void)removeAccount { - - MSList *accountList = [LinphoneManager.instance createAccountsNotHiddenList]; - LinphoneAccount *account = bctbx_list_nth_data(accountList, - [self integerForKey:@"current_proxy_config_preference"]); - - - const MSList *lists = linphone_core_get_friends_lists(LC); - while (lists) { - linphone_friend_list_enable_subscriptions(lists->data, FALSE); - linphone_friend_list_update_subscriptions(lists->data); - lists = lists->next; - } - BOOL isDefault = (linphone_core_get_default_account(LC) == account); - - const LinphoneAuthInfo *ai = linphone_account_find_auth_info(account); - linphone_core_remove_account(LC, account); - if (ai) { - // Friend list unsubscription above is not instantanous, so give a bit of a time margin before finishing the removal of the auth info - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - linphone_core_remove_auth_info(LC, ai); - }); - } - [self setInteger:-1 forKey:@"current_proxy_config_preference"]; - - if (isDefault) { - // if we removed the default proxy config, set another one instead - if (accountList != NULL) { - linphone_core_set_default_account(LC, (LinphoneAccount *)(accountList->data)); - } - } - [self transformLinphoneCoreToKeys]; - bctbx_free(accountList); -} - -- (void)removeLdap { - LinphoneLdap *ldap = bctbx_list_nth_data(linphone_core_get_ldap_list(LC), - [self integerForKey:@"current_ldap_index"]); - linphone_core_remove_ldap(LC, ldap); - [self transformLinphoneCoreToKeys]; -} -@end diff --git a/Classes/LinphoneManager.h b/Classes/LinphoneManager.h deleted file mode 100644 index 5524144f6..000000000 --- a/Classes/LinphoneManager.h +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import -#import -#import -#import - -#import - -#import "IASKSettingsReader.h" -#import "IASKSettingsStore.h" -#import "IASKAppSettingsViewController.h" -#import "FastAddressBook.h" -#import "InAppProductsManager.h" - -#include "linphone/linphonecore.h" -#include "bctoolbox/list.h" -#import "OrderedDictionary.h" - - -extern NSString *const LINPHONERC_APPLICATION_KEY; - -extern NSString *const kLinphoneCoreUpdate; -extern NSString *const kLinphoneDisplayStatusUpdate; -extern NSString *const kLinphoneMessageReceived; -extern NSString *const kLinphoneTextComposeEvent; -extern NSString *const kLinphoneCallUpdate; -extern NSString *const kLinphoneRegistrationUpdate; -extern NSString *const kLinphoneMainViewChange; -extern NSString *const kLinphoneAddressBookUpdate; -extern NSString *const kLinphoneLogsUpdate; -extern NSString *const kLinphoneSettingsUpdate; -extern NSString *const kLinphoneBluetoothAvailabilityUpdate; -extern NSString *const kLinphoneConfiguringStateUpdate; -extern NSString *const kLinphoneGlobalStateUpdate; -extern NSString *const kLinphoneNotifyReceived; -extern NSString *const kLinphoneNotifyPresenceReceivedForUriOrTel; -extern NSString *const kLinphoneCallEncryptionChanged; -extern NSString *const kLinphoneFileTransferSendUpdate; -extern NSString *const kLinphoneFileTransferRecvUpdate; -extern NSString *const kLinphoneQRCodeFound; -extern NSString *const kLinphoneChatCreateViewChange; -extern NSString *const kLinphoneEphemeralMessageDeletedInRoom; -extern NSString *const kLinphoneVoiceMessagePlayerEOF; -extern NSString *const kLinphoneVoiceMessagePlayerLostFocus; -extern NSString *const kLinphoneConfStateParticipantListChanged; -extern NSString *const kLinphoneConfStateChanged; -extern NSString *const kLinphoneMagicSearchStarted; -extern NSString *const kLinphoneMagicSearchFinished; -extern NSString *const kLinphoneMagicSearchMoreAvailable; -extern NSString *const kDisplayModeChanged; -extern NSString *const kLinphoneAccountCreationAuthenticationTokenReceived; - - -extern NSString *const kLinphoneMsgNotificationAppGroupId; - -typedef enum _NetworkType { - network_none = 0, - network_2g, - network_3g, - network_4g, - network_lte, - network_wifi -} NetworkType; - -extern const int kLinphoneAudioVbrCodecDefaultBitrate; - -typedef struct _LinphoneManagerSounds { - SystemSoundID vibrate; -} LinphoneManagerSounds; - -@interface LinphoneManager : NSObject { -@protected - SCNetworkReachabilityRef proxyReachability; - -@private - NSTimer* mIterateTimer; - NSMutableArray* pushCallIDs; - - UIBackgroundTaskIdentifier pausedCallBgTask; - UIBackgroundTaskIdentifier incallBgTask; - UIBackgroundTaskIdentifier pushBgTaskRefer; - UIBackgroundTaskIdentifier pushBgTaskCall; - UIBackgroundTaskIdentifier pushBgTaskMsg; - CTCallCenter* mCallCenter; - NSDate *mLastKeepAliveDate; -} -+ (LinphoneManager*)instance; -#ifdef DEBUG -+ (void)instanceRelease; -#endif -+ (LinphoneCore*) getLc; -+ (BOOL)isLcInitialized; -+ (BOOL)runningOnIpad; -+ (BOOL)isNotIphone3G; -+ (NSString *)getPreferenceForCodec: (const char*) name withRate: (int) rate; -+ (BOOL)isCodecSupported: (const char*)codecName; -+ (NSSet *)unsupportedCodecs; -+ (NSString *)getUserAgent; -+ (int)unreadMessageCount; - -- (void)configurePushProviderForAccounts; -- (void)playMessageSound; -- (void)resetLinphoneCore; -- (void)launchLinphoneCore; -- (void)destroyLinphoneCore; -- (void)startLinphoneCore; -- (BOOL)resignActive; -- (void)becomeActive; -- (BOOL)enterBackgroundMode; -- (void)addPushCallId:(NSString*) callid; -- (BOOL)popPushCallID:(NSString*) callId; -- (void)acceptCallForCallId:(NSString*)callid; -+ (BOOL)langageDirectionIsRTL; - -- (void)refreshRegisters; - -- (void)configureVbrCodecs; - -+ (BOOL)copyFile:(NSString*)src destination:(NSString*)dst override:(BOOL)override ignore:(BOOL)ignore; -+ (PHFetchResult *)getPHAssets:(NSString *)key; -+ (NSString*)bundleFile:(NSString*)file; -+ (NSString *)preferenceFile:(NSString *)file; -+ (NSString *)documentFile:(NSString *)file; -+ (NSString*)dataFile:(NSString*)file; -+ (NSString*)cacheDirectory; -+ (NSString *)imagesDirectory; -+ (NSString *)validFilePath:(NSString *)name; -// migration -+ (NSString *)oldPreferenceFile:(NSString *)file; -+ (NSString *)oldDataFile:(NSString *)file; - -- (void)send:(NSString *)replyText toChatRoom:(LinphoneChatRoom *)room; -- (void)call:(const LinphoneAddress *)address; - -+(id)getMessageAppDataForKey:(NSString*)key inMessage:(LinphoneChatMessage*)msg; -+(void)setValueInMessageAppData:(id)value forKey:(NSString*)key inMessage:(LinphoneChatMessage*)msg; - -- (void)lpConfigSetString:(NSString*)value forKey:(NSString*)key; -- (void)lpConfigSetString:(NSString *)value forKey:(NSString *)key inSection:(NSString *)section; -- (NSString *)lpConfigStringForKey:(NSString *)key; -- (NSString *)lpConfigStringForKey:(NSString *)key inSection:(NSString *)section; -- (NSString *)lpConfigStringForKey:(NSString *)key withDefault:(NSString *)value; -- (NSString *)lpConfigStringForKey:(NSString *)key inSection:(NSString *)section withDefault:(NSString *)value; - -- (void)lpConfigSetInt:(int)value forKey:(NSString *)key; -- (void)lpConfigSetInt:(int)value forKey:(NSString *)key inSection:(NSString *)section; -- (int)lpConfigIntForKey:(NSString *)key; -- (int)lpConfigIntForKey:(NSString *)key inSection:(NSString *)section; -- (int)lpConfigIntForKey:(NSString *)key withDefault:(int)value; -- (int)lpConfigIntForKey:(NSString *)key inSection:(NSString *)section withDefault:(int)value; - -- (void)lpConfigSetBool:(BOOL)value forKey:(NSString*)key; -- (void)lpConfigSetBool:(BOOL)value forKey:(NSString *)key inSection:(NSString *)section; -- (BOOL)lpConfigBoolForKey:(NSString *)key; -- (BOOL)lpConfigBoolForKey:(NSString *)key inSection:(NSString *)section; -- (BOOL)lpConfigBoolForKey:(NSString *)key withDefault:(BOOL)value; -- (BOOL)lpConfigBoolForKey:(NSString *)key inSection:(NSString *)section withDefault:(BOOL)value; - -- (void)silentPushFailed:(NSTimer*)timer; - -- (MSList *) createAccountsNotHiddenList; // needs to be unref -- (void)removeAllAccounts; - -+ (BOOL)isMyself:(const LinphoneAddress *)addr; - -- (void)shouldPresentLinkPopup; - -- (void) setContactsUpdated:(BOOL) updated; -- (BOOL) getContactsUpdated; - -- (void)checkNewVersion; - -- (void)loadAvatar; -- (void)migrationPerAccount; - -- (void)setupGSMInteraction; -- (BOOL)isCTCallCenterExist; -- (void)checkLocalNetworkPermission; -- (void)setDnsServer; - -+ (BOOL) getChatroomPushEnabled:(LinphoneChatRoom *)chatroom; -+ (void) setChatroomPushEnabled:(LinphoneChatRoom *)chatroom withPushEnabled:(BOOL)enabled; - -@property (readonly) BOOL isTesting; -@property(readonly, strong) FastAddressBook *fastAddressBook; -@property (readonly) NetworkType network; -@property (readonly) const char* frontCamId; -@property (readonly) const char* backCamId; -@property(strong, nonatomic) NSString *SSID; -@property (readonly) sqlite3* database; -@property (readonly) LinphoneManagerSounds sounds; -@property (readonly) NSMutableArray *logs; -@property (readonly) NSString* contactSipField; -@property (readonly,copy) NSString* contactFilter; -@property (copy) void (^silentPushCompletion)(UIBackgroundFetchResult); -@property (readonly) BOOL wasRemoteProvisioned; -@property (readonly) LpConfig *configDb; -@property(readonly) InAppProductsManager *iapManager; -@property(strong, nonatomic) NSMutableArray *fileTransferDelegates; -@property BOOL conf; -@property NSDictionary *pushDict; -@property(strong, nonatomic) OrderedDictionary *linphoneManagerAddressBookMap; -@property (nonatomic, assign) BOOL contactsUpdated; -@property UIImage *avatar; -@property NSString *customCoreDNS; - -@end diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m deleted file mode 100644 index fe19b2d5a..000000000 --- a/Classes/LinphoneManager.m +++ /dev/null @@ -1,2405 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include -#include -#include -#include - -#import "linphoneapp-Swift.h" -#import -#import -#import -#import -#import - -#import "LinphoneCoreSettingsStore.h" -#import "LinphoneAppDelegate.h" -#import "LinphoneManager.h" -#import "Utils/FileTransferDelegate.h" - -#include "linphone/factory.h" -#include "linphone/linphonecore_utils.h" -#include "linphone/lpconfig.h" -#include "mediastreamer2/mscommon.h" - -#import "LinphoneIOSVersion.h" - -#import "Utils.h" -#import "PhoneMainView.h" -#import "ChatsListView.h" -#import "ChatConversationView.h" -#import - -#define LINPHONE_LOGS_MAX_ENTRY 5000 - -static LinphoneCore *theLinphoneCore = nil; -static LinphoneManager *theLinphoneManager = nil; - -NSString *const LINPHONERC_APPLICATION_KEY = @"app"; - -NSString *const kLinphoneCoreUpdate = @"LinphoneCoreUpdate"; -NSString *const kLinphoneDisplayStatusUpdate = @"LinphoneDisplayStatusUpdate"; -NSString *const kLinphoneMessageReceived = @"LinphoneMessageReceived"; -NSString *const kLinphoneTextComposeEvent = @"LinphoneTextComposeStarted"; -NSString *const kLinphoneCallUpdate = @"LinphoneCallUpdate"; -NSString *const kLinphoneRegistrationUpdate = @"LinphoneRegistrationUpdate"; -NSString *const kLinphoneAddressBookUpdate = @"LinphoneAddressBookUpdate"; -NSString *const kLinphoneMainViewChange = @"LinphoneMainViewChange"; -NSString *const kLinphoneLogsUpdate = @"LinphoneLogsUpdate"; -NSString *const kLinphoneSettingsUpdate = @"LinphoneSettingsUpdate"; -NSString *const kLinphoneBluetoothAvailabilityUpdate = @"LinphoneBluetoothAvailabilityUpdate"; -NSString *const kLinphoneConfiguringStateUpdate = @"LinphoneConfiguringStateUpdate"; -NSString *const kLinphoneGlobalStateUpdate = @"LinphoneGlobalStateUpdate"; -NSString *const kLinphoneNotifyReceived = @"LinphoneNotifyReceived"; -NSString *const kLinphoneNotifyPresenceReceivedForUriOrTel = @"LinphoneNotifyPresenceReceivedForUriOrTel"; -NSString *const kLinphoneCallEncryptionChanged = @"LinphoneCallEncryptionChanged"; -NSString *const kLinphoneFileTransferSendUpdate = @"LinphoneFileTransferSendUpdate"; -NSString *const kLinphoneFileTransferRecvUpdate = @"LinphoneFileTransferRecvUpdate"; -NSString *const kLinphoneQRCodeFound = @"LinphoneQRCodeFound"; -NSString *const kLinphoneChatCreateViewChange = @"LinphoneChatCreateViewChange"; -NSString *const kLinphoneEphemeralMessageDeletedInRoom = @"LinphoneEphemeralMessageDeletedInRoom"; -NSString *const kLinphoneVoiceMessagePlayerEOF = @"LinphoneVoiceMessagePlayerEOF"; -NSString *const kLinphoneVoiceMessagePlayerLostFocus = @"LinphoneVoiceMessagePlayerLostFocus"; -NSString *const kLinphoneConfStateChanged = @"kLinphoneConfStateChanged"; -NSString *const kLinphoneConfStateParticipantListChanged = @"kLinphoneConfStateParticipantListChanged"; -NSString *const kLinphoneMagicSearchStarted = @"LinphoneMagicSearchStarted"; -NSString *const kLinphoneMagicSearchFinished = @"LinphoneMagicSearchFinished"; -NSString *const kLinphoneMagicSearchMoreAvailable = @"LinphoneMagicSearchMoreAvailable"; -NSString *const kDisplayModeChanged = @"DisplayModeChanged"; -NSString *const kLinphoneAccountCreationAuthenticationTokenReceived = @"LinphoneAccountCreationAuthenticationTokenReceived"; - -NSString *const kLinphoneMsgNotificationAppGroupId = @"group.org.linphone.phone.msgNotification"; - -const int kLinphoneAudioVbrCodecDefaultBitrate = 36; /*you can override this from linphonerc or linphonerc-factory*/ - -extern void libmsamr_init(MSFactory *factory); -extern void libmsopenh264_init(MSFactory *factory); -extern void libmssilk_init(MSFactory *factory); -extern void libmswebrtc_init(MSFactory *factory); -extern void libmscodec2_init(MSFactory *factory); - -#define FRONT_CAM_NAME \ - "AV Capture: com.apple.avfoundation.avcapturedevice.built-in_video:1" /*"AV Capture: Front Camera"*/ -#define BACK_CAM_NAME \ - "AV Capture: com.apple.avfoundation.avcapturedevice.built-in_video:0" /*"AV Capture: Back Camera"*/ - -NSString *const kLinphoneOldChatDBFilename = @"chat_database.sqlite"; -NSString *const kLinphoneInternalChatDBFilename = @"linphone_chats.db"; - -@interface LinphoneManager () - @property(strong, nonatomic) AVAudioPlayer *messagePlayer; -@end - -@implementation LinphoneManager - -struct codec_name_pref_table { - const char *name; - int rate; - const char *prefname; -}; - -struct codec_name_pref_table codec_pref_table[] = {{"speex", 8000, "speex_8k_preference"}, - {"speex", 16000, "speex_16k_preference"}, - {"silk", 24000, "silk_24k_preference"}, - {"silk", 16000, "silk_16k_preference"}, - {"amr", 8000, "amr_preference"}, - {"gsm", 8000, "gsm_preference"}, - {"ilbc", 8000, "ilbc_preference"}, - {"isac", 16000, "isac_preference"}, - {"pcmu", 8000, "pcmu_preference"}, - {"pcma", 8000, "pcma_preference"}, - {"g722", 8000, "g722_preference"}, - {"g729", 8000, "g729_preference"}, - {"mp4v-es", 90000, "mp4v-es_preference"}, - {"h264", 90000, "h264_preference"}, - {"h265", 90000, "h265_preference"}, - {"vp8", 90000, "vp8_preference"}, - {"mpeg4-generic", 16000, "aaceld_16k_preference"}, - {"mpeg4-generic", 22050, "aaceld_22k_preference"}, - {"mpeg4-generic", 32000, "aaceld_32k_preference"}, - {"mpeg4-generic", 44100, "aaceld_44k_preference"}, - {"mpeg4-generic", 48000, "aaceld_48k_preference"}, - {"opus", 48000, "opus_preference"}, - {"BV16", 8000, "bv16_preference"}, - {"CODEC2", 8000, "codec2_preference"}, - {NULL, 0, Nil}}; - -+ (NSString *)getPreferenceForCodec:(const char *)name withRate:(int)rate { - int i; - for (i = 0; codec_pref_table[i].name != NULL; ++i) { - if (strcasecmp(codec_pref_table[i].name, name) == 0 && codec_pref_table[i].rate == rate) - return [NSString stringWithUTF8String:codec_pref_table[i].prefname]; - } - return Nil; -} - -+ (NSSet *)unsupportedCodecs { - NSMutableSet *set = [NSMutableSet set]; - for (int i = 0; codec_pref_table[i].name != NULL; ++i) { - PayloadType *available = linphone_core_find_payload_type( - theLinphoneCore, codec_pref_table[i].name, codec_pref_table[i].rate, LINPHONE_FIND_PAYLOAD_IGNORE_CHANNELS); - if ((available == NULL) - // these two codecs should not be hidden, even if not supported - && strcmp(codec_pref_table[i].prefname, "h264_preference") != 0 && - strcmp(codec_pref_table[i].prefname, "mp4v-es_preference") != 0) { - [set addObject:[NSString stringWithUTF8String:codec_pref_table[i].prefname]]; - } - } - return set; -} - -+ (BOOL)isCodecSupported:(const char *)codecName { - return (codecName != NULL) && - (NULL != linphone_core_find_payload_type(theLinphoneCore, codecName, LINPHONE_FIND_PAYLOAD_IGNORE_RATE, - LINPHONE_FIND_PAYLOAD_IGNORE_CHANNELS)); -} - -+ (BOOL)runningOnIpad { - return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad); -} - -+ (BOOL)isRunningTests { - NSDictionary *environment = [[NSProcessInfo processInfo] environment]; - NSString *injectBundle = environment[@"XCInjectBundle"]; - return [[injectBundle pathExtension] isEqualToString:@"xctest"]; -} - -+ (BOOL)isNotIphone3G { - static BOOL done = FALSE; - static BOOL result; - if (!done) { - size_t size; - sysctlbyname("hw.machine", NULL, &size, NULL, 0); - char *machine = malloc(size); - sysctlbyname("hw.machine", machine, &size, NULL, 0); - NSString *platform = [[NSString alloc] initWithUTF8String:machine]; - free(machine); - - result = ![platform isEqualToString:@"iPhone1,2"]; - - done = TRUE; - } - return result; -} - -+ (NSString *)getUserAgent { - return - [NSString stringWithFormat:@"LinphoneIphone/%@ (Linphone/%s; Apple %@/%@)", - [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey], - linphone_core_get_version(), [UIDevice currentDevice].systemName, - [UIDevice currentDevice].systemVersion]; -} - -+ (LinphoneManager *)instance { - @synchronized(self) { - if (theLinphoneManager == nil) { - theLinphoneManager = [[LinphoneManager alloc] init]; - } - } - return theLinphoneManager; -} - -#ifdef DEBUG -+ (void)instanceRelease { - if (theLinphoneManager != nil) { - theLinphoneManager = nil; - } -} -#endif - -+ (BOOL)langageDirectionIsRTL { - static NSLocaleLanguageDirection dir = NSLocaleLanguageDirectionLeftToRight; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - dir = [NSLocale characterDirectionForLanguage:[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]]; - }); - return dir == NSLocaleLanguageDirectionRightToLeft; -} - -#pragma mark - Lifecycle Functions - -- (id)init { - if ((self = [super init])) { - - NSString *path = [[NSBundle mainBundle] pathForResource:@"msg" ofType:@"wav"]; - self.messagePlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL URLWithString:path] error:nil]; - - //_sounds.vibrate = kSystemSoundID_Vibrate; - - _logs = [[NSMutableArray alloc] init]; - _pushDict = [[NSMutableDictionary alloc] init]; - _database = NULL; - _conf = FALSE; - _fileTransferDelegates = [[NSMutableArray alloc] init]; - _linphoneManagerAddressBookMap = [[OrderedDictionary alloc] init]; - pushCallIDs = [[NSMutableArray alloc] init]; - _isTesting = [LinphoneManager isRunningTests]; - [self migrateImportantFiles]; - [self renameDefaultSettings]; - [self copyDefaultSettings]; - [self overrideDefaultSettings]; - - if (![self lpConfigBoolForKey:@"disable_chat_feature" withDefault:FALSE]) { - _sounds.vibrate = kSystemSoundID_Vibrate; - } - - if (![self lpConfigBoolForKey:@"migration_images_done" withDefault:FALSE]) { - [self migrationAllImages]; - } - - [self lpConfigSetString:[LinphoneManager dataFile:@"linphone.db"] forKey:@"uri" inSection:@"storage"]; - [self lpConfigSetString:[LinphoneManager dataFile:@"x3dh.c25519.sqlite3"] forKey:@"x3dh_db_path" inSection:@"lime"]; - // set default values for first boot - if ([self lpConfigStringForKey:@"debugenable_preference"] == nil) { -#ifdef DEBUG - [self lpConfigSetInt:1 forKey:@"debugenable_preference"]; -#else - [self lpConfigSetInt:0 forKey:@"debugenable_preference"]; -#endif - } - - // by default if handle_content_encoding is not set, we use plain text for debug purposes only - if ([self lpConfigStringForKey:@"handle_content_encoding" inSection:@"misc"] == nil) { -#ifdef DEBUG - [self lpConfigSetString:@"none" forKey:@"handle_content_encoding" inSection:@"misc"]; -#else - [self lpConfigSetString:@"conflate" forKey:@"handle_content_encoding" inSection:@"misc"]; -#endif - } - - if ([self lpConfigStringForKey:@"display_link_account_popup"] == nil) { - [self lpConfigSetBool:true forKey:@"display_link_account_popup"]; - } - - if ([self lpConfigStringForKey:@"hide_link_phone_number"] == nil) { - [self lpConfigSetInt:1 forKey:@"hide_link_phone_number"]; - } - - [self migrateFromUserPrefs]; - [self loadAvatar]; - } - return self; -} - -- (void)dealloc { - [NSNotificationCenter.defaultCenter removeObserver:self]; -} - -#pragma mark - Contacts Updated - -- (void) setContactsUpdated:(BOOL) updated{ - _contactsUpdated = updated; -} -- (BOOL) getContactsUpdated{ - return _contactsUpdated; -} - -#pragma deploymate push "ignored-api-availability" -- (void)silentPushFailed:(NSTimer *)timer { - if (_silentPushCompletion) { - LOGI(@"silentPush failed, silentPushCompletion block: %p", _silentPushCompletion); - _silentPushCompletion(UIBackgroundFetchResultNoData); - _silentPushCompletion = nil; - } -} -#pragma deploymate pop - -#pragma mark - Migration - -- (void)migrationAllPost { - [self migrationLinphoneSettings]; - [self migrationPerAccount]; -} - -- (void)migrationAllPre { - // migrate xmlrpc URL if needed - if ([self lpConfigBoolForKey:@"migration_xmlrpc"] == NO) { - [self lpConfigSetString:@"https://subscribe.linphone.org:444/wizard.php" - forKey:@"xmlrpc_url" - inSection:@"assistant"]; - [self lpConfigSetString:@"sip:rls@sip.linphone.org" forKey:@"rls_uri" inSection:@"sip"]; - [self lpConfigSetBool:YES forKey:@"migration_xmlrpc"]; - } - [self lpConfigSetBool:NO forKey:@"store_friends" inSection:@"misc"]; //so far, storing friends in files is not needed. may change in the future. - -} - -static int check_should_migrate_images(void *data, int argc, char **argv, char **cnames) { - *((BOOL *)data) = TRUE; - return 0; -} - -- (void)migrateFromUserPrefs { - static NSString *migration_flag = @"userpref_migration_done"; - - if (_configDb == nil) - return; - - if ([self lpConfigIntForKey:migration_flag withDefault:0]) { - return; - } - - NSDictionary *defaults = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]; - NSArray *defaults_keys = [defaults allKeys]; - NSDictionary *values = - @{ @"backgroundmode_preference" : @NO, - @"debugenable_preference" : @NO, - @"start_at_boot_preference" : @YES }; - BOOL shouldSync = FALSE; - - LOGI(@"%lu user prefs", (unsigned long)[defaults_keys count]); - - for (NSString *userpref in values) { - if ([defaults_keys containsObject:userpref]) { - LOGI(@"Migrating %@ from user preferences: %d", userpref, [[defaults objectForKey:userpref] boolValue]); - [self lpConfigSetBool:[[defaults objectForKey:userpref] boolValue] forKey:userpref]; - [[NSUserDefaults standardUserDefaults] removeObjectForKey:userpref]; - shouldSync = TRUE; - } else if ([self lpConfigStringForKey:userpref] == nil) { - // no default value found in our linphonerc, we need to add them - [self lpConfigSetBool:[[values objectForKey:userpref] boolValue] forKey:userpref]; - } - } - - if (shouldSync) { - LOGI(@"Synchronizing..."); - [[NSUserDefaults standardUserDefaults] synchronize]; - } - // don't get back here in the future - [self lpConfigSetBool:YES forKey:migration_flag]; -} - -- (void)migrationLinphoneSettings { - NSString *appDomain = [LinphoneManager.instance lpConfigStringForKey:@"domain_name" - inSection:@"app" - withDefault:@"sip.linphone.org"]; - - /* AVPF migration */ - if ([self lpConfigBoolForKey:@"avpf_migration_done"] == FALSE) { - const MSList *accounts = linphone_core_get_account_list(theLinphoneCore); - while (accounts) - { - LinphoneAccount *account = (LinphoneAccount *)accounts->data; - LinphoneAccountParams *newAccountParams = linphone_account_params_clone(linphone_account_get_params(account)); - const char *addr = linphone_account_params_get_server_addr(newAccountParams); - // we want to enable AVPF for the proxies - if (addr && - strstr(addr, [LinphoneManager.instance lpConfigStringForKey:@"domain_name" - inSection:@"app" - withDefault:@"sip.linphone.org"] - .UTF8String) != 0) { - LOGI(@"Migrating proxy config to use AVPF"); - linphone_account_params_set_avpf_mode(newAccountParams, LinphoneAVPFEnabled); - linphone_account_set_params(account, newAccountParams); - } - accounts = accounts->next; - linphone_account_params_unref(newAccountParams); - } - [self lpConfigSetBool:TRUE forKey:@"avpf_migration_done"]; - } - /* Quality Reporting migration */ - if ([self lpConfigBoolForKey:@"quality_report_migration_done"] == FALSE) { - const MSList *accounts = linphone_core_get_account_list(theLinphoneCore); - while (accounts) - { - LinphoneAccount *account = (LinphoneAccount *)accounts->data; - LinphoneAccountParams *newAccountParams = linphone_account_params_clone(linphone_account_get_params(account)); - const char *addr = linphone_account_params_get_server_addr(newAccountParams); - // we want to enable quality reporting for the proxies that are on linphone.org - if (addr && - strstr(addr, [LinphoneManager.instance lpConfigStringForKey:@"domain_name" - inSection:@"app" - withDefault:@"sip.linphone.org"] - .UTF8String) != 0) { - LOGI(@"Migrating proxy config to send quality report"); - - linphone_account_params_set_quality_reporting_collector( - newAccountParams, "sip:voip-metrics@sip.linphone.org;transport=tls"); - linphone_account_params_set_quality_reporting_interval(newAccountParams, 180); - linphone_account_params_set_quality_reporting_enabled(newAccountParams, TRUE); - linphone_account_set_params(account, newAccountParams); - } - accounts = accounts->next; - linphone_account_params_unref(newAccountParams); - } - [self lpConfigSetBool:TRUE forKey:@"quality_report_migration_done"]; - } - /* File transfer migration */ - if ([self lpConfigBoolForKey:@"file_transfer_migration_done"] == FALSE) { - const char *newURL = "https://www.linphone.org:444/lft.php"; - LOGI(@"Migrating sharing server url from %s to %s", linphone_core_get_file_transfer_server(LC), newURL); - linphone_core_set_file_transfer_server(LC, newURL); - [self lpConfigSetBool:TRUE forKey:@"file_transfer_migration_done"]; - } - - if ([self lpConfigBoolForKey:@"lime_migration_done"] == FALSE) { - const MSList *accounts = linphone_core_get_account_list(theLinphoneCore); - while (accounts) - { - if (!strcmp(linphone_account_params_get_domain(linphone_account_get_params((LinphoneAccount *)accounts->data)),"sip.linphone.org")) { - linphone_core_set_lime_x3dh_server_url(LC, "https://lime.linphone.org/lime-server/lime-server.php"); - break; - } - accounts = accounts->next; - } - [self lpConfigSetBool:TRUE forKey:@"lime_migration_done"]; - } - - if ([self lpConfigBoolForKey:@"push_notification_migration_done"] == FALSE) { - const MSList *accounts = linphone_core_get_account_list(theLinphoneCore); - bool_t pushEnabled; - while (accounts) - { - LinphoneAccount *account = (LinphoneAccount *)accounts->data; - LinphoneAccountParams *newAccountParams = linphone_account_params_clone(linphone_account_get_params(account)); - const char *refkey = linphone_account_params_get_ref_key(newAccountParams); - if (refkey) { - pushEnabled = (strcmp(refkey, "push_notification") == 0); - } else { - pushEnabled = true; - } - linphone_account_params_set_push_notification_allowed(newAccountParams, pushEnabled); - linphone_account_params_set_remote_push_notification_allowed(newAccountParams, pushEnabled); - linphone_account_set_params(account, newAccountParams); - linphone_account_params_unref(newAccountParams); - accounts = accounts->next; - } - [self lpConfigSetBool:TRUE forKey:@"push_notification_migration_done"]; - } - if ([self lpConfigBoolForKey:@"publish_enabled_migration_done"] == FALSE) { - const MSList *accounts = linphone_core_get_account_list(theLinphoneCore); - linphone_core_set_log_collection_upload_server_url(LC, "https://www.linphone.org:444/lft.php"); - [self lpConfigSetBool:TRUE forKey:@"update_presence_model_timestamp_before_publish_expires_refresh"]; - - while (accounts) - { - LinphoneAccount *account = (LinphoneAccount *)accounts->data; - LinphoneAccountParams *newAccountParams = linphone_account_params_clone(linphone_account_get_params(account)); - - if (strcmp(appDomain.UTF8String, linphone_account_params_get_domain(newAccountParams)) == 0) { - linphone_account_params_set_publish_enabled(newAccountParams, true); - linphone_account_params_set_publish_expires(newAccountParams, 120); - linphone_account_set_params(account, newAccountParams); - } - linphone_account_params_unref(newAccountParams); - accounts = accounts->next; - } - [self lpConfigSetBool:TRUE forKey:@"publish_enabled_migration_done"]; - } - - linphone_core_set_video_codec_priority_policy(LC, LinphoneCodecPriorityPolicyAuto); -} - -- (void)migrationPerAccount { - const MSList *accounts = linphone_core_get_account_list(theLinphoneCore); - NSString *appDomain = [LinphoneManager.instance lpConfigStringForKey:@"domain_name" - inSection:@"app" - withDefault:@"sip.linphone.org"]; - while (accounts) { - LinphoneAccount *account = accounts->data; - LinphoneAccountParams *newAccountParams = linphone_account_params_clone(linphone_account_get_params(account)); - - if (strcmp(appDomain.UTF8String, linphone_account_params_get_domain(newAccountParams)) == 0) { - // can not create group chat without conference factory - if (!linphone_account_params_get_conference_factory_uri(newAccountParams)) { - linphone_account_params_set_conference_factory_uri(newAccountParams, "sip:conference-factory@sip.linphone.org"); - linphone_account_set_params(account, newAccountParams); - } - - if (!linphone_account_params_get_audio_video_conference_factory_address(newAccountParams)) { - NSString *uri = [self lpConfigStringForKey:@"default_audio_video_conference_factory_uri" withDefault:@"sip:videoconference-factory2@sip.linphone.org"]; - LinphoneAddress *a = linphone_factory_create_address(linphone_factory_get(), uri.UTF8String); - if (a) { - linphone_account_params_set_audio_video_conference_factory_address(newAccountParams, a); - linphone_account_set_params(account, newAccountParams); - } - } - - /* - if (!linphone_account_params_rtp_bundle_enabled(newAccountParams)) { - linphone_account_params_enable_rtp_bundle(newAccountParams, true); - linphone_account_set_params(account,newAccountParams); - } - */ - - LOGI(@"Setting the sip 'expires' parameters of existing account to 1 year (31536000 seconds)"); - linphone_account_params_set_expires(newAccountParams, 31536000); - } - linphone_account_params_unref(newAccountParams); - accounts = accounts->next; - } - - NSString *s = [self lpConfigStringForKey:@"pushnotification_preference"]; - if (s && s.boolValue) { - LOGI(@"Migrating push notification per account, enabling for ALL"); - [self lpConfigSetBool:NO forKey:@"pushnotification_preference"]; - const MSList *accounts = linphone_core_get_account_list(theLinphoneCore); - while (accounts) { - LinphoneAccount *account = accounts->data; - LinphoneAccountParams *newAccountParams = linphone_account_params_clone(linphone_account_get_params(account)); - linphone_account_params_set_push_notification_allowed(newAccountParams, true); - linphone_account_params_set_remote_push_notification_allowed(newAccountParams, true); - linphone_account_set_params(account, newAccountParams); - linphone_account_params_unref(newAccountParams); - accounts = accounts->next; - } - } -} - -static void migrateWizardToAssistant(const char *entry, void *user_data) { - LinphoneManager *thiz = (__bridge LinphoneManager *)(user_data); - NSString *key = [NSString stringWithUTF8String:entry]; - [thiz lpConfigSetString:[thiz lpConfigStringForKey:key inSection:@"wizard"] forKey:key inSection:@"assistant"]; -} - -#pragma mark - Linphone Core Functions - -+ (LinphoneCore *)getLc { - if (theLinphoneCore == nil) { - @throw([NSException exceptionWithName:@"LinphoneCoreException" - reason:@"Linphone core not initialized yet" - userInfo:nil]); - } - return theLinphoneCore; -} - -+ (BOOL)isLcInitialized { - if (theLinphoneCore == nil) { - return NO; - } - return YES; -} - -#pragma mark Debug functions - -+ (void)dumpLcConfig { - if (theLinphoneCore) { - LpConfig *conf = LinphoneManager.instance.configDb; - char *config = linphone_config_dump(conf); - LOGI(@"\n%s", config); - ms_free(config); - } -} - -#pragma mark - Logs Functions handlers -static void linphone_iphone_log_user_info(struct _LinphoneCore *lc, const char *message) { - linphone_iphone_log_handler(NULL, ORTP_MESSAGE, message, NULL); -} -static void linphone_iphone_log_user_warning(struct _LinphoneCore *lc, const char *message) { - linphone_iphone_log_handler(NULL, ORTP_WARNING, message, NULL); -} - -#pragma mark - Display Status Functions - -- (void)displayStatus:(NSString *)message { - // Post event - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneDisplayStatusUpdate - object:self - userInfo:@{ - @"message" : message - }]; -} - -static void linphone_iphone_display_status(struct _LinphoneCore *lc, const char *message) { - NSString *status = [[NSString alloc] initWithCString:message encoding:[NSString defaultCStringEncoding]]; - [(__bridge LinphoneManager *)linphone_core_cbs_get_user_data(linphone_core_get_current_callbacks(lc)) displayStatus:status]; -} - -#pragma mark - Call State Functions - -- (void)localNotifContinue:(NSTimer *)timer { - UILocalNotification *notif = [timer userInfo]; - if (notif) { - LOGI(@"cancelling/presenting local notif"); - [[UIApplication sharedApplication] cancelAllLocalNotifications]; - [[UIApplication sharedApplication] presentLocalNotificationNow:notif]; - } -} - -- (void)userNotifContinue:(NSTimer *)timer { - UNNotificationContent *content = [timer userInfo]; - if (content && [UIApplication sharedApplication].applicationState != UIApplicationStateActive) { - LOGI(@"cancelling/presenting user notif"); - UNNotificationRequest *req = - [UNNotificationRequest requestWithIdentifier:@"call_request" content:content trigger:NULL]; - [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:req - withCompletionHandler:^(NSError *_Nullable error) { - // Enable or disable features based on authorization. - if (error) { - LOGD(@"Error while adding notification request :"); - LOGD(error.description); - } - }]; - } -} - -#pragma mark - Ephemeral State Functions -static void linphone_iphone_ephemeral_message_deleted(LinphoneCore *lc, LinphoneChatRoom *cr) { - LinphoneManager *lm = (__bridge LinphoneManager *)linphone_core_cbs_get_user_data(linphone_core_get_current_callbacks(lc)); - NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSValue valueWithPointer:cr], @"room", nil]; - - // dispatch the notification asynchronously - dispatch_async(dispatch_get_main_queue(), ^(void) { - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneEphemeralMessageDeletedInRoom object:lm userInfo:dict]; - }); - -} - -#pragma mark - Transfert State Functions - -static void linphone_iphone_transfer_state_changed(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState state) { -} - -#pragma mark - Global state change - -static void linphone_iphone_global_state_changed(LinphoneCore *lc, LinphoneGlobalState gstate, const char *message) { - [(__bridge LinphoneManager *)linphone_core_cbs_get_user_data(linphone_core_get_current_callbacks(lc)) onGlobalStateChanged:gstate withMessage:message]; -} - -- (void)onGlobalStateChanged:(LinphoneGlobalState)state withMessage:(const char *)message { - LOGI(@"onGlobalStateChanged: %d (message: %s)", state, message); - - NSDictionary *dict = [NSDictionary - dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:state], @"state", - [NSString stringWithUTF8String:message ? message : ""], @"message", nil]; - // dispatch the notification asynchronously - dispatch_async(dispatch_get_main_queue(), ^(void) { - if (theLinphoneCore && linphone_core_get_global_state(theLinphoneCore) != LinphoneGlobalOff) - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneGlobalStateUpdate object:self userInfo:dict]; - }); - - if (state == LinphoneGlobalOn) { - // reload friends - [self.fastAddressBook fetchContactsInBackGroundThread]; - /*if (@available(iOS 15.0, *)) { - [LocalPushManager.shared configureLocalPushWithCCoreConfig:linphone_core_get_config(LC)]; - } else { - LOGW(@"Local push notifications not available for this ios version (iOS 15 minimum)"); - }*/ - } -} - -- (void)globalStateChangedNotificationHandler:(NSNotification *)notif { - if ((LinphoneGlobalState)[[[notif userInfo] valueForKey:@"state"] integerValue] == LinphoneGlobalOn) { - [self finishCoreConfiguration]; - } -} - -#pragma mark - Configuring status changed - -static void linphone_iphone_configuring_status_changed(LinphoneCore *lc, LinphoneConfiguringState status, - const char *message) { - [(__bridge LinphoneManager *)linphone_core_cbs_get_user_data(linphone_core_get_current_callbacks(lc)) onConfiguringStatusChanged:status withMessage:message]; -} - -- (void)onConfiguringStatusChanged:(LinphoneConfiguringState)status withMessage:(const char *)message { - LOGI(@"onConfiguringStatusChanged: %s %@", linphone_configuring_state_to_string(status), - message ? [NSString stringWithFormat:@"(message: %s)", message] : @""); - NSDictionary *dict = [NSDictionary - dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:status], @"state", - [NSString stringWithUTF8String:message ? message : ""], @"message", nil]; - - // dispatch the notification asynchronously - dispatch_async(dispatch_get_main_queue(), ^(void) { - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneConfiguringStateUpdate - object:self - userInfo:dict]; - }); - - if (status == LinphoneConfiguringSuccessful) { - /*if (@available(iOS 15.0, *)) { - [LocalPushManager.shared configureLocalPushWithCCoreConfig:linphone_core_get_config(LC)]; - } else { - LOGW(@"Local push notifications not available for this ios version (iOS 15 minimum)"); - }*/ - } -} - -#pragma mark - Registration State Functions - -- (void)onRegister:(LinphoneCore *)lc -account:(LinphoneAccount *)account -state:(LinphoneRegistrationState)state -message:(const char *)cmessage { - LOGI(@"New registration state: %s (message: %s)", linphone_registration_state_to_string(state), cmessage); - - LinphoneReason reason = linphone_account_get_error(account); - NSString *message = nil; - switch (reason) { - case LinphoneReasonBadCredentials: - message = NSLocalizedString(@"Bad credentials, check your account settings", nil); - break; - case LinphoneReasonNoResponse: - message = NSLocalizedString(@"No response received from remote", nil); - break; - case LinphoneReasonUnsupportedContent: - message = NSLocalizedString(@"Unsupported content", nil); - break; - case LinphoneReasonIOError: - message = NSLocalizedString( - @"Cannot reach the server: either it is an invalid address or it may be temporary down.", nil); - break; - - case LinphoneReasonUnauthorized: - message = NSLocalizedString(@"Operation is unauthorized because missing credential", nil); - break; - case LinphoneReasonNoMatch: - message = NSLocalizedString(@"Operation could not be executed by server or remote client because it " - @"didn't have any context for it", - nil); - break; - case LinphoneReasonMovedPermanently: - message = NSLocalizedString(@"Resource moved permanently", nil); - break; - case LinphoneReasonGone: - message = NSLocalizedString(@"Resource no longer exists", nil); - break; - case LinphoneReasonTemporarilyUnavailable: - message = NSLocalizedString(@"Temporarily unavailable", nil); - break; - case LinphoneReasonAddressIncomplete: - message = NSLocalizedString(@"Address incomplete", nil); - break; - case LinphoneReasonNotImplemented: - message = NSLocalizedString(@"Not implemented", nil); - break; - case LinphoneReasonBadGateway: - message = NSLocalizedString(@"Bad gateway", nil); - break; - case LinphoneReasonServerTimeout: - message = NSLocalizedString(@"Server timeout", nil); - break; - case LinphoneReasonNotAcceptable: - case LinphoneReasonDoNotDisturb: - case LinphoneReasonDeclined: - case LinphoneReasonNotFound: - case LinphoneReasonNotAnswered: - case LinphoneReasonBusy: - case LinphoneReasonNone: - case LinphoneReasonUnknown: - message = NSLocalizedString(@"Unknown error", nil); - break; - } - - // Post event - NSDictionary *dict = - [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:state], @"state", - [NSValue valueWithPointer:account], @"account", message, @"message", nil]; - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneRegistrationUpdate object:self userInfo:dict]; -} - -static void linphone_iphone_registration_state(LinphoneCore *lc, LinphoneAccount *account, - LinphoneRegistrationState state, const char *message) { - [(__bridge LinphoneManager *)linphone_core_cbs_get_user_data(linphone_core_get_current_callbacks(lc)) onRegister:lc account:account state:state message:message]; -} - -#pragma mark - Auth info Function - -static void linphone_iphone_popup_password_request(LinphoneCore *lc, LinphoneAuthInfo *auth_info, LinphoneAuthMethod method) { - // let the wizard handle its own errors - if ([PhoneMainView.instance currentView] != AssistantView.compositeViewDescription) { - const char * realmC = linphone_auth_info_get_realm(auth_info); - const char * usernameC = linphone_auth_info_get_username(auth_info) ? : ""; - const char * domainC = linphone_auth_info_get_domain(auth_info) ? : ""; - static UIAlertController *alertView = nil; - - // InstantMessageDeliveryNotifications from previous accounts can trigger some pop-up spam asking for indentification - // Try to filter the popup password request to avoid displaying those that do not matter and can be handled through a simple warning - const MSList *accountList = linphone_core_get_account_list(LC); - bool foundMatchingConfig = false; - while (accountList && !foundMatchingConfig) { - LinphoneAccountParams const *accountParams = linphone_account_get_params(accountList->data); - const char * configUsername = linphone_address_get_username(linphone_account_params_get_identity_address(accountParams)); - const char * configDomain = linphone_account_params_get_domain(accountParams); - foundMatchingConfig = (strcmp(configUsername, usernameC) == 0) && (strcmp(configDomain, domainC) == 0); - accountList = accountList->next; - } - if (!foundMatchingConfig) { - LOGW(@"Received an authentication request from %s@%s, but ignored it did not match any current user", usernameC, domainC); - return; - } - - // avoid having multiple popups - [PhoneMainView.instance dismissViewControllerAnimated:YES completion:nil]; - - // dont pop up if we are in background, in any case we will refresh registers when entering - // the application again - if ([[UIApplication sharedApplication] applicationState] != UIApplicationStateActive) { - return; - } - - NSString *realm = [NSString stringWithUTF8String:realmC?:domainC]; - NSString *username = [NSString stringWithUTF8String:usernameC]; - NSString *domain = [NSString stringWithUTF8String:domainC]; - alertView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Authentification needed", nil) - message:[NSString stringWithFormat:NSLocalizedString(@"Connection failed because authentication is " - @"missing or invalid for %@@%@.\nYou can " - @"provide password again, or check your " - @"account configuration in the settings.", nil), username, realm] - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [alertView addTextFieldWithConfigurationHandler:^(UITextField *textField) { - textField.placeholder = NSLocalizedString(@"Password", nil); - textField.clearButtonMode = UITextFieldViewModeWhileEditing; - textField.borderStyle = UITextBorderStyleRoundedRect; - textField.secureTextEntry = YES; - }]; - - UIAlertAction* continueAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Confirm password", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - NSString *password = alertView.textFields[0].text; - LinphoneAuthInfo *info = - linphone_auth_info_new(username.UTF8String, NULL, password.UTF8String, NULL, - realm.UTF8String, domain.UTF8String); - linphone_core_add_auth_info(LC, info); - [LinphoneManager.instance refreshRegisters]; - }]; - - UIAlertAction* settingsAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Go to settings", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - [PhoneMainView.instance changeCurrentView:SettingsView.compositeViewDescription]; - }]; - - [alertView addAction:defaultAction]; - [alertView addAction:continueAction]; - [alertView addAction:settingsAction]; - [PhoneMainView.instance presentViewController:alertView animated:YES completion:nil]; - } -} - -#pragma mark - Text Received Functions - -- (void)onMessageReceived:(LinphoneCore *)lc room:(LinphoneChatRoom *)room message:(LinphoneChatMessage *)msg { -#pragma deploymate push "ignored-api-availability" - if (_silentPushCompletion) { - // we were woken up by a silent push. Call the completion handler with NEWDATA - // so that the push is notified to the user - LOGI(@"onMessageReceived - handler %p", _silentPushCompletion); - _silentPushCompletion(UIBackgroundFetchResultNewData); - _silentPushCompletion = nil; - } -#pragma deploymate pop - NSString *callID = [NSString stringWithUTF8String:linphone_chat_message_get_custom_header(msg, "Call-ID")]; - - int index = [(NSNumber *)[_pushDict objectForKey:callID] intValue] - 1; - LOGI(@"Decrementing index of long running task for call id : %@ with index : %d", callID, index); - [_pushDict setValue:[NSNumber numberWithInt:index] forKey:callID]; - BOOL need_bg_task = FALSE; - for (NSString *key in [_pushDict allKeys]) { - int value = [(NSNumber *)[_pushDict objectForKey:key] intValue]; - if (value > 0) { - need_bg_task = TRUE; - break; - } - } - if (pushBgTaskMsg && !need_bg_task) { - LOGI(@"Message received, stopping message background task for call-id [%@]", callID); - [[UIApplication sharedApplication] endBackgroundTask:pushBgTaskMsg]; - pushBgTaskMsg = 0; - } - - BOOL hasFile = FALSE; - // if auto_download is available and file is downloaded - if ((linphone_core_get_max_size_for_auto_download_incoming_files(LC) > -1) && linphone_chat_message_get_file_transfer_information(msg)) - hasFile = TRUE; - - if (!linphone_chat_message_is_file_transfer(msg) && !linphone_chat_message_is_text(msg) && !hasFile && ![ICSBubbleView isConferenceInvitationMessageWithCmessage:msg]) - return; - - if (hasFile) { - if (PhoneMainView.instance.currentView == ChatConversationViewSwift.compositeViewDescription && room == PhoneMainView.instance.currentRoom) - return; - [self autoDownload:msg]; - } - - // Post event - NSDictionary *dict = @{ - @"room" : [NSValue valueWithPointer:room], - @"from_address" : [NSValue valueWithPointer:linphone_chat_message_get_from_address(msg)], - @"message" : [NSValue valueWithPointer:msg], - @"call-id" : callID - }; - - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneMessageReceived object:self userInfo:dict]; -} - -- (void)autoDownload:(LinphoneChatMessage *)message { - LinphoneContent *content = linphone_chat_message_get_file_transfer_information(message); - NSString *name = [NSString stringWithUTF8String:linphone_content_get_name(content)]; - NSString *fileType = [NSString stringWithUTF8String:linphone_content_get_type(content)]; - NSString *key = [ChatConversationViewSwift getKeyFromFileType:fileType fileName:name]; - - [LinphoneManager setValueInMessageAppData:name forKey:key inMessage:message]; - dispatch_async(dispatch_get_main_queue(), ^{ - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneMessageReceived object:VIEW(ChatConversationViewSwift)]; - if (![VFSUtil vfsEnabledWithGroupName:kLinphoneMsgNotificationAppGroupId] && [ConfigManager.instance lpConfigBoolForKeyWithKey:@"auto_write_to_gallery_preference"]) { - [ChatConversationViewSwift writeMediaToGalleryFromName:name fileType:fileType]; - } - }); -} - -static void linphone_iphone_message_received(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *message) { - [(__bridge LinphoneManager *)linphone_core_cbs_get_user_data(linphone_core_get_current_callbacks(lc)) onMessageReceived:lc room:room message:message]; -} - -static void linphone_iphone_message_received_unable_decrypt(LinphoneCore *lc, LinphoneChatRoom *room, - LinphoneChatMessage *message) { -} - -- (void)onNotifyReceived:(LinphoneCore *)lc -event:(LinphoneEvent *)lev -notifyEvent:(const char *)notified_event -content:(const LinphoneContent *)body { - // Post event - NSMutableDictionary *dict = [NSMutableDictionary dictionary]; - [dict setObject:[NSValue valueWithPointer:lev] forKey:@"event"]; - [dict setObject:[NSString stringWithUTF8String:notified_event] forKey:@"notified_event"]; - if (body != NULL) { - [dict setObject:[NSValue valueWithPointer:body] forKey:@"content"]; - } - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneNotifyReceived object:self userInfo:dict]; -} - -static void linphone_iphone_notify_received(LinphoneCore *lc, LinphoneEvent *lev, const char *notified_event, - const LinphoneContent *body) { - [(__bridge LinphoneManager *)linphone_core_cbs_get_user_data(linphone_core_get_current_callbacks(lc)) onNotifyReceived:lc - event:lev - notifyEvent:notified_event - content:body]; -} - -- (void)onNotifyPresenceReceivedForUriOrTel:(LinphoneCore *)lc -friend:(LinphoneFriend *)lf -uri:(const char *)uri -presenceModel:(const LinphonePresenceModel *)model { - // Post event - NSMutableDictionary *dict = [NSMutableDictionary dictionary]; - [dict setObject:[NSValue valueWithPointer:lf] forKey:@"friend"]; - [dict setObject:[NSValue valueWithPointer:uri] forKey:@"uri"]; - [dict setObject:[NSValue valueWithPointer:model] forKey:@"presence_model"]; - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneNotifyPresenceReceivedForUriOrTel - object:self - userInfo:dict]; -} - -static void linphone_iphone_notify_presence_received_for_uri_or_tel(LinphoneCore *lc, LinphoneFriend *lf, - const char *uri_or_tel, - const LinphonePresenceModel *presence_model) { - [(__bridge LinphoneManager *)linphone_core_cbs_get_user_data(linphone_core_get_current_callbacks(lc)) onNotifyPresenceReceivedForUriOrTel:lc - friend:lf - uri:uri_or_tel - presenceModel:presence_model]; -} - -static void linphone_iphone_call_encryption_changed(LinphoneCore *lc, LinphoneCall *call, bool_t on, - const char *authentication_token) { - [(__bridge LinphoneManager *)linphone_core_cbs_get_user_data(linphone_core_get_current_callbacks(lc)) onCallEncryptionChanged:lc - call:call - on:on - token:authentication_token]; -} - -- (void)onCallEncryptionChanged:(LinphoneCore *)lc -call:(LinphoneCall *)call -on:(BOOL)on -token:(const char *)authentication_token { - // Post event - NSMutableDictionary *dict = [NSMutableDictionary dictionary]; - [dict setObject:[NSValue valueWithPointer:call] forKey:@"call"]; - [dict setObject:[NSNumber numberWithBool:on] forKey:@"on"]; - if (authentication_token) { - [dict setObject:[NSString stringWithUTF8String:authentication_token] forKey:@"token"]; - } - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneCallEncryptionChanged object:self userInfo:dict]; -} - -void linphone_iphone_chatroom_state_changed(LinphoneCore *lc, LinphoneChatRoom *cr, LinphoneChatRoomState state) { - if (state == LinphoneChatRoomStateCreated) { - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneMessageReceived object:nil]; - } -} - -void linphone_iphone_version_update_check_result_received (LinphoneCore *lc, LinphoneVersionUpdateCheckResult result, const char *version, const char *url) { - if (result == LinphoneVersionUpdateCheckUpToDate || result == LinphoneVersionUpdateCheckError) { - return; - } - NSString *title = NSLocalizedString(@"Outdated Version", nil); - NSString *body = NSLocalizedString(@"A new version of your app is available, use the button below to download it.", nil); - - UIAlertController *versVerifView = [UIAlertController alertControllerWithTitle:title - message:body - preferredStyle:UIAlertControllerStyleAlert]; - - NSString *ObjCurl = [NSString stringWithUTF8String:url]; - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Download", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - [[UIApplication sharedApplication] openURL:[NSURL URLWithString:ObjCurl]]; - }]; - - [versVerifView addAction:defaultAction]; - [PhoneMainView.instance presentViewController:versVerifView animated:YES completion:nil]; -} - -void linphone_iphone_qr_code_found(LinphoneCore *lc, const char *result) { - NSDictionary *eventDic = [NSDictionary dictionaryWithObject:[NSString stringWithCString:result encoding:[NSString defaultCStringEncoding]] forKey:@"qrcode"]; - LOGD(@"QRCODE FOUND"); - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneQRCodeFound object:nil userInfo:eventDic]; -} - -static void linphone_iphone_call_log_updated(LinphoneCore *lc, LinphoneCallLog *newcl) { - if (linphone_call_log_get_status(newcl) == LinphoneCallEarlyAborted) { - const char *cid = linphone_call_log_get_call_id(newcl); - if (cid) { - [CallManager.instance markCallAsDeclinedWithCallId:[NSString stringWithUTF8String:cid]]; - } - } -} - -static void linphone_iphone_call_id_updated(LinphoneCore *lc, const char *previous_call_id, const char *current_call_id) { - [CallManager.instance updateCallIdWithPrevious:[NSString stringWithUTF8String:previous_call_id] current:[NSString stringWithUTF8String:current_call_id]]; -} -#pragma mark - Message composition start -- (void)onMessageComposeReceived:(LinphoneCore *)core forRoom:(LinphoneChatRoom *)room { - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneTextComposeEvent - object:self - userInfo:@{ - @"room" : [NSValue valueWithPointer:room] - }]; -} - -static void linphone_iphone_is_composing_received(LinphoneCore *lc, LinphoneChatRoom *room) { - [(__bridge LinphoneManager *)linphone_core_cbs_get_user_data(linphone_core_get_current_callbacks(lc)) onMessageComposeReceived:lc forRoom:room]; -} - -#pragma mark - Network Functions - - -- (NetworkType)network { - if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7) { - UIApplication *app = [UIApplication sharedApplication]; - NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews]; - NSNumber *dataNetworkItemView = nil; - - for (id subview in subviews) { - if ([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) { - dataNetworkItemView = subview; - break; - } - } - - NSNumber *number = (NSNumber *)[dataNetworkItemView valueForKey:@"dataNetworkType"]; - return [number intValue]; - } else { -#pragma deploymate push "ignored-api-availability" - CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init]; - NSString *currentRadio = info.currentRadioAccessTechnology; - if ([currentRadio isEqualToString:CTRadioAccessTechnologyEdge]) { - return network_2g; - } else if ([currentRadio isEqualToString:CTRadioAccessTechnologyLTE]) { - return network_4g; - } -#pragma deploymate pop - return network_3g; - } -} - -- (void)setDnsServer { - NSString *dns_server_ip = [self lpConfigStringForKey:@"dns_server_ip"]; - if ([dns_server_ip isEqualToString:@""]) {dns_server_ip = NULL;} - bctbx_list_t *dns_server_list = dns_server_ip?bctbx_list_new((void *)[dns_server_ip UTF8String]):NULL; - linphone_core_set_dns_servers_app(LC, dns_server_list); - bctbx_list_free(dns_server_list); -} - -#pragma mark - - -// scheduling loop -- (void)iterate { - linphone_core_iterate(theLinphoneCore); -} - -/** Should be called once per linphone_core_new() */ -- (void)finishCoreConfiguration { - //Force keep alive to workaround push notif on chat message - linphone_core_enable_keep_alive([LinphoneManager getLc], true); - - // get default config from bundle - NSString *zrtpSecretsFileName = [LinphoneManager dataFile:@"zrtp_secrets"]; - NSString *chatDBFileName = [LinphoneManager dataFile:kLinphoneInternalChatDBFilename]; - NSString *device = [[NSMutableString alloc] initWithString:[NSString stringWithFormat:@"%@iOS/%@ (%@) LinphoneSDK", - [NSBundle.mainBundle objectForInfoDictionaryKey:@"CFBundleDisplayName"], - [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"], - [[UIDevice currentDevice] name]]]; - - linphone_core_set_user_agent(theLinphoneCore, device.UTF8String, LINPHONE_SDK_VERSION); - - _contactSipField = [self lpConfigStringForKey:@"contact_im_type_value" inSection:@"sip" withDefault:@"SIP"]; - - if (_fastAddressBook == nil) { - _fastAddressBook = [[FastAddressBook alloc] init]; - } - - linphone_core_set_zrtp_secrets_file(theLinphoneCore, [zrtpSecretsFileName UTF8String]); - //linphone_core_set_chat_database_path(theLinphoneCore, [chatDBFileName UTF8String]); - linphone_core_set_call_logs_database_path(theLinphoneCore, [chatDBFileName UTF8String]); - - NSString *path = [LinphoneManager bundleFile:@"nowebcamCIF.jpg"]; - if (path) { - const char *imagePath = [path UTF8String]; - LOGI(@"Using '%s' as source image for no webcam", imagePath); - linphone_core_set_static_picture(theLinphoneCore, imagePath); - } - - /*DETECT cameras*/ - _frontCamId = _backCamId = nil; - char **camlist = (char **)linphone_core_get_video_devices(theLinphoneCore); - if (camlist) { - for (char *cam = *camlist; *camlist != NULL; cam = *++camlist) { - if (strcmp(FRONT_CAM_NAME, cam) == 0) { - _frontCamId = cam; - // great set default cam to front - LOGI(@"Setting default camera [%s]", _frontCamId); - linphone_core_set_video_device(theLinphoneCore, _frontCamId); - } - if (strcmp(BACK_CAM_NAME, cam) == 0) { - _backCamId = cam; - } - } - } else { - LOGW(@"No camera detected!"); - } - - if (![LinphoneManager isNotIphone3G]) { - PayloadType *pt = linphone_core_find_payload_type(theLinphoneCore, "SILK", 24000, -1); - if (pt) { - linphone_core_enable_payload_type(theLinphoneCore, pt, FALSE); - LOGW(@"SILK/24000 and video disabled on old iPhone 3G"); - } - linphone_core_enable_video_display(theLinphoneCore, FALSE); - linphone_core_enable_video_capture(theLinphoneCore, FALSE); - } - - [self enableProxyPublish:([UIApplication sharedApplication].applicationState == UIApplicationStateActive)]; - - LOGI(@"Linphone [%s] started on [%s]", linphone_core_get_version(), [[UIDevice currentDevice].model UTF8String]); - - // Post event - NSDictionary *dict = [NSDictionary dictionaryWithObject:[NSValue valueWithPointer:theLinphoneCore] forKey:@"core"]; - - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneCoreUpdate - object:LinphoneManager.instance - userInfo:dict]; - - -} - -static BOOL libStarted = FALSE; - -- (void)launchLinphoneCore { - - if (libStarted) { - LOGE(@"Liblinphone is already initialized!"); - return; - } - - libStarted = TRUE; - - signal(SIGPIPE, SIG_IGN); - - // create linphone core - [self createLinphoneCore]; - _iapManager = [[InAppProductsManager alloc] init]; - - // - Security fix - remove multi transport migration, because it enables tcp or udp, if by factoring settings only - // tls is enabled. This is a problem for new installations. - // linphone_core_migrate_to_multi_transport(theLinphoneCore); - - // init audio session (just getting the instance will init) - AVAudioSession *audioSession = [AVAudioSession sharedInstance]; - BOOL bAudioInputAvailable = audioSession.inputAvailable; - NSError *err = nil; - - if (![audioSession setActive:NO error:&err] && err) { - LOGE(@"audioSession setActive failed: %@", [err description]); - err = nil; - } - if (!bAudioInputAvailable) { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"No microphone", nil) - message:NSLocalizedString(@"You need to plug a microphone to your device to use the application.", nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; - } - - if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) { - // go directly to bg mode - [self enterBackgroundMode]; - } - - -} - -void popup_link_account_cb(LinphoneAccountCreator *creator, LinphoneAccountCreatorStatus status, const char *resp) { - if (status == LinphoneAccountCreatorStatusAccountLinked) { - [LinphoneManager.instance lpConfigSetInt:0 forKey:@"must_link_account_time"]; - } else { - LinphoneAccount *account = linphone_core_get_default_account(LC); - LinphoneAccountParams const *accountParams = account ? linphone_account_get_params(account) : NULL; - if (account && - strcmp(linphone_account_params_get_domain(accountParams), - [LinphoneManager.instance lpConfigStringForKey:@"domain_name" - inSection:@"app" - withDefault:@"sip.linphone.org"] - .UTF8String) == 0) { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Link your account", nil) - message:[NSString stringWithFormat:NSLocalizedString(@"Link your Linphone.org account %s to your phone number.", nil), - linphone_address_get_username(linphone_account_params_get_identity_address(accountParams))] - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Maybe later", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - UIAlertAction* continueAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Let's go", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - [PhoneMainView.instance changeCurrentView:AssistantLinkView.compositeViewDescription]; - }]; - - UIAlertAction* otherAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Never ask again", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - [LinphoneManager.instance lpConfigSetBool:false forKey:@"display_link_account_popup"]; - }]; - defaultAction.accessibilityLabel = @"Later"; - [errView addAction:otherAction]; - [errView addAction:defaultAction]; - [errView addAction:continueAction]; - [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; - - [LinphoneManager.instance - lpConfigSetInt:[[NSDate date] dateByAddingTimeInterval:[LinphoneManager.instance - lpConfigIntForKey:@"link_account_popup_time" - withDefault:84200]] - .timeIntervalSince1970 - forKey:@"must_link_account_time"]; - } - } -} - -- (void)shouldPresentLinkPopup { - NSDate *nextTime = - [NSDate dateWithTimeIntervalSince1970:[self lpConfigIntForKey:@"must_link_account_time" withDefault:1]]; - NSDate *now = [NSDate date]; - if (nextTime.timeIntervalSince1970 > 0 && [now earlierDate:nextTime] == nextTime && [LinphoneManager.instance lpConfigBoolForKey:@"display_link_account_popup"] && ![LinphoneManager.instance lpConfigIntForKey:@"hide_link_phone_number"]) { - LinphoneAccount *account = linphone_core_get_default_account(LC); - if (account) { - const char *username = linphone_address_get_username(linphone_account_params_get_identity_address(linphone_account_get_params(account))); - LinphoneAccountCreator *account_creator = linphone_account_creator_new( - LC, - [LinphoneManager.instance lpConfigStringForKey:@"xmlrpc_url" inSection:@"assistant" withDefault:@""] - .UTF8String); - linphone_account_creator_set_user_data(account_creator, (__bridge void *)(self)); - linphone_account_creator_cbs_set_is_account_linked(linphone_account_creator_get_callbacks(account_creator), - popup_link_account_cb); - linphone_account_creator_set_username(account_creator, username); - linphone_account_creator_is_account_linked(account_creator); - } - } -} - -- (void)configurePushProviderForAccounts { - const MSList *accountsList = linphone_core_get_account_list(theLinphoneCore); - while (accountsList) { - LinphoneAccount * account = accountsList->data; - LinphoneAccountParams * accountParams = linphone_account_params_clone(linphone_account_get_params(account)); - // In linphone-iphone, remote and voip push autorisations always go together. - bool accountPushAllowed = linphone_account_params_get_push_notification_allowed(accountParams); - linphone_account_params_set_remote_push_notification_allowed(accountParams, accountPushAllowed); - - - LinphonePushNotificationConfig *pushConfig = linphone_account_params_get_push_notification_config(accountParams); -#ifdef DEBUG -#define PROVIDER_NAME "apns.dev" -#else -#define PROVIDER_NAME "apns" -#endif - linphone_push_notification_config_set_provider(pushConfig, PROVIDER_NAME); - linphone_account_set_params(account, accountParams); - linphone_account_params_unref(accountParams); - accountsList = accountsList->next; - } -} - -- (void)enableLinphoneAccountSpecificSettings { - 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); - char * addressIdentity = linphone_address_as_string(currentAddress); - - if (strcmp(linphone_address_get_domain(currentAddress), "sip.linphone.org") == 0) { - LinphoneAccountParams * newParams = linphone_account_params_clone(linphone_account_get_params(account)); - if (!linphone_account_params_cpim_in_basic_chat_room_enabled(currentParams) ) { - LOGI(@"Enabling CPIM in basic chatroom for account [%s]", addressIdentity); - linphone_account_params_enable_cpim_in_basic_chat_room(newParams, true); - } - - const char* current_lime_url = linphone_account_params_get_lime_server_url(currentParams); - if (!current_lime_url){ - const char* core_lime_url = linphone_core_get_lime_x3dh_server_url(LC); - if (core_lime_url) { - LOGI(@"Copying core's LIME X3DH server URL [%s] to account [%s]", core_lime_url, addressIdentity); - linphone_account_params_set_lime_server_url(newParams, core_lime_url); - } else { - LOGI(@"Account [%s] didn't have a LIME X3DH server URL, setting one: [%s]", addressIdentity, core_lime_url); - linphone_account_params_set_lime_server_url(newParams, "https://lime.linphone.org/lime-server/lime-server.php"); - } - } - linphone_account_set_params(account, newParams); - linphone_account_params_unref(newParams); - } - - ms_free(addressIdentity); - 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 enableLinphoneAccountSpecificSettings]; -} - -- (void)createLinphoneCore { - [self migrationAllPre]; - if (theLinphoneCore != nil) { - LOGI(@"linphonecore is already created"); - return; - } - - - // Set audio assets - NSString *ring = - ([LinphoneManager bundleFile:[self lpConfigStringForKey:@"local_ring" inSection:@"sound"].lastPathComponent] - ?: [LinphoneManager bundleFile:@"notes_of_the_optimistic.caf"]) - .lastPathComponent; - NSString *ringback = - ([LinphoneManager bundleFile:[self lpConfigStringForKey:@"remote_ring" inSection:@"sound"].lastPathComponent] - ?: [LinphoneManager bundleFile:@"ringback.wav"]) - .lastPathComponent; - NSString *hold = - ([LinphoneManager bundleFile:[self lpConfigStringForKey:@"hold_music" inSection:@"sound"].lastPathComponent] - ?: [LinphoneManager bundleFile:@"hold.mkv"]) - .lastPathComponent; - [self lpConfigSetString:[LinphoneManager bundleFile:ring] forKey:@"local_ring" inSection:@"sound"]; - [self lpConfigSetString:[LinphoneManager bundleFile:ringback] forKey:@"remote_ring" inSection:@"sound"]; - [self lpConfigSetString:[LinphoneManager bundleFile:hold] forKey:@"hold_music" inSection:@"sound"]; - - LinphoneFactory *factory = linphone_factory_get(); - LinphoneCoreCbs *cbs = linphone_factory_create_core_cbs(factory); - linphone_core_cbs_set_account_registration_state_changed(cbs,linphone_iphone_registration_state); - linphone_core_cbs_set_notify_presence_received_for_uri_or_tel(cbs, linphone_iphone_notify_presence_received_for_uri_or_tel); - linphone_core_cbs_set_authentication_requested(cbs, linphone_iphone_popup_password_request); - linphone_core_cbs_set_message_received(cbs, linphone_iphone_message_received); - linphone_core_cbs_set_message_received_unable_decrypt(cbs, linphone_iphone_message_received_unable_decrypt); - linphone_core_cbs_set_transfer_state_changed(cbs, linphone_iphone_transfer_state_changed); - linphone_core_cbs_set_is_composing_received(cbs, linphone_iphone_is_composing_received); - linphone_core_cbs_set_configuring_status(cbs, linphone_iphone_configuring_status_changed); - linphone_core_cbs_set_global_state_changed(cbs, linphone_iphone_global_state_changed); - linphone_core_cbs_set_notify_received(cbs, linphone_iphone_notify_received); - linphone_core_cbs_set_call_encryption_changed(cbs, linphone_iphone_call_encryption_changed); - linphone_core_cbs_set_chat_room_state_changed(cbs, linphone_iphone_chatroom_state_changed); - linphone_core_cbs_set_version_update_check_result_received(cbs, linphone_iphone_version_update_check_result_received); - linphone_core_cbs_set_qrcode_found(cbs, linphone_iphone_qr_code_found); - linphone_core_cbs_set_call_log_updated(cbs, linphone_iphone_call_log_updated); - linphone_core_cbs_set_call_id_updated(cbs, linphone_iphone_call_id_updated); - linphone_core_cbs_set_user_data(cbs, (__bridge void *)(self)); - linphone_core_cbs_set_chat_room_ephemeral_message_deleted(cbs, linphone_iphone_ephemeral_message_deleted); - linphone_core_cbs_set_conference_state_changed(cbs, linphone_iphone_conference_state_changed); - - - - theLinphoneCore = linphone_factory_create_shared_core_with_config(factory, _configDb, NULL, [kLinphoneMsgNotificationAppGroupId UTF8String], true); - linphone_core_add_callbacks(theLinphoneCore, cbs); - - [ConfigManager.instance setDbWithDb:_configDb]; - [CallManager.instance setCoreWithCore:theLinphoneCore]; - [CallsViewModelBridge updateCore]; - - [LinphoneManager.instance startLinphoneCore]; - - // Let the core handle cbs - linphone_core_cbs_unref(cbs); - - LOGI(@"Create linphonecore %p", theLinphoneCore); - - // Load plugins if available in the linphone SDK - otherwise these calls will do nothing - MSFactory *f = linphone_core_get_ms_factory(theLinphoneCore); - libmssilk_init(f); - libmsamr_init(f); - libmsopenh264_init(f); - libmswebrtc_init(f); - libmscodec2_init(f); - - linphone_core_reload_ms_plugins(theLinphoneCore, NULL); - [self migrationAllPost]; - - linphone_core_enable_record_aware(theLinphoneCore, true); //force record aware enable - - /* Use the rootca from framework, which is already set*/ - //linphone_core_set_root_ca(theLinphoneCore, [LinphoneManager bundleFile:@"rootca.pem"].UTF8String); - linphone_core_set_user_certificates_path(theLinphoneCore, linphone_factory_get_data_dir(linphone_factory_get(), kLinphoneMsgNotificationAppGroupId.UTF8String)); - - /* The core will call the linphone_iphone_configuring_status_changed callback when the remote provisioning is loaded - (or skipped). - Wait for this to finish the code configuration */ - - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(globalStateChangedNotificationHandler:) - name:kLinphoneGlobalStateUpdate - object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(inappReady:) name:kIAPReady object:nil]; - - /*call iterate once immediately in order to initiate background connections with sip server or remote provisioning - * grab, if any */ - [self setDnsServer]; //configure DNS if custom DNS server is set - [self iterate]; -} - -- (void)destroyLinphoneCore { - // just in case - [self removeCTCallCenterCb]; - [MagicSearchSingleton destroyInstance]; - - if (theLinphoneCore != nil) { // just in case application terminate before linphone core initialization - - // rare case, remove duplicated fileTransferDelegates to avoid crash - [_fileTransferDelegates setArray:[[NSSet setWithArray:_fileTransferDelegates] allObjects]]; - for (FileTransferDelegate *ftd in _fileTransferDelegates) { - // Not remove here, avoid array mutated while being enumerated - [ftd stopAndDestroyAndRemove:FALSE]; - } - [_fileTransferDelegates removeAllObjects]; - - if (linphone_core_get_global_state(LC) != LinphoneGlobalOff) { - linphone_core_stop(LC); - } - linphone_core_unref(theLinphoneCore); - LOGI(@"Destroy linphonecore %p", theLinphoneCore); - theLinphoneCore = nil; - - // Post event - NSDictionary *dict = - [NSDictionary dictionaryWithObject:[NSValue valueWithPointer:theLinphoneCore] forKey:@"core"]; - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneCoreUpdate - object:LinphoneManager.instance - userInfo:dict]; - } - libStarted = FALSE; - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -- (void)resetLinphoneCore { - [self destroyLinphoneCore]; - [self createLinphoneCore]; -} - -static int comp_call_id(const LinphoneCall *call, const char *callid) { - if (linphone_call_log_get_call_id(linphone_call_get_call_log(call)) == nil) { - ms_error("no callid for call [%p]", call); - return 1; - } - return strcmp(linphone_call_log_get_call_id(linphone_call_get_call_log(call)), callid); -} - -- (void)acceptCallForCallId:(NSString *)callid { - // first, make sure this callid is not already involved in a call - const bctbx_list_t *calls = linphone_core_get_calls(theLinphoneCore); - bctbx_list_t *call = bctbx_list_find_custom(calls, (bctbx_compare_func)comp_call_id, [callid UTF8String]); - if (call != NULL) { - const LinphoneVideoPolicy *video_policy = linphone_core_get_video_policy(theLinphoneCore); - bool with_video = video_policy->automatically_accept; - [CallManager.instance acceptCallWithCall:(LinphoneCall *)call->data hasVideo:with_video]; - return; - }; -} - -- (void)addPushCallId:(NSString *)callid { - // first, make sure this callid is not already involved in a call - const bctbx_list_t *calls = linphone_core_get_calls(theLinphoneCore); - if (bctbx_list_find_custom(calls, (bctbx_compare_func)comp_call_id, [callid UTF8String])) { - LOGW(@"Call id [%@] already handled", callid); - return; - }; - if ([pushCallIDs count] > 10 /*max number of pending notif*/) - [pushCallIDs removeObjectAtIndex:0]; - - [pushCallIDs addObject:callid]; -} - -- (BOOL)popPushCallID:(NSString *)callId { - for (NSString *pendingNotif in pushCallIDs) { - if ([pendingNotif compare:callId] == NSOrderedSame) { - [pushCallIDs removeObject:pendingNotif]; - return TRUE; - } - } - return FALSE; -} - -- (BOOL)resignActive { - linphone_core_stop_dtmf_stream(theLinphoneCore); - - return YES; -} - -- (void)playMessageSound { - BOOL success = [self.messagePlayer play]; - if (!success) { - LOGE(@"Could not play the message sound"); - } - AudioServicesPlaySystemSound(LinphoneManager.instance.sounds.vibrate); -} - -static int comp_call_state_paused(const LinphoneCall *call, const void *param) { - return linphone_call_get_state(call) != LinphoneCallPaused; -} - -- (void)startCallPausedLongRunningTask { - pausedCallBgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ - LOGW(@"Call cannot be paused any more, too late"); - [[UIApplication sharedApplication] endBackgroundTask:pausedCallBgTask]; - }]; - LOGI(@"Long running task started, remaining [%@] because at least one call is paused", - [LinphoneUtils intervalToString:[[UIApplication sharedApplication] backgroundTimeRemaining]]); -} - -- (void)enableProxyPublish:(BOOL)enabled { - if (linphone_core_get_global_state(LC) != LinphoneGlobalOn || !linphone_core_get_default_friend_list(LC)) { - LOGW(@"Not changing presence configuration because linphone core not ready yet"); - return; - } - - if ([self lpConfigBoolForKey:@"publish_presence"]) { - // set present to "tv", because "available" does not work yet - if (enabled) { - linphone_core_set_presence_model(LC, linphone_core_create_presence_model_with_activity(LC, LinphonePresenceActivityTV, NULL)); - } - - const MSList *accounts = linphone_core_get_account_list(LC); - while (accounts) { - LinphoneAccount *account = accounts->data; - LinphoneAccountParams *newAccountParams = linphone_account_params_clone(linphone_account_get_params(account)); - linphone_account_params_set_publish_enabled(newAccountParams, enabled); - linphone_account_set_params(account, newAccountParams); - linphone_account_params_unref(newAccountParams); - accounts = accounts->next; - } - // force registration update first, then update friend list subscription - [self iterate]; - } - - linphone_core_enable_friend_list_subscription(LC, enabled && [LinphoneManager.instance lpConfigBoolForKey:@"use_rls_presence"]); -} - -- (BOOL)enterBackgroundMode { - LinphoneAccount *account = linphone_core_get_default_account(theLinphoneCore); - BOOL shouldEnterBgMode = FALSE; - - // disable presence - [self enableProxyPublish:NO]; - - // handle proxy config if any - if (account) { - LinphoneAccountParams const *accountParams = linphone_account_get_params(account); - BOOL pushNotifEnabled = linphone_account_params_get_push_notification_allowed(accountParams); - if ([LinphoneManager.instance lpConfigBoolForKey:@"backgroundmode_preference"] || pushNotifEnabled) { - if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) { - // For registration register - [self refreshRegisters]; - } - } - - if ([LinphoneManager.instance lpConfigBoolForKey:@"voip_mode_preference"] && [LinphoneManager.instance lpConfigBoolForKey:@"backgroundmode_preference"] && !pushNotifEnabled) { - // Keep this!! Socket VoIP is deprecated after 9.0, but sometimes it's the only way to keep the phone background and receive the call. For example, when there is only local area network. - // register keepalive - if ([[UIApplication sharedApplication] - setKeepAliveTimeout:600 /*(NSTimeInterval)linphone_proxy_config_get_expires(proxyCfg)*/ - handler:^{ - LOGW(@"keepalive handler"); - mLastKeepAliveDate = [NSDate date]; - if (theLinphoneCore == nil) { - LOGW(@"It seems that Linphone BG mode was deactivated, just skipping"); - return; - } - [_iapManager check]; - if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) { - // For registration register - [self refreshRegisters]; - } - linphone_core_iterate(theLinphoneCore); - }]) { - LOGI(@"keepalive handler succesfully registered"); - } else { - LOGI(@"keepalive handler cannot be registered"); - } - shouldEnterBgMode = TRUE; - } - } - - LinphoneCall *currentCall = linphone_core_get_current_call(theLinphoneCore); - const bctbx_list_t *callList = linphone_core_get_calls(theLinphoneCore); - if (!currentCall // no active call - && callList // at least one call in a non active state - && bctbx_list_find_custom(callList, (bctbx_compare_func)comp_call_state_paused, NULL)) { - [self startCallPausedLongRunningTask]; - } - if (callList) // If at least one call exist, enter normal bg mode - shouldEnterBgMode = TRUE; - - // Stop the video preview - if (theLinphoneCore) { - linphone_core_enable_video_preview(theLinphoneCore, FALSE); - [self iterate]; - } - - LOGI(@"Entering [%s] bg mode", shouldEnterBgMode ? "normal" : "lite"); - if (!shouldEnterBgMode && floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) { - if (account) { - LinphoneAccountParams const *accountParams = linphone_account_get_params(account); - BOOL pushNotifEnabled = linphone_account_params_get_push_notification_allowed(accountParams); - if (pushNotifEnabled) { - LOGI(@"Keeping lc core to handle push"); - return YES; - } - return NO; - } - } - return YES; -} - -- (void)becomeActive { - [self checkNewVersion]; - - // enable presence - if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) { - [self refreshRegisters]; - } - if (pausedCallBgTask) { - [[UIApplication sharedApplication] endBackgroundTask:pausedCallBgTask]; - pausedCallBgTask = 0; - } - if (incallBgTask) { - [[UIApplication sharedApplication] endBackgroundTask:incallBgTask]; - incallBgTask = 0; - } - - /*IOS specific*/ - [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo - completionHandler:^(BOOL granted){ - }]; - [AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio - completionHandler:^(BOOL granted){ - }]; - - /*start the video preview in case we are in the main view*/ - if (linphone_core_video_display_enabled(theLinphoneCore) && [self lpConfigBoolForKey:@"preview_preference"]) { - linphone_core_enable_video_preview(theLinphoneCore, TRUE); - } - /*check last keepalive handler date*/ - if (mLastKeepAliveDate != Nil) { - NSDate *current = [NSDate date]; - if ([current timeIntervalSinceDate:mLastKeepAliveDate] > 700) { - NSString *datestr = [mLastKeepAliveDate description]; - LOGW(@"keepalive handler was called for the last time at %@", datestr); - } - } - - [self enableProxyPublish:YES]; -} - -- (void)refreshRegisters { - linphone_core_refresh_registers(theLinphoneCore); // just to make sure REGISTRATION is up to date -} - -- (void)migrationAllImages { - NSFileManager *fileManager = [NSFileManager defaultManager]; - NSArray *images = [fileManager contentsOfDirectoryAtPath:[LinphoneManager cacheDirectory] error:NULL]; - - for (NSString *image in images) - { - [fileManager copyItemAtPath:[[LinphoneManager cacheDirectory] stringByAppendingPathComponent:image] toPath:[[LinphoneManager imagesDirectory] stringByAppendingPathComponent:image] error:nil]; - } - [self lpConfigSetBool:TRUE forKey:@"migration_images_done"]; -} - -- (void)migrateImportantFiles { - if ([LinphoneManager copyFile:[LinphoneManager oldPreferenceFile:@"linphonerc"] destination:[LinphoneManager preferenceFile:@"linphonerc"] override:TRUE ignore:TRUE]) { - [NSFileManager.defaultManager - removeItemAtPath:[LinphoneManager oldPreferenceFile:@"linphonerc"] - error:nil]; - } else if ([LinphoneManager copyFile:[LinphoneManager documentFile:@"linphonerc"] destination:[LinphoneManager preferenceFile:@"linphonerc"] override:TRUE ignore:TRUE]) { - [NSFileManager.defaultManager - removeItemAtPath:[LinphoneManager documentFile:@"linphonerc"] - error:nil]; - } - - if ([LinphoneManager copyFile:[LinphoneManager oldDataFile:@"linphone.db"] destination:[LinphoneManager dataFile:@"linphone.db"] override:TRUE ignore:TRUE]) { - [NSFileManager.defaultManager - removeItemAtPath:[LinphoneManager oldDataFile:@"linphone.db"] - error:nil]; - } - - if ([LinphoneManager copyFile:[LinphoneManager oldDataFile:@"x3dh.c25519.sqlite3"] destination:[LinphoneManager dataFile:@"x3dh.c25519.sqlite3"] override:TRUE ignore:TRUE]) { - [NSFileManager.defaultManager - removeItemAtPath:[LinphoneManager oldDataFile:@"x3dh.c25519.sqlite3"] - error:nil]; - } - - // call history - if ([LinphoneManager copyFile:[LinphoneManager oldDataFile:kLinphoneInternalChatDBFilename] destination:[LinphoneManager dataFile:kLinphoneInternalChatDBFilename] override:TRUE ignore:TRUE]) { - [NSFileManager.defaultManager - removeItemAtPath:[LinphoneManager oldDataFile:kLinphoneInternalChatDBFilename] - error:nil]; - } - - if ([LinphoneManager copyFile:[LinphoneManager oldDataFile:@"zrtp_secrets"] destination:[LinphoneManager dataFile:@"zrtp_secrets"] override:TRUE ignore:TRUE]) { - [NSFileManager.defaultManager - removeItemAtPath:[LinphoneManager oldDataFile:@"zrtp_secrets"] - error:nil]; - } -} - -- (void)renameDefaultSettings { - // rename .linphonerc to linphonerc to ease debugging: when downloading - // containers from MacOSX, Finder do not display hidden files leading - // to useless painful operations to display the .linphonerc file - NSString *src = [LinphoneManager documentFile:@".linphonerc"]; - NSString *dst = [LinphoneManager preferenceFile:@"linphonerc"]; - NSFileManager *fileManager = [NSFileManager defaultManager]; - NSError *fileError = nil; - if ([fileManager fileExistsAtPath:src]) { - if ([fileManager fileExistsAtPath:dst]) { - [fileManager removeItemAtPath:src error:&fileError]; - LOGW(@"%@ already exists, simply removing %@ %@", dst, src, - fileError ? fileError.localizedDescription : @"successfully"); - } else { - [fileManager moveItemAtPath:src toPath:dst error:&fileError]; - LOGW(@"%@ moving to %@ %@", dst, src, fileError ? fileError.localizedDescription : @"successfully"); - } - } -} - -- (void)copyDefaultSettings { - NSString *src = [LinphoneManager bundleFile:@"linphonerc"]; - NSString *srcIpad = [LinphoneManager bundleFile:@"linphonerc~ipad"]; - if (IPAD && [[NSFileManager defaultManager] fileExistsAtPath:srcIpad]) { - src = srcIpad; - } - NSString *dst = [LinphoneManager preferenceFile:@"linphonerc"]; - [LinphoneManager copyFile:src destination:dst override:FALSE ignore:FALSE]; -} - -- (void)overrideDefaultSettings { - NSString *factory = [LinphoneManager bundleFile:@"linphonerc-factory"]; - NSString *factoryIpad = [LinphoneManager bundleFile:@"linphonerc-factory~ipad"]; - if (IPAD && [[NSFileManager defaultManager] fileExistsAtPath:factoryIpad]) { - factory = factoryIpad; - } - _configDb = linphone_config_new_for_shared_core(kLinphoneMsgNotificationAppGroupId.UTF8String, @"linphonerc".UTF8String, factory.UTF8String); - if (linphone_config_has_entry(_configDb, "misc", "max_calls")) { // Not doable on core on iOS (requires CallKit) -> flag moved to app section, and have app handle it in ProviderDelegate - linphone_config_set_int(_configDb, "app", "max_calls", linphone_config_get_int(_configDb,"misc", "max_calls",10)); - linphone_config_clean_entry(_configDb, "misc", "max_calls"); - } -} -#pragma mark - Audio route Functions - -#pragma mark - Call Functions -- (void)send:(NSString *)replyText toChatRoom:(LinphoneChatRoom *)room { - LinphoneChatMessage *msg = linphone_chat_room_create_message(room, replyText.UTF8String); - linphone_chat_message_send(msg); - - [ChatConversationViewSwift markAsRead:room]; -} - -/* - * If ICE is enabled, check if local network permission is given and show an alert message. - * It is indeed required for ICE to operate correctly. - * If it is not the the case, liblinphone will automatically skip ICE during the call. - * The purpose of this function is only to show the alert message. - */ -- (void) checkLocalNetworkPermission{ - NSString *alertSuppressionKey = @"LocalNetworkPermissionAlertSuppression"; - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - - LinphoneProxyConfig *defaultCfg = linphone_core_get_default_proxy_config(LC); - if (!defaultCfg) return; - LinphoneNatPolicy *natPolicy = linphone_proxy_config_get_nat_policy(defaultCfg); - if (!natPolicy || !linphone_nat_policy_ice_enabled(natPolicy)) - return; - - if (linphone_core_local_permission_enabled(LC)) return; - - - if (![defaults boolForKey: alertSuppressionKey]) { - UIAlertController *noticeView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Local network usage", nil) - message:NSLocalizedString(@"Granting the local network permission is recommended to enhance the audio & video quality. You may enable it from iOS settings.", nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - UIAlertAction* ignoreForeverAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Don't show this again.", nil) - style:UIAlertActionStyleCancel - handler:^(UIAlertAction * action) { - [defaults setBool:TRUE forKey: alertSuppressionKey]; - }]; - - [noticeView addAction:defaultAction]; - [noticeView addAction:ignoreForeverAction]; - [PhoneMainView.instance presentViewController:noticeView animated:YES completion:nil]; - } -} - -- (void)call:(const LinphoneAddress *)iaddr { - // First verify that network is available, abort otherwise. - if (!linphone_core_is_network_reachable(theLinphoneCore)) { - [PhoneMainView.instance presentViewController:[LinphoneUtils networkErrorView:@"place a call"] animated:YES completion:nil]; - return; - } - - // Then check that no GSM calls are in progress, abort otherwise. - CTCallCenter *callCenter = [[CTCallCenter alloc] init]; - if ([callCenter currentCalls] != nil && floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) { - LOGE(@"GSM call in progress, cancelling outgoing SIP call request"); - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Cannot make call", nil) - message:NSLocalizedString(@"Please terminate GSM call first.", nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; - return; - } - - // Then check that the supplied address is valid - if (!iaddr) { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Invalid SIP address", nil) - message:NSLocalizedString(@"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)", nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; - return; - } - [self checkLocalNetworkPermission]; - // For OutgoingCall, show CallOutgoingView - LinphoneVideoActivationPolicy *policy = linphone_core_get_video_activation_policy(LC); - BOOL initiateVideoCall = linphone_video_activation_policy_get_automatically_initiate(policy); - [CallManager.instance startCallWithAddr:iaddr isSas:FALSE isVideo:initiateVideoCall isConference:false]; - linphone_video_activation_policy_unref(policy); -} - -#pragma mark - Misc Functions -+ (PHFetchResult *)getPHAssets:(NSString *)key { - PHFetchResult *assets; - if ([key hasPrefix:@"assets-library"]) { - // compability with previous linphone version - assets = [PHAsset fetchAssetsWithALAssetURLs:@[[NSURL URLWithString:key]] options:nil]; - } else { - assets = [PHAsset fetchAssetsWithLocalIdentifiers:[NSArray arrayWithObject:key] options:nil]; - } - return assets; -} - -+ (NSString *)bundleFile:(NSString *)file { - return [[NSBundle mainBundle] pathForResource:[file stringByDeletingPathExtension] ofType:[file pathExtension]]; -} - -+ (NSString *)documentFile:(NSString *)file { - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); - NSString *documentsPath = [paths objectAtIndex:0]; - return [documentsPath stringByAppendingPathComponent:file]; -} - -+ (NSString *)preferenceFile:(NSString *)file { - LinphoneFactory *factory = linphone_factory_get(); - NSString *fullPath = [NSString stringWithUTF8String:linphone_factory_get_config_dir(factory, kLinphoneMsgNotificationAppGroupId.UTF8String)]; - return [fullPath stringByAppendingPathComponent:file]; -} - -+ (NSString *)dataFile:(NSString *)file { - LinphoneFactory *factory = linphone_factory_get(); - NSString *fullPath = [NSString stringWithUTF8String:linphone_factory_get_data_dir(factory, kLinphoneMsgNotificationAppGroupId.UTF8String)]; - return [fullPath stringByAppendingPathComponent:file]; -} - -+ (NSString *)imagesDirectory { - NSURL *basePath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:kLinphoneMsgNotificationAppGroupId]; - NSString *fullPath = [[basePath path] stringByAppendingString:@"/Library/Images/"]; - if (![[NSFileManager defaultManager] fileExistsAtPath:fullPath]) { - NSError *error; - LOGW(@"Download path %@ does not exist, creating it.", fullPath); - if (![[NSFileManager defaultManager] createDirectoryAtPath:fullPath - withIntermediateDirectories:YES - attributes:nil - error:&error]) { - LOGE(@"Create download path directory error: %@", error.description); - } - } - return fullPath; -} - -+ (NSString *)cacheDirectory { - NSURL *basePath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:kLinphoneMsgNotificationAppGroupId]; - NSString *fullPath = [[basePath path] stringByAppendingString:@"/Library/Caches/"]; - if (![[NSFileManager defaultManager] fileExistsAtPath:fullPath]) { - NSError *error; - LOGW(@"Download path %@ does not exist, creating it.", fullPath); - if (![[NSFileManager defaultManager] createDirectoryAtPath:fullPath - withIntermediateDirectories:YES - attributes:nil - error:&error]) { - LOGE(@"Create download path directory error: %@", error.description); - } - } - return fullPath; -} - -+ (NSString *)validFilePath:(NSString *)name { - NSString *filePath = [[LinphoneManager imagesDirectory] stringByAppendingPathComponent:name]; - if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { - return filePath; - } - // if migration (move files of cacheDirectory to imagesDirectory) failed - return [[LinphoneManager cacheDirectory] stringByAppendingPathComponent:name]; -} - -+ (NSString *)oldPreferenceFile:(NSString *)file { - // migration - LinphoneFactory *factory = linphone_factory_get(); - NSString *fullPath = [NSString stringWithUTF8String:linphone_factory_get_config_dir(factory, nil)]; - return [fullPath stringByAppendingPathComponent:file]; -} - -+ (NSString *)oldDataFile:(NSString *)file { - // migration - LinphoneFactory *factory = linphone_factory_get(); - NSString *fullPath = [NSString stringWithUTF8String:linphone_factory_get_data_dir(factory, nil)]; - return [fullPath stringByAppendingPathComponent:file]; -} - -+ (int)unreadMessageCount { - int count = 0; - const MSList *rooms = linphone_core_get_chat_rooms(LC); - const MSList *item = rooms; - while (item) { - LinphoneChatRoom *room = (LinphoneChatRoom *)item->data; - if (room) { - count += linphone_chat_room_get_unread_messages_count(room); - } - item = item->next; - } - - return count; -} - -+ (BOOL)copyFile:(NSString *)src destination:(NSString *)dst override:(BOOL)override ignore:(BOOL)ignore { - NSFileManager *fileManager = NSFileManager.defaultManager; - NSError *error = nil; - if ([fileManager fileExistsAtPath:src] == NO) { - if (!ignore) - LOGE(@"Can't find \"%@\": %@", src, [error localizedDescription]); - return FALSE; - } - if ([fileManager fileExistsAtPath:dst] == YES) { - if (override) { - [fileManager removeItemAtPath:dst error:&error]; - if (error != nil) { - LOGE(@"Can't remove \"%@\": %@", dst, [error localizedDescription]); - return FALSE; - } - } else { - LOGW(@"\"%@\" already exists", dst); - return FALSE; - } - } - [fileManager copyItemAtPath:src toPath:dst error:&error]; - if (error != nil) { - LOGE(@"Can't copy \"%@\" to \"%@\": %@", src, dst, [error localizedDescription]); - return FALSE; - } - return TRUE; -} - -- (void)configureVbrCodecs { - PayloadType *pt; - int bitrate = linphone_config_get_int( - _configDb, "audio", "codec_bitrate_limit", - kLinphoneAudioVbrCodecDefaultBitrate); /*default value is in linphonerc or linphonerc-factory*/ - const MSList *audio_codecs = linphone_core_get_audio_codecs(theLinphoneCore); - const MSList *codec = audio_codecs; - while (codec) { - pt = codec->data; - if (linphone_core_payload_type_is_vbr(theLinphoneCore, pt)) { - linphone_core_set_payload_type_bitrate(theLinphoneCore, pt, bitrate); - } - codec = codec->next; - } -} - -+ (id)getMessageAppDataForKey:(NSString *)key inMessage:(LinphoneChatMessage *)msg { - - if (msg == nil) - return nil; - - id value = nil; - const char *appData = linphone_chat_message_get_appdata(msg); - if (appData) { - NSDictionary *appDataDict = - [NSJSONSerialization JSONObjectWithData:[NSData dataWithBytes:appData length:strlen(appData)] - options:0 - error:nil]; - value = [appDataDict objectForKey:key]; - } - return value; -} - -+ (void)setValueInMessageAppData:(id)value forKey:(NSString *)key inMessage:(LinphoneChatMessage *)msg { - NSMutableDictionary *appDataDict = [NSMutableDictionary dictionary]; - const char *appData = linphone_chat_message_get_appdata(msg); - if (appData) { - appDataDict = [NSJSONSerialization JSONObjectWithData:[NSData dataWithBytes:appData length:strlen(appData)] - options:NSJSONReadingMutableContainers - error:nil]; - } - - [appDataDict setValue:value forKey:key]; - - NSData *data = [NSJSONSerialization dataWithJSONObject:appDataDict options:0 error:nil]; - NSString *appdataJSON = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - linphone_chat_message_set_appdata(msg, [appdataJSON UTF8String]); -} - -#pragma mark - LPConfig Functions - -- (void)lpConfigSetString:(NSString *)value forKey:(NSString *)key { - [self lpConfigSetString:value forKey:key inSection:LINPHONERC_APPLICATION_KEY]; -} -- (void)lpConfigSetString:(NSString *)value forKey:(NSString *)key inSection:(NSString *)section { - if (!key) - return; - linphone_config_set_string(_configDb, [section UTF8String], [key UTF8String], value ? [value UTF8String] : NULL); -} -- (NSString *)lpConfigStringForKey:(NSString *)key { - return [self lpConfigStringForKey:key withDefault:nil]; -} -- (NSString *)lpConfigStringForKey:(NSString *)key withDefault:(NSString *)defaultValue { - return [self lpConfigStringForKey:key inSection:LINPHONERC_APPLICATION_KEY withDefault:defaultValue]; -} -- (NSString *)lpConfigStringForKey:(NSString *)key inSection:(NSString *)section { - return [self lpConfigStringForKey:key inSection:section withDefault:nil]; -} -- (NSString *)lpConfigStringForKey:(NSString *)key inSection:(NSString *)section withDefault:(NSString *)defaultValue { - if (!key) - return defaultValue; - const char *value = linphone_config_get_string(_configDb, [section UTF8String], [key UTF8String], NULL); - return value ? [NSString stringWithUTF8String:value] : defaultValue; -} - -- (void)lpConfigSetInt:(int)value forKey:(NSString *)key { - [self lpConfigSetInt:value forKey:key inSection:LINPHONERC_APPLICATION_KEY]; -} -- (void)lpConfigSetInt:(int)value forKey:(NSString *)key inSection:(NSString *)section { - if (!key) - return; - linphone_config_set_int(_configDb, [section UTF8String], [key UTF8String], (int)value); -} -- (int)lpConfigIntForKey:(NSString *)key { - return [self lpConfigIntForKey:key withDefault:-1]; -} -- (int)lpConfigIntForKey:(NSString *)key withDefault:(int)defaultValue { - return [self lpConfigIntForKey:key inSection:LINPHONERC_APPLICATION_KEY withDefault:defaultValue]; -} -- (int)lpConfigIntForKey:(NSString *)key inSection:(NSString *)section { - return [self lpConfigIntForKey:key inSection:section withDefault:-1]; -} -- (int)lpConfigIntForKey:(NSString *)key inSection:(NSString *)section withDefault:(int)defaultValue { - if (!key) - return defaultValue; - return linphone_config_get_int(_configDb, [section UTF8String], [key UTF8String], (int)defaultValue); -} - -- (void)lpConfigSetBool:(BOOL)value forKey:(NSString *)key { - [self lpConfigSetBool:value forKey:key inSection:LINPHONERC_APPLICATION_KEY]; -} -- (void)lpConfigSetBool:(BOOL)value forKey:(NSString *)key inSection:(NSString *)section { - [self lpConfigSetInt:(int)(value == TRUE) forKey:key inSection:section]; -} -- (BOOL)lpConfigBoolForKey:(NSString *)key { - return [self lpConfigBoolForKey:key withDefault:FALSE]; -} -- (BOOL)lpConfigBoolForKey:(NSString *)key withDefault:(BOOL)defaultValue { - return [self lpConfigBoolForKey:key inSection:LINPHONERC_APPLICATION_KEY withDefault:defaultValue]; -} -- (BOOL)lpConfigBoolForKey:(NSString *)key inSection:(NSString *)section { - return [self lpConfigBoolForKey:key inSection:section withDefault:FALSE]; -} -- (BOOL)lpConfigBoolForKey:(NSString *)key inSection:(NSString *)section withDefault:(BOOL)defaultValue { - if (!key) - return defaultValue; - int val = [self lpConfigIntForKey:key inSection:section withDefault:-1]; - return (val != -1) ? (val == 1) : defaultValue; -} - -#pragma mark - GSM management - -- (void)removeCTCallCenterCb { - if (mCallCenter != nil) { - LOGI(@"Removing CT call center listener [%p]", mCallCenter); - mCallCenter.callEventHandler = NULL; - } - mCallCenter = nil; -} - -- (BOOL)isCTCallCenterExist { - return mCallCenter != nil; -} - -- (void)setupGSMInteraction { - - [self removeCTCallCenterCb]; - mCallCenter = [[CTCallCenter alloc] init]; - LOGI(@"Adding CT call center listener [%p]", mCallCenter); - __block __weak LinphoneManager *weakSelf = self; - __block __weak CTCallCenter *weakCCenter = mCallCenter; - mCallCenter.callEventHandler = ^(CTCall *call) { - // post on main thread - [weakSelf performSelectorOnMainThread:@selector(handleGSMCallInteration:) - withObject:weakCCenter - waitUntilDone:YES]; - }; -} - -- (void)handleGSMCallInteration:(id)cCenter { - if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) { - CTCallCenter *ct = (CTCallCenter *)cCenter; - // pause current call, if any - LinphoneCall *call = linphone_core_get_current_call(theLinphoneCore); - if ([ct currentCalls] != nil) { - if (call) { - LOGI(@"Pausing SIP call because GSM call"); - CallManager.instance.speakerBeforePause = [CallManager.instance isSpeakerEnabled]; - linphone_call_pause(call); - [self startCallPausedLongRunningTask]; - } else if (linphone_core_is_in_conference(theLinphoneCore)) { - LOGI(@"Leaving conference call because GSM call"); - linphone_core_leave_conference(theLinphoneCore); - [self startCallPausedLongRunningTask]; - } - } // else nop, keep call in paused state - } -} - -- (NSString *)contactFilter { - NSString *filter = @"*"; - if ([self lpConfigBoolForKey:@"contact_filter_on_default_domain"]) { - LinphoneAccount *account = linphone_core_get_default_account(theLinphoneCore); - LinphoneAccountParams const *accountParams = linphone_account_get_params(account); - if (account && linphone_account_params_get_server_addr(accountParams)) { - return [NSString stringWithCString:linphone_account_params_get_domain(accountParams) - encoding:[NSString defaultCStringEncoding]]; - } - } - return filter; -} - -#pragma mark - InApp Purchase events - -- (void)inappReady:(NSNotification *)notif { - // Query our in-app server to retrieve InApp purchases - //[_iapManager retrievePurchases]; -} - -#pragma mark - - -- (MSList *) createAccountsNotHiddenList { - MSList *list = NULL; - const MSList *accounts = linphone_core_get_account_list(LC); - while (accounts) { - const char *isHidden = linphone_account_get_custom_param(accounts->data, "hidden"); - if (isHidden == NULL || strcmp(linphone_account_get_custom_param(accounts->data, "hidden"), "1") != 0) { - if (!list) { - list = bctbx_list_new(accounts->data); - } else { - bctbx_list_append(list, accounts->data); - } - } - accounts = accounts->next; - } - return list; -} - -- (void)removeAllAccounts { - linphone_core_clear_accounts(LC); - linphone_core_clear_all_auth_info(LC); -} - -+ (BOOL)isMyself:(const LinphoneAddress *)addr { - if (!addr) - return NO; - - const MSList *accounts = linphone_core_get_account_list(LC); - while (accounts) { - if (linphone_address_weak_equal(addr, linphone_account_params_get_identity_address(linphone_account_get_params(accounts->data)))) { - return YES; - } - accounts = accounts->next; - } - return NO; -} - -// ugly hack to export symbol from liblinphone so that they are available for the linphoneTests target -// linphoneTests target do not link with liblinphone but instead dynamically link with ourself which is -// statically linked with liblinphone, so we must have exported required symbols from the library to -// have them available in linphoneTests -// DO NOT INVOKE THIS METHOD -- (void)exportSymbolsForUITests { - linphone_address_set_header(NULL, NULL, NULL); -} - -- (void)checkNewVersion { - if (!CHECK_VERSION_UPDATE) - return; - if (theLinphoneCore == nil) - return; - NSString *curVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; - const char *curVersionCString = [curVersion cStringUsingEncoding:NSUTF8StringEncoding]; - linphone_core_check_for_update(theLinphoneCore, curVersionCString); -} - -- (void)loadAvatar { - NSString *assetId = [self lpConfigStringForKey:@"avatar"]; - __block UIImage *ret = nil; - if (assetId) { - PHFetchResult *assets = [PHAsset fetchAssetsWithLocalIdentifiers:[NSArray arrayWithObject:assetId] options:nil]; - if (![assets firstObject]) { - LOGE(@"Can't fetch avatar image."); - } - PHAsset *asset = [assets firstObject]; - // load avatar synchronously so that we can return UIIMage* directly - since we are - // only using thumbnail, it must be pretty fast to fetch even without cache. - PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init]; - options.synchronous = TRUE; - [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeDefault options:options - resultHandler:^(UIImage *image, NSDictionary * info) { - if (image) - ret = [UIImage UIImageThumbnail:image thumbSize:150]; - else - LOGE(@"Can't read avatar"); - }]; - } - - if (!ret) { - ret = [UIImage imageNamed:@"avatar.png"]; - } - _avatar = ret; -} - -#pragma mark - Conference - - - -void conference_participant_changed(LinphoneConference *conference, const LinphoneParticipant *participant) { - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneConfStateParticipantListChanged object:nil]; -} - -void conference_device_changed(LinphoneConference *conference, const LinphoneParticipantDevice *participant) { - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneConfStateParticipantListChanged object:nil]; -} - -void linphone_iphone_conference_state_changed(LinphoneCore *lc, LinphoneConference *conf,LinphoneConferenceState state) { - - if (state == LinphoneConferenceStateCreated) { - LinphoneConferenceCbs * cbs = linphone_factory_create_conference_cbs(linphone_factory_get()); - linphone_conference_cbs_set_participant_added(cbs, conference_participant_changed); - linphone_conference_cbs_set_participant_device_added(cbs, conference_device_changed); - linphone_conference_cbs_set_participant_device_removed(cbs, conference_device_changed); - linphone_conference_cbs_set_participant_removed(cbs, conference_participant_changed); - linphone_conference_add_callbacks(conf, cbs); - } - NSMutableDictionary *dict = [NSMutableDictionary dictionary]; - [dict setObject:[NSNumber numberWithInt:state] forKey:@"state"]; - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneConfStateChanged object:nil userInfo:dict]; -} - -+ (BOOL) getChatroomPushEnabled:(LinphoneChatRoom *)chatroom { - bool currently_enabled = true; - NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:kLinphoneMsgNotificationAppGroupId]; - NSDictionary *chatroomsPushStatus = [defaults dictionaryForKey:@"chatroomsPushStatus"]; - if (chatroomsPushStatus != nil && chatroom) { - char *uri = linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(chatroom)); - NSString* pushStatus = [chatroomsPushStatus objectForKey:[NSString stringWithUTF8String:uri]]; - currently_enabled = (pushStatus == nil) || [pushStatus isEqualToString:@"enabled"]; - ms_free(uri); - } - return currently_enabled; -} - -+ (void) setChatroomPushEnabled:(LinphoneChatRoom *)chatroom withPushEnabled:(BOOL)enabled { - if (!chatroom) return; - - NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:kLinphoneMsgNotificationAppGroupId]; - NSMutableDictionary *chatroomsPushStatus = [[NSMutableDictionary alloc] initWithDictionary:[defaults dictionaryForKey:@"chatroomsPushStatus"]]; - if (chatroomsPushStatus == nil) chatroomsPushStatus = [[NSMutableDictionary dictionary] init]; - - char *uri = linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(chatroom)); - [chatroomsPushStatus setValue:(enabled ? @"enabled" : @"disabled") forKey:[NSString stringWithUTF8String:uri]]; - ms_free(uri); - - [defaults setObject:chatroomsPushStatus forKey:@"chatroomsPushStatus"]; -} - -@end diff --git a/Classes/LinphoneUI/Base.lproj/StatusBarView.strings b/Classes/LinphoneUI/Base.lproj/StatusBarView.strings deleted file mode 100644 index 3ca9a0d25..000000000 Binary files a/Classes/LinphoneUI/Base.lproj/StatusBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/Base.lproj/StatusBarView.xib b/Classes/LinphoneUI/Base.lproj/StatusBarView.xib deleted file mode 100644 index ecf23cbb5..000000000 --- a/Classes/LinphoneUI/Base.lproj/StatusBarView.xib +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/LinphoneUI/Base.lproj/TabBarView.strings b/Classes/LinphoneUI/Base.lproj/TabBarView.strings deleted file mode 100644 index cf4ea9723..000000000 Binary files a/Classes/LinphoneUI/Base.lproj/TabBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/Base.lproj/TabBarView.xib b/Classes/LinphoneUI/Base.lproj/TabBarView.xib deleted file mode 100644 index 9639e2884..000000000 --- a/Classes/LinphoneUI/Base.lproj/TabBarView.xib +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/LinphoneUI/Base.lproj/UICallCell.strings b/Classes/LinphoneUI/Base.lproj/UICallCell.strings deleted file mode 100644 index cc5ae2ee6..000000000 Binary files a/Classes/LinphoneUI/Base.lproj/UICallCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/Base.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/Base.lproj/UICallConferenceCell.strings deleted file mode 100644 index e24779e2c..000000000 Binary files a/Classes/LinphoneUI/Base.lproj/UICallConferenceCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/Base.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/Base.lproj/UICallPausedCell.strings deleted file mode 100644 index db95ec94e..000000000 Binary files a/Classes/LinphoneUI/Base.lproj/UICallPausedCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/Base.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/Base.lproj/UIChatBubblePhotoCell.strings deleted file mode 100644 index 9af3a1d6a..000000000 Binary files a/Classes/LinphoneUI/Base.lproj/UIChatBubblePhotoCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/Base.lproj/UIChatBubblePhotoCell.xib b/Classes/LinphoneUI/Base.lproj/UIChatBubblePhotoCell.xib deleted file mode 100644 index b028b60e4..000000000 --- a/Classes/LinphoneUI/Base.lproj/UIChatBubblePhotoCell.xib +++ /dev/null @@ -1,268 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.strings deleted file mode 100644 index 87c5684aa..000000000 Binary files a/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.xib b/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.xib deleted file mode 100644 index 7cbb944c2..000000000 --- a/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.xib +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/LinphoneUI/Base.lproj/UIChatCell.strings b/Classes/LinphoneUI/Base.lproj/UIChatCell.strings deleted file mode 100644 index 0c24079ac..000000000 Binary files a/Classes/LinphoneUI/Base.lproj/UIChatCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/Base.lproj/UIChatCell.xib b/Classes/LinphoneUI/Base.lproj/UIChatCell.xib deleted file mode 100644 index 998281423..000000000 --- a/Classes/LinphoneUI/Base.lproj/UIChatCell.xib +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/LinphoneUI/Base.lproj/UIChatConversationImdnTableViewCell.strings b/Classes/LinphoneUI/Base.lproj/UIChatConversationImdnTableViewCell.strings deleted file mode 100644 index 94a957dd5..000000000 Binary files a/Classes/LinphoneUI/Base.lproj/UIChatConversationImdnTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/Base.lproj/UIChatConversationImdnTableViewCell.xib b/Classes/LinphoneUI/Base.lproj/UIChatConversationImdnTableViewCell.xib deleted file mode 100644 index 85628a3b9..000000000 --- a/Classes/LinphoneUI/Base.lproj/UIChatConversationImdnTableViewCell.xib +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/LinphoneUI/Base.lproj/UIChatConversationInfoTableViewCell.strings b/Classes/LinphoneUI/Base.lproj/UIChatConversationInfoTableViewCell.strings deleted file mode 100644 index 86570c18c..000000000 Binary files a/Classes/LinphoneUI/Base.lproj/UIChatConversationInfoTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/Base.lproj/UIChatConversationInfoTableViewCell.xib b/Classes/LinphoneUI/Base.lproj/UIChatConversationInfoTableViewCell.xib deleted file mode 100644 index 7cbce97ec..000000000 --- a/Classes/LinphoneUI/Base.lproj/UIChatConversationInfoTableViewCell.xib +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/LinphoneUI/Base.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/Base.lproj/UIChatCreateCell.strings deleted file mode 100644 index 2c2a4ba7f..000000000 Binary files a/Classes/LinphoneUI/Base.lproj/UIChatCreateCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/Base.lproj/UIChatCreateCell.xib b/Classes/LinphoneUI/Base.lproj/UIChatCreateCell.xib deleted file mode 100644 index f204268d9..000000000 --- a/Classes/LinphoneUI/Base.lproj/UIChatCreateCell.xib +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/LinphoneUI/Base.lproj/UIChatCreateCollectionViewCell.strings b/Classes/LinphoneUI/Base.lproj/UIChatCreateCollectionViewCell.strings deleted file mode 100644 index c4186dcaa..000000000 Binary files a/Classes/LinphoneUI/Base.lproj/UIChatCreateCollectionViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/Base.lproj/UIChatReplyBubbleView.xib b/Classes/LinphoneUI/Base.lproj/UIChatReplyBubbleView.xib deleted file mode 100644 index 8db8e4bf0..000000000 --- a/Classes/LinphoneUI/Base.lproj/UIChatReplyBubbleView.xib +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/LinphoneUI/Base.lproj/UIChatRoomCell.strings b/Classes/LinphoneUI/Base.lproj/UIChatRoomCell.strings deleted file mode 100644 index aa7f96da1..000000000 Binary files a/Classes/LinphoneUI/Base.lproj/UIChatRoomCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/Base.lproj/UICompositeView.xib b/Classes/LinphoneUI/Base.lproj/UICompositeView.xib deleted file mode 100644 index 1989d890d..000000000 --- a/Classes/LinphoneUI/Base.lproj/UICompositeView.xib +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/LinphoneUI/Base.lproj/UICompositeView~ipad.xib b/Classes/LinphoneUI/Base.lproj/UICompositeView~ipad.xib deleted file mode 100644 index 82cbd8e30..000000000 --- a/Classes/LinphoneUI/Base.lproj/UICompositeView~ipad.xib +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/LinphoneUI/Base.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/Base.lproj/UIConfirmationDialog.strings deleted file mode 100644 index b4edc2ae2..000000000 Binary files a/Classes/LinphoneUI/Base.lproj/UIConfirmationDialog.strings and /dev/null differ diff --git a/Classes/LinphoneUI/Base.lproj/UIConfirmationDialog.xib b/Classes/LinphoneUI/Base.lproj/UIConfirmationDialog.xib deleted file mode 100644 index 19b1b5271..000000000 --- a/Classes/LinphoneUI/Base.lproj/UIConfirmationDialog.xib +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/LinphoneUI/Base.lproj/UIContactCell.strings b/Classes/LinphoneUI/Base.lproj/UIContactCell.strings deleted file mode 100644 index aca210d0b..000000000 Binary files a/Classes/LinphoneUI/Base.lproj/UIContactCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/Base.lproj/UIContactCell.xib b/Classes/LinphoneUI/Base.lproj/UIContactCell.xib deleted file mode 100644 index 1f68f7212..000000000 --- a/Classes/LinphoneUI/Base.lproj/UIContactCell.xib +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/LinphoneUI/Base.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/Base.lproj/UIContactDetailsCell.strings deleted file mode 100644 index 3b0b47e8d..000000000 Binary files a/Classes/LinphoneUI/Base.lproj/UIContactDetailsCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/Base.lproj/UIContactDetailsCell.xib b/Classes/LinphoneUI/Base.lproj/UIContactDetailsCell.xib deleted file mode 100644 index f69fd659a..000000000 --- a/Classes/LinphoneUI/Base.lproj/UIContactDetailsCell.xib +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/LinphoneUI/Base.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/Base.lproj/UIHistoryCell.strings deleted file mode 100644 index 731db2b00..000000000 Binary files a/Classes/LinphoneUI/Base.lproj/UIHistoryCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/Base.lproj/UIHistoryCell.xib b/Classes/LinphoneUI/Base.lproj/UIHistoryCell.xib deleted file mode 100644 index 39fb1c76d..000000000 --- a/Classes/LinphoneUI/Base.lproj/UIHistoryCell.xib +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/LinphoneUI/Base.lproj/UIMainBar.strings b/Classes/LinphoneUI/Base.lproj/UIMainBar.strings deleted file mode 100644 index 7dcd85f93..000000000 Binary files a/Classes/LinphoneUI/Base.lproj/UIMainBar.strings and /dev/null differ diff --git a/Classes/LinphoneUI/Base.lproj/UIMainBar~ipad.strings b/Classes/LinphoneUI/Base.lproj/UIMainBar~ipad.strings deleted file mode 100644 index 670e50eb1..000000000 Binary files a/Classes/LinphoneUI/Base.lproj/UIMainBar~ipad.strings and /dev/null differ diff --git a/Classes/LinphoneUI/Base.lproj/UIStateBar.strings b/Classes/LinphoneUI/Base.lproj/UIStateBar.strings deleted file mode 100644 index 4056cdda2..000000000 Binary files a/Classes/LinphoneUI/Base.lproj/UIStateBar.strings and /dev/null differ diff --git a/Classes/LinphoneUI/StatusBarView.h b/Classes/LinphoneUI/StatusBarView.h deleted file mode 100644 index ff3f661f6..000000000 --- a/Classes/LinphoneUI/StatusBarView.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import "TPMultiLayoutViewController.h" -#import "UIConfirmationDialog.h" -#import "LinphoneManager.h" - -@interface StatusBarView : UIViewController { - UIConfirmationDialog *securityDialog; -} - -@property(weak, nonatomic) IBOutlet UIButton *registrationState; -@property(nonatomic, strong) IBOutlet UIButton *callSecurityButton; -@property(weak, nonatomic) IBOutlet UIButton *voicemailButton; -@property(weak, nonatomic) IBOutlet UIButton *callQualityButton; -//@property (weak, nonatomic) IBOutlet UILabel *localpushIndicator; - -@property(weak, nonatomic) IBOutlet UIView *incallView; -@property(weak, nonatomic) IBOutlet UIView *outcallView; - -- (IBAction)onSecurityClick:(id)sender; -- (IBAction)onQualityClick:(id)sender; -- (IBAction)onSideMenuClick:(id)sender; -- (IBAction)onRegistrationStateClick:(id)sender; -+ (UIImage *)imageForState:(LinphoneRegistrationState)state; -@end diff --git a/Classes/LinphoneUI/StatusBarView.m b/Classes/LinphoneUI/StatusBarView.m deleted file mode 100644 index 9ef7a8c28..000000000 --- a/Classes/LinphoneUI/StatusBarView.m +++ /dev/null @@ -1,438 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "StatusBarView.h" -#import "LinphoneManager.h" -#import "PhoneMainView.h" -#import -#import "linphoneapp-Swift.h" - -@implementation StatusBarView { - - NSTimer *callQualityTimer; - NSTimer *callSecurityTimer; - int messagesUnreadCount; -} - -#pragma mark - Lifecycle Functions - -- (void)dealloc { - [NSNotificationCenter.defaultCenter removeObserver:self]; - [callQualityTimer invalidate]; -} - -#pragma mark - ViewController Functions - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - - // Set observer - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(registrationUpdate:) - name:kLinphoneRegistrationUpdate - object:nil]; - - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(globalStateUpdate:) - name:kLinphoneGlobalStateUpdate - object:nil]; - - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(notifyReceived:) - name:kLinphoneNotifyReceived - object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(mainViewChanged:) - name:kLinphoneMainViewChange - object:nil]; - - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(callUpdate:) - name:kLinphoneCallUpdate - object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(onCallEncryptionChanged:) - name:kLinphoneCallEncryptionChanged - object:nil]; - - // Update to default state - LinphoneAccount *account = linphone_core_get_default_account(LC); - messagesUnreadCount = linphone_config_get_int(linphone_core_get_config(LC), "app", "voice_mail_messages_count", 0); - - [self accountUpdate:account]; - [self updateUI:linphone_core_get_calls_nb(LC)]; - [self updateVoicemail]; - - /*if (@available(iOS 15.0, *)) { - [LocalPushManager.shared addActiveCallBackObserverWithAction:^(BOOL active) { - _localpushIndicator.hidden = !active; - }]; - } else { - _localpushIndicator.hidden = true; - }*/ - - -} - -- (void)viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; - - // Remove observer - [NSNotificationCenter.defaultCenter removeObserver:self name:kLinphoneRegistrationUpdate object:nil]; - [NSNotificationCenter.defaultCenter removeObserver:self name:kLinphoneGlobalStateUpdate object:nil]; - [NSNotificationCenter.defaultCenter removeObserver:self name:kLinphoneNotifyReceived object:nil]; - [NSNotificationCenter.defaultCenter removeObserver:self name:kLinphoneCallUpdate object:nil]; - [NSNotificationCenter.defaultCenter removeObserver:self name:kLinphoneMainViewChange object:nil]; - - if (callQualityTimer != nil) { - [callQualityTimer invalidate]; - callQualityTimer = nil; - } - if (callSecurityTimer != nil) { - [callSecurityTimer invalidate]; - callSecurityTimer = nil; - } - - if (securityDialog != nil) { - [securityDialog dismiss]; - securityDialog = nil; - } -} - -#pragma mark - Event Functions - -- (void)registrationUpdate:(NSNotification *)notif { - LinphoneAccount *account = linphone_core_get_default_account(LC); - [self accountUpdate:account]; -} - -- (void)globalStateUpdate:(NSNotification *)notif { - [self registrationUpdate:nil]; -} - -- (void)mainViewChanged:(NSNotification *)notif { - [self registrationUpdate:nil]; -} - -- (void)onCallEncryptionChanged:(NSNotification *)notif { - LinphoneCall *call = linphone_core_get_current_call(LC); - - if (call && (linphone_call_params_get_media_encryption(linphone_call_get_current_params(call)) == - LinphoneMediaEncryptionZRTP) && - (!linphone_call_get_authentication_token_verified(call))) { - [self onSecurityClick:nil]; - } -} - -- (void)notifyReceived:(NSNotification *)notif { - const LinphoneContent *content = [[notif.userInfo objectForKey:@"content"] pointerValue]; - - if ((content == NULL) || (strcmp("application", linphone_content_get_type(content)) != 0) || - (strcmp("simple-message-summary", linphone_content_get_subtype(content)) != 0) || - (linphone_content_get_buffer(content) == NULL)) { - return; - } - const uint8_t *bodyTmp = linphone_content_get_buffer(content); - const char *body = (const char *)bodyTmp; - if ((body = strstr(body, "voice-message: ")) == NULL) { - LOGW(@"Received new NOTIFY from voice mail but could not find 'voice-message' in BODY. Ignoring it."); - return; - } - - sscanf((const char *)body, "voice-message: %d", &messagesUnreadCount); - - LOGI(@"Received new NOTIFY from voice mail: there is/are now %d message(s) unread", messagesUnreadCount); - - // save in lpconfig for future - linphone_config_set_int(linphone_core_get_config(LC), "app", "voice_mail_messages_count", messagesUnreadCount); - - [self updateVoicemail]; -} - -- (void)updateVoicemail { - _voicemailButton.hidden = (messagesUnreadCount <= 0); - _voicemailButton.titleLabel.text = @(messagesUnreadCount).stringValue; -} - -- (void)callUpdate:(NSNotification *)notif { - // show voice mail only when there is no call - [self updateUI:linphone_core_get_calls(LC) != NULL]; - [self updateVoicemail]; -} - -#pragma mark - - -+ (UIImage *)imageForState:(LinphoneRegistrationState)state { - switch (state) { - case LinphoneRegistrationFailed: - return [UIImage imageNamed:@"led_error.png"]; - case LinphoneRegistrationCleared: - case LinphoneRegistrationNone: - return [UIImage imageNamed:@"led_disconnected.png"]; - case LinphoneRegistrationProgress: - case LinphoneRegistrationRefreshing: - return [UIImage imageNamed:@"led_inprogress.png"]; - case LinphoneRegistrationOk: - return [UIImage imageNamed:@"led_connected.png"]; - } -} -- (void)accountUpdate:(LinphoneAccount *)account { - LinphoneRegistrationState state = LinphoneRegistrationNone; - NSString *message = nil; - LinphoneGlobalState gstate = linphone_core_get_global_state(LC); - - if ([PhoneMainView.instance.currentView equal:AssistantView.compositeViewDescription] || [PhoneMainView.instance.currentView equal:CountryListView.compositeViewDescription]) { - message = NSLocalizedString(@"Configuring account", nil); - } else if (gstate == LinphoneGlobalOn && !linphone_core_is_network_reachable(LC)) { - message = NSLocalizedString(@"Network down", nil); - } else if (gstate == LinphoneGlobalConfiguring) { - message = NSLocalizedString(@"Fetching remote configuration", nil); - } else if (account == NULL) { - state = LinphoneRegistrationNone; - MSList *accounts = [LinphoneManager.instance createAccountsNotHiddenList]; - if (accounts != NULL) { - message = NSLocalizedString(@"No default account", nil); - } else { - message = NSLocalizedString(@"No account configured", nil); - } - bctbx_free(accounts); - - } else { - state = linphone_account_get_state(account); - - switch (state) { - case LinphoneRegistrationOk: - message = NSLocalizedString(@"Connected", nil); - break; - case LinphoneRegistrationNone: - case LinphoneRegistrationCleared: - message = NSLocalizedString(@"Not connected", nil); - break; - case LinphoneRegistrationFailed: - message = NSLocalizedString(@"Connection failed", nil); - break; - case LinphoneRegistrationProgress: - message = NSLocalizedString(@"Connection in progress", nil); - break; - default: - break; - } - } - [_registrationState setTitle:message forState:UIControlStateNormal]; - _registrationState.accessibilityValue = message; - [_registrationState setImage:[self.class imageForState:state] forState:UIControlStateNormal]; -} - -#pragma mark - - -- (void)updateUI:(BOOL)inCall { - BOOL hasChanged = (_outcallView.hidden != inCall); - - _outcallView.hidden = inCall; - _incallView.hidden = !inCall; - - if (!hasChanged) - return; - - if (callQualityTimer) { - [callQualityTimer invalidate]; - callQualityTimer = nil; - } - if (callSecurityTimer) { - [callSecurityTimer invalidate]; - callSecurityTimer = nil; - } - if (securityDialog) { - [securityDialog dismiss]; - } - - // if we are in call, we have to update quality and security icons every sec - if (inCall) { - callQualityTimer = [NSTimer scheduledTimerWithTimeInterval:1 - target:self - selector:@selector(callQualityUpdate) - userInfo:nil - repeats:YES]; - callSecurityTimer = [NSTimer scheduledTimerWithTimeInterval:1 - target:self - selector:@selector(callSecurityUpdate) - userInfo:nil - repeats:YES]; - } -} - -- (void)callSecurityUpdate { - BOOL pending = false; - BOOL security = true; - - const MSList *list = linphone_core_get_calls(LC); - if (list == NULL) { - if (securityDialog) { - [securityDialog dismiss]; - } - } else { - _callSecurityButton.hidden = NO; - while (list != NULL) { - LinphoneCall *call = (LinphoneCall *)list->data; - LinphoneMediaEncryption enc = - linphone_call_params_get_media_encryption(linphone_call_get_current_params(call)); - if (enc == LinphoneMediaEncryptionNone) - security = false; - else if (enc == LinphoneMediaEncryptionZRTP) { - if (!linphone_call_get_authentication_token_verified(call)) { - pending = true; - } - } - list = list->next; - } - NSString *imageName = - (security ? (pending ? @"security_pending.png" : @"security_ok.png") : @"security_ko.png"); - [_callSecurityButton setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal]; - } -} - -- (void)callQualityUpdate { - LinphoneCall *call = linphone_core_get_current_call(LC); - if (call != NULL) { - int quality = MIN(4, floor(linphone_call_get_current_quality(call))); - NSString *accessibilityValue = [NSString stringWithFormat:NSLocalizedString(@"Call quality: %d", nil), quality]; - if (![accessibilityValue isEqualToString:_callQualityButton.accessibilityValue]) { - _callQualityButton.accessibilityValue = accessibilityValue; - _callQualityButton.hidden = NO; //(quality == -1.f); - UIImage *image = - (quality == -1.f) - ? [UIImage imageNamed:@"call_quality_indicator_0.png"] // nil - : [UIImage imageNamed:[NSString stringWithFormat:@"call_quality_indicator_%d.png", quality]]; - [_callQualityButton setImage:image forState:UIControlStateNormal]; - } - } -} - -#pragma mark - Action Functions - -- (IBAction)onSecurityClick:(id)sender { - if (linphone_core_get_calls_nb(LC)) { - LinphoneCall *call = linphone_core_get_current_call(LC); - if (call != NULL) { - LinphoneMediaEncryption enc = - linphone_call_params_get_media_encryption(linphone_call_get_current_params(call)); - if (enc == LinphoneMediaEncryptionZRTP) { - NSString *code = [NSString stringWithUTF8String:linphone_call_get_authentication_token(call)]; - NSString *myCode; - NSString *correspondantCode; - if (linphone_call_get_dir(call) == LinphoneCallIncoming) { - myCode = [code substringToIndex:2]; - correspondantCode = [code substringFromIndex:2]; - } else { - correspondantCode = [code substringToIndex:2]; - myCode = [code substringFromIndex:2]; - } - NSString *message = [NSString stringWithFormat:NSLocalizedString(@"\nCommunication security:\n\nTo raise the security level, you can check the following codes with your correspondent.\n\nSay: %1$@\n\nYour correspondent must say: %2$@", nil), - myCode.uppercaseString, correspondantCode.uppercaseString]; - - if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive && - floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) { - UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]; - content.title = NSLocalizedString(@"ZRTP verification", nil); - content.body = message; - content.categoryIdentifier = @"zrtp_request"; - content.userInfo = @{ - @"CallId" : [NSString - stringWithUTF8String:linphone_call_log_get_call_id(linphone_call_get_call_log(call))] - }; - - UNNotificationRequest *req = - [UNNotificationRequest requestWithIdentifier:@"zrtp_request" content:content trigger:NULL]; - [[UNUserNotificationCenter currentNotificationCenter] - addNotificationRequest:req - withCompletionHandler:^(NSError *_Nullable error) { - // Enable or disable features based on authorization. - if (error) { - LOGD(@"Error while adding notification request :"); - LOGD(error.description); - } - }]; - } else { - if (securityDialog == nil) { - __block __strong StatusBarView *weakSelf = self; - // define font of message - NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:message]; - NSUInteger length = [message length]; - UIFont *baseFont = [UIFont systemFontOfSize:21.0]; - [attrString addAttribute:NSFontAttributeName value:baseFont range:NSMakeRange(0, length)]; - UIFont *boldFont = [UIFont boldSystemFontOfSize:23.0]; - [attrString addAttribute:NSFontAttributeName value:boldFont range:[message rangeOfString:@"Communication security"]]; - UIColor *color = [UIColor colorWithRed:(150 / 255.0) green:(193 / 255.0) blue:(31 / 255.0) alpha:1.0]; - [attrString addAttribute:NSForegroundColorAttributeName value:color range:[message rangeOfString:myCode.uppercaseString]]; - [attrString addAttribute:NSForegroundColorAttributeName value:color range:[message rangeOfString:correspondantCode.uppercaseString]]; - - securityDialog = [UIConfirmationDialog ShowWithAttributedMessage:attrString - cancelMessage:NSLocalizedString(@"Later", nil) - confirmMessage:NSLocalizedString(@"Correct", nil) - onCancelClick:^() { - if (linphone_core_get_current_call(LC) == call) { - linphone_call_set_authentication_token_verified(call, NO); - } - weakSelf->securityDialog = nil; - [LinphoneManager.instance lpConfigSetString:[NSString stringWithUTF8String:linphone_call_get_remote_address_as_string(call)] forKey:@"sas_dialog_denied"]; - } - onConfirmationClick:^() { - if (linphone_core_get_current_call(LC) == call) { - linphone_call_set_authentication_token_verified(call, YES); - } - weakSelf->securityDialog = nil; - [LinphoneManager.instance lpConfigSetString:nil forKey:@"sas_dialog_denied"]; - } ]; - - securityDialog.securityImage.hidden = FALSE; - [securityDialog setSpecialColor]; - [securityDialog setWhiteCancel]; - } - } - } - } - } -} - -- (IBAction)onQualityClick:(id)sender { - [ControlsViewModelBridge toggleStatsVisibility]; -} - -- (IBAction)onSideMenuClick:(id)sender { - UICompositeView *cvc = PhoneMainView.instance.mainViewController; - [cvc hideSideMenu:(cvc.sideMenuView.frame.origin.x == 0)]; -} - - -- (IBAction)onRegistrationStateClick:(id)sender { - if (linphone_core_get_default_account(LC)) { - linphone_core_refresh_registers(LC); - } else { - - MSList *accounts = [LinphoneManager.instance createAccountsNotHiddenList]; - if (accounts) { - [PhoneMainView.instance changeCurrentView:SettingsView.compositeViewDescription]; - } else { - [PhoneMainView.instance changeCurrentView:AssistantView.compositeViewDescription]; - } - bctbx_free(accounts); - } -} - -@end diff --git a/Classes/LinphoneUI/TabBarView.h b/Classes/LinphoneUI/TabBarView.h deleted file mode 100644 index 938895722..000000000 --- a/Classes/LinphoneUI/TabBarView.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import "TPMultiLayoutViewController.h" -#import "UIBouncingView.h" - -@interface TabBarView : TPMultiLayoutViewController { -} - -@property(nonatomic, strong) IBOutlet UIButton *historyButton; -@property(nonatomic, strong) IBOutlet UIButton *contactsButton; -@property(nonatomic, strong) IBOutlet UIButton *dialerButton; -@property(nonatomic, strong) IBOutlet UIButton *chatButton; -@property(nonatomic, strong) IBOutlet UIBouncingView *historyNotificationView; -@property(nonatomic, strong) IBOutlet UIBouncingView *chatNotificationView; -@property(nonatomic, strong) IBOutlet UILabel *chatNotificationLabel; -@property(nonatomic, strong) IBOutlet UILabel *historyNotificationLabel; -@property(weak, nonatomic) IBOutlet UIImageView *selectedButtonImage; - -- (void)update:(BOOL)appear; - -- (IBAction)onHistoryClick:(id)event; -- (IBAction)onContactsClick:(id)event; -- (IBAction)onDialerClick:(id)event; -- (IBAction)onChatClick:(id)event; - -@end diff --git a/Classes/LinphoneUI/TabBarView.m b/Classes/LinphoneUI/TabBarView.m deleted file mode 100644 index 40369b36c..000000000 --- a/Classes/LinphoneUI/TabBarView.m +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "TabBarView.h" -#import "PhoneMainView.h" -#import "linphoneapp-Swift.h" - -@implementation TabBarView - -#pragma mark - ViewController Functions - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(changeViewEvent:) - name:kLinphoneMainViewChange - object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(callUpdate:) - name:kLinphoneCallUpdate - object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(messageReceived:) - name:kLinphoneMessageReceived - object:nil]; - [self update:FALSE]; -} - -- (void)viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; - [NSNotificationCenter.defaultCenter removeObserver:self]; -} - -- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { - [self update:FALSE]; -} - -#pragma mark - Event Functions - -- (void)callUpdate:(NSNotification *)notif { - // LinphoneCall *call = [[notif.userInfo objectForKey: @"call"] pointerValue]; - // LinphoneCallState state = [[notif.userInfo objectForKey: @"state"] intValue]; - [self updateMissedCall:linphone_core_get_missed_calls_count(LC) appear:TRUE]; -} - -- (void)changeViewEvent:(NSNotification *)notif { - UICompositeViewDescription *view = [notif.userInfo objectForKey:@"view"]; - if (view != nil) { - [self updateSelectedButton:view]; - } -} - -- (void)messageReceived:(NSNotification *)notif { - [self updateUnreadMessage:TRUE]; -} - -#pragma mark - UI Update - -- (void)update:(BOOL)appear { - [self updateSelectedButton:[PhoneMainView.instance currentView]]; - [self updateMissedCall:linphone_core_get_missed_calls_count(LC) appear:appear]; - if (![LinphoneManager.instance lpConfigBoolForKey:@"disable_chat_feature"]) { - [self updateUnreadMessage:appear]; - } -} - -- (void)updateUnreadMessage:(BOOL)appear { - int unreadMessage = [LinphoneManager unreadMessageCount]; - if (![LinphoneManager.instance lpConfigBoolForKey:@"disable_chat_feature"]) { - if (unreadMessage > 0) { - _chatNotificationLabel.text = [NSString stringWithFormat:@"%i", unreadMessage]; - [_chatNotificationView startAnimating:appear]; - } else { - [_chatNotificationView stopAnimating:appear]; - } - } -} - -- (void)updateMissedCall:(int)missedCall appear:(BOOL)appear { - if (missedCall > 0) { - _historyNotificationLabel.text = [NSString stringWithFormat:@"%i", missedCall]; - [_historyNotificationView startAnimating:appear]; - } else { - [_historyNotificationView stopAnimating:appear]; - } -} - -- (void)updateSelectedButton:(UICompositeViewDescription *)view { - _historyButton.selected = [view equal:HistoryListView.compositeViewDescription] || - [view equal:HistoryDetailsView.compositeViewDescription] || - [view equal:ConferenceHistoryDetailsView.compositeViewDescription]; - _contactsButton.selected = [view equal:ContactsListView.compositeViewDescription] || - [view equal:ContactDetailsView.compositeViewDescription]; - _dialerButton.selected = [view equal:DialerView.compositeViewDescription]; - _chatButton.selected = [view equal:ChatsListView.compositeViewDescription] || - [view equal:ChatConversationCreateView.compositeViewDescription] || - [view equal:ChatConversationInfoView.compositeViewDescription] || - [view equal:ChatConversationImdnView.compositeViewDescription] || - [view equal:ChatConversationViewSwift.compositeViewDescription]; - if ([LinphoneManager.instance lpConfigBoolForKey:@"disable_chat_feature"] && [self viewIsCurrentlyPortrait]) { - CGFloat itemWidth = [UIScreen mainScreen].bounds.size.width/3; - [_chatButton setEnabled:false]; - [_chatButton setHidden:true]; - [_chatNotificationView setHidden:true]; - _historyButton.frame = CGRectMake(0, 0, itemWidth, 66); - _contactsButton.frame = CGRectMake(itemWidth, 0, itemWidth, 66); - _dialerButton.frame = CGRectMake(itemWidth*2, 0, itemWidth, 66); - _selectedButtonImage.frame = CGRectMake(_selectedButtonImage.frame.origin.x, _selectedButtonImage.frame.origin.y, itemWidth, 3); - } else if ([LinphoneManager.instance lpConfigBoolForKey:@"disable_chat_feature"] && ![self viewIsCurrentlyPortrait]) { - [_chatButton setEnabled:false]; - [_chatButton setHidden:true]; - [_chatNotificationView setHidden:true]; - _historyButton.frame = CGRectMake(0, 20, 90, 90); - _contactsButton.frame = CGRectMake(0, 120, 90, 90); - _dialerButton.frame = CGRectMake(0, 220, 90, 90); - _selectedButtonImage.frame = CGRectMake(_selectedButtonImage.frame.origin.x, _selectedButtonImage.frame.origin.y, 3, 90); - } - CGRect selectedNewFrame = _selectedButtonImage.frame; - if ([self viewIsCurrentlyPortrait]) { - selectedNewFrame.origin.x = - (_historyButton.selected - ? _historyButton.frame.origin.x - : (_contactsButton.selected - ? _contactsButton.frame.origin.x - : (_dialerButton.selected - ? _dialerButton.frame.origin.x - : (_chatButton.selected - ? _chatButton.frame.origin.x - : -selectedNewFrame.size.width /*hide it if none is selected*/)))); - } else { - selectedNewFrame.origin.y = - (_historyButton.selected - ? _historyButton.frame.origin.y - : (_contactsButton.selected - ? _contactsButton.frame.origin.y - : (_dialerButton.selected - ? _dialerButton.frame.origin.y - : (_chatButton.selected - ? _chatButton.frame.origin.y - : -selectedNewFrame.size.height /*hide it if none is selected*/)))); - } - - CGFloat delay = ANIMATED ? 0.3 : 0; - [UIView animateWithDuration:delay - animations:^{ - _selectedButtonImage.frame = selectedNewFrame; - - }]; -} - -#pragma mark - Action Functions - -- (IBAction)onHistoryClick:(id)event { - linphone_core_reset_missed_calls_count(LC); - [self update:FALSE]; - [PhoneMainView.instance updateApplicationBadgeNumber]; - [PhoneMainView.instance changeCurrentView:HistoryListView.compositeViewDescription]; -} - -- (IBAction)onContactsClick:(id)event { - [ContactSelection setAddAddress:nil]; - [PhoneMainView.instance changeCurrentView:ContactsListView.compositeViewDescription]; -} - -- (IBAction)onDialerClick:(id)event { - [PhoneMainView.instance changeCurrentView:DialerView.compositeViewDescription]; -} - -- (IBAction)onSettingsClick:(id)event { - [PhoneMainView.instance changeCurrentView:SettingsView.compositeViewDescription]; -} - -- (IBAction)onChatClick:(id)event { - [PhoneMainView.instance changeCurrentView:ChatsListView.compositeViewDescription]; -} - -@end diff --git a/Classes/LinphoneUI/UIAddressTextField.h b/Classes/LinphoneUI/UIAddressTextField.h deleted file mode 100644 index c0e091c0b..000000000 --- a/Classes/LinphoneUI/UIAddressTextField.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -@interface UIAddressTextField : UITextField - -@end diff --git a/Classes/LinphoneUI/UIAddressTextField.m b/Classes/LinphoneUI/UIAddressTextField.m deleted file mode 100644 index 17a2b3e63..000000000 --- a/Classes/LinphoneUI/UIAddressTextField.m +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIAddressTextField.h" - -@implementation UIAddressTextField - -- (void)setText:(NSString *)text { - [super setText:text]; - [self sendActionsForControlEvents:UIControlEventEditingChanged]; -} - -- (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 { - return [super canPerformAction:action withSender:sender]; - } -} - -@end diff --git a/Classes/LinphoneUI/UIAssistantTextField.h b/Classes/LinphoneUI/UIAssistantTextField.h deleted file mode 100644 index f40e17ca9..000000000 --- a/Classes/LinphoneUI/UIAssistantTextField.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -typedef BOOL (^DisplayErrorPred)(NSString *inputEntry); - -@interface UIAssistantTextField : UITextField - -@property(nonatomic, strong) IBOutlet UIView* nextFieldResponder; -@property(nonatomic, strong) IBOutlet UILabel *errorLabel; -@property(nonatomic, readonly) DisplayErrorPred showErrorPredicate; - -@property(nonatomic, strong) NSString *lastText; -// we should show error only when user finished editted the field at least once -@property(atomic) BOOL canShowError; - -- (void)showError:(NSString *)msg when:(DisplayErrorPred)pred; -- (void)showError:(NSString *)msg; -- (BOOL)isInvalid; -- (BOOL)isVisible; - -@end diff --git a/Classes/LinphoneUI/UIAssistantTextField.m b/Classes/LinphoneUI/UIAssistantTextField.m deleted file mode 100644 index 669d2507f..000000000 --- a/Classes/LinphoneUI/UIAssistantTextField.m +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIAssistantTextField.h" -#import "Utils.h" - -@implementation UIAssistantTextField - -INIT_WITH_COMMON_CF { - self.delegate = self; - self.enabled = self.isEnabled; //force refresh bg color - return self; -} - -- (void)showError:(NSString *)msg { - _errorLabel.text = msg; - _lastText = self.text; - - _errorLabel.hidden = NO; - self.layer.borderWidth = .8; - self.layer.cornerRadius = 4.f; - self.autoresizingMask = YES; - self.layer.borderColor = _errorLabel.hidden ? [[UIColor clearColor] CGColor] : [[UIColor redColor] CGColor]; -} - -- (void)showError:(NSString *)msg when:(DisplayErrorPred)apred { - _showErrorPredicate = apred; - [self showError:msg]; - [self checkDisplayError]; -} - -- (void)checkDisplayError { - _errorLabel.hidden = !(_canShowError && [self isInvalid]); - self.layer.borderColor = _errorLabel.hidden ? [[UIColor clearColor] CGColor] : [[UIColor redColor] CGColor]; -} - -- (BOOL)isVisible { - UIView* aview = self; - while (aview) { - if (aview.isHidden || !aview.isUserInteractionEnabled) return NO; - aview = aview.superview; - } - return YES; -} - -- (BOOL)isInvalid { - return self.isVisible && _showErrorPredicate && _showErrorPredicate(_lastText); -} - -- (void)setEnabled:(BOOL)enabled { - [super setEnabled:enabled]; - self.backgroundColor = [self.backgroundColor colorWithAlphaComponent:enabled?1:0.3]; -} - -#pragma mark - UITextFieldDelegate Functions - -- (BOOL)textField:(UITextField *)textField - shouldChangeCharactersInRange:(NSRange)range - replacementString:(NSString *)string { - // we must not show any error until user typed at least one character - _canShowError |= (string.length > 0); - _lastText = [textField.text stringByReplacingCharactersInRange:range withString:string]; - [self checkDisplayError]; - return YES; -} - -- (void)textFieldDidBeginEditing:(UITextField *)textField { - if (self.nextFieldResponder && !self.nextFieldResponder.hidden) { - self.returnKeyType = UIReturnKeyNext; - } else { - self.returnKeyType = UIReturnKeyDone; - } - -} -- (void)textFieldDidEndEditing:(UITextField *)textField { - _lastText = textField.text; - [self checkDisplayError]; -} - -@end diff --git a/Classes/LinphoneUI/UIAvatarPresence.h b/Classes/LinphoneUI/UIAvatarPresence.h deleted file mode 100644 index c86fb2fe4..000000000 --- a/Classes/LinphoneUI/UIAvatarPresence.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -@interface UIAvatarPresence : UIRoundedImageView - -@property(nonatomic, setter=setFriend:) LinphoneFriend *friend; -@property(nonatomic, readonly) UIImageView *presenceImage; - -@end diff --git a/Classes/LinphoneUI/UIAvatarPresence.m b/Classes/LinphoneUI/UIAvatarPresence.m deleted file mode 100644 index 82d039185..000000000 --- a/Classes/LinphoneUI/UIAvatarPresence.m +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIAvatarPresence.h" - -@implementation UIAvatarPresence - -INIT_WITH_COMMON_CF { - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(onPresenceChanged:) - name:kLinphoneNotifyPresenceReceivedForUriOrTel - object:nil]; - - if (!_presenceImage) { - _presenceImage = [[UIImageView alloc] init]; - _presenceImage.tag = 883; - [self addSubview:_presenceImage]; - } - CGSize s = self.frame.size; - int is = MIN(s.width, s.height); - // place it in bottom right corner - _presenceImage.frame = CGRectMake(.5 * (s.width - is) + .7 * is, .5 * (s.height - is) + .7 * is, .2 * is, .2 * is); - - _presenceImage.image = [UIImage imageNamed:@"presence_unregistered"]; - - return self; -} - -- (void)dealloc { - [NSNotificationCenter.defaultCenter removeObserver:self]; -}; -- (void)setFrame:(CGRect)frame { - [super setFrame:frame]; - - CGSize s = self.frame.size; - int is = MIN(s.width, s.height); - // place it in bottom right corner - _presenceImage.frame = CGRectMake(.5 * (s.width - is) + .7 * is, .5 * (s.height - is) + .7 * is, .2 * is, .2 * is); -} - -- (void)onPresenceChanged:(NSNotification *)k { - LinphoneFriend *f = [[k.userInfo valueForKey:@"friend"] pointerValue]; - // only consider event if it's about us - if (!_friend || f != _friend) { - return; - } - [self updatePresenceImage]; -} - -- (void)updatePresenceImage { - LinphonePresenceBasicStatus basic = - _friend ? linphone_presence_model_get_basic_status(linphone_friend_get_presence_model(_friend)) - : LinphonePresenceBasicStatusClosed; - const LinphonePresenceModel *model = _friend ? linphone_friend_get_presence_model(_friend) : NULL; - LinphonePresenceActivity *activity = model ? linphone_presence_model_get_activity(model) : NULL; - - LOGE(@"Friend %s status is now %s/%s since %@", _friend ? linphone_friend_get_name(_friend) : "NULL", - basic == LinphonePresenceBasicStatusOpen ? "open" : "closed", - activity ? linphone_presence_activity_to_string(activity) : "Unknown", - [NSDate dateWithTimeIntervalSince1970:linphone_presence_model_get_timestamp(model)]); - - NSString *imageName; - if (basic == LinphonePresenceBasicStatusClosed) { - imageName = - (_friend && linphone_friend_is_presence_received(_friend)) ? @"presence_away" : @"presence_unregistered"; - } else if (linphone_presence_activity_get_type(activity) == LinphonePresenceActivityTV) { - imageName = @"presence_online"; - } else { - imageName = @"presence_away"; - } - _presenceImage.image = [UIImage imageNamed:imageName]; -} - -- (void)setFriend:(LinphoneFriend *) friend { - _friend = friend; - [self updatePresenceImage]; -} - -@end diff --git a/Classes/LinphoneUI/UIBackToCallButton.h b/Classes/LinphoneUI/UIBackToCallButton.h deleted file mode 100644 index d5a0ac7c2..000000000 --- a/Classes/LinphoneUI/UIBackToCallButton.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIInterfaceStyleButton.h" - -@interface UIBackToCallButton : UIInterfaceStyleButton - -- (IBAction)onBackToCallClick:(id)sender; -- (void)update; - -@property(assign, nonatomic) IBOutlet UITableView *tableView; -@end diff --git a/Classes/LinphoneUI/UIBackToCallButton.m b/Classes/LinphoneUI/UIBackToCallButton.m deleted file mode 100644 index 9e45b2aa9..000000000 --- a/Classes/LinphoneUI/UIBackToCallButton.m +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIBackToCallButton.h" -#import "LinphoneManager.h" -#import "PhoneMainView.h" -#import "linphoneapp-Swift.h" - - -@implementation UIBackToCallButton - -- (instancetype)init { - if (self = [super init]) { - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(callUpdateEvent:) - name:kLinphoneCallUpdate - object:nil]; - } - return self; -} - -- (void)dealloc { - [NSNotificationCenter.defaultCenter removeObserver:self]; -} - -- (void)callUpdateEvent:(NSNotification *)notif { - [self update]; -} - -- (void)update { - self.hidden = (_tableView.isEditing || linphone_core_get_calls_nb(LC) == 0); -} - -- (IBAction)onBackToCallClick:(id)sender { - [PhoneMainView.instance popToView:[CallsViewModelBridge callViewToDisplay]]; -} - -@end diff --git a/Classes/LinphoneUI/UIBouncingView.h b/Classes/LinphoneUI/UIBouncingView.h deleted file mode 100644 index ca0b8a750..000000000 --- a/Classes/LinphoneUI/UIBouncingView.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -@interface UIBouncingView : UIView - -- (void)startAnimating:(BOOL)animated; -- (void)stopAnimating:(BOOL)animated; - -@end diff --git a/Classes/LinphoneUI/UIBouncingView.m b/Classes/LinphoneUI/UIBouncingView.m deleted file mode 100644 index 6e0a38064..000000000 --- a/Classes/LinphoneUI/UIBouncingView.m +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIBouncingView.h" - -#import "CAAnimation+Blocks.h" -#import "Utils.h" - -static NSString *const kBounceAnimation = @"bounce"; -static NSString *const kAppearAnimation = @"appear"; -static NSString *const kDisappearAnimation = @"disappear"; - -@implementation UIBouncingView - -INIT_WITH_COMMON_CF { - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(settingsUpdate:) - name:kLinphoneSettingsUpdate - object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(applicationWillEnterForeground:) - name:UIApplicationWillEnterForegroundNotification - object:nil]; - return self; -} - -- (void)dealloc { - [NSNotificationCenter.defaultCenter removeObserver:self]; -} - -- (void)settingsUpdate:(NSNotification *)notif { - if (ANIMATED == false) { - [self stopAnimating:NO]; - } else { - if (![self isHidden]) { - self.hidden = YES; - [self startAnimating:YES]; - } - } -} - -- (void)applicationWillEnterForeground:(NSNotification *)notif { - // Force the animations - if (self.isHidden) { - self.hidden = NO; - [self stopAnimating:NO]; - } else { - self.hidden = YES; - [self startAnimating:NO]; - } -} - -#pragma mark - Animation - -- (void)appearAnimation:(NSString *)animationID target:(UIView *)target completion:(void (^)(BOOL finished))completion { - CABasicAnimation *appear = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; - appear.duration = 0.4; - appear.fromValue = [NSNumber numberWithDouble:0.0f]; - appear.toValue = [NSNumber numberWithDouble:1.0f]; - appear.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; - appear.fillMode = kCAFillModeForwards; - appear.removedOnCompletion = NO; - [appear setCompletion:completion]; - [target.layer addAnimation:appear forKey:animationID]; -} - -- (void)disappearAnimation:(NSString *)animationID - target:(UIView *)target - completion:(void (^)(BOOL finished))completion { - CABasicAnimation *disappear = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; - disappear.duration = 0.4; - disappear.fromValue = [NSNumber numberWithDouble:1.0f]; - disappear.toValue = [NSNumber numberWithDouble:0.0f]; - disappear.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; - disappear.fillMode = kCAFillModeForwards; - disappear.removedOnCompletion = NO; - [disappear setCompletion:completion]; - [target.layer addAnimation:disappear forKey:animationID]; -} - -- (void)startBounceAnimation:(NSString *)animationID target:(UIView *)target { - CABasicAnimation *bounce = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; - bounce.duration = 0.3; - bounce.fromValue = [NSNumber numberWithDouble:0.0f]; - bounce.toValue = [NSNumber numberWithDouble:8.0f]; - bounce.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; - bounce.autoreverses = TRUE; - bounce.repeatCount = HUGE_VALF; - [target.layer addAnimation:bounce forKey:animationID]; -} - -- (void)stopBounceAnimation:(NSString *)animationID target:(UIView *)target { - [target.layer removeAnimationForKey:animationID]; -} - -- (void)startAnimating:(BOOL)animated { - animated = NO; - if (!self.hidden) { - return; - } - - [self setHidden:FALSE]; - if (ANIMATED) { - if (animated) { - [self appearAnimation:kAppearAnimation - target:self - completion:^(BOOL finished) { - [self startBounceAnimation:kBounceAnimation target:self]; - if (finished) { - [self.layer removeAnimationForKey:kAppearAnimation]; - } - }]; - } else { - [self startBounceAnimation:kBounceAnimation target:self]; - } - } -} - -- (void)stopAnimating:(BOOL)animated { - animated = NO; - if (self.hidden) { - return; - } - - [self stopBounceAnimation:kBounceAnimation target:self]; - if (animated) { - [self disappearAnimation:kDisappearAnimation - target:self - completion:^(BOOL finished) { - [self setHidden:TRUE]; - if (finished) { - [self.layer removeAnimationForKey:kDisappearAnimation]; - } - }]; - } else { - [self setHidden:TRUE]; - } -} -@end diff --git a/Classes/LinphoneUI/UICallButton.h b/Classes/LinphoneUI/UICallButton.h deleted file mode 100644 index a27b326da..000000000 --- a/Classes/LinphoneUI/UICallButton.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UIIconButton.h" - -@interface UICallButton : UIIconButton { -} - -@property(nonatomic, strong) IBOutlet UITextField *addressField; - -- (void)updateIcon; - -@end diff --git a/Classes/LinphoneUI/UICallButton.m b/Classes/LinphoneUI/UICallButton.m deleted file mode 100644 index be9bdfd81..000000000 --- a/Classes/LinphoneUI/UICallButton.m +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "linphoneapp-Swift.h" -#import "UICallButton.h" -#import "LinphoneManager.h" - -#import - -@implementation UICallButton - -@synthesize addressField; - -#pragma mark - Lifecycle Functions - -- (void)initUICallButton { - [self addTarget:self action:@selector(touchUp:) forControlEvents:UIControlEventTouchUpInside]; -} - -- (id)init { - self = [super init]; - if (self) { - [self initUICallButton]; - } - return self; -} - -- (id)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - [self initUICallButton]; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)decoder { - self = [super initWithCoder:decoder]; - if (self) { - [self initUICallButton]; - } - return self; -} - -#pragma mark - - -- (void)touchUp:(id)sender { - NSString *address = addressField.text; - if (address.length == 0) { - LinphoneCallLog *log = linphone_core_get_last_outgoing_call_log(LC); - if (log) { - const LinphoneAddress *to = linphone_call_log_get_to_address(log); - const char *domain = linphone_address_get_domain(to); - char *bis_address = NULL; - LinphoneAccount *def_account = linphone_core_get_default_account(LC); - - // if the 'to' address is on the default proxy, only present the username - if (def_account) { - const char *def_domain = linphone_account_params_get_domain(linphone_account_get_params(def_account)); - if (def_domain && domain && !strcmp(domain, def_domain)) { - bis_address = ms_strdup(linphone_address_get_username(to)); - } - } - if (bis_address == NULL) { - bis_address = linphone_address_as_string_uri_only(to); - } - [addressField setText:[NSString stringWithUTF8String:bis_address]]; - ms_free(bis_address); - // return after filling the address, let the user confirm the call by pressing again - return; - } - } - - if ([address length] > 0) { - LinphoneAddress *addr = [LinphoneUtils normalizeSipOrPhoneAddress:address]; - [LinphoneManager.instance call:addr]; - if (addr) - linphone_address_unref(addr); - } -} - -- (void)updateIcon { - if (linphone_core_video_capture_enabled(LC) && linphone_core_get_video_policy(LC)->automatically_initiate) { - [self setImage:[UIImage imageNamed:@"call_video_start_default.png"] forState:UIControlStateNormal]; - [self setImage:[UIImage imageNamed:@"call_video_start_disabled.png"] forState:UIControlStateDisabled]; - } else { - [self setImage:[UIImage imageNamed:@"call_audio_start_default.png"] forState:UIControlStateNormal]; - [self setImage:[UIImage imageNamed:@"call_audio_start_disabled.png"] forState:UIControlStateDisabled]; - } - - if (CallManager.instance.nextCallIsTransfer) { - [self setImage:[UIImage imageNamed:@"call_transfer_default.png"] forState:UIControlStateNormal]; - [self setImage:[UIImage imageNamed:@"call_transfer_disabled.png"] forState:UIControlStateDisabled]; - } else if (linphone_core_get_calls_nb(LC) > 0) { - [self setImage:[UIImage imageNamed:@"call_add_default.png"] forState:UIControlStateNormal]; - [self setImage:[UIImage imageNamed:@"call_add_disabled.png"] forState:UIControlStateDisabled]; - } -} -@end diff --git a/Classes/LinphoneUI/UICamSwitch.h b/Classes/LinphoneUI/UICamSwitch.h deleted file mode 100644 index 545d71428..000000000 --- a/Classes/LinphoneUI/UICamSwitch.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UIIconButton.h" - -@interface UICamSwitch : UIIconButton - -@property(nonatomic, weak) IBOutlet UIView *preview; -+ (void) switchCamera; - -@end diff --git a/Classes/LinphoneUI/UICamSwitch.m b/Classes/LinphoneUI/UICamSwitch.m deleted file mode 100644 index 22218a0e5..000000000 --- a/Classes/LinphoneUI/UICamSwitch.m +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UICamSwitch.h" -#include "LinphoneManager.h" -#import "Utils.h" - -@implementation UICamSwitch -@synthesize preview; - -#pragma mark - Lifecycle Functions - -INIT_WITH_COMMON_CF { - [self addTarget:self action:@selector(touchUp:) forControlEvents:UIControlEventTouchUpInside]; - return self; -} - -#pragma mark - - -- (void)touchUp:(id)sender { - [UICamSwitch switchCamera]; -} - -+ (void) switchCamera { - const char *currentCamId = (char *)linphone_core_get_video_device(LC); - const char **cameras = linphone_core_get_video_devices(LC); - const char *newCamId = NULL; - int i; - - for (i = 0; cameras[i] != NULL; ++i) { - if (strcmp(cameras[i], "StaticImage: Static picture") == 0) - continue; - if (strcmp(cameras[i], currentCamId) != 0) { - newCamId = cameras[i]; - break; - } - } - if (newCamId) { - LOGI(@"Switching from [%s] to [%s]", currentCamId, newCamId); - linphone_core_set_video_device(LC, newCamId); - } -} - -@end diff --git a/Classes/LinphoneUI/UIChatBubblePhotoCell.h b/Classes/LinphoneUI/UIChatBubblePhotoCell.h deleted file mode 100644 index 49555feaa..000000000 --- a/Classes/LinphoneUI/UIChatBubblePhotoCell.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UILoadingImageView.h" -#import "UITextViewNoDefine.h" -#import "FileTransferDelegate.h" -#import "ChatConversationTableView.h" -#import "UIChatBubbleTextCell.h" -#import "UIChatContentView.h" - -@interface UIChatBubblePhotoCell : UIChatBubbleTextCell - -@property(nonatomic, strong) IBOutlet UILoadingImageView *messageImageView; -@property(nonatomic, strong) IBOutlet UIButton *downloadButton; -@property (weak, nonatomic) IBOutlet UILabel *fileName; -@property(nonatomic, strong) IBOutlet UIButton *playButton; -@property(weak, nonatomic) IBOutlet UIProgressView *fileTransferProgress; -@property(weak, nonatomic) IBOutlet UIButton *cancelButton; -@property(weak, nonatomic) IBOutlet UIView *imageSubView; -@property(weak, nonatomic) IBOutlet UIView *totalView; -@property (weak, nonatomic) IBOutlet UIView *finalAssetView; -@property (weak, nonatomic) IBOutlet UIImageView *finalImage; -@property(strong, nonatomic) IBOutlet UITapGestureRecognizer *imageGestureRecognizer; -@property (weak, nonatomic) IBOutlet UIButton *fileButton; -@property (weak, nonatomic) IBOutlet UIView *fileView; -@property(strong, nonatomic) NSMutableArray *contentViews; - -// Video recordings -@property (weak, nonatomic) IBOutlet UIView *vrView; -@property (weak, nonatomic) IBOutlet UIButton *vrPlayPause; -@property (weak, nonatomic) IBOutlet UILabel *vrTimerLabel; -@property (weak, nonatomic) IBOutlet UIImageView *vrWave; -@property (weak, nonatomic) IBOutlet UIView *vrWaveMaskPlayback; -@property NSTimer *vrPlayerTimer; -@property NSString *voiceRecordingFile; - - - -- (void)setEvent:(LinphoneEventLog *)event; -- (void)setChatMessage:(LinphoneChatMessage *)message; -- (void)connectToFileDelegate:(FileTransferDelegate *)ftd; -- (IBAction)onDownloadClick:(id)event; -- (IBAction)onImageClick:(id)event; -- (IBAction)onCancelClick:(id)sender; -- (IBAction)onPlayClick:(id)sender; -- (IBAction)onFileClick:(id)sender; - -@end - - diff --git a/Classes/LinphoneUI/UIChatBubblePhotoCell.m b/Classes/LinphoneUI/UIChatBubblePhotoCell.m deleted file mode 100644 index ec2560723..000000000 --- a/Classes/LinphoneUI/UIChatBubblePhotoCell.m +++ /dev/null @@ -1,841 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "linphoneapp-Swift.h" -#import "UIChatBubblePhotoCell.h" -#import "LinphoneManager.h" -#import "PhoneMainView.h" - -#import -#import -#import -#import - -#define voicePlayer VIEW(ChatConversationView).sharedVoicePlayer -#define chatView VIEW(ChatConversationView) -#define FILE_ICON_TAG 0 -#define REALIMAGE_TAG 1 -#define PHOTO_LIBRARY_FETCH_IMAGE_SIZE CGSizeMake(UIScreen.mainScreen.bounds.size.width * 0.8f,UIScreen.mainScreen.bounds.size.width * 0.8f) - - -@implementation UIChatBubblePhotoCell { - FileTransferDelegate *_ftd; - CGSize imageSize, bubbleSize, videoDefaultSize; - ChatConversationTableView *chatTableView; - BOOL assetIsLoaded; -} - -#pragma mark - Lifecycle Functions - -- (id)initWithIdentifier:(NSString *)identifier { - if ((self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]) != nil) { - NSArray *arrayOfViews = - [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil]; - // resize cell to match .nib size. It is needed when resized the cell to - // correctly adapt its height too - UIView *sub = nil; - for (int i = 0; i < arrayOfViews.count; i++) { - if ([arrayOfViews[i] isKindOfClass:UIView.class]) { - sub = arrayOfViews[i]; - break; - } - } - [self addSubview:sub]; - chatTableView = VIEW(ChatConversationView).tableController; - videoDefaultSize = CGSizeMake(320, 240); - assetIsLoaded = FALSE; - self.contentView.userInteractionEnabled = NO; - _contentViews = [[NSMutableArray alloc] init]; - - - self.vrView.layer.cornerRadius = 30.0f; - self.vrView.layer.masksToBounds = YES; - [self.innerView addGestureRecognizer:[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onPopupMenuPressed)]]; - [self.messageText addGestureRecognizer:[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onPopupMenuPressed)]]; - } - return self; -} - -- (void)onDelete { - [super onDelete]; -} - -#pragma mark - -- (void)setEvent:(LinphoneEventLog *)event { - if (!event || !(linphone_event_log_get_type(event) == LinphoneEventLogTypeConferenceChatMessage)) - return; - - [super setEvent:event]; - [self setChatMessage:linphone_event_log_get_chat_message(event)]; -} - -- (void)setChatMessage:(LinphoneChatMessage *)amessage { - _imageGestureRecognizer.enabled = NO; - _messageImageView.image = nil; - _finalImage.image = nil; - _finalImage.hidden = TRUE; - _fileTransferProgress.progress = 0; - assetIsLoaded = FALSE; - - /* As the cell UI will be reset, fileTransDelegate need to be reconnected. Otherwise, the UIProgressView will not work */ - [self disconnectFromFileDelegate]; - if (amessage) { - for (FileTransferDelegate *aftd in [LinphoneManager.instance fileTransferDelegates]) { - if (aftd.message == amessage && linphone_chat_message_get_state(amessage) == LinphoneChatMessageStateFileTransferInProgress) { - LOGI(@"Chat message [%p] with file transfer delegate [%p], connecting to it!", amessage, aftd); - [self connectToFileDelegate:aftd]; - break; - } - } - } - - [super setChatMessageForCbs:amessage]; - [LinphoneManager setValueInMessageAppData:NULL forKey:@"encryptedfile" inMessage:self.message]; - [LinphoneManager setValueInMessageAppData:NULL forKey:@"encryptedfiles" inMessage:self.message]; -} - -- (void) loadImageAsset:(PHAsset*) asset image:(UIImage *)image { - _finalImage.tag = REALIMAGE_TAG; - dispatch_async(dispatch_get_main_queue(), ^{ - [_finalImage setImage:image]; - [_messageImageView setAsset:asset]; - [_messageImageView stopLoading]; - _messageImageView.hidden = YES; - _finalImage.hidden = NO; - _fileView.hidden = YES; - [self layoutSubviews]; - }); -} - -- (void) loadAsset:(PHAsset *) asset { - - UIImage *image = [SwiftUtil getCachedImageWithKey:asset]; - if (image) { - imageSize = [UIChatBubbleTextCell getMediaMessageSizefromOriginalSize:[image size] withWidth:chatTableView.tableView.frame.size.width - CELL_IMAGE_X_MARGIN]; - [chatTableView.imagesInChatroom setObject:image forKey:[asset localIdentifier]]; - [self loadImageAsset:asset image:image]; - return; - } else { - PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init]; - options.synchronous = FALSE; - options.resizeMode = PHImageRequestOptionsResizeModeNone; - [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHOTO_LIBRARY_FETCH_IMAGE_SIZE contentMode:PHImageContentModeAspectFit options:options - resultHandler:^(UIImage *image, NSDictionary * info) { - if (image) { - imageSize = [UIChatBubbleTextCell getMediaMessageSizefromOriginalSize:[image size] withWidth:chatTableView.tableView.frame.size.width - CELL_IMAGE_X_MARGIN]; - [chatTableView.imagesInChatroom setObject:image forKey:[asset localIdentifier]]; - [self loadImageAsset:asset image:image]; - [SwiftUtil setCachedImageWithKey:asset image:image]; - } - else { - LOGE(@"Can't read image"); - } - }]; - } -} - -- (void) loadFileAsset:(NSString *)name { - UIImage *image = [UIChatBubbleTextCell getImageFromFileName:name forReplyBubble:false]; - [self loadImageAsset:nil image:image]; - _imageGestureRecognizer.enabled = YES; - _finalImage.tag = FILE_ICON_TAG; -} - -- (void) loadPlaceholder { - dispatch_async(dispatch_get_main_queue(), ^{ - // Change this to load placeholder image when no asset id - //[_finalImage setImage:image]; - //[_messageImageView setAsset:asset]; - [_messageImageView stopLoading]; - _messageImageView.hidden = YES; - _imageGestureRecognizer.enabled = YES; - _finalImage.hidden = NO; - [self layoutSubviews]; - }); -} - - -- (void)update { - if (self.message == nil) { - LOGW(@"Cannot update message room cell: NULL message"); - return; - } - [super update]; - - _vrPlayPause.enabled = linphone_core_get_calls_nb(LC) == 0; - - - NSMutableDictionary *encrptedFilePaths = NULL; - if ([VFSUtil vfsEnabledWithGroupName:kLinphoneMsgNotificationAppGroupId]) { - encrptedFilePaths = [LinphoneManager getMessageAppDataForKey:@"encryptedfiles" inMessage:self.message]; - if (!encrptedFilePaths) { - encrptedFilePaths = [NSMutableDictionary dictionary]; - } - } - - _voiceRecordingFile = nil; - LinphoneContent *voiceContent = [UIChatBubbleTextCell voiceContent:self.message]; - if (voiceContent) { - const char *fileName = ([VFSUtil vfsEnabledWithGroupName:kLinphoneMsgNotificationAppGroupId] ? linphone_content_get_plain_file_path(voiceContent) : linphone_content_get_file_path(voiceContent)); - if (fileName == nil) { - linphone_content_set_file_path(voiceContent, [[LinphoneManager imagesDirectory] stringByAppendingPathComponent:[[NSUUID UUID] UUIDString]].UTF8String); - linphone_chat_message_download_content(self.message, voiceContent); - } - _voiceRecordingFile = fileName ? [NSString stringWithUTF8String:fileName] : nil; - if (fileName && [VFSUtil vfsEnabledWithGroupName:kLinphoneMsgNotificationAppGroupId]) { - [encrptedFilePaths setValue:_voiceRecordingFile forKey:[NSString stringWithUTF8String:linphone_content_get_name(voiceContent)]]; - } - _vrTimerLabel.text = [self formattedDuration:linphone_content_get_file_duration(voiceContent)/1000]; - _vrWaveMaskPlayback.frame = CGRectZero; - _vrWaveMaskPlayback.backgroundColor = linphone_chat_message_is_outgoing(self.message) ? UIColor.orangeColor : UIColor.grayColor; - } - - const bctbx_list_t *contents = linphone_chat_message_get_contents(self.message); - - size_t contentCount = bctbx_list_size(contents); - if (voiceContent) - contentCount--; - BOOL multiParts = ((linphone_chat_message_get_utf8_text(self.message) != NULL) ? bctbx_list_size(contents) > 2 : bctbx_list_size(contents) > 1); - if (voiceContent && !multiParts) { - _cancelButton.hidden = _fileTransferProgress.hidden = _downloadButton.hidden = _playButton.hidden = _fileName.hidden = _fileView.hidden = _fileButton.hidden = YES; - return; - } - - if (multiParts) { - if (!assetIsLoaded) { - _imageGestureRecognizer.enabled = NO; - _cancelButton.hidden = _fileTransferProgress.hidden = _downloadButton.hidden = _playButton.hidden = _fileName.hidden = _fileView.hidden = _fileButton.hidden = YES; - const bctbx_list_t *it = contents; - int i; - for (it = contents, i=0; it != NULL; it=bctbx_list_next(it)){ - LinphoneContent *content = (LinphoneContent *)it->data; - if (linphone_content_is_voice_recording(content)) { // Handled elsewhere - continue; - } - if (linphone_content_is_file_transfer(content) || linphone_content_is_file(content)){ - UIChatContentView *contentView = [[UIChatContentView alloc] initWithFrame: CGRectMake(0,0,0,0)]; - if([VFSUtil vfsEnabledWithGroupName:kLinphoneMsgNotificationAppGroupId] && (linphone_chat_message_is_outgoing(self.message) || linphone_content_is_file(content))) { - // downloaded or ougoing message - NSString *name = [NSString stringWithUTF8String:linphone_content_get_name(content)]; - NSString *filePath = [encrptedFilePaths valueForKey:name]; - if (filePath == NULL) { - char *cPath = linphone_content_get_plain_file_path(content); - if (cPath) { - if (strcmp(cPath, "") != 0) { - NSString *tempPath = [NSString stringWithUTF8String:cPath]; - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); - filePath = [NSString stringWithFormat:@"%@/%s", [paths objectAtIndex:0],linphone_chat_message_get_message_id(super.message)]; - [FileUtil ensureDirectoryExistsWithPath:filePath]; - filePath = [filePath stringByAppendingPathComponent:name]; - [[NSFileManager defaultManager] moveItemAtPath:tempPath toPath:filePath error:nil]; - } - ms_free(cPath); - [encrptedFilePaths setValue:filePath forKey:name]; - } - } - contentView.filePath = filePath; - } - [contentView setContent:content message:self.message]; - contentView.position = i; - [_contentViews addObject:contentView]; - i++; - } - } - if ([VFSUtil vfsEnabledWithGroupName:kLinphoneMsgNotificationAppGroupId]) { - [LinphoneManager setValueInMessageAppData:encrptedFilePaths forKey:@"encryptedfiles" inMessage:self.message]; - } - assetIsLoaded = TRUE; - [self layoutSubviews]; - } - return; - } - - const char *url = linphone_chat_message_get_external_body_url(self.message); - BOOL is_external = - (url && (strstr(url, "http") == url)) || linphone_chat_message_get_file_transfer_information(self.message); - NSString *localImage = [LinphoneManager getMessageAppDataForKey:@"localimage" inMessage:self.message]; - NSString *localVideo = [LinphoneManager getMessageAppDataForKey:@"localvideo" inMessage:self.message]; - NSString *localFile = [LinphoneManager getMessageAppDataForKey:@"localfile" inMessage:self.message]; - NSString *filePath = [LinphoneManager getMessageAppDataForKey:@"encryptedfile" inMessage:self.message]; - assert(is_external || localImage || localVideo || localFile); - - LinphoneContent *fileContent = linphone_chat_message_get_file_transfer_information(self.message); - if (fileContent == nil) { - LOGW(@"file content is null"); - return; - } - - BOOL is_outgoing = linphone_chat_message_is_outgoing(self.message); - if (!is_outgoing) { - LinphoneChatMessageState state = linphone_chat_message_get_state(self.message); - if (state != LinphoneChatMessageStateFileTransferDone && state != LinphoneChatMessageStateDisplayed) { - _downloadButton.hidden = YES; - UIChatContentView * contentView = [[UIChatContentView alloc] init]; - [contentView setContent:fileContent message:self.message]; - contentView.position = 0; - [_contentViews addObject:contentView]; - _cancelButton.hidden = _fileTransferProgress.hidden = YES; - _playButton.hidden = YES; - _fileName.hidden = _fileView.hidden = _fileButton.hidden = YES; - [self layoutSubviews]; - return; - } - } - - NSString *fileType = [NSString stringWithUTF8String:linphone_content_get_type(fileContent)]; - NSString *fileName = [NSString stringWithUTF8String:linphone_content_get_name(fileContent)]; - - if (!filePath) { - char *cPath = [VFSUtil vfsEnabledWithGroupName:kLinphoneMsgNotificationAppGroupId] ? linphone_content_get_plain_file_path(fileContent) : NULL; - if (cPath) { - if (strcmp(cPath, "") != 0) { - NSString *tempPath = [NSString stringWithUTF8String:cPath]; - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); - filePath = [NSString stringWithFormat:@"%@/%s", [paths objectAtIndex:0],linphone_chat_message_get_message_id(super.message)]; - [FileUtil ensureDirectoryExistsWithPath:filePath]; - filePath = [filePath stringByAppendingPathComponent:fileName]; - [[NSFileManager defaultManager] moveItemAtPath:tempPath toPath:filePath error:nil]; - } - ms_free(cPath); - [LinphoneManager setValueInMessageAppData:filePath forKey:@"encryptedfile" inMessage:self.message]; - } else { - filePath = [LinphoneManager validFilePath:fileName]; - } - } - if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { - // already downloaded - if (!assetIsLoaded) { - assetIsLoaded = TRUE; - NSString *key = [ChatConversationView getKeyFromFileType:fileType fileName:fileName]; - if ([key isEqualToString:@"localimage"]) { - // we did not load the image yet, so start doing so - if (_messageImageView.image == nil) { - UIImage *cachedImage = [SwiftUtil getCachedImageWithKey:filePath] ? : [UIImage imageWithContentsOfFile:filePath]; - UIImage *image = [SwiftUtil getCachedImageWithKey:filePath]; - if (!image) { - image = [UIImage imageWithContentsOfFile:filePath]; - if (image) - [SwiftUtil setCachedImageWithKey:filePath image:image]; - } - if (image) { - [self loadImageAsset:nil image:image]; - _imageGestureRecognizer.enabled = YES; - } else { - // compability with other platforms - [self loadFileAsset:fileName]; - } - } - } else if ([key isEqualToString:@"localvideo"]) { - if (_messageImageView.image == nil) { - UIImage* image = [UIChatBubbleTextCell getImageFromVideoUrl:[NSURL fileURLWithPath:filePath]]; - if (image) { - [self loadImageAsset:nil image:image]; - _imageGestureRecognizer.enabled = NO; - } else { - // compability with other platforms - [self loadFileAsset:fileName]; - } - } - } else if ([key isEqualToString:@"localfile"]) { - if ([fileType isEqualToString:@"video"]) { - UIImage* image = [UIChatBubbleTextCell getImageFromVideoUrl:[NSURL fileURLWithPath:filePath]]; - [self loadImageAsset:nil image:image]; - _imageGestureRecognizer.enabled = NO; - } else if ([fileName hasSuffix:@"JPG"] || [fileName hasSuffix:@"PNG"] || [fileName hasSuffix:@"jpg"] || [fileName hasSuffix:@"png"]) { - UIImage *image = [UIImage imageWithContentsOfFile:filePath]; - [self loadImageAsset:nil image:image]; - _imageGestureRecognizer.enabled = YES; - } else { - [self loadFileAsset:fileName]; - } - } - - if (!(localImage || localVideo || localFile)) { - // If the file has been downloaded in background, save it in the folders and display it. - [LinphoneManager setValueInMessageAppData:fileName forKey:key inMessage:self.message]; - dispatch_async(dispatch_get_main_queue(), ^ { - if (![VFSUtil vfsEnabledWithGroupName:kLinphoneMsgNotificationAppGroupId] && [ConfigManager.instance lpConfigBoolForKeyWithKey:@"auto_write_to_gallery_preference"]) { - [ChatConversationView writeMediaToGallery:fileName fileType:fileType]; - } - }); - } - } - [self uploadingImage:fileType localFile:localFile]; - } else { - // support previous methode: - if (!(localImage || localVideo || localFile)) { - _playButton.hidden = YES; - _fileName.hidden = _fileView.hidden = _fileButton.hidden = YES; - _messageImageView.hidden = _cancelButton.hidden = (_ftd.message == nil); - _downloadButton.hidden = !_cancelButton.hidden; - _fileTransferProgress.hidden = NO; - } else { - // file is being saved on device - just wait for it - if ([localImage isEqualToString:@"saving..."] || [localVideo isEqualToString:@"saving..."] || [localFile isEqualToString:@"saving..."]) { - _cancelButton.hidden = _fileTransferProgress.hidden = _downloadButton.hidden = _playButton.hidden = _fileName.hidden = _fileView.hidden = _fileButton.hidden = YES; - } else { - if(!assetIsLoaded) { - assetIsLoaded = TRUE; - if (localImage) { - // we did not load the image yet, so start doing so - if (_messageImageView.image == nil) { - [self loadFirstImage:localImage type:PHAssetMediaTypeImage]; - _imageGestureRecognizer.enabled = YES; - } - } else if (localVideo) { - if (_messageImageView.image == nil) { - [self loadFirstImage:localVideo type:PHAssetMediaTypeVideo]; - _imageGestureRecognizer.enabled = NO; - } - } else if (localFile) { - if ([fileType isEqualToString:@"video"]) { - UIImage* image = [UIChatBubbleTextCell getImageFromVideoUrl:[VIEW(ChatConversationView) getICloudFileUrl:localFile]]; - [self loadImageAsset:nil image:image]; - _imageGestureRecognizer.enabled = NO; - } else if ([localFile hasSuffix:@"JPG"] || [localFile hasSuffix:@"PNG"] || [localFile hasSuffix:@"jpg"] || [localFile hasSuffix:@"png"]) { - NSData *data = [NSData dataWithContentsOfURL:[VIEW(ChatConversationView) getICloudFileUrl:localFile]]; - UIImage *image = [[UIImage alloc] initWithData:data]; - [self loadImageAsset:nil image:image]; - _imageGestureRecognizer.enabled = YES; - } else { - [self loadFileAsset:fileName]; - } - } - } - } - [self uploadingImage:fileType localFile:localFile]; - } - } -} - -- (void)uploadingImage:(NSString *)fileType localFile:(NSString *)localFile { - // we are uploading the image - if (_ftd.message != nil) { - _cancelButton.hidden = _fileTransferProgress.hidden = super.notDelivered ? YES : NO; - _downloadButton.hidden = YES; - _playButton.hidden = YES; - _fileName.hidden = _fileView.hidden = _fileButton.hidden =YES; - } else { - _cancelButton.hidden = _fileTransferProgress.hidden = _downloadButton.hidden = YES; - _playButton.hidden = ![fileType isEqualToString:@"video"]; - _fileName.hidden = _fileView.hidden = _fileButton.hidden = localFile ? NO : YES; - } -} - -- (void)loadFirstImage:(NSString *)key type:(PHAssetMediaType)type { - [_messageImageView startLoading]; - PHFetchResult *assets = [LinphoneManager getPHAssets:key]; - UIImage *img = nil; - - img = [chatTableView.imagesInChatroom objectForKey:key]; - PHAsset *asset = [assets firstObject]; - if (!asset) - [self loadPlaceholder]; - else if (asset.mediaType != type) - img = nil; - if (img) - [self loadImageAsset:asset image:img]; - else - [self loadAsset:asset]; -} - -- (void)fileErrorBlock { - DTActionSheet *sheet = [[DTActionSheet alloc] initWithTitle:NSLocalizedString(@"Can't find this file", nil)]; - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - [sheet addCancelButtonWithTitle:NSLocalizedString(@"OK", nil) block:nil]; - dispatch_async(dispatch_get_main_queue(), ^{ - [sheet showInView:PhoneMainView.instance.view]; - }); - }); -} - -- (void)playVideoByPlayer:(AVPlayer *)player { - AVPlayerViewController *controller = [[AVPlayerViewController alloc] init]; - [PhoneMainView.instance presentViewController:controller animated:YES completion:nil]; - controller.player = player; - [player play]; -} - -- (IBAction)onDownloadClick:(id)event { - [_ftd cancel]; - _ftd = [[FileTransferDelegate alloc] init]; - [self connectToFileDelegate:_ftd]; - [_ftd download:self.message]; - _cancelButton.hidden = NO; - _downloadButton.hidden = YES; - _playButton.hidden = YES; - _fileName.hidden = _fileView.hidden = _fileButton.hidden = YES; -} - -- (IBAction)onPlayClick:(id)sender { - NSString *filePath = [LinphoneManager getMessageAppDataForKey:@"encryptedfile" inMessage:self.message]; - if (!filePath) { - NSString *localVideo = [LinphoneManager getMessageAppDataForKey:@"localvideo" inMessage:self.message]; - NSString *localFile = [LinphoneManager getMessageAppDataForKey:@"localfile" inMessage:self.message]; - filePath = [LinphoneManager validFilePath:(localVideo?:localFile)]; - } - - if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { - AVPlayer *player = [AVPlayer playerWithURL:[NSURL fileURLWithPath:filePath]]; - [self playVideoByPlayer:player]; - return; - } - - PHAsset *asset = [_messageImageView asset]; - if (!asset) { - NSString *localFile = [LinphoneManager getMessageAppDataForKey:@"localfile" inMessage:self.message]; - NSURL *url = [VIEW(ChatConversationView) getICloudFileUrl:localFile]; - AVPlayer *player = [AVPlayer playerWithURL:url]; - [self playVideoByPlayer:player]; - return; - } - PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc] init]; - // options.synchronous = TRUE; - [[PHImageManager defaultManager] requestPlayerItemForVideo:asset options:options resultHandler:^(AVPlayerItem * _Nullable playerItem, NSDictionary * _Nullable info) { - if(playerItem) { - AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem]; - [self playVideoByPlayer:player]; - } else { - [self fileErrorBlock]; - } - }]; -} - - -- (IBAction)onFileClick:(id)sender { - ChatConversationView *view = VIEW(ChatConversationView); - NSString *filePath = [LinphoneManager getMessageAppDataForKey:@"encryptedfile" inMessage:self.message]; - if (filePath) { - [view openFileWithURL:[NSURL fileURLWithPath:filePath]]; - return; - } - NSString *name = [LinphoneManager getMessageAppDataForKey:@"localfile" inMessage:self.message]; - if([[NSFileManager defaultManager] fileExistsAtPath: [LinphoneManager validFilePath:name]]) { - [view openFileWithURL:[ChatConversationView getFileUrl:name]]; - } else { - [view openFileWithURL:[view getICloudFileUrl:name]]; - } -} - - -- (IBAction)onCancelClick:(id)sender { - FileTransferDelegate *tmp = _ftd; - [self disconnectFromFileDelegate]; - _fileTransferProgress.progress = 0; - [tmp cancel]; - if (!linphone_core_is_network_reachable(LC)) { - [self update]; - } -} - - -- (IBAction)onImageClick:(id)event { - if (_finalImage.tag == FILE_ICON_TAG) { - [self onFileClick:nil]; - return; - } - LinphoneChatMessageState state = linphone_chat_message_get_state(self.message); - if (state == LinphoneChatMessageStateNotDelivered) { - return; - } else { - if (![_messageImageView isLoading]) { - ImageView *view = VIEW(ImageView); - [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; - NSString *filePath = [LinphoneManager getMessageAppDataForKey:@"encryptedfile" inMessage:self.message]; - if (filePath) { - UIImage *image = [UIImage imageWithContentsOfFile:filePath]; - [view setImage:image]; - return; - } - - NSString *localImage = [LinphoneManager getMessageAppDataForKey:@"localimage" inMessage:self.message]; - NSString *localFile = [LinphoneManager getMessageAppDataForKey:@"localfile" inMessage:self.message]; - NSString *imageName = NULL; - if (localImage && [[NSFileManager defaultManager] fileExistsAtPath: [LinphoneManager validFilePath:localImage]]) { - imageName = localImage; - } else if (localFile && [[NSFileManager defaultManager] fileExistsAtPath:[LinphoneManager validFilePath:localFile]]) { - if ([localFile hasSuffix:@"JPG"] || [localFile hasSuffix:@"PNG"] || [localFile hasSuffix:@"jpg"] || [localFile hasSuffix:@"png"]) { - imageName = localFile; - } - } - - if (imageName) { - UIImage *image = [UIImage imageWithContentsOfFile: [LinphoneManager validFilePath:imageName]]; - if (image) - [view setImage:image]; - else - LOGE(@"Can't read image"); - return; - } - - PHAsset *asset = [_messageImageView asset]; - if (!asset) { - return; - } - PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init]; - options.synchronous = TRUE; - [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeDefault options:options - resultHandler:^(UIImage *image, NSDictionary * info) { - if (image) { - [view setImage:image]; - } - else { - LOGE(@"Can't read image"); - } - }]; - } - } -} - -#pragma mark - LinphoneFileTransfer Notifications Handling - -- (void)connectToFileDelegate:(FileTransferDelegate *)aftd { - if (aftd.message && linphone_chat_message_get_state(aftd.message) == LinphoneChatMessageStateFileTransferError) { - LOGW(@"This file transfer failed unexpectedly, cleaning it"); - [aftd stopAndDestroy]; - return; - } - - _ftd = aftd; - _fileTransferProgress.progress = 0; - [NSNotificationCenter.defaultCenter removeObserver:self]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(onFileTransferSendUpdate:) - name:kLinphoneFileTransferSendUpdate - object:_ftd]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(onFileTransferRecvUpdate:) - name:kLinphoneFileTransferRecvUpdate - object:_ftd]; -} - -- (void)disconnectFromFileDelegate { - [NSNotificationCenter.defaultCenter removeObserver:self name:kLinphoneFileTransferSendUpdate object:_ftd]; - [NSNotificationCenter.defaultCenter removeObserver:self name:kLinphoneFileTransferRecvUpdate object:_ftd]; - _ftd = nil; -} - -- (void)onFileTransferSendUpdate:(NSNotification *)notif { - LinphoneChatMessageState state = [[[notif userInfo] objectForKey:@"state"] intValue]; - - if (state == LinphoneChatMessageStateInProgress || state == LinphoneChatMessageStateFileTransferInProgress) { - float progress = [[[notif userInfo] objectForKey:@"progress"] floatValue]; - // When uploading a file, the self.message file is first uploaded to the server, - // so we are in progress state. Then state goes to filetransfertdone. Then, - // the exact same self.message is sent to the other participant and we come - // back to in progress again. This second time is NOT an upload, so we must - // not update progress! - _fileTransferProgress.progress = MAX(_fileTransferProgress.progress, progress); - _fileTransferProgress.hidden = _cancelButton.hidden = (_fileTransferProgress.progress == 1.f); - } else { - ChatConversationView *view = VIEW(ChatConversationView); - [view.tableController updateEventEntry:self.event]; - [view.tableController scrollToBottom:true]; - } -} -- (void)onFileTransferRecvUpdate:(NSNotification *)notif { - LinphoneChatMessageState state = [[[notif userInfo] objectForKey:@"state"] intValue]; - if (state == LinphoneChatMessageStateInProgress || state == LinphoneChatMessageStateFileTransferInProgress) { - float progress = [[[notif userInfo] objectForKey:@"progress"] floatValue]; - _fileTransferProgress.progress = MAX(_fileTransferProgress.progress, progress); - _fileTransferProgress.hidden = _cancelButton.hidden = (_fileTransferProgress.progress == 1.f); - } else { - ChatConversationView *view = VIEW(ChatConversationView); - [view.tableController updateEventEntry:self.event]; - [view.tableController scrollToBottom:true]; - } -} - -- (void)layoutSubviews { - [super layoutSubviews]; - BOOL is_outgoing = linphone_chat_message_is_outgoing(super.message); - CGRect bubbleFrame = super.bubbleView.frame; - int origin_x; - - bubbleSize = [UIChatBubbleTextCell ViewSizeForMessage:[self message] withWidth:chatTableView.tableView.frame.size.width]; - - bubbleFrame.size = bubbleSize; - - if (chatTableView.tableView.isEditing) { - origin_x = 0; - } else { - origin_x = (is_outgoing ? self.frame.size.width - bubbleFrame.size.width : 0); - } - - bubbleFrame.origin.x = origin_x; - - super.bubbleView.frame = bubbleFrame; - - if (_contentViews.count > 0) { - // Positioning contentViews - CGFloat imagesw=0; - CGFloat max_imagesh=0; - CGFloat max_imagesw=0; - CGFloat originy=0; - CGFloat originx=-IMAGE_DEFAULT_MARGIN; - CGFloat availableWidth = chatTableView.tableView.frame.size.width-CELL_IMAGE_X_MARGIN; - - NSMutableArray *fileUrls = [[NSMutableArray alloc] init]; - for (UIChatContentView *contentView in _contentViews) { - if (contentView.filePath) { - [fileUrls addObject:[NSURL fileURLWithPath:contentView.filePath]]; - } - } - for (UIChatContentView *contentView in _contentViews) { - UIImage *image = contentView.image; - CGSize sSize = [UIChatBubbleTextCell getMediaMessageSizefromOriginalSize:image.size withWidth:IMAGE_DEFAULT_WIDTH]; - imagesw += sSize.width; - if (imagesw > availableWidth) { - imagesw = sSize.width; - max_imagesw = MAX(max_imagesw, imagesw); - originy = max_imagesh+IMAGE_DEFAULT_MARGIN; - max_imagesh += sSize.height; - originx = sSize.width; - } else { - max_imagesw = MAX(max_imagesw, imagesw); - max_imagesh = MAX(max_imagesh, sSize.height); - originx += (sSize.width+IMAGE_DEFAULT_MARGIN); - } - - [contentView setFrame:CGRectMake(originx-sSize.width, originy, sSize.width, sSize.height)]; - contentView.fileUrls = fileUrls; - [_finalAssetView addSubview:contentView]; - } - CGRect imgFrame = self.finalAssetView.frame; - imgFrame.size = CGSizeMake(max_imagesw, max_imagesh); - self.finalAssetView.frame = imgFrame; - _finalImage.hidden = YES; - } else { - // Resizing Image view - if (_finalImage.image) { - CGRect imgFrame = self.finalAssetView.frame; - imgFrame.size = [UIChatBubbleTextCell getMediaMessageSizefromOriginalSize:[_finalImage.image size] withWidth:chatTableView.tableView.frame.size.width - CELL_IMAGE_X_MARGIN]; - imgFrame.origin.x = (self.innerView.frame.size.width - imgFrame.size.width-17)/2; - self.finalAssetView.frame = imgFrame; - } - } - - // Positioning text message - const char *utf8Text = linphone_chat_message_get_utf8_text(self.message); - - CGRect textFrame = self.messageText.frame; - if (_contentViews.count > 0 || _finalImage.image) - textFrame.origin = CGPointMake(textFrame.origin.x, self.finalAssetView.frame.origin.y + self.finalAssetView.frame.size.height); - else - // When image hasn't be download - textFrame.origin = CGPointMake(textFrame.origin.x, _voiceRecordingFile ? _fileView.frame.origin.y : _imageSubView.frame.size.height + _imageSubView.frame.origin.y - 10); - if (!utf8Text) { - textFrame.size.height = 0; - } else { - textFrame.size.height = bubbleFrame.size.height - 90;//textFrame.origin.x; - } - - if (_voiceRecordingFile) { - CGRect vrFrame = _vrView.frame; - vrFrame.origin.y = _contentViews.count == 0 && !utf8Text ? _fileView.frame.origin.y : textFrame.origin.y; - _vrView.frame = vrFrame; - textFrame.origin.y += VOICE_RECORDING_PLAYER_HEIGHT; - _vrView.hidden = NO; - } else { - _vrView.hidden = YES; - } - - CGRect r = super.photoCellContentView.frame; - r.origin.y = linphone_chat_message_is_reply(super.message) ? super.replyView.view.frame.origin.y + super.replyView.view.frame.size.height + 10 : 7 ; - super.photoCellContentView.frame = r; - - r = super.photoCellContentView.frame; - r.origin.y = linphone_chat_message_is_forward(super.message) ? super.contactDateLabel.frame.origin.y + super.contactDateLabel.frame.size.height + 3 : r.origin.y; - super.photoCellContentView.frame = r; - - self.messageText.frame = textFrame; -} - -// Voice messages - - --(void) voicePlayTimerUpdate { - CGRect r = _vrWaveMaskPlayback.frame; - r.size.width += _vrView.frame.size.width / ((linphone_player_get_duration(voicePlayer) / 500)) ; - if (r.size.width > _vrView.frame.size.width) { - r.size.width = _vrView.frame.size.width; - } - [UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{ - _vrWaveMaskPlayback.frame = r; - }completion:^(BOOL finished) {}]; -} - - --(void) stopPlayer { - [NSNotificationCenter.defaultCenter removeObserver:self]; - [chatView stopSharedPlayer]; - [_vrPlayPause setImage:[UIImage imageNamed:@"vr_play"] forState:UIControlStateNormal]; - [_vrPlayerTimer invalidate]; - _vrWaveMaskPlayback.frame = CGRectZero; -} - --(NSString *)formattedDuration:(long)valueMs { - return [NSString stringWithFormat:@"%02ld:%02ld", valueMs/ 60, (valueMs % 60) ]; -} - --(void) startPlayer { - [chatView startSharedPlayer:_voiceRecordingFile.UTF8String]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(stopPlayer) - name:kLinphoneVoiceMessagePlayerLostFocus - object:nil]; - - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(stopPlayer) - name:kLinphoneVoiceMessagePlayerEOF - object:nil]; - - [_vrPlayPause setImage:[UIImage imageNamed:@"vr_stop"] forState:UIControlStateNormal]; - CGRect r = CGRectZero; - r.size.height = _vrView.frame.size.height - 14; - r.origin.y = 7; - _vrWaveMaskPlayback.frame = r; - _vrPlayerTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 - target:self - selector:@selector(voicePlayTimerUpdate) - userInfo:nil - repeats:YES]; - [self voicePlayTimerUpdate]; - -} - -- (IBAction)onVRPlayPauseClick:(id)sender { - if ([chatView sharedPlayedIsPlaying:_voiceRecordingFile.UTF8String]) - [self stopPlayer]; - else { - [self startPlayer]; - } -} - - -// menu - --(void) onPopupMenuPressed { - [super onPopupMenuPressed]; -} - - -@end - - diff --git a/Classes/LinphoneUI/UIChatBubbleTextCell.h b/Classes/LinphoneUI/UIChatBubbleTextCell.h deleted file mode 100644 index cbc0a647b..000000000 --- a/Classes/LinphoneUI/UIChatBubbleTextCell.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UITextViewNoDefine.h" -#import "ChatConversationTableView.h" -#import "UIRoundedImageView.h" -#import "UIChatReplyBubbleView.h" - -#define CELL_IMAGE_X_MARGIN 100 -#define IMAGE_DEFAULT_WIDTH 120 -#define IMAGE_DEFAULT_MARGIN 5 -#define VOICE_RECORDING_PLAYER_HEIGHT 60 -#define VOICE_RECORDING_PLAYER_WIDTH 300 -#define CONFERENCE_INVITATION_HEIGHT 210 -#define CONFERENCE_INVITATION_WIDTH 300 - - - -@interface UIChatBubbleTextCell : UITableViewCell - -@property(readonly, nonatomic) LinphoneEventLog *event; -@property(readonly, nonatomic) LinphoneChatMessage *message; -@property(nonatomic, weak) IBOutlet UIImageView *backgroundColorImage; -@property(nonatomic, weak) IBOutlet UIImageView *avatarImage; -@property(nonatomic, weak) IBOutlet UILabel *contactDateLabel; -//@property(weak, nonatomic) IBOutlet UIActivityIndicatorView *statusInProgressSpinner; -@property(nonatomic, weak) IBOutlet UITextViewNoDefine *messageText; -//@property(weak, nonatomic) IBOutlet UIImageView *bottomBarColor; -@property(nonatomic, strong) id chatRoomDelegate; -@property(strong, nonatomic) IBOutlet UIView *bubbleView; -@property(strong, nonatomic) IBOutlet UITapGestureRecognizer *resendRecognizer; -//@property(weak, nonatomic) IBOutlet UIImageView *LIMEKO; -@property(weak, nonatomic) IBOutlet UIImageView *imdmIcon; -//@property(weak, nonatomic) IBOutlet UILabel *imdmLabel; -@property (nonatomic, strong) UIDocumentPickerViewController *documentPicker; -@property (weak, nonatomic) IBOutlet UIView *innerView; -@property (weak, nonatomic) IBOutlet UILabel *ephemeralTime; -@property (weak, nonatomic) IBOutlet UIImageView *ephemeralIcon; -@property ChatConversationTableView *tableController; -@property BOOL popupMenuAllowed; - -// Message popup menu -@property UITableView *popupMenu; -@property NSMutableArray *messageActionsTitles; -@property NSMutableArray *messageActionsIcons; -@property NSMutableArray *messageActionsBlocks; - -// Message reply/transfer -@property UIChatReplyBubbleView *replyView; -@property UILabel *replyOrForward; -@property (weak, nonatomic) IBOutlet UIImageView *replyTransferIcon; -@property (weak, nonatomic) IBOutlet UILabel *replyTransferLabel; -@property (weak, nonatomic) IBOutlet UIView *photoCellContentView; -@property UIView *icsBubbleView; - - -@property(nonatomic) BOOL isFirst; -@property(nonatomic) BOOL isLast; -@property(nonatomic) BOOL notDelivered; - -+ (CGSize)ViewSizeForMessage:(LinphoneChatMessage *)chat withWidth:(int)width; -+ (CGSize)ViewHeightForMessageText:(LinphoneChatMessage *)chat withWidth:(int)width textForImdn:(NSString *)imdnText; -+ (CGSize)getMediaMessageSizefromOriginalSize:(CGSize)originalSize withWidth:(int)width; -+ (UIImage *)getImageFromVideoUrl:(NSURL *)url; -+ (UIImage *)getImageFromContent:(LinphoneContent *)content filePath:(NSString *)filePath forReplyBubble:(BOOL)forReplyBubble; -+ (UIImage *)getImageFromFileName:(NSString *)fileName forReplyBubble:(BOOL)forReplyBubbble; - - -- (void)setEvent:(LinphoneEventLog *)event; -- (void)setChatMessageForCbs:(LinphoneChatMessage *)message; -- (void)clearEncryptedFiles; - -- (void)onDelete; -- (void)update; - -- (void)displayImdmStatus:(LinphoneChatMessageState)state; -+ (CGSize)ViewHeightForMessage:(LinphoneChatMessage *)chat withWidth:(int)width; -+ (NSString *)TextMessageForChat:(LinphoneChatMessage *)message; -+ (CGSize)computeBoundingBox:(NSString *)text size:(CGSize)size font:(UIFont *)font; -+ (NSString *)ContactDateForChat:(LinphoneChatMessage *)message; -+(LinphoneContent *) voiceContent:(LinphoneChatMessage *)message; --(void) onPopupMenuPressed; --(void) dismissPopup; -@end diff --git a/Classes/LinphoneUI/UIChatBubbleTextCell.m b/Classes/LinphoneUI/UIChatBubbleTextCell.m deleted file mode 100644 index ee561c9dd..000000000 --- a/Classes/LinphoneUI/UIChatBubbleTextCell.m +++ /dev/null @@ -1,1056 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "linphoneapp-Swift.h" -#import "UIChatBubbleTextCell.h" -#import "LinphoneManager.h" -#import "PhoneMainView.h" -#import "Utils.h" - -#import -#import -#import - -@implementation UIChatBubbleTextCell - - - -#pragma mark - Lifecycle Functions - - - -- (id)initWithIdentifier:(NSString *)identifier { - if ((self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]) != nil) { - if ([identifier isEqualToString:NSStringFromClass(self.class)]) { - NSArray *arrayOfViews = - [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil]; - // resize cell to match .nib size. It is needed when resized the cell to - // correctly adapt its height too - UIView *sub = ((UIView *)[arrayOfViews objectAtIndex:arrayOfViews.count - 1]); - [self setFrame:CGRectMake(0, 0, sub.frame.size.width, sub.frame.size.height)]; - [self addSubview:sub]; - self.icsBubbleView = [[ICSBubbleView alloc] init]; - [self.innerView addSubview:self.icsBubbleView]; - [(ICSBubbleView*)self.icsBubbleView setLayoutConstraintsWithView:self.backgroundColorImage]; - } - } - - - [_innerView addGestureRecognizer:[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onPopupMenuPressed)]]; - [_messageText addGestureRecognizer:[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onPopupMenuPressed)]]; - - - self.contentView.userInteractionEnabled = NO; - return self; -} - -- (void)dealloc { - [self setEvent:NULL]; - [self setChatMessageForCbs:NULL]; -} - -#pragma mark - - -- (void)clearEncryptedFiles { - if ([VFSUtil vfsEnabledWithGroupName:kLinphoneMsgNotificationAppGroupId]) { - NSMutableDictionary *encrptedFilePaths = [LinphoneManager getMessageAppDataForKey:@"encryptedfiles" inMessage:_message]; - if ([encrptedFilePaths count] > 0) { - for(NSString *path in [encrptedFilePaths allValues]) { - if (![path isEqualToString:@""]) { - LOGW(@"[vfs]s remove item at %@",path); - if ([path isEqualToString:[LinphoneManager imagesDirectory]]) { - LOGE(@"[vfs] something is wrong, can not delete the cache directory"); - break; - } - [[NSFileManager defaultManager] removeItemAtPath:path error:nil]; - - } - } - [LinphoneManager setValueInMessageAppData:NULL forKey:@"encryptedfiles" inMessage:_message]; - return; - } - - NSString *filePath = [LinphoneManager getMessageAppDataForKey:@"encryptedfile" inMessage:_message]; - if (filePath) { - if (![filePath isEqualToString:@""]) { - NSError *error = nil; - LOGW(@"[vfs] remove item at %@",filePath); - if ([filePath isEqualToString:[LinphoneManager imagesDirectory]]) { - LOGE(@"[vfs] something is wrong, can not delete the cache directory"); - } else { - [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error]; - - if (error) { - LOGI(@"clean failed %@", error.description); - } - } - } - [LinphoneManager setValueInMessageAppData:NULL forKey:@"encryptedfile" inMessage:_message]; - } - } -} - -- (void)setEvent:(LinphoneEventLog *)event { - if(!event) - return; - - _event = event; - if (!(linphone_event_log_get_type(event) == LinphoneEventLogTypeConferenceChatMessage)) { - LOGE(@"Impossible to create a ChatBubbleText whit a non message event"); - return; - } - [self setChatMessageForCbs:linphone_event_log_get_chat_message(event)]; -} - -- (void)setChatMessageForCbs:(LinphoneChatMessage *)amessage { - if (amessage == _message) { - return; - } - if (_message){ - linphone_chat_message_unref(_message); - } - _message = amessage; - if (amessage){ - linphone_chat_message_ref(amessage); - linphone_chat_message_set_user_data(_message, (void *)CFBridgingRetain(self)); - LinphoneChatMessageCbs *cbs = linphone_chat_message_get_callbacks(_message); - linphone_chat_message_cbs_set_msg_state_changed(cbs, message_status); - linphone_chat_message_cbs_set_participant_imdn_state_changed(cbs, participant_imdn_status); - linphone_chat_message_cbs_set_user_data(cbs, (void *)_event); - } -} - -+ (NSString *)TextMessageForChat:(LinphoneChatMessage *)message { - const char *url = linphone_chat_message_get_external_body_url(message); - const LinphoneContent *last_content = linphone_chat_message_get_file_transfer_information(message); - // Last message was a file transfer (image) so display a picture... - if ((url || last_content) && message) { - if (linphone_chat_message_get_utf8_text(message)) - return [NSString stringWithUTF8String:linphone_chat_message_get_utf8_text(message)]; - return @"🗻"; - } else { - const char *text = linphone_chat_message_get_utf8_text(message) ?: ""; - return [NSString stringWithUTF8String:text] ?: [NSString stringWithCString:text encoding:NSASCIIStringEncoding] - ?: NSLocalizedString(@"(invalid string)", nil); - } -} - -+ (NSString *)ContactDateForChat:(LinphoneChatMessage *)message { - const LinphoneAddress *address = - linphone_chat_message_get_from_address(message) - ? linphone_chat_message_get_from_address(message) - : linphone_chat_room_get_peer_address(linphone_chat_message_get_chat_room(message)); - return [NSString stringWithFormat:@"%@ - %@", [LinphoneUtils timeToString:linphone_chat_message_get_time(message) - withFormat:LinphoneDateChatBubble], - [FastAddressBook displayNameForAddress:address]]; -} - -- (NSString *)textMessage { - return [self.class TextMessageForChat:_message]; -} - -- (void)update { - if (_message == nil) { - LOGW(@"Cannot update message room cell: null message"); - return; - } - - if (_messageText && ![LinphoneManager getMessageAppDataForKey:@"localvideo" inMessage:_message] && ![ICSBubbleView isConferenceInvitationMessageWithCmessage:self.message]) { - [_messageText setHidden:FALSE]; - /* We need to use an attributed string here so that data detector don't mess - * with the text style. See http://stackoverflow.com/a/20669356 */ - UIColor *color = [UIColor darkGrayColor]; - if (@available(iOS 13,*)) { - color = [UIColor secondaryLabelColor]; - } - - NSAttributedString *attr_text = - [[NSAttributedString alloc] initWithString:self.textMessage - attributes:@{ - NSFontAttributeName : _messageText.font, - NSForegroundColorAttributeName : color - }]; - _messageText.attributedText = attr_text; - } - - LinphoneChatMessageState state = linphone_chat_message_get_state(_message); - BOOL outgoing = linphone_chat_message_is_outgoing(_message); - - - _contactDateLabel.hidden = !_isFirst; - if (outgoing) { - _contactDateLabel.text = [LinphoneUtils timeToString:linphone_chat_message_get_time(_message) - withFormat:LinphoneDateChatBubble]; - _contactDateLabel.textAlignment = NSTextAlignmentRight; - _avatarImage.hidden = TRUE; - - } else { - [_avatarImage setImage:[FastAddressBook imageForAddress:linphone_chat_message_get_from_address(_message)]]; - _contactDateLabel.text = [self.class ContactDateForChat:_message]; - _contactDateLabel.textAlignment = NSTextAlignmentLeft; - _avatarImage.hidden = !_isFirst; - } - - - // Not use [UIImage imageNamed], it takes too much time - _backgroundColorImage.image = nil; - _backgroundColorImage.backgroundColor = outgoing ? [UIColor color:@"A"] : [UIColor color:@"D"]; - - - // set maskedCorners - if (@available(iOS 11.0, *)) { - _backgroundColorImage.layer.cornerRadius = 10; - if (outgoing) { - _backgroundColorImage.layer.maskedCorners = kCALayerMinXMaxYCorner | kCALayerMinXMinYCorner; - if (_isFirst) - _backgroundColorImage.layer.maskedCorners = _backgroundColorImage.layer.maskedCorners | kCALayerMaxXMinYCorner; - if (_isLast) - _backgroundColorImage.layer.maskedCorners = _backgroundColorImage.layer.maskedCorners | kCALayerMaxXMaxYCorner; - } else { - _backgroundColorImage.layer.maskedCorners = kCALayerMaxXMinYCorner | kCALayerMaxXMaxYCorner; - if (_isFirst) - _backgroundColorImage.layer.maskedCorners = _backgroundColorImage.layer.maskedCorners | kCALayerMinXMinYCorner; - if (_isLast) - _backgroundColorImage.layer.maskedCorners = _backgroundColorImage.layer.maskedCorners | kCALayerMinXMaxYCorner; - } - _backgroundColorImage.layer.masksToBounds = YES; - } else { - // TODO it doesn't work for ios < 11.0 - UIRectCorner corner; - if (outgoing) { - corner = UIRectCornerTopLeft | UIRectCornerBottomLeft; - if (_isFirst) - corner = corner | UIRectCornerTopRight; - if (_isLast) - corner = corner | UIRectCornerBottomRight; - } else { - corner = UIRectCornerTopRight | UIRectCornerBottomRight; - if (_isFirst) - corner = corner | UIRectCornerTopLeft; - if (_isLast) - corner = corner | UIRectCornerBottomLeft; - } - UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:_backgroundColorImage.frame byRoundingCorners:corner cornerRadii:CGSizeMake(10,10)]; - CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; - maskLayer.frame = _backgroundColorImage.frame; - maskLayer.path = maskPath.CGPath; - _backgroundColorImage.layer.mask = maskLayer; - } - - // need space for dateLabel - CGRect frame = _innerView.frame; - frame.origin.y = _isFirst ? 20 : 0; - _innerView.frame = frame; - - - [_messageText setAccessibilityLabel:outgoing ? @"Outgoing message" : @"Incoming message"]; - if (outgoing && - (state == LinphoneChatMessageStateDeliveredToUser || state == LinphoneChatMessageStateDisplayed || - state == LinphoneChatMessageStateNotDelivered || state == LinphoneChatMessageStateFileTransferError)) { - [self displayImdmStatus:state]; - } else - [self displayImdmStatus:LinphoneChatMessageStateInProgress]; - - if (linphone_chat_message_is_reply(_message)) { - if (_replyView == nil) { - _replyView = [[UIChatReplyBubbleView alloc] initWithNibName:@"UIChatReplyBubbleView" bundle:nil]; - [self.innerView addSubview:_replyView.view]; - } - _replyView.view.hidden = false; - CGRect replyFrame = CGRectMake(_contactDateLabel.frame.origin.x, _contactDateLabel.frame.origin.y+_contactDateLabel.frame.size.height,self.contactDateLabel.frame.size.width, REPLY_CHAT_BUBBLE_HEIGHT); - _replyView.view.frame = replyFrame; - [_replyView configureForMessage:linphone_chat_message_get_reply_message(_message) withDimissBlock:^{} hideDismiss:true withClickBlock:^{ - [_tableController scrollToMessage:linphone_chat_message_get_reply_message(_message)]; - }]; - } else { - if (_replyView) - _replyView.view.hidden = true; - } - - // ICS for conference invitations - - if ([ICSBubbleView isConferenceInvitationMessageWithCmessage:self.message]) { - [(ICSBubbleView*)self.icsBubbleView setFromChatMessageWithCmessage:self.message]; - self.icsBubbleView.hidden = false; - _messageText.hidden = true; - } else { - self.icsBubbleView.hidden = true; - _messageText.hidden = false; - } - - -} - -- (void)setEditing:(BOOL)editing { - [self setEditing:editing animated:FALSE]; -} - -- (void)setEditing:(BOOL)editing animated:(BOOL)animated { - _resendRecognizer.enabled = !editing; -} - -- (void)displayLIMEWarning { - UIAlertController *errView = - [UIAlertController alertControllerWithTitle:NSLocalizedString(@"LIME warning", nil) - message:NSLocalizedString(@"This message is not encrypted.", nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *action){ - }]; - - [errView addAction:defaultAction]; - [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; -} - -#pragma mark - Action Functions - -- (void)onDelete { - if (_message != NULL) { - /* - UITableView *tableView = VIEW(ChatConversationViewSwift).tableController.tableView; - NSIndexPath *indexPath = [tableView indexPathForCell:self]; - [tableView.dataSource tableView:tableView - commitEditingStyle:UITableViewCellEditingStyleDelete - forRowAtIndexPath:indexPath]; - */ - } -} - -#pragma mark - State changed handling -static void message_status(LinphoneChatMessage *msg, LinphoneChatMessageState state) { - LOGI(@"State for message [%p] changed to %s", msg, linphone_chat_message_state_to_string(state)); - if (state == LinphoneChatMessageStateFileTransferInProgress) - return; - - if (!linphone_chat_message_is_outgoing(msg) || (state != LinphoneChatMessageStateFileTransferDone && state != LinphoneChatMessageStateFileTransferInProgress)) { - LinphoneEventLog *event = (LinphoneEventLog *)linphone_chat_message_cbs_get_user_data(linphone_chat_message_get_callbacks(msg)); - ChatConversationViewSwift *view = VIEW(ChatConversationViewSwift); - //[view.tableController updateEventEntry:event]; - //[view.tableController scrollToBottom:true]; - } -} - -static void participant_imdn_status(LinphoneChatMessage* msg, const LinphoneParticipantImdnState *state) { - dispatch_async(dispatch_get_main_queue(), ^{ - ChatConversationImdnView *imdnView = VIEW(ChatConversationImdnView); - [imdnView updateImdnList]; - }); -} - -- (void)displayImdmStatus:(LinphoneChatMessageState)state { - NSString *imageName = nil; - _notDelivered = FALSE; - if (state == LinphoneChatMessageStateDeliveredToUser) { - imageName = @"chat_delivered.png"; - [_imdmIcon setHidden:FALSE]; - } else if (state == LinphoneChatMessageStateDisplayed) { - imageName = @"chat_read"; - [_imdmIcon setHidden:FALSE]; - } else if (state == LinphoneChatMessageStateNotDelivered || state == LinphoneChatMessageStateFileTransferError) { - imageName = @"chat_error"; - [_imdmIcon setHidden:FALSE]; - _notDelivered = TRUE; - } else { - [_imdmIcon setHidden:TRUE]; - } - [_imdmIcon setImage:[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@",[[NSBundle mainBundle] bundlePath],imageName]]]; -} - -#pragma mark - Bubble size computing - -+ (CGSize)computeBoundingBox:(NSString *)text size:(CGSize)size font:(UIFont *)font { - if (!text || text.length == 0) - return CGSizeMake(0, 0); - - return [text boundingRectWithSize:size - options:(NSStringDrawingUsesLineFragmentOrigin | - NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesFontLeading) - attributes:@{ - NSFontAttributeName : font - } - context:nil].size; -} - -static const CGFloat CELL_MIN_HEIGHT = 65.0f; -static const CGFloat CELL_MIN_WIDTH = 190.0f; -static const CGFloat CELL_MESSAGE_X_MARGIN = 68 + 10.0f; -static const CGFloat CELL_MESSAGE_Y_MARGIN = 44; -static const CGFloat REPLY_CHAT_BUBBLE_HEIGHT = 120; -static const CGFloat REPLY_OR_FORWARD_TAG_HEIGHT = 18; - - -+ (CGSize)ViewHeightForMessage:(LinphoneChatMessage *)chat withWidth:(int)width { - - CGSize cached = [SwiftUtil getCachedMessageHeightWithCmessage:chat]; - if (cached.height != 0) { - return cached; - } - - CGSize size = [self ViewHeightForMessageText:chat withWidth:width textForImdn:nil]; - size.height += linphone_chat_message_is_forward(chat) || linphone_chat_message_is_reply(chat) ? REPLY_OR_FORWARD_TAG_HEIGHT : 0; - size.height += linphone_chat_message_is_reply(chat) ? REPLY_CHAT_BUBBLE_HEIGHT+5 : 0; - - // No modifications of size below as it goes into cache - if ([SwiftUtil messageHeightCanBeCachedWithCmessage:chat]) { - [SwiftUtil setCachedMessageHeightWithCmessage:chat size:size]; - } - - return size; -} - -+ (CGSize)ViewHeightForFile:(int)width { - CGSize fileSize = CGSizeMake(230, 50); - CGSize size = [self getMediaMessageSizefromOriginalSize:fileSize withWidth:width]; - size.width = MAX(size.width + CELL_MESSAGE_X_MARGIN, CELL_MIN_WIDTH); - size.height = MAX(size.height + CELL_MESSAGE_Y_MARGIN, CELL_MIN_HEIGHT); - return size; -} - - -+(NSString *)formattedDuration:(long)valueSec { - return [NSString stringWithFormat:@"%02ld:%02ld", valueSec/ 60, (valueSec % 60) ]; -} - -+(NSString *) recordingDuration:(NSString *) _voiceRecordingFile{ - LinphonePlayer *p = linphone_core_create_local_player(LC, nil, nil, nil); - linphone_player_open(p, _voiceRecordingFile.UTF8String); - NSString *result = [self formattedDuration:linphone_player_get_duration(p)]; - linphone_player_close(p); - return result; -} - -+ (UIImage *)getImageFromFileName:(NSString *)fileName forReplyBubble:(BOOL)forReplyBubbble { - NSString *extension = [[fileName.lowercaseString componentsSeparatedByString:@"."] lastObject]; - UIImage *image; - NSString * text = fileName; - if ([fileName containsString:@"voice-recording"]) { - image = [UIImage imageNamed:@"file_voice_default"]; - text = [self recordingDuration:[LinphoneManager validFilePath:fileName]]; - } else { - if ([extension isEqualToString:@"pdf"]) - image = [UIImage imageNamed:@"file_pdf_default"]; - else if ([@[@"png", @"jpg", @"jpeg", @"bmp", @"heic"] containsObject:extension]) - image = [UIImage imageNamed:@"file_picture_default"]; - else if ([@[@"mkv", @"avi", @"mov", @"mp4"] containsObject:extension]) - image = [UIImage imageNamed:@"file_video_default"]; - else if ([@[@"wav", @"au", @"m4a"] containsObject:extension]) - image = [UIImage imageNamed:@"file_audio_default"]; - else - image = [UIImage imageNamed:@"file_default"]; - } - - return [SwiftUtil textToImageWithDrawText:text inImage:image forReplyBubble:forReplyBubbble]; -} - -+ (UIImage *)getImageFromContent:(LinphoneContent *)content filePath:(NSString *)filePath forReplyBubble:(BOOL)forReplyBubble { - NSString *type = [NSString stringWithUTF8String:linphone_content_get_type(content)]; - NSString *name = [NSString stringWithUTF8String:linphone_content_get_name(content)]; - if (!filePath) { - filePath = [LinphoneManager validFilePath:name]; - } - - UIImage *image = nil; - if ([type isEqualToString:@"video"]) { - image = [UIChatBubbleTextCell getImageFromVideoUrl:[NSURL fileURLWithPath:filePath]]; - } else if ([type isEqualToString:@"image"]) { - NSData* data = [NSData dataWithContentsOfFile:filePath]; - image = [[UIImage alloc] initWithData:data]; - } - if (image) return image; - else return [self getImageFromFileName:name forReplyBubble:forReplyBubble]; -} - -+(LinphoneContent *) voiceContent:(LinphoneChatMessage *)message { - for (const bctbx_list_t *it = linphone_chat_message_get_contents(message); it != NULL; it=bctbx_list_next(it)){ - LinphoneContent *content = (LinphoneContent *)it->data; - if (linphone_content_is_voice_recording(content)) - return content; - } - return nil; -} - - -+(CGSize) addVoicePlayerToSize:(CGSize)size withMargins:(BOOL)margins { - return CGSizeMake(MAX(size.width,VOICE_RECORDING_PLAYER_WIDTH + (margins ? CELL_MESSAGE_X_MARGIN: 0)), size.height + VOICE_RECORDING_PLAYER_HEIGHT+(margins ? CELL_MESSAGE_Y_MARGIN: 0)); - -} - -+ (CGSize)ViewHeightForMessageText:(LinphoneChatMessage *)chat withWidth:(int)width textForImdn:(NSString *)imdnText { - - if ([ICSBubbleView isConferenceInvitationMessageWithCmessage:chat]) { - return CGSizeMake(CONFERENCE_INVITATION_WIDTH, CONFERENCE_INVITATION_HEIGHT+[ICSBubbleView getDescriptionHeightFromContentWithCmessage:chat]); - } - - NSString *messageText = [UIChatBubbleTextCell TextMessageForChat:chat]; - static UIFont *messageFont = nil; - - if (!messageFont) { - UIChatBubbleTextCell *cell = - [[UIChatBubbleTextCell alloc] initWithIdentifier:NSStringFromClass(UIChatBubbleTextCell.class)]; - messageFont = cell.messageText.font; - } - width -= CELL_IMAGE_X_MARGIN; - CGSize size; - const char *url = linphone_chat_message_get_external_body_url(chat); - - if (imdnText) { - size = [self computeBoundingBox:imdnText - size:CGSizeMake(width - 4, CGFLOAT_MAX) - font:messageFont]; - size.width = MAX(size.width + CELL_MESSAGE_X_MARGIN, CELL_MIN_WIDTH); - size.height = MAX(size.height + CELL_MESSAGE_Y_MARGIN + 50, CELL_MIN_HEIGHT); - return size; - } - - CGFloat imagesw=0; - CGFloat imagesh=0; - CGFloat max_imagesw=0; - CGFloat max_imagesh=0; - LinphoneContent *voiceContent = [self voiceContent:chat]; - const bctbx_list_t *contents = linphone_chat_message_get_contents(chat); - size_t contentCount = bctbx_list_size(contents); - if (voiceContent) - contentCount--; - - BOOL multiParts = ((linphone_chat_message_get_utf8_text(chat) != NULL) ? contentCount > 2 : contentCount > 1); - - if (voiceContent && contentCount == 0) { - size = CGSizeMake(VOICE_RECORDING_PLAYER_WIDTH, VOICE_RECORDING_PLAYER_HEIGHT); - CGSize textSize = CGSizeMake(0, 0); - if (![messageText isEqualToString:@"🗻"]) { - textSize = [self computeBoundingBox:messageText - size:CGSizeMake(max_imagesw , CGFLOAT_MAX) - font:messageFont]; - } - - // add size for message text - size.height += textSize.height; - size.width = MAX(textSize.width, size.width); - size.width = MAX(size.width + CELL_MESSAGE_X_MARGIN, CELL_MIN_WIDTH); - size.height = MAX(size.height + CELL_MESSAGE_Y_MARGIN, CELL_MIN_HEIGHT) ; - return size; - } - - if (multiParts) { - const bctbx_list_t *it = contents; - NSMutableDictionary *encrptedFilePaths = [LinphoneManager getMessageAppDataForKey:@"encryptedfiles" inMessage:chat]; - - for (it = contents; it != NULL; it=bctbx_list_next(it)){ - LinphoneContent *content = (LinphoneContent *)it->data; - if (linphone_content_is_voice_recording(content)) { - CGSize sSize = CGSizeMake(VOICE_RECORDING_PLAYER_WIDTH, VOICE_RECORDING_PLAYER_HEIGHT); - imagesw += sSize.width; - if (imagesw > width) { - imagesw = sSize.width; - max_imagesw = MAX(max_imagesw, imagesw); - max_imagesh += imagesh; - imagesh = sSize.height; - } else { - max_imagesw = MAX(max_imagesw, imagesw); - imagesh = MAX(imagesh, sSize.height); - } - continue; - } - UIImage *image; - if(!linphone_chat_message_is_outgoing(chat) && linphone_content_is_file_transfer(content)) { - // not yet downloaded - UIImage *basicImage = [ChatConversationView getBasicImage]; - NSString *name = [NSString stringWithUTF8String:linphone_content_get_name(content)] ; - image = [ChatConversationView drawText:name image:basicImage textSize:25]; - } else if (linphone_content_is_file_transfer(content) || linphone_content_is_file(content)) { - NSString *name = [NSString stringWithUTF8String:linphone_content_get_name(content)]; - NSString *filePath=[encrptedFilePaths valueForKey:name]; - if (filePath == NULL) { - filePath = [LinphoneManager validFilePath:name]; - } - - image = [UIChatBubbleTextCell getImageFromContent:content filePath:filePath forReplyBubble:false]; - } - if (image) { - CGSize sSize = [self getMediaMessageSizefromOriginalSize:image.size withWidth:IMAGE_DEFAULT_WIDTH]; - imagesw += sSize.width; - if (imagesw > width) { - imagesw = sSize.width; - max_imagesw = MAX(max_imagesw, imagesw); - max_imagesh += imagesh; - imagesh = sSize.height; - } else { - max_imagesw = MAX(max_imagesw, imagesw); - imagesh = MAX(imagesh, sSize.height); - } - } - } - max_imagesh += imagesh; - - size = CGSizeMake(max_imagesw, max_imagesh); - CGSize textSize = CGSizeMake(0, 0); - if (![messageText isEqualToString:@"🗻"]) { - textSize = [self computeBoundingBox:messageText - size:CGSizeMake(max_imagesw , CGFLOAT_MAX) - font:messageFont]; - } - - // add size for message text - size.height += textSize.height; - size.width = MAX(textSize.width, size.width); - size.width = MAX(size.width + CELL_MESSAGE_X_MARGIN, CELL_MIN_WIDTH); - size.height = MAX(size.height + CELL_MESSAGE_Y_MARGIN, CELL_MIN_HEIGHT) ; - return size; - } - - - // if here, either 1 file + text or just one file or just text. - BOOL justText = linphone_chat_message_get_utf8_text(chat) != NULL && contentCount == 1; - if (justText) { // Just text - size = [self computeBoundingBox:messageText - size:CGSizeMake(width - CELL_MESSAGE_X_MARGIN - 4, CGFLOAT_MAX) - font:messageFont]; - size.width += 4; - } else { // Just file or file with text - LinphoneContent *fileContent = linphone_chat_message_get_file_transfer_information(chat); - NSString *localImage = [LinphoneManager getMessageAppDataForKey:@"localimage" inMessage:chat]; - NSString *localFile = [LinphoneManager getMessageAppDataForKey:@"localfile" inMessage:chat]; - NSString *localVideo = [LinphoneManager getMessageAppDataForKey:@"localvideo" inMessage:chat]; - NSString *filePath = [LinphoneManager getMessageAppDataForKey:@"encryptedfile" inMessage:chat]; - NSString *fileName = fileContent ? [NSString stringWithUTF8String:linphone_content_get_name(fileContent)] : nil; - - CGSize textSize = CGSizeMake(0, 0); - if (![messageText isEqualToString:@"🗻"] && messageText.length > 0) { - textSize = [self computeBoundingBox:messageText - size:CGSizeMake(width - CELL_MESSAGE_X_MARGIN - 4, CGFLOAT_MAX) - font:messageFont]; - size.height += textSize.height; - } - - CGSize originalImageSize = CGSizeMake(230, 50); - if (!filePath) { - filePath = [LinphoneManager validFilePath:fileName]; - } - if (localFile) { - UIImage *image = nil; - NSString *type = [NSString stringWithUTF8String:linphone_content_get_type(fileContent)]; - - if ([type isEqualToString:@"video"]) { - if ([[NSFileManager defaultManager] fileExistsAtPath: filePath]) { - image = [self getImageFromVideoUrl:[NSURL fileURLWithPath:filePath]]; - } else { - image = [self getImageFromVideoUrl:[VIEW(ChatConversationView) getICloudFileUrl:localFile]]; - } - } else if ([localFile hasSuffix:@"JPG"] || [localFile hasSuffix:@"PNG"] || [localFile hasSuffix:@"jpg"] || [localFile hasSuffix:@"png"]) { - if ([[NSFileManager defaultManager] fileExistsAtPath: filePath]) { - NSData *data = [NSData dataWithContentsOfFile:filePath]; - image = [[UIImage alloc] initWithData:data]; - } else { - NSData *data = [NSData dataWithContentsOfURL:[VIEW(ChatConversationView) getICloudFileUrl:localFile]]; - image = [[UIImage alloc] initWithData:data]; - } - } else if (voiceContent){ - return [self addVoicePlayerToSize:[self ViewHeightForFile:width] withMargins:true]; - } else { - image = nil; - originalImageSize = CGSizeMake(140, 140); - } - if (image != nil) - originalImageSize = image.size; - } else { - if (!localImage && !localVideo) { - //We are loading the image - CGSize baseSize = CGSizeMake(120 + CELL_MESSAGE_X_MARGIN, 120 + CELL_MESSAGE_Y_MARGIN + textSize.height + (textSize.height != 0 ? 20 : 0)); - if (voiceContent) { - baseSize = [self addVoicePlayerToSize:baseSize withMargins:true]; - baseSize.height -= VOICE_RECORDING_PLAYER_HEIGHT; - baseSize.height += 10; - } - return baseSize; - } - - if (localImage && [[NSFileManager defaultManager] fileExistsAtPath:filePath]) { - NSData* data = [NSData dataWithContentsOfFile:filePath]; - UIImage *image = [[UIImage alloc] initWithData:data]; - if (!image) { - CGSize fileSize = [self ViewHeightForFile:width]; - if (voiceContent) { - fileSize = [self addVoicePlayerToSize:fileSize withMargins:true]; - } - return fileSize; - } - originalImageSize = image.size; - } else if (localVideo && [[NSFileManager defaultManager] fileExistsAtPath:filePath]) { - UIImage *image = [UIChatBubbleTextCell getImageFromVideoUrl:[NSURL fileURLWithPath:filePath]]; - if (!image) { - CGSize fileSize = [self ViewHeightForFile:width]; - if (voiceContent) { - fileSize = [self addVoicePlayerToSize:fileSize withMargins:true]; - } - return fileSize; - } - originalImageSize = image.size; - } else { - // support previous versions - PHFetchResult *assets; - if(localImage) - assets = [LinphoneManager getPHAssets:localImage]; - else - assets = [PHAsset fetchAssetsWithLocalIdentifiers:[NSArray arrayWithObject:localVideo] options:nil]; - - if (![assets firstObject]) { - CGSize baseSize = CGSizeMake(CELL_MIN_WIDTH, CELL_MIN_WIDTH + CELL_MESSAGE_Y_MARGIN + textSize.height); - if (voiceContent) { - baseSize = [self addVoicePlayerToSize:baseSize withMargins:true]; - } - return baseSize; - } else { - PHAsset *asset = [assets firstObject]; - originalImageSize = CGSizeMake([asset pixelWidth], [asset pixelHeight]); - } - } - } - size = [self getMediaMessageSizefromOriginalSize:originalImageSize withWidth:width]; - // add size for message text - size.height += textSize.height; - size.width = MAX(textSize.width, size.width); - } - - if (voiceContent) { - size.width = MAX(size.width,VOICE_RECORDING_PLAYER_WIDTH); - size.height += VOICE_RECORDING_PLAYER_HEIGHT; - } - - size.width = MAX(size.width + CELL_MESSAGE_X_MARGIN, CELL_MIN_WIDTH); - size.height = MAX(size.height + CELL_MESSAGE_Y_MARGIN, CELL_MIN_HEIGHT); - return size; -} - -+ (CGSize)ViewSizeForMessage:(LinphoneChatMessage *)chat withWidth:(int)width { - static UIFont *dateFont = nil; - static CGSize dateViewSize; - - if (!dateFont) { - UIChatBubbleTextCell *cell = - [[UIChatBubbleTextCell alloc] initWithIdentifier:NSStringFromClass(UIChatBubbleTextCell.class)]; - dateFont = cell.contactDateLabel.font; - dateViewSize = cell.contactDateLabel.frame.size; - dateViewSize.width = CGFLOAT_MAX; - } - - CGSize messageSize = [self ViewHeightForMessage:chat withWidth:width]; - CGSize dateSize = [self computeBoundingBox:[self ContactDateForChat:chat] size:dateViewSize font:dateFont]; - messageSize.width = MAX(MAX(messageSize.width, MIN(dateSize.width + CELL_MESSAGE_X_MARGIN, width)), CELL_MIN_WIDTH); - messageSize.width = MAX(MAX(messageSize.width, MIN(CELL_MESSAGE_X_MARGIN, width)), CELL_MIN_WIDTH); - - return messageSize; -} - -+ (UIImage *)getImageFromVideoUrl:(NSURL *)url { - AVURLAsset* asset = [AVURLAsset URLAssetWithURL:url options:nil]; - AVAssetImageGenerator* generator = [AVAssetImageGenerator assetImageGeneratorWithAsset:asset]; - generator.appliesPreferredTrackTransform = YES; - return [UIImage imageWithCGImage:[generator copyCGImageAtTime:CMTimeMake(0, 1) actualTime:nil error:nil]]; -} - -- (void)layoutSubviews { - [super layoutSubviews]; - if (_message != nil) { - //UITableView *tableView = VIEW(ChatConversationViewSwift).tableController.tableView; - BOOL is_outgoing = linphone_chat_message_is_outgoing(_message); - CGRect bubbleFrame = _bubbleView.frame; - int available_width = self.frame.size.width; - int origin_x; - - bubbleFrame.size = [self.class ViewSizeForMessage:_message withWidth:available_width]; - if (linphone_chat_message_is_reply(_message)) { - bubbleFrame.size.width = MAX(bubbleFrame.size.width, 300); - } - - /* - if (tableView.isEditing) { - origin_x = 0; - } else { - origin_x = (is_outgoing ? self.frame.size.width - bubbleFrame.size.width : 0); - } - */ - - CGRect r = _messageText.frame; - r.origin.y = linphone_chat_message_is_reply(_message) ? _replyView.view.frame.origin.y + _replyView.view.frame.size.height + 5 : 3; - _messageText.frame = r; - - r = _messageText.frame; - r.origin.y = linphone_chat_message_is_forward(_message) ? _contactDateLabel.frame.origin.y + _contactDateLabel.frame.size.height + 5 : r.origin.y; - _messageText.frame = r; - - _replyTransferIcon.hidden = ! linphone_chat_message_is_reply(_message) && !linphone_chat_message_is_forward(_message); - _replyTransferLabel.hidden = ! linphone_chat_message_is_reply(_message) && !linphone_chat_message_is_forward(_message); - [(ICSBubbleView*)self.icsBubbleView updateTopLayoutConstraintsWithView:self.backgroundColorImage replyOrForward:linphone_chat_message_is_reply(_message)||linphone_chat_message_is_forward(_message)]; - - - if (linphone_chat_message_is_reply(_message)) { - CGRect replyFrame = CGRectMake(10, _replyTransferLabel.frame.origin.y+_replyTransferLabel.frame.size.height+5,MAX(self.contactDateLabel.frame.size.width-20,180), REPLY_CHAT_BUBBLE_HEIGHT); - _replyView.view.frame = replyFrame; - _replyTransferIcon.image = [UIImage imageNamed:@"menu_reply_default"]; - _replyTransferLabel.text = NSLocalizedString(@"Answer",nil); - _replyTransferLabel.textColor = [UIColor lightGrayColor]; - } - - if (linphone_chat_message_is_forward(_message)) { - _replyTransferIcon.image = [UIImage imageNamed:@"menu_forward_default"]; - _replyTransferLabel.text = NSLocalizedString(@"Transferred",nil); - _replyTransferLabel.textColor = [UIColor darkGrayColor]; - } - - bubbleFrame.origin.x = origin_x; - _bubbleView.frame = bubbleFrame; - - - } -} - - -+ (CGSize)getMediaMessageSizefromOriginalSize:(CGSize)originalSize withWidth:(int)width { - CGSize mediaSize = CGSizeMake(0, 0); - int availableWidth = width; - if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]) || IPAD) { - availableWidth = availableWidth /1.7; - } - - int newHeight = originalSize.height; - float originalAspectRatio = originalSize.width / originalSize.height; - // We resize in width and crop in height - if (originalSize.width > availableWidth) { - newHeight = availableWidth / originalAspectRatio; - } - - if (newHeight > availableWidth) { - newHeight = availableWidth; - availableWidth = newHeight * originalAspectRatio; - } - mediaSize.height = newHeight; - mediaSize.width = MIN(availableWidth, originalSize.width); - return mediaSize; -} - - -// Message popup menu -// Copy text -> if has text -// Transfer -> always -// Reply -> always -// IMDM Status -> out -// Delete -> always - - --(void) buildActions { - LinphoneChatMessage *message = self.message; - LinphoneEventLog *event = self.event; - - _messageActionsTitles = [[NSMutableArray alloc] init]; - _messageActionsBlocks = [[NSMutableArray alloc] init]; - _messageActionsIcons = [[NSMutableArray alloc] init]; - - [VIEW(ChatConversationView).messageField resignFirstResponder]; - UIChatBubbleTextCell *thiz = self; - - LinphoneChatMessageState state = linphone_chat_message_get_state(self.message); - if (state == LinphoneChatMessageStateNotDelivered || state == LinphoneChatMessageStateFileTransferError) { - [_messageActionsTitles addObject:NSLocalizedString(@"Resend", nil)]; - [_messageActionsIcons addObject:@"menu_resend_default"]; - [_messageActionsBlocks addObject:^{ - [thiz dismissPopup]; - if (!linphone_core_is_network_reachable(LC)) { - [PhoneMainView.instance presentViewController:[LinphoneUtils networkErrorView:@"send a message"] animated:YES completion:nil]; - return; - } - linphone_chat_message_send(message); - }]; - } - - - if (linphone_chat_message_get_utf8_text(message) && ![ICSBubbleView isConferenceInvitationMessageWithCmessage:message]) { - [_messageActionsTitles addObject:NSLocalizedString(@"Copy text", nil)]; - [_messageActionsIcons addObject:@"menu_copy_text_default"]; - [_messageActionsBlocks addObject:^{ - [thiz dismissPopup]; - [UIPasteboard.generalPasteboard setString:[NSString stringWithUTF8String:linphone_chat_message_get_utf8_text(message)]]; - }]; - } - - - [_messageActionsTitles addObject:NSLocalizedString(@"Forward", nil)]; - [_messageActionsIcons addObject:@"menu_forward_default"]; - [_messageActionsBlocks addObject:^{ - [thiz dismissPopup]; - VIEW(ChatConversationViewSwift).pendingForwardMessage = message; - [PhoneMainView.instance changeCurrentView:VIEW(ChatsListView).compositeViewDescription]; - }]; - - - - [_messageActionsTitles addObject:NSLocalizedString(@"Reply", nil)]; - [_messageActionsIcons addObject:@"menu_reply_default"]; - [_messageActionsBlocks addObject:^{ - [thiz dismissPopup]; - [VIEW(ChatConversationViewSwift) initiateReplyViewForMessage:message]; - }]; - - LinphoneChatRoom *chatroom = linphone_chat_message_get_chat_room(self.message); - - if (linphone_chat_room_get_nb_participants(chatroom) > 1) { - [_messageActionsTitles addObject:NSLocalizedString(@"Infos", nil)]; - [_messageActionsIcons addObject:@"menu_info"]; - [_messageActionsBlocks addObject:^{ - [thiz dismissPopup]; - ChatConversationImdnView *view = VIEW(ChatConversationImdnView); - view.event = event; - [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; - }]; - } - - if (!linphone_chat_message_is_outgoing(self.message) - && [FastAddressBook getContactWithAddress:linphone_chat_message_get_from_address(self.message)] == nil - && !(linphone_chat_room_get_capabilities(chatroom) & LinphoneChatRoomCapabilitiesOneToOne) ) { - - LinphoneAddress *fromAddress = linphone_address_clone(linphone_chat_message_get_from_address(self.message)); - [_messageActionsTitles addObject:NSLocalizedString(@"Add to contact", nil)]; - [_messageActionsIcons addObject:@"contact_add_default"]; - [_messageActionsBlocks addObject:^{ - [thiz dismissPopup]; - linphone_address_clean(fromAddress); - char *lAddress = linphone_address_as_string_uri_only(fromAddress); - if (lAddress != NULL) { - NSString *normSip = [NSString stringWithUTF8String:lAddress]; - normSip = [normSip hasPrefix:@"sip:"] ? [normSip substringFromIndex:4] : normSip; - normSip = [normSip hasPrefix:@"sips:"] ? [normSip substringFromIndex:5] : normSip; - [ContactSelection setAddAddress:normSip]; - [ContactSelection setSelectionMode:ContactSelectionModeEdit]; - [ContactSelection enableSipFilter:FALSE]; - [PhoneMainView.instance changeCurrentView:ContactsListView.compositeViewDescription]; - ms_free(lAddress); - } - linphone_address_unref(fromAddress); - }]; - } - - [_messageActionsTitles addObject:NSLocalizedString(@"Delete", nil)]; - [_messageActionsIcons addObject:@"menu_delete"]; - [_messageActionsBlocks addObject:^{ - [thiz dismissPopup]; - linphone_chat_room_delete_message(linphone_chat_message_get_chat_room(message), message); - //[VIEW(ChatConversationViewSwift).tableController reloadData]; - }]; -} - --(void) onPopupMenuPressed { - if (_popupMenu != nil) - [self dismissPopup]; - - if (!self.popupMenuAllowed) - return; - - - //[VIEW(ChatConversationViewSwift).tableController dismissMessagesPopups]; - [self buildActions]; - int width = 250; - int cellHeight = 45; - int numberOfItems = (int) _messageActionsTitles.count; - CGRect screenRect = UIScreen.mainScreen.bounds; - int menuHeight = numberOfItems * cellHeight; - - /* - CGRect frame = CGRectMake( - linphone_chat_message_is_outgoing(self.message) ? screenRect.size.width - width - 10 : 10, - (self.frame.origin.y + self.frame.size.height) - [VIEW(ChatConversationViewSwift).tableController .tableView contentOffset].y > screenRect.size.height /2 ? self.frame.origin.y - menuHeight - 10: self.frame.origin.y + self.frame.size.height, - width, - menuHeight);*/ - - //_popupMenu = [[UITableView alloc]initWithFrame:frame]; - _popupMenu.scrollEnabled = false; - _popupMenu.dataSource = self; - _popupMenu.delegate = self; - _popupMenu.separatorStyle = UITableViewCellSeparatorStyleNone; - - _popupMenu.layer.masksToBounds = false; - - _popupMenu.layer.shadowColor = [UIColor darkGrayColor].CGColor; - _popupMenu.layer.shadowOpacity = 0.7; - _popupMenu.layer.shadowOffset = CGSizeMake(0, 3); - _popupMenu.layer.shadowRadius = 5; - _popupMenu.layer.shadowPath = [[UIBezierPath bezierPathWithRoundedRect:_popupMenu.layer.bounds cornerRadius:_popupMenu.layer.cornerRadius] CGPath]; - - _popupMenu.tableFooterView = [UIView new]; - _popupMenu.editing = NO; - _popupMenu.userInteractionEnabled = true; - [_popupMenu reloadData]; - //[VIEW(ChatConversationViewSwift).tableController.view addSubview:_popupMenu]; - UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapOutsideMenu:)]; - tapGestureRecognizer.cancelsTouchesInView = NO; - tapGestureRecognizer.numberOfTapsRequired = 1; - //[VIEW(ChatConversationViewSwift).tableController.view addGestureRecognizer:tapGestureRecognizer]; -} - --(void) dismissPopup { - if (!_popupMenu) - return; - [_popupMenu removeFromSuperview]; - _popupMenu = nil; - [self setNeedsLayout]; -} - - --(void) tapOutsideMenu:(UITapGestureRecognizer *) g { - /* - CGPoint p = [g locationInView:VIEW(ChatConversationViewSwift).tableController.view]; - if (!CGRectContainsPoint(_popupMenu.frame,p)) { - [self dismissPopup]; - } - */ -} - --(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - void (^ myblock)(void) = [_messageActionsBlocks objectAtIndex:indexPath.row]; - [self dismissPopup]; - myblock(); -} - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 1; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return [_messageActionsTitles count]; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell *cell = [[UITableViewCell alloc] init]; - UIImageView * icon = [[UIImageView alloc] initWithFrame:CGRectMake(tableView.frame.size.width-37, 7, 30, 30)]; - icon.image = [[UIImage imageNamed:[_messageActionsIcons objectAtIndex:indexPath.row]] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; - [cell.contentView addSubview:icon]; - cell.textLabel.text = [_messageActionsTitles objectAtIndex:indexPath.row]; - icon.contentMode = UIViewContentModeScaleAspectFit; - if ([[_messageActionsIcons objectAtIndex:indexPath.row] isEqualToString:@"menu_delete"]) { - cell.textLabel.textColor = UIColor.redColor; - icon.tintColor = UIColor.redColor; - } else { - icon.tintColor = PhoneMainView.instance.darkMode ? UIColor.whiteColor : UIColor.blackColor; - } - return cell; -} - - - -@end diff --git a/Classes/LinphoneUI/UIChatCell.h b/Classes/LinphoneUI/UIChatCell.h deleted file mode 100644 index bb26032d9..000000000 --- a/Classes/LinphoneUI/UIChatCell.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UIRoundedImageView.h" -#import "UIIconButton.h" -#import "UIBouncingView.h" - -#include "linphone/linphonecore.h" - -@interface UIChatCell : UITableViewCell { - LinphoneChatRoom *chatRoom; -} - -@property(readonly, nonatomic) LinphoneEventLog *event; -@property(nonatomic, strong) IBOutlet UIImageView *avatarImage; -@property (weak, nonatomic) IBOutlet UIImageView *securityImage; -@property(nonatomic, strong) IBOutlet UILabel *addressLabel; -@property(nonatomic, strong) IBOutlet UILabel *chatContentLabel; -@property(weak, nonatomic) IBOutlet UILabel *chatLatestTimeLabel; -@property(weak, nonatomic) IBOutlet UIBouncingView *unreadCountView; -@property(weak, nonatomic) IBOutlet UILabel *unreadCountLabel; -@property (weak, nonatomic) IBOutlet UIImageView *imdmIcon; -@property (weak, nonatomic) IBOutlet UIImageView *ephemeral; -@property (weak, nonatomic) IBOutlet UIImageView *forwardIcon; - - -- (id)initWithIdentifier:(NSString*)identifier; - -- (IBAction)onDeleteClick:(id)event; -- (void)updateUnreadBadge; -- (void)setChatRoom:(LinphoneChatRoom *)achat; -@end diff --git a/Classes/LinphoneUI/UIChatCell.m b/Classes/LinphoneUI/UIChatCell.m deleted file mode 100644 index d2043e60d..000000000 --- a/Classes/LinphoneUI/UIChatCell.m +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIChatCell.h" -#import "PhoneMainView.h" -#import "LinphoneManager.h" -#import "Utils.h" -#import "linphoneapp-Swift.h" - -@implementation UIChatCell - -#pragma mark - Lifecycle Functions - -- (id)initWithIdentifier:(NSString *)identifier { - if ((self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]) != nil) { - NSArray *arrayOfViews = - [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil]; - - // resize cell to match .nib size. It is needed when resized the cell to - // correctly adapt its height too - UIView *sub = ((UIView *)[arrayOfViews objectAtIndex:0]); - [self setFrame:CGRectMake(0, 0, sub.frame.size.width, sub.frame.size.height)]; - [self addSubview:sub]; - } - [_imdmIcon setHidden:TRUE]; - _unreadCountView.backgroundColor = VoipTheme.primary_color; - _unreadCountView.layer.cornerRadius = 10; - _unreadCountView.clipsToBounds = true; - _unreadCountLabel.textAlignment = NSTextAlignmentCenter; - return self; -} - -#pragma mark - Property Funcitons - -- (void)setChatRoom:(LinphoneChatRoom *)achat { - chatRoom = achat; - [self update]; - [self.forwardIcon setImageNamed:@"forward_message_default" tintColor:PhoneMainView.instance.darkMode ? UIColor.whiteColor : UIColor.darkGrayColor]; -} - -#pragma mark - - -- (NSString *)accessibilityValue { - if (_chatContentLabel.text) { - return [NSString stringWithFormat:@"%@, %@ (%li)", _addressLabel.text, _chatContentLabel.text, - (long)[_unreadCountLabel.text integerValue]]; - } else { - return [NSString stringWithFormat:@"%@ (%li)", _addressLabel.text, (long)[_unreadCountLabel.text integerValue]]; - } -} - -- (void)update { - if (chatRoom == nil) { - LOGW(@"Cannot update chat cell: null chat"); - return; - } - - LinphoneChatRoomCapabilitiesMask capabilities = linphone_chat_room_get_capabilities(chatRoom); - if (capabilities & LinphoneChatRoomCapabilitiesOneToOne) { - bctbx_list_t *participants = linphone_chat_room_get_participants(chatRoom); - LinphoneParticipant *firstParticipant = participants ? (LinphoneParticipant *)participants->data : NULL; - const LinphoneAddress *addr = firstParticipant ? linphone_participant_get_address(firstParticipant) : linphone_chat_room_get_peer_address(chatRoom); - if (addr) { - [ContactDisplay setDisplayNameLabel:_addressLabel forAddress:addr]; - [_avatarImage setImage:[FastAddressBook imageForAddress:addr]]; - } else { - _addressLabel.text = [NSString stringWithUTF8String:LINPHONE_DUMMY_SUBJECT]; - } - bctbx_list_free(participants); - } else { - const char *subject = linphone_chat_room_get_subject(chatRoom); - _addressLabel.text = [NSString stringWithUTF8String:subject ?: LINPHONE_DUMMY_SUBJECT]; - [_avatarImage setImage:[UIImage imageNamed:@"chat_group_avatar.png"]]; - } - // TODO update security image when security level changed - [_securityImage setImage:[FastAddressBook imageForSecurityLevel:linphone_chat_room_get_security_level(chatRoom)]]; - - _chatLatestTimeLabel.text = [LinphoneUtils timeToString:linphone_chat_room_get_last_update_time(chatRoom) withFormat:LinphoneDateChatList]; - - LinphoneChatMessage *last_msg = linphone_chat_room_get_last_message_in_history(chatRoom); - if (last_msg) { - BOOL imdnInSnap = TRUE; - if (imdnInSnap) { - BOOL outgoing = linphone_chat_message_is_outgoing(last_msg); - NSString *text = [UIChatBubbleTextCell TextMessageForChat:last_msg]; - if (capabilities & LinphoneChatRoomCapabilitiesOneToOne) { - // shorten long messages - /*if ([text length] > 50) - text = [[text substringToIndex:50] stringByAppendingString:@"[...]"];*/ - _chatContentLabel.attributedText = nil; - _chatContentLabel.text = text; - } else { - NSString *name = [FastAddressBook displayNameForAddress:linphone_chat_message_get_from_address(last_msg)]; - if ([name length] > 25) { - name = [[name substringToIndex:25] stringByAppendingString:@"[...]"]; - } - CGFloat fontSize = _chatContentLabel.font.pointSize; - UIFont *boldFont = [UIFont boldSystemFontOfSize:fontSize]; - NSMutableAttributedString *boldText = [[NSMutableAttributedString alloc] initWithString:name attributes:@{ NSFontAttributeName : boldFont }]; - text = [@" : " stringByAppendingString:text]; - //NSString *fullText = [name stringByAppendingString:text]; - /*if ([fullText length] > 50) { - text = [[text substringToIndex: (50 - [name length])] stringByAppendingString:@"[...]"]; - }*/ - [boldText appendAttributedString:[[NSAttributedString alloc] initWithString:text]]; - _chatContentLabel.text = nil; - _chatContentLabel.attributedText = boldText; - } - - if (outgoing){ - linphone_chat_message_set_user_data(last_msg, (void *)CFBridgingRetain(self)); - LinphoneChatMessageCbs *cbs = linphone_chat_message_get_callbacks(last_msg); - linphone_chat_message_cbs_set_msg_state_changed(cbs, message_status); - linphone_chat_message_cbs_set_user_data(cbs, (void *)_event); - } - - LinphoneChatMessageState state = linphone_chat_message_get_state(last_msg); - if (outgoing && (state == LinphoneChatMessageStateDeliveredToUser || state == LinphoneChatMessageStateDisplayed || state == LinphoneChatMessageStateNotDelivered || state == LinphoneChatMessageStateFileTransferError)) { - [self displayImdmStatus:state]; - CGRect newFrame = _chatContentLabel.frame; - newFrame.origin.x = 89; - _chatContentLabel.frame = newFrame; - } else { - // We displace the message 20 pixels to the left - [_imdmIcon setHidden:TRUE]; - CGRect newFrame = _chatContentLabel.frame; - newFrame.origin.x = 69; - _chatContentLabel.frame = newFrame; - } - } else { - NSString *conferenceInfo = [ICSBubbleView getConferenceSummaryWithCmessage:last_msg]; - NSString *text = conferenceInfo != nil ? conferenceInfo : [[FastAddressBook displayNameForAddress:linphone_chat_message_get_from_address(last_msg)] - stringByAppendingFormat:@" : %@", [UIChatBubbleTextCell TextMessageForChat:last_msg]]; - // shorten long messages - /*if ([text length] > 50) - text = [[text substringToIndex:50] stringByAppendingString:@"[...]"];*/ - [_imdmIcon setHidden:TRUE]; - CGRect newFrame = _chatContentLabel.frame; - newFrame.origin.x = 69; - _chatContentLabel.frame = newFrame; - _chatContentLabel.text = text; - } - - linphone_chat_message_unref(last_msg); - } else - _chatContentLabel.text = nil; - - [self updateUnreadBadge]; - _ephemeral.hidden = !linphone_chat_room_ephemeral_enabled(chatRoom); -} - -- (void)updateUnreadBadge { - int count = linphone_chat_room_get_unread_messages_count(chatRoom); - _unreadCountLabel.text = [NSString stringWithFormat:@"%i", count]; - if (count > 0) { - [_unreadCountView startAnimating:YES]; - } else { - [_unreadCountView stopAnimating:YES]; - } - UIFont *addressFont = (count <= 0) ? [UIFont systemFontOfSize:21] : [UIFont boldSystemFontOfSize:21]; - _addressLabel.font = addressFont; -} - -- (void)setEditing:(BOOL)editing { - [self setEditing:editing animated:FALSE]; -} - -- (void)setEditing:(BOOL)editing animated:(BOOL)animated { - if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground) { - return; - } - if (animated) { - [UIView beginAnimations:nil context:nil]; - [UIView setAnimationDuration:0.3]; - } - if (editing) { - [_unreadCountView stopAnimating:animated]; - } else if (linphone_chat_room_get_unread_messages_count(chatRoom) > 0) { - [_unreadCountView startAnimating:animated]; - } - if (animated) { - [UIView commitAnimations]; - } -} - -#pragma mark - Action Functions - -- (IBAction)onDeleteClick:(id)event { - if (chatRoom != NULL) { - UITableView *tableView = VIEW(ChatsListView).tableController.tableView; - NSIndexPath *indexPath = [tableView indexPathForCell:self]; - [[tableView dataSource] tableView:tableView - commitEditingStyle:UITableViewCellEditingStyleDelete - forRowAtIndexPath:indexPath]; - } -} - - -- (void)displayImdmStatus:(LinphoneChatMessageState)state { - if (state == LinphoneChatMessageStateDeliveredToUser) { - [_imdmIcon setImage:[UIImage imageNamed:@"chat_delivered"]]; - [_imdmIcon setHidden:FALSE]; - } else if (state == LinphoneChatMessageStateDisplayed) { - [_imdmIcon setImage:[UIImage imageNamed:@"chat_read"]]; - [_imdmIcon setHidden:FALSE]; - } else if (state == LinphoneChatMessageStateNotDelivered || state == LinphoneChatMessageStateFileTransferError) { - [_imdmIcon setImage:[UIImage imageNamed:@"chat_error"]]; - [_imdmIcon setHidden:FALSE]; - } else { - [_imdmIcon setHidden:TRUE]; - } -} - -static void message_status(LinphoneChatMessage *msg, LinphoneChatMessageState state) { - LOGI(@"State for message [%p] changed to %s", msg, linphone_chat_message_state_to_string(state)); - if (state == LinphoneChatMessageStateFileTransferInProgress) - return; - - if (!linphone_chat_message_is_outgoing(msg) || (state != LinphoneChatMessageStateFileTransferDone && state != LinphoneChatMessageStateFileTransferInProgress)) { - ChatsListView *view = VIEW(ChatsListView); - [view.tableController updateEventEntry:msg]; - } -} - -@end diff --git a/Classes/LinphoneUI/UIChatContentView.h b/Classes/LinphoneUI/UIChatContentView.h deleted file mode 100644 index b5d530de1..000000000 --- a/Classes/LinphoneUI/UIChatContentView.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - - -@interface UIChatContentView : UIImageView - -@property(strong, nonatomic) NSMutableArray *fileUrls; -@property(nonatomic) NSInteger position; -@property(readonly, nonatomic) LinphoneContent *content; -@property(readonly, nonatomic) LinphoneChatMessage *message; -@property(nonatomic) UIButton *downloadButton; -@property(nonatomic) NSString *filePath; -@property(nonatomic) UIProgressView *progress; - - -- (void)setContent:(LinphoneContent *)content message:(LinphoneChatMessage *)message; - -@end diff --git a/Classes/LinphoneUI/UIChatContentView.m b/Classes/LinphoneUI/UIChatContentView.m deleted file mode 100644 index 31c35da80..000000000 --- a/Classes/LinphoneUI/UIChatContentView.m +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import "UIChatContentView.h" -#import "ChatConversationView.h" -#import "PhoneMainView.h" - -@implementation UIChatContentView - -static NSMutableDictionary *instances; - -- (void)setContent:(LinphoneContent *)content message:(LinphoneChatMessage *)message { - - if (!instances) - instances = [[NSMutableDictionary alloc] init]; - - _content = content; - _message = message; - self.userInteractionEnabled = YES; - - if(!linphone_chat_message_is_outgoing(_message) && linphone_content_is_file_transfer(_content)) { - // has not yet downloaded - NSString *name = [NSString stringWithUTF8String:linphone_content_get_name(content)] ; - UIImage *image = [UIChatBubbleTextCell getImageFromFileName:name forReplyBubble:false]; - [self setImage:image]; - _downloadButton = [UIButton buttonWithType:UIButtonTypeCustom]; - [_downloadButton addTarget:self - action:@selector(onDownloadClick:) - forControlEvents:UIControlEventTouchUpInside]; - UIFont *boldFont = [UIFont systemFontOfSize:12]; - NSMutableParagraphStyle * paragraphStyle = [[NSMutableParagraphStyle alloc] init]; - paragraphStyle.alignment = NSTextAlignmentCenter; - NSMutableAttributedString *boldText = [[NSMutableAttributedString alloc] initWithString:@"Download" attributes:@{ NSFontAttributeName : boldFont, NSParagraphStyleAttributeName:paragraphStyle,NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle) }]; - [_downloadButton setAttributedTitle:boldText forState:UIControlStateNormal]; - _downloadButton.frame = CGRectMake(0, 90, 120, 30); - [self addSubview:_downloadButton]; - _progress = [[UIProgressView alloc] initWithFrame:CGRectMake(5, 75, 110, 30)]; - _progress.tintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"color_A.png"]]; - _progress.hidden = true; - [self addSubview:_progress]; - } else { - if (_filePath == NULL) { - NSString *name = [NSString stringWithUTF8String:linphone_content_get_name(content)]; - _filePath = [LinphoneManager validFilePath:name]; - } - UIImage *image = [UIChatBubbleTextCell getImageFromContent:content filePath:_filePath forReplyBubble:false]; - [self setImage:image]; - UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onMultiPartClick:)]; - tapGestureRecognizer.numberOfTapsRequired = 1; - tapGestureRecognizer.enabled = YES; - [self addGestureRecognizer:tapGestureRecognizer]; - self.userInteractionEnabled = true; - } -} - - --(IBAction)onMultiPartClick:(id)sender { - ChatConversationView *view = VIEW(ChatConversationView); - [view openFileWithURLs:_fileUrls index:_position]; -} - --(IBAction)onDownloadClick:(id)sender { - _downloadButton.enabled = NO; - linphone_content_set_file_path(_content, [[LinphoneManager imagesDirectory] stringByAppendingPathComponent:[NSString stringWithUTF8String:linphone_content_get_name(_content)]].UTF8String); - linphone_chat_message_cbs_set_file_transfer_progress_indication(linphone_chat_message_get_callbacks(_message), file_transfer_progress_indication_recv); - _progress.hidden = false; - _downloadButton.enabled = false; - [instances setValue:self forKey:[NSString stringWithUTF8String:linphone_content_get_name(_content)]]; - - linphone_chat_message_download_content(_message, _content); -} - -static void file_transfer_progress_indication_recv(LinphoneChatMessage *message, LinphoneContent* content, size_t offset, size_t total) { - CGFloat p = offset * 1.f / total; - dispatch_async(dispatch_get_main_queue(), ^{ - UIChatContentView *thiz = [instances objectForKey:[NSString stringWithUTF8String:linphone_content_get_name(content)]]; - if (offset == total) { - thiz.progress.hidden = true; - } else { - thiz.progress.hidden = false; - thiz.progress.progress = p; - LOGD(@"Transfer of %s (%d bytes): already %ld recv progress = %f", linphone_content_get_name(content), total, p); - } - }); -} - -@end - diff --git a/Classes/LinphoneUI/UIChatConversationImdnTableViewCell.h b/Classes/LinphoneUI/UIChatConversationImdnTableViewCell.h deleted file mode 100644 index ad24750ec..000000000 --- a/Classes/LinphoneUI/UIChatConversationImdnTableViewCell.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef UIChatConversationImdnTableViewCell_h -#define UIChatConversationImdnTableViewCell_h - -@interface UIChatConversationImdnTableViewCell : UITableViewCell - -@property (weak, nonatomic) IBOutlet UIImageView *avatar; -@property (weak, nonatomic) IBOutlet UILabel *displayName; -@property (weak, nonatomic) IBOutlet UILabel *dateLabel; -- (id)initWithIdentifier:(NSString *)identifier; -@end - -#endif /* UIChatConversationImdnTableViewCell_h */ diff --git a/Classes/LinphoneUI/UIChatConversationImdnTableViewCell.m b/Classes/LinphoneUI/UIChatConversationImdnTableViewCell.m deleted file mode 100644 index 2153f2adf..000000000 --- a/Classes/LinphoneUI/UIChatConversationImdnTableViewCell.m +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "PhoneMainView.h" -#import "UIChatConversationImdnTableViewCell.h" - -@implementation UIChatConversationImdnTableViewCell - -- (void)awakeFromNib { - [super awakeFromNib]; - // Initialization code -} - -- (id)initWithIdentifier:(NSString *)identifier { - self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; - if (self != nil) { - NSArray *arrayOfViews = - [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil]; - if ([arrayOfViews count] >= 1) { - UIView *sub = ((UIView *)[arrayOfViews objectAtIndex:0]); - [self setFrame:CGRectMake(0, 0, sub.frame.size.width, sub.frame.size.height)]; - [self addSubview:sub]; - } - } - return self; -} - -@end - diff --git a/Classes/LinphoneUI/UIChatConversationInfoTableViewCell.h b/Classes/LinphoneUI/UIChatConversationInfoTableViewCell.h deleted file mode 100644 index 40dae59d6..000000000 --- a/Classes/LinphoneUI/UIChatConversationInfoTableViewCell.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import "ChatConversationInfoView.h" - -@interface UIChatConversationInfoTableViewCell : UITableViewCell - -@property (weak, nonatomic) IBOutlet UIImageView *avatarImage; -@property (weak, nonatomic) IBOutlet UIIconButton *removeButton; -@property (weak, nonatomic) IBOutlet UIView *adminButton; -@property (weak, nonatomic) IBOutlet UILabel *adminLabel; -@property (weak, nonatomic) IBOutlet UIImageView *adminImage; -@property (weak, nonatomic) IBOutlet UILabel *nameLabel; -@property (weak, nonatomic) ChatConversationInfoView *controllerView; -@property (strong) NSString *uri; - -- (id)initWithIdentifier:(NSString *)identifier; -@end diff --git a/Classes/LinphoneUI/UIChatConversationInfoTableViewCell.m b/Classes/LinphoneUI/UIChatConversationInfoTableViewCell.m deleted file mode 100644 index 9c958e32c..000000000 --- a/Classes/LinphoneUI/UIChatConversationInfoTableViewCell.m +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "PhoneMainView.h" -#import "UIChatConversationInfoTableViewCell.h" - -@implementation UIChatConversationInfoTableViewCell - -- (void)awakeFromNib { - [super awakeFromNib]; - // Initialization code -} - -- (id)initWithIdentifier:(NSString *)identifier { - self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; - if (self != nil) { - NSArray *arrayOfViews = - [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil]; - if ([arrayOfViews count] >= 1) { - UIChatConversationInfoTableViewCell *sub = ((UIChatConversationInfoTableViewCell *)[arrayOfViews objectAtIndex:0]); - self = sub; - } - } - - UITapGestureRecognizer *adminTap = [[UITapGestureRecognizer alloc] - initWithTarget:self - action:@selector(onAdmin)]; - adminTap.delegate = self; - adminTap.numberOfTapsRequired = 1; - [_adminButton addGestureRecognizer:adminTap]; - return self; -} - -- (IBAction)onDelete:(id)sender { - [_controllerView.contacts removeObject:_uri]; - if ([_controllerView.admins containsObject:_uri]) - [_controllerView.admins removeObject:_uri]; - - [_controllerView.tableView reloadData]; - _controllerView.nextButton.enabled = _controllerView.nameLabel.text.length > 0 && _controllerView.contacts.count > 0; -} - -- (void)onAdmin { - _adminLabel.enabled = !_adminLabel.enabled; - NSString *content = _adminLabel.enabled - ? @"check_selected.png" - : @"check_unselected.png"; - - _adminImage.image = [UIImage imageNamed:content]; - - if (_adminLabel.enabled) - [_controllerView.admins addObject:_uri]; - else - [_controllerView.admins removeObject:_uri]; -} - -@end diff --git a/Classes/LinphoneUI/UIChatCreateCell.h b/Classes/LinphoneUI/UIChatCreateCell.h deleted file mode 100644 index f9cb97bf7..000000000 --- a/Classes/LinphoneUI/UIChatCreateCell.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -@interface UIChatCreateCell : UITableViewCell -@property(weak, nonatomic) IBOutlet UILabel *displayNameLabel; -@property(weak, nonatomic) IBOutlet UILabel *addressLabel; -@property (weak, nonatomic) IBOutlet UIImageView *selectedImage; -@property (weak, nonatomic) IBOutlet UIImageView *linphoneImage; -@property (weak, nonatomic) IBOutlet UIImageView *avatarImage; -@property (weak, nonatomic) IBOutlet UIImageView *securityImage; -@property (weak, nonatomic) IBOutlet UIView *greyView; - -- (id)initWithIdentifier:(NSString *)identifier; - -@end diff --git a/Classes/LinphoneUI/UIChatCreateCell.m b/Classes/LinphoneUI/UIChatCreateCell.m deleted file mode 100644 index 757fc63a1..000000000 --- a/Classes/LinphoneUI/UIChatCreateCell.m +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIChatCreateCell.h" - -@implementation UIChatCreateCell - -- (id)initWithIdentifier:(NSString *)identifier { - self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; - if (self != nil) { - NSArray *arrayOfViews = - [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil]; - if ([arrayOfViews count] >= 1) { - // resize cell to match .nib size. It is needed when resized the cell to - // correctly adapt its height too - UIView *sub = ((UIView *)[arrayOfViews objectAtIndex:0]); - [self setFrame:CGRectMake(0, 0, sub.frame.size.width, sub.frame.size.height)]; - [self addSubview:sub]; - } - } - _selectedImage.hidden = TRUE; - _linphoneImage.hidden = TRUE; - return self; -} - -@end diff --git a/Classes/LinphoneUI/UIChatCreateCollectionViewCell.h b/Classes/LinphoneUI/UIChatCreateCollectionViewCell.h deleted file mode 100644 index a3e2c565e..000000000 --- a/Classes/LinphoneUI/UIChatCreateCollectionViewCell.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import "ChatConversationCreateView.h" - -@interface UIChatCreateCollectionViewCell : UICollectionViewCell -@property UILabel *nameLabel; -@property (strong, nonatomic) ChatConversationCreateView *controller; -@property (strong, nonatomic) NSString *uri; -- (void)onDelete; -@end diff --git a/Classes/LinphoneUI/UIChatCreateCollectionViewCell.m b/Classes/LinphoneUI/UIChatCreateCollectionViewCell.m deleted file mode 100644 index 1ae4bf5d9..000000000 --- a/Classes/LinphoneUI/UIChatCreateCollectionViewCell.m +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIChatCreateCollectionViewCell.h" -#import "linphoneapp-Swift.h" - -@implementation UIChatCreateCollectionViewCell - -- (id)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - self.contentView.translatesAutoresizingMaskIntoConstraints = false; - [SnapkitBridge matchParentDimensionsWithView:self.contentView topInset:10]; - - self.nameLabel = [[UILabel alloc] initWithFrame:CGRectZero]; - self.nameLabel.numberOfLines = 1; - [self.contentView addSubview:self.nameLabel]; - [SnapkitBridge matchParentDimensionsWithView:self.nameLabel leftInset:20]; - [SnapkitBridge heightWithView:self heiht:50]; - - UIImageView *image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"conference_delete"]]; - image.contentMode = UIViewContentModeScaleAspectFit; - [self.contentView addSubview:image]; - [SnapkitBridge squareWithView:image size:15]; - [SnapkitBridge alignParentLeftWithView:image]; - [SnapkitBridge centerYWithView:image]; - UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onDelete)]; - tap.numberOfTouchesRequired = 1; - [image addGestureRecognizer:tap]; - image.userInteractionEnabled = true; - return self; -} - -- (void) onDelete { - [_controller.tableController.contactsGroup removeObject:_uri]; - if (_controller.tableController.contactsGroup.count == 0) { - [UIView animateWithDuration:0.2 - delay:0 - options:UIViewAnimationOptionCurveEaseOut - animations:^{ - [_controller.tableController.tableView setFrame:CGRectMake(_controller.tableController.tableView.frame.origin.x, - _controller.tableController.searchBar.frame.origin.y + _controller.tableController.searchBar.frame.size.height, - _controller.tableController.tableView.frame.size.width, - _controller.tableController.tableView.frame.size.height + _controller.collectionView.frame.size.height)]; - } - completion:nil]; - } - [_controller.collectionView reloadData]; - [_controller.tableController.tableView reloadData]; - _controller.nextButton.enabled = (_controller.tableController.contactsGroup.count > 0) || _controller.isForEditing; -} - - -@end diff --git a/Classes/LinphoneUI/UIChatNotifiedEventCell.h b/Classes/LinphoneUI/UIChatNotifiedEventCell.h deleted file mode 100644 index a4e5dd120..000000000 --- a/Classes/LinphoneUI/UIChatNotifiedEventCell.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef UIChatNotifiedEventCell_h -#define UIChatNotifiedEventCell_h - -#import - -#import "ChatConversationTableView.h" - -@interface UIChatNotifiedEventCell : UITableViewCell - -@property(readonly, nonatomic) LinphoneEventLog *event; -@property (weak, nonatomic) IBOutlet UILabel *contactDateLabel; -@property (weak, nonatomic) IBOutlet UIImageView *rightBar; -@property (weak, nonatomic) IBOutlet UIImageView *leftBar; -@property (weak, nonatomic) IBOutlet UITableViewCell *eventView; - -+ (CGFloat)height; - -- (void)setEvent:(LinphoneEventLog *)event; - -@end - -#endif /* UIChatNotifiedEventCell_h */ diff --git a/Classes/LinphoneUI/UIChatNotifiedEventCell.m b/Classes/LinphoneUI/UIChatNotifiedEventCell.m deleted file mode 100644 index caf576a93..000000000 --- a/Classes/LinphoneUI/UIChatNotifiedEventCell.m +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import "UIChatNotifiedEventCell.h" -#import "LinphoneManager.h" -#import "PhoneMainView.h" - -#import -#import - -@implementation UIChatNotifiedEventCell - -#pragma mark - Class methods -static const CGFloat NOTIFIED_CELL_HEIGHT = 44; - -+ (CGFloat)height { - return NOTIFIED_CELL_HEIGHT; -} - -#pragma mark - Lifecycle Functions - -- (id)initWithIdentifier:(NSString *)identifier { - if ((self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]) != nil) { - if ([identifier isEqualToString:NSStringFromClass(self.class)]) { - NSArray *arrayOfViews = - [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil]; - // resize cell to match .nib size. It is needed when resized the cell to - // correctly adapt its height too - UIView *sub = ((UIView *)[arrayOfViews objectAtIndex:arrayOfViews.count - 1]); - [self setFrame:CGRectMake(0, 0, sub.frame.size.width, sub.frame.size.height)]; - [self addSubview:sub]; - } - } - _event = NULL; - return self; -} - -- (void)dealloc { - _event = NULL; -} - -- (void)setEditing:(BOOL)editing { - [self setEditing:editing animated:FALSE]; -} - -- (void)setEditing:(BOOL)editing animated:(BOOL)animated { - _leftBar.hidden = _rightBar.hidden = editing; - if (editing) - [_contactDateLabel setFrame:CGRectMake(1, 1, _contactDateLabel.frame.size.width, NOTIFIED_CELL_HEIGHT)]; -} - -#pragma mark - - -- (void)setEvent:(LinphoneEventLog *)event { - _event = event; - NSString *eventString; - UIColor *eventColor = [UIColor grayColor]; - switch (linphone_event_log_get_type(event)) { - case LinphoneEventLogTypeConferenceSubjectChanged: { - NSString *subject = [NSString stringWithUTF8String:linphone_event_log_get_subject(event) ?: LINPHONE_DUMMY_SUBJECT]; - eventString = [NSString stringWithFormat:NSLocalizedString(@"New subject : %@", nil), subject]; - break; - } - case LinphoneEventLogTypeConferenceParticipantAdded: { - NSString *participant = [FastAddressBook displayNameForAddress:linphone_event_log_get_participant_address(event)]; - eventString = [NSString stringWithFormat:NSLocalizedString(@"%@ has joined", nil), participant]; - break; - } - case LinphoneEventLogTypeConferenceParticipantRemoved: { - NSString *participant = [FastAddressBook displayNameForAddress:linphone_event_log_get_participant_address(event)]; - eventString = [NSString stringWithFormat:NSLocalizedString(@"%@ has left", nil), participant]; - break; - } - case LinphoneEventLogTypeConferenceParticipantSetAdmin: { - NSString *participant = [FastAddressBook displayNameForAddress:linphone_event_log_get_participant_address(event)]; - eventString = [NSString stringWithFormat:NSLocalizedString(@"%@ is now an admin", nil), participant]; - break; - } - case LinphoneEventLogTypeConferenceParticipantUnsetAdmin: { - NSString *participant = [FastAddressBook displayNameForAddress:linphone_event_log_get_participant_address(event)]; - eventString = [NSString stringWithFormat:NSLocalizedString(@"%@ is no longer an admin", nil), participant]; - break; - } - case LinphoneEventLogTypeConferenceTerminated: { - eventString = [NSString stringWithFormat:NSLocalizedString(@"You have left the group", nil)]; - break; - } - case LinphoneEventLogTypeConferenceCreated: { - eventString = [NSString stringWithFormat:NSLocalizedString(@"You have joined the group", nil)]; - break; - } - case LinphoneEventLogTypeConferenceSecurityEvent: { - LinphoneSecurityEventType type = linphone_event_log_get_security_event_type(event); - NSString *participant = [FastAddressBook displayNameForAddress:linphone_event_log_get_security_event_faulty_device_address(event)]; - switch (type) { - case LinphoneSecurityEventTypeSecurityLevelDowngraded: - if (!participant) - eventString = [NSString stringWithFormat:NSLocalizedString(@"Security level decreased", nil)]; - else - eventString = [NSString stringWithFormat:NSLocalizedString(@"Security level decreased because of %@", nil),participant]; - eventColor = [UIColor grayColor]; - break; - case LinphoneSecurityEventTypeParticipantMaxDeviceCountExceeded: - if (!participant) - eventString = [NSString stringWithFormat:NSLocalizedString(@"Max participant count exceeded", nil)]; - else - eventString = [NSString stringWithFormat:NSLocalizedString(@"Max participant count exceeded by %@", nil),participant]; - eventColor = [UIColor redColor]; - break; - case LinphoneSecurityEventTypeEncryptionIdentityKeyChanged: - if (!participant) - eventString = [NSString stringWithFormat:NSLocalizedString(@"LIME identity key changed", nil)]; - else - eventString = [NSString stringWithFormat:NSLocalizedString(@"LIME identity key changed for %@", nil),participant]; - eventColor = [UIColor redColor]; - break; - case LinphoneSecurityEventTypeManInTheMiddleDetected: - if (!participant) - eventString = [NSString stringWithFormat:NSLocalizedString(@"Man-in-the-middle attack detected", nil)]; - else - eventString = [NSString stringWithFormat:NSLocalizedString(@"Man-in-the-middle attack detected for %@", nil),participant]; - eventColor = [UIColor redColor]; - break; - - case LinphoneSecurityEventTypeNone: - default: - break; - } - - break; - } - - case LinphoneEventLogTypeConferenceEphemeralMessageDisabled: { - eventString = [NSString stringWithFormat:NSLocalizedString(@"You disabled ephemeral messages", nil)]; - break; - } - case LinphoneEventLogTypeConferenceEphemeralMessageEnabled: { - eventString = [NSString stringWithFormat:NSLocalizedString(@"You enabled ephemeral messages: %@", nil),[self formatEphemeralExpiration:linphone_event_log_get_ephemeral_message_lifetime(event)]]; - break; - } - case LinphoneEventLogTypeConferenceEphemeralMessageLifetimeChanged: { - eventString = [NSString stringWithFormat:NSLocalizedString(@"Ephemeral messages expiry date: %@",nil),[self formatEphemeralExpiration:linphone_event_log_get_ephemeral_message_lifetime(event)]]; - break; - } - - default: - return; - } - _contactDateLabel.text = eventString; - - CGSize newSize = [_contactDateLabel.text boundingRectWithSize:CGSizeZero - options:(NSStringDrawingUsesLineFragmentOrigin | - NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesFontLeading) - attributes:@{NSFontAttributeName :_contactDateLabel.font} - context:nil].size; - float delta = (_contactDateLabel.frame.size.width - newSize.width) / 2; - - [_contactDateLabel setFrame:CGRectMake((_eventView.frame.size.width - newSize.width) / 2, 1, newSize.width, NOTIFIED_CELL_HEIGHT)]; - [_leftBar setFrame:CGRectMake(0, - _leftBar.frame.origin.y, - _contactDateLabel.frame.origin.x - 5, - 1)]; - [_rightBar setFrame:CGRectMake(_contactDateLabel.frame.origin.x + newSize.width + 5, - _rightBar.frame.origin.y, - _rightBar.frame.size.width + delta, - 1)]; -} - -- (void)layoutSubviews { - [super layoutSubviews]; -} - -- (NSString *) formatEphemeralExpiration:(long)duration { - switch (duration) { - case 0:return NSLocalizedString(@"Disabled",nil);break; - case 60:return NSLocalizedString(@"1 minute",nil);break; - case 3600:return NSLocalizedString(@"1 hour",nil);break; - case 86400:return NSLocalizedString(@"1 day",nil);break; - case 259200:return NSLocalizedString(@"3 days",nil);break; - case 604800L:return NSLocalizedString(@"1 week",nil);break; - } - return NSLocalizedString(@"Unexpected duration",nil); -} - - -@end diff --git a/Classes/LinphoneUI/UIChatNotifiedEventCell.xib b/Classes/LinphoneUI/UIChatNotifiedEventCell.xib deleted file mode 100644 index 85e855ffa..000000000 --- a/Classes/LinphoneUI/UIChatNotifiedEventCell.xib +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/LinphoneUI/UIChatReplyBubbleView.h b/Classes/LinphoneUI/UIChatReplyBubbleView.h deleted file mode 100644 index 81f8b7f8c..000000000 --- a/Classes/LinphoneUI/UIChatReplyBubbleView.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface UIChatReplyBubbleView : UIViewController -@property (weak, nonatomic) IBOutlet UILabel *senderName; -@property (weak, nonatomic) IBOutlet UIButton *dismissButton; -@property (weak, nonatomic) IBOutlet UIView *leftBar; -@property (weak, nonatomic) IBOutlet UIView *rightBar; -@property LinphoneChatMessage *message; -@property (weak, nonatomic) IBOutlet UILabel *textContent; -@property void (^ dismissAction)(void); -@property void (^ clickAction)(void); -@property (weak, nonatomic) IBOutlet UICollectionView *contentCollection; -@property NSArray *dataContent; -@property (weak, nonatomic) IBOutlet UILabel *originalMessageGone; -@property (weak, nonatomic) IBOutlet UIImageView *icsIcon; - --(void) configureForMessage:(LinphoneChatMessage *)message withDimissBlock:(void (^)(void))dismissBlock hideDismiss:(BOOL)hideDismiss withClickBlock:(void (^)(void))clickBlock; -@end - -NS_ASSUME_NONNULL_END diff --git a/Classes/LinphoneUI/UIChatReplyBubbleView.m b/Classes/LinphoneUI/UIChatReplyBubbleView.m deleted file mode 100644 index cf9c05709..000000000 --- a/Classes/LinphoneUI/UIChatReplyBubbleView.m +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIChatReplyBubbleView.h" -#import "linphoneapp-Swift.h" -#import "Utils.h" - -@interface UIChatReplyBubbleView () - -@end - -@implementation UIChatReplyBubbleView - - -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; -} - -- (instancetype)initWithCoder:(NSCoder *)coder -{ - self = [super initWithCoder:coder]; - return self; -} - --(void) viewDidLoad { - _contentCollection.dataSource = self; - [_icsIcon setImageNamed:@"voip_meeting_schedule" tintColor:VoipTheme.voip_dark_gray]; - [_contentCollection registerClass:UICollectionViewCell.class forCellWithReuseIdentifier:@"dataContent"]; -} - - --(void) configureForMessage:(LinphoneChatMessage *)message withDimissBlock:(void (^)(void))dismissBlock hideDismiss:(BOOL)hideDismiss withClickBlock:(void (^)(void))clickBlock{ - if (!message) { - _textContent.hidden = true; - _dismissButton.hidden = true; - _contentCollection.hidden = true; - _senderName.hidden = true; - _originalMessageGone.hidden = false; - _icsIcon.hidden = true; - return; - } - if (hideDismiss) { - self.view.layer.cornerRadius = 10; - self.view.layer.masksToBounds = true; - } - _originalMessageGone.hidden = true; - self.message = message; - self.dataContent = [self loadDataContent]; - BOOL isIcal = [ICSBubbleView isConferenceInvitationMessageWithCmessage:message]; - _icsIcon.hidden = !isIcal; - - NSString *sender = [FastAddressBook displayNameForAddress:linphone_chat_message_get_from_address(message)]; - _senderName.text = sender; - const char * text = isIcal ? [ICSBubbleView getSubjectFromContentWithCmessage:message].UTF8String : linphone_chat_message_get_utf8_text(message); - if (text && strlen(text) == 0) - text = nil; - _textContent.text = text ? [NSString stringWithUTF8String:text] : @""; - _dismissButton.hidden = hideDismiss; - _dismissAction = dismissBlock; - _clickAction = clickBlock; - if (hideDismiss) { - UITapGestureRecognizer *singleFingerTap = - [[UITapGestureRecognizer alloc] initWithTarget:self - action:@selector(onClick)]; - [self.view addGestureRecognizer:singleFingerTap]; - } - else - [_dismissButton addTarget:self action:@selector(dismissClick) forControlEvents:UIControlEventTouchUpInside]; - - - self.view.backgroundColor = hideDismiss ? UIColor.whiteColor :(linphone_chat_message_is_outgoing(message) ? [[UIColor color:@"A"] colorWithAlphaComponent:0.2] : [[UIColor color:@"D"] colorWithAlphaComponent:0.2]); - _leftBar.backgroundColor = linphone_chat_message_is_outgoing(message) ? [UIColor color:@"A"] : [UIColor color:@"D"]; - _leftBar.hidden = !hideDismiss; - _rightBar.backgroundColor = self.view.backgroundColor; - - - // Resize frame -> text or content only = 100, 145 otherwise - _contentCollection.hidden = self.dataContent.count == 0; - - CGRect r = self.view.frame ; - r.size.width = self.view.superview.frame.size.width; - self.view.frame = r; - - if (self.dataContent.count == 0) { - CGRect r = _textContent.frame; - r.origin.y = _contentCollection.frame.origin.y; - r.size.height = 87; - _textContent.frame = r; - } - - if (text == nil) { - CGRect r = _contentCollection.frame; - r.origin.y = 30; - _contentCollection.frame = r; - } -} - - --(NSArray *) loadDataContent { - NSMutableArray *result = [[NSMutableArray alloc] init]; - const bctbx_list_t *contents = linphone_chat_message_get_contents(_message); - const char * text = linphone_chat_message_get_utf8_text(_message); - if (text && bctbx_list_size(contents) == 1) - return result; - - for (const bctbx_list_t * it = contents; it != NULL; it=bctbx_list_next(it)){ - LinphoneContent *content = (LinphoneContent *)it->data; - if (linphone_content_is_text(content)) - continue; - NSString *name = [NSString stringWithUTF8String:linphone_content_get_name(content)]; - NSMutableDictionary *encrptedFilePaths = encrptedFilePaths = [LinphoneManager getMessageAppDataForKey:@"encryptedfiles" inMessage:_message]; - NSString *filePath = encrptedFilePaths ? [encrptedFilePaths valueForKey:name] : nil; - if (filePath == NULL) { - filePath = [LinphoneManager validFilePath:name]; - } - [result addObject:[UIChatBubbleTextCell getImageFromContent:content filePath:filePath forReplyBubble:true]]; - } - return result; -} - --(void) dismissClick { - _dismissAction(); -} - --(void) onClick { - _clickAction(); -} - --(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { - return 1; -} - -- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { - return self.dataContent.count; -} - -- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { - UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"dataContent" forIndexPath:indexPath]; - UIImageView *img = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 60, 60)]; - img.image = [self.dataContent objectAtIndex:indexPath.row]; - [cell.contentView addSubview:img]; - return cell; -} - - - - -@end diff --git a/Classes/LinphoneUI/UICheckBoxTableView.h b/Classes/LinphoneUI/UICheckBoxTableView.h deleted file mode 100644 index 06822ecf1..000000000 --- a/Classes/LinphoneUI/UICheckBoxTableView.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#pragma once - -#import - -@interface UICheckBoxTableView : UITableViewController - -@property(nonatomic, readonly) NSMutableArray *selectedItems; -@property(weak, nonatomic) IBOutlet UIButton *deleteButton; -@property(weak, nonatomic) IBOutlet UIButton *editButton; -@property(weak, nonatomic) IBOutlet UIButton *cancelButton; -@property(weak, nonatomic) IBOutlet UIButton *toggleSelectionButton; -@property(weak, nonatomic) IBOutlet UIView *emptyView; - -- (void)loadData; -- (void)accessoryForCell:(UITableViewCell *)cell atPath:(NSIndexPath *)indexPath; -- (void)removeSelectionUsing:(void (^)(NSIndexPath *indexPath))remover; - -- (BOOL)selectFirstRow; - -- (IBAction)onSelectionToggle:(id)sender; -- (IBAction)onEditClick:(id)sender; -- (IBAction)onCancelClick:(id)sender; - -- (NSInteger)totalNumberOfItems; - -@end diff --git a/Classes/LinphoneUI/UICheckBoxTableView.m b/Classes/LinphoneUI/UICheckBoxTableView.m deleted file mode 100644 index a01ed8746..000000000 --- a/Classes/LinphoneUI/UICheckBoxTableView.m +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UICheckBoxTableView.h" -#import "Utils.h" - -@implementation UICheckBoxTableView - -- (instancetype)initWithCoder:(NSCoder *)aDecoder { - self = [super initWithCoder:aDecoder]; - _selectedItems = [[NSMutableArray alloc] init]; - return self; -} - -- (instancetype)init { - self = [super init]; - _selectedItems = [[NSMutableArray alloc] init]; - return self; -} - -#pragma mark - UITableViewDelegate Functions - -- (BOOL)selectFirstRow { - // reset details view in fragment mode - if ([self totalNumberOfItems] > 0) { - NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; - [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; - [self tableView:self.tableView didSelectRowAtIndexPath:indexPath]; - _emptyView.hidden = YES; - } else { - _emptyView.hidden = NO; - } - return _emptyView.hidden; -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - _emptyView.hidden = _editButton.enabled = ([self totalNumberOfItems] > 0); -} - -- (void)toggleRowSelectionForRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; - if ([_selectedItems containsObject:indexPath]) { - [_selectedItems removeObject:indexPath]; - } else { - [_selectedItems addObject:indexPath]; - } - [self accessoryForCell:cell atPath:indexPath]; - [self selectToggleButton:(_selectedItems.count != [self totalNumberOfItems])]; -} - -- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath { - [self toggleRowSelectionForRowAtIndexPath:indexPath]; -} - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - [self toggleRowSelectionForRowAtIndexPath:indexPath]; -} - -/* Empty methods allow to not freeze UI...*/ -- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(nonnull NSIndexPath *)indexPath { -} - -- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath { -} - -- (void)selectToggleButton:(BOOL)select { - _toggleSelectionButton.selected = select; - if (select) { - _toggleSelectionButton.accessibilityLabel = NSLocalizedString(@"Select all", nil); - } else { - _toggleSelectionButton.accessibilityLabel = NSLocalizedString(@"Deselect all", nil); - } -} -#pragma mark - - -- (void)accessoryForCell:(UITableViewCell *)cell atPath:(NSIndexPath *)indexPath { - if ([self isEditing]) { - cell.selectionStyle = UITableViewCellSelectionStyleGray; - UIButton *checkBoxButton = [UIButton buttonWithType:UIButtonTypeCustom]; - UIImage *image = nil; - if ([_selectedItems containsObject:indexPath]) { - image = [UIImage imageNamed:@"checkbox_checked.png"]; - checkBoxButton.accessibilityValue = NSLocalizedString(@"Selected", nil); - } else { - image = [UIImage imageNamed:@"checkbox_unchecked.png"]; - checkBoxButton.accessibilityValue = NSLocalizedString(@"Deselected", nil); - } - [checkBoxButton setImage:image forState:UIControlStateNormal]; - [checkBoxButton setFrame:CGRectMake(0, 0, 19, 19)]; - [checkBoxButton setBackgroundColor:[UIColor clearColor]]; - checkBoxButton.accessibilityLabel = NSLocalizedString(@"Checkbox", nil); - checkBoxButton.userInteractionEnabled = NO; - cell.accessoryView = checkBoxButton; - } else { - cell.accessoryView = nil; - cell.accessoryType = UITableViewCellAccessoryNone; - } - _deleteButton.enabled = (_selectedItems.count != 0); - _editButton.enabled = YES; -} - -- (void)setEditing:(BOOL)editing animated:(BOOL)animated { - [super setEditing:editing animated:animated]; - - _editButton.hidden = editing; - _deleteButton.hidden = _cancelButton.hidden = _toggleSelectionButton.hidden = !editing; - [self selectToggleButton:YES]; - - // when switching editing mode, we must reload all cells to remove/add checkboxes - [self loadData]; -} - -- (void)loadData { - [_selectedItems removeAllObjects]; - [self.tableView reloadData]; - - _emptyView.hidden = _editButton.enabled = ([self totalNumberOfItems] > 0); -} - -- (void)removeSelectionUsing:(void (^)(NSIndexPath *indexPath))remover { - // we must iterate through selected items in reverse order - [_selectedItems sortUsingComparator:^(NSIndexPath *obj1, NSIndexPath *obj2) { - return [obj2 compare:obj1]; - }]; - NSArray *copy = [[NSArray alloc] initWithArray:_selectedItems]; - for (NSIndexPath *indexPath in copy) { - if (remover) { - remover(indexPath); - } else { - [self tableView:self.tableView - commitEditingStyle:UITableViewCellEditingStyleDelete - forRowAtIndexPath:indexPath]; - } - } - [_selectedItems removeAllObjects]; - [self setEditing:NO animated:YES]; -} - -- (void)onSelectionToggle:(id)sender { - [_selectedItems removeAllObjects]; - - [self selectToggleButton:!_toggleSelectionButton.selected]; // TODO: why do we need that? - LOGI(@"onSelectionToggle: select %@", _toggleSelectionButton.selected ? @"NONE" : @"ALL"); - for (int i = 0; i < [self numberOfSectionsInTableView:self.tableView]; i++) { - for (int j = 0; j < [self tableView:self.tableView numberOfRowsInSection:i]; j++) { - NSIndexPath *indexPath = [NSIndexPath indexPathForRow:j inSection:i]; - UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; - if (!_toggleSelectionButton.selected) { - [_selectedItems addObject:indexPath]; - [self.tableView selectRowAtIndexPath:indexPath - animated:NO - scrollPosition:UITableViewScrollPositionNone]; - } else { - [self.tableView deselectRowAtIndexPath:indexPath animated:NO]; - } - - [self accessoryForCell:cell atPath:indexPath]; - } - } -} - -- (IBAction)onEditClick:(id)sender { - [self setEditing:YES animated:YES]; -} - -- (IBAction)onCancelClick:(id)sender { - [self setEditing:NO animated:YES]; -} - -- (NSInteger)totalNumberOfItems { - NSInteger total = 0; - for (int i = 0; i < [self numberOfSectionsInTableView:self.tableView]; i++) { - total += [self tableView:self.tableView numberOfRowsInSection:i]; - } - return total; -} -@end diff --git a/Classes/LinphoneUI/UICompositeView.h b/Classes/LinphoneUI/UICompositeView.h deleted file mode 100644 index 9a686347b..000000000 --- a/Classes/LinphoneUI/UICompositeView.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import - -#import "LinphoneManager.h" -#import "TPMultiLayoutViewController.h" -#import "SideMenuTableView.h" - -@interface UICompositeViewDescription : NSObject { -} - -@property(strong) NSString *name; -@property(strong) NSString *statusBar; -@property(strong) NSString *tabBar; -@property(strong) NSString *sideMenu; -@property(strong) NSString *otherFragment; -@property(assign) BOOL statusBarEnabled; -@property(assign) BOOL tabBarEnabled; -@property(assign) BOOL sideMenuEnabled; -@property(assign) BOOL fullscreen; -@property(assign) BOOL isLeftFragment; -@property(assign) BOOL darkBackground; -@property(assign) BOOL landscapeMode; -@property(assign) BOOL portraitMode; - -- (id)copy; -- (BOOL)equal:(UICompositeViewDescription *)description; -- (id)init:(Class)name - statusBar:(Class)statusBar - tabBar:(Class)tabBar - sideMenu:(Class)sideMenu - fullscreen:(BOOL)fullscreen - isLeftFragment:(BOOL)isLeftFragment - fragmentWith:(Class)otherFragment; - -@end - -@protocol UICompositeViewDelegate - -+ (UICompositeViewDescription *)compositeViewDescription; -- (UICompositeViewDescription *)compositeViewDescription; - -@end - -@interface UICompositeView : TPMultiLayoutViewController { - @private - NSMutableDictionary *viewControllerCache; - UICompositeViewDescription *currentViewDescription; - UIInterfaceOrientation currentOrientation; -} - -@property(strong) CATransition *viewTransition; -@property(nonatomic, strong) IBOutlet UIView *statusBarView; -@property(nonatomic, strong) IBOutlet UIView *mainView; -@property(nonatomic, strong) IBOutlet UIView *detailsView; -@property(nonatomic, strong) IBOutlet UIView *tabBarView; -@property(strong, nonatomic) IBOutlet UIView *sideMenuView; - -- (void)changeView:(UICompositeViewDescription *)description; -- (void)setFullscreen:(BOOL)enabled; -- (void)hideStatusBar:(BOOL)hidden; -- (void)hideTabBar:(BOOL)hidden; -- (void)hideSideMenu:(BOOL)hidden; -- (BOOL)currentViewSupportsLandscape; -- (UIViewController *)getCachedController:(NSString *)name; -- (UIViewController *)getCurrentViewController; -- (UIInterfaceOrientation)currentOrientation; -- (void)clearCache:(NSArray *)exclude; -- (void)removeEntryFromCache:(NSString *)key; -- (IBAction)onRightSwipe:(id)sender; - - -@end diff --git a/Classes/LinphoneUI/UICompositeView.m b/Classes/LinphoneUI/UICompositeView.m deleted file mode 100644 index 197b9be2e..000000000 --- a/Classes/LinphoneUI/UICompositeView.m +++ /dev/null @@ -1,732 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UICompositeView.h" - -#import "LinphoneAppDelegate.h" -#import "Utils.h" -#import "SideMenuView.h" -#import "linphoneapp-Swift.h" - -@implementation UICompositeViewDescription - -- (id)copy { - UICompositeViewDescription *copy = [UICompositeViewDescription alloc]; - copy.name = self.name; - copy.statusBar = self.statusBar; - copy.tabBar = self.tabBar; - copy.sideMenu = self.sideMenu; - copy.statusBarEnabled = self.statusBarEnabled; - copy.tabBarEnabled = self.tabBarEnabled; - copy.sideMenuEnabled = self.sideMenuEnabled; - copy.fullscreen = self.fullscreen; - copy.landscapeMode = self.landscapeMode; - copy.portraitMode = self.portraitMode; - copy.isLeftFragment = self.isLeftFragment; - copy.otherFragment = self.otherFragment; - copy.darkBackground = self.darkBackground; - return copy; -} - -- (BOOL)equal:(UICompositeViewDescription *)description { - return [self.name compare:description.name] == NSOrderedSame; -} - -- (id)init:(Class)content - statusBar:(Class)statusBar - tabBar:(Class)tabBar - sideMenu:(Class)sideMenu - fullscreen:(BOOL)fullscreen - isLeftFragment:(BOOL)isLeftFragment - fragmentWith:(Class)otherFragment { - self.name = NSStringFromClass(content); - self.statusBar = NSStringFromClass(statusBar); - self.tabBar = NSStringFromClass(tabBar); - self.sideMenu = NSStringFromClass(sideMenu); - self.statusBarEnabled = YES; - self.tabBarEnabled = YES; - self.sideMenuEnabled = NO; - self.fullscreen = fullscreen; - self.landscapeMode = YES; - self.portraitMode = YES; - self.otherFragment = IPAD ? NSStringFromClass(otherFragment) : nil; - self.isLeftFragment = isLeftFragment || (self.otherFragment == nil); - self.darkBackground = true; - - return self; -} - -@end -@interface UICompositeView () - -@property(nonatomic, strong) UIViewController *statusBarViewController; -@property(nonatomic, strong) UIViewController *tabBarViewController; -@property(nonatomic, strong) UIViewController *mainViewController; -@property(nonatomic, strong) UIViewController *detailsViewController; -@property(nonatomic, strong) UIViewController *sideMenuViewController; - -@end - -@implementation UICompositeView - -#pragma mark - Lifecycle Functions - -- (void)initUICompositeView { - viewControllerCache = [[NSMutableDictionary alloc] init]; - currentOrientation = (UIInterfaceOrientation)UIDeviceOrientationUnknown; -} - -- (id)init { - self = [super init]; - if (self) { - [self initUICompositeView]; - } - return self; -} - -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - [self initUICompositeView]; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)decoder { - self = [super initWithCoder:decoder]; - if (self) { - [self initUICompositeView]; - } - return self; -} - -- (void)dealloc { - [NSNotificationCenter.defaultCenter removeObserver:self]; -} - -#pragma mark - ViewController Functions - -- (void)updateViewsFramesAccordingToLaunchOrientation { - CGRect frame = - [self.view frame]; // this view has the correct size at launch (1024/768 for iPad, 320*{568,480} for iPhone) - UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; - BOOL portrait = UIInterfaceOrientationIsPortrait(orientation); - CGRect oppositeFrame = frame; - oppositeFrame.size.height = frame.size.width; - oppositeFrame.size.width = frame.size.height; - - // if we start in portrait, the landscape view must get the opposite height and width - if (portrait || [[UIDevice currentDevice].systemVersion floatValue] < 8) { - LOGI(@"landscape get opposite: %@", NSStringFromCGSize(oppositeFrame.size)); - [landscapeView setFrame:oppositeFrame]; - } else { - // if we start in landscape, the landscape view has to get the current size, - // whereas the portrait has to get the opposite - LOGI(@"landscape get frame: %@ and portrait gets opposite: %@", NSStringFromCGSize(frame.size), - NSStringFromCGSize(oppositeFrame.size)); - [landscapeView setFrame:frame]; - [portraitView setFrame:oppositeFrame]; - } -} - -- (void)viewDidLoad { - /* Force landscape view to match portrait view, because portrait view inherits - the device screen size at load */ - [self updateViewsFramesAccordingToLaunchOrientation]; - [super viewDidLoad]; - NSArray * arr =[[NSBundle mainBundle] loadNibNamed:@"LaunchScreen" owner:nil options:nil]; - LaunchScreen * customView = [arr firstObject]; - customView.frame = self.view.frame; - customView.tag = 999; - [self.view addSubview:customView]; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; - [self.mainViewController viewWillAppear:animated]; - [self.detailsViewController viewWillAppear:animated]; - [self.tabBarViewController viewWillAppear:animated]; - [self.statusBarViewController viewWillAppear:animated]; - [self.sideMenuViewController viewWillAppear:animated]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(orientationDidChange:) - name:UIDeviceOrientationDidChangeNotification - object:nil]; -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - [self.mainViewController viewDidAppear:animated]; - [self.detailsViewController viewDidAppear:animated]; - [self.tabBarViewController viewDidAppear:animated]; - [self.statusBarViewController viewDidAppear:animated]; - [self.sideMenuViewController viewDidAppear:animated]; -} - -- (void)viewWillDisappear:(BOOL)animated { - [self.mainViewController viewWillDisappear:animated]; - [self.detailsViewController viewWillDisappear:animated]; - [self.tabBarViewController viewWillDisappear:animated]; - [self.statusBarViewController viewWillDisappear:animated]; - [self.sideMenuViewController viewWillDisappear:animated]; - [NSNotificationCenter.defaultCenter removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil]; - [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; - [super viewWillDisappear:animated]; -} - -- (void)viewDidDisappear:(BOOL)animated { - [self.mainViewController viewDidDisappear:animated]; - [self.detailsViewController viewDidDisappear:animated]; - [self.tabBarViewController viewDidDisappear:animated]; - [self.statusBarViewController viewDidDisappear:animated]; - [self.sideMenuViewController viewDidDisappear:animated]; - [super viewDidDisappear:animated]; -} - -#pragma mark - Rotation messages - -- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation - duration:(NSTimeInterval)duration { - currentOrientation = toInterfaceOrientation; - [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; - [self.mainViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; - [self.detailsViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; - [self.tabBarViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; - [self.statusBarViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; - [self.sideMenuViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; -} - -- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation - duration:(NSTimeInterval)duration { - [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation - duration:duration]; // Will invoke TPMultiLayout - [self.mainViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; - [self.detailsViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; - [self.tabBarViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; - [self.statusBarViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; - [self.sideMenuViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; - [self update:nil tabBar:nil statusBar:nil sideMenu:nil fullscreen:nil]; -} - -- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { - [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; - [self.mainViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation]; - [self.detailsViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation]; - [self.tabBarViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation]; - [self.statusBarViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation]; - [self.sideMenuViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation]; -} - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - if (interfaceOrientation == currentOrientation) - return YES; - return NO; -} - -#pragma mark - Event Functions - -- (void)orientationDidChange:(NSNotification *)notif { - @try { - // Update rotation - UIInterfaceOrientation correctOrientation = - [self getCorrectInterfaceOrientation:[[UIDevice currentDevice] orientation]]; - if (currentOrientation != correctOrientation) { - [UICompositeView setOrientation:correctOrientation - animated:currentOrientation != UIDeviceOrientationUnknown]; - } - } @catch (NSException *exception) { - // There are some crashes reports from iTunes connect because Linphone core is - // not ready yet - whatever the reason is, we can safely ignore the exception - LOGE(@"Exception: %@, ignoring", exception); - } -} - -#pragma mark - - -/* - Will simulate a device rotation - */ -+ (void)setOrientation:(UIInterfaceOrientation)orientation animated:(BOOL)animated { - UIView *firstResponder = nil; - - UIViewController *controller = nil; - - controller = [[UIApplication sharedApplication] keyWindow].rootViewController; - CGRect frame = [[UIScreen mainScreen] bounds]; - UIInterfaceOrientation oldOrientation = controller.interfaceOrientation; - - NSTimeInterval animationDuration = animated ? 0.3f : 0.0; - - [controller willRotateToInterfaceOrientation:orientation duration:animationDuration]; - [controller willAnimateRotationToInterfaceOrientation:orientation duration:animationDuration]; - [controller didRotateFromInterfaceOrientation:oldOrientation]; - [UIView animateWithDuration:animationDuration - animations:^{ - [controller.view setFrame:frame]; - }]; - - if (firstResponder == nil) { - firstResponder = [UICompositeView findFirstResponder:controller.view]; - } - - [[UIApplication sharedApplication] setStatusBarOrientation:orientation animated:animated]; - if (firstResponder) { - [firstResponder resignFirstResponder]; - [firstResponder becomeFirstResponder]; - } -} - -+ (UIView *)findFirstResponder:(UIView *)view { - if (view.isFirstResponder) { - return view; - } - for (UIView *subView in view.subviews) { - UIView *ret = [UICompositeView findFirstResponder:subView]; - if (ret != nil) - return ret; - } - return nil; -} - -- (void)removeEntryFromCache:(NSString *)key { - [viewControllerCache removeObjectForKey:key]; -} - -- (void)clearCache:(NSArray *)exclude { - - - for (NSString *key in [viewControllerCache allKeys]) { - bool remove = true; - - /*ImagePickerView can be used as popover and we do NOT want to free it*/; - if ([key isEqualToString:ImagePickerView.compositeViewDescription.name] || [key isEqualToString:SingleCallView.compositeViewDescription.name] || [key isEqualToString:ConferenceCallView.compositeViewDescription.name]) { - remove = false; - } else if (exclude != nil) { - for (UICompositeViewDescription *description in exclude) { - if ([key isEqualToString:description.name] || [key isEqualToString:description.statusBar] || - [key isEqualToString:description.tabBar] || [key isEqualToString:description.sideMenu]) { - remove = false; - break; - } - } - } - if (remove) { - LOGI(@"Free cached view: %@", key); - [viewControllerCache removeObjectForKey:key]; - } - } -} - -- (UIInterfaceOrientation)currentOrientation { - return currentOrientation; -} - -- (IBAction)onRightSwipe:(id)sender { - if (linphone_core_get_calls_nb(LC) > 0) { - return; - } - [self hideSideMenu:NO]; -} - -+ (void)addSubView:(UIViewController *)controller view:(UIView *)view { - if (controller != nil) { - [view addSubview:controller.view]; - } -} - -+ (void)removeSubView:(UIViewController *)controller { - if (controller != nil) { - [controller.view removeFromSuperview]; - } -} - -- (UIViewController *)getCachedController:(NSString *)name { - UIViewController *controller = nil; - if (name != nil) { - controller = [viewControllerCache objectForKey:name]; - if (controller == nil) { - controller = [[NSClassFromString(name) alloc] init]; - [viewControllerCache setValue:controller forKey:name]; - [controller view]; // Load the view - } - } - return controller; -} - -- (UIInterfaceOrientation)getCorrectInterfaceOrientation:(UIDeviceOrientation)deviceOrientation { - if (currentViewDescription != nil) { - // If unknown return status bar orientation - if (deviceOrientation == UIDeviceOrientationUnknown && currentOrientation == UIDeviceOrientationUnknown) { - return [UIApplication sharedApplication].statusBarOrientation; - } - - // Don't rotate in UIDeviceOrientationFaceUp UIDeviceOrientationFaceDown - if (!UIDeviceOrientationIsPortrait(deviceOrientation) && !UIDeviceOrientationIsLandscape(deviceOrientation)) { - if (currentOrientation == UIDeviceOrientationUnknown) { - return [UIApplication sharedApplication].statusBarOrientation; - } - deviceOrientation = (UIDeviceOrientation)currentOrientation; - } - if (UIDeviceOrientationIsPortrait(deviceOrientation)) { - if ([currentViewDescription portraitMode]) { - return (UIInterfaceOrientation)deviceOrientation; - } else { - return UIInterfaceOrientationLandscapeLeft; - } - } - if (UIDeviceOrientationIsLandscape(deviceOrientation)) { - if ([currentViewDescription landscapeMode]) { - return (UIInterfaceOrientation)deviceOrientation; - } else { - return UIInterfaceOrientationPortrait; - } - } - } - return UIInterfaceOrientationPortrait; -} - -- (void)update:(UICompositeViewDescription *)description - tabBar:(NSNumber *)tabBar - statusBar:(NSNumber *)statusBar - sideMenu:(NSNumber *)sideMenu - fullscreen:(NSNumber *)fullscreen { - - currentOrientation = [self getCorrectInterfaceOrientation:[[UIDevice currentDevice] orientation]]; - - UIViewController *oldMainViewController = self.mainViewController; - UIViewController *oldDetailsViewController = self.detailsViewController; - UIViewController *oldStatusBarViewController = self.statusBarViewController; - UIViewController *oldTabBarViewController = self.tabBarViewController; - UIViewController *oldSideMenuViewController = self.sideMenuViewController; - // Copy view description - UICompositeViewDescription *oldViewDescription = nil; - - if (description != nil) { - oldViewDescription = currentViewDescription; - currentViewDescription = [description copy]; - - UIViewController *newMainViewController = description.isLeftFragment - ? [self getCachedController:description.name] - : [self getCachedController:description.otherFragment]; - UIViewController *newDetailsViewController = !description.isLeftFragment - ? [self getCachedController:description.name] - : [self getCachedController:description.otherFragment]; - UIViewController *newStatusBarViewController = [self getCachedController:description.statusBar]; - UIViewController *newTabBarViewController = [self getCachedController:description.tabBar]; - UIViewController *newSideMenuViewController = [self getCachedController:description.sideMenu]; - - // Animate only with a previous screen - if (oldViewDescription != nil && self.viewTransition != nil) { - if (oldMainViewController != newMainViewController) { - [self.mainView.layer removeAnimationForKey:@"transition"]; - [self.mainView.layer addAnimation:self.viewTransition forKey:@"transition"]; - } else { - [self.mainView.layer removeAnimationForKey:@"transition"]; - } - if (oldDetailsViewController != newDetailsViewController) { - [self.detailsView.layer removeAnimationForKey:@"transition"]; - [self.detailsView.layer addAnimation:self.viewTransition forKey:@"transition"]; - } else { - [self.detailsView.layer removeAnimationForKey:@"transition"]; - } - - if (oldStatusBarViewController != newStatusBarViewController || - oldViewDescription.statusBarEnabled != currentViewDescription.statusBarEnabled) { - [self.statusBarView.layer removeAnimationForKey:@"transition"]; - [self.statusBarView.layer addAnimation:self.viewTransition forKey:@"transition"]; - } else { - [self.statusBarView.layer removeAnimationForKey:@"transition"]; - } - if (oldTabBarViewController != newTabBarViewController || - oldViewDescription.tabBarEnabled != currentViewDescription.tabBarEnabled) { - [self.tabBarView.layer removeAnimationForKey:@"transition"]; - [self.tabBarView.layer addAnimation:self.viewTransition forKey:@"transition"]; - } else { - [self.tabBarView.layer removeAnimationForKey:@"transition"]; - } - if (oldSideMenuViewController != newSideMenuViewController || - oldViewDescription.sideMenuEnabled != currentViewDescription.sideMenuEnabled) { - [self.sideMenuView.layer removeAnimationForKey:@"transition"]; - [self.sideMenuView.layer addAnimation:self.viewTransition forKey:@"transition"]; - } - } - - if (oldMainViewController != nil && oldMainViewController != newMainViewController) { - [UICompositeView removeSubView:oldMainViewController]; - } - if (oldDetailsViewController != nil && oldDetailsViewController != newDetailsViewController) { - [UICompositeView removeSubView:oldDetailsViewController]; - } - if (oldTabBarViewController != nil && oldTabBarViewController != newTabBarViewController) { - [UICompositeView removeSubView:oldTabBarViewController]; - } - if (oldStatusBarViewController != nil && oldStatusBarViewController != newStatusBarViewController) { - [UICompositeView removeSubView:oldStatusBarViewController]; - } - if (oldSideMenuViewController != nil && oldSideMenuViewController != newSideMenuViewController) { - [UICompositeView removeSubView:oldSideMenuViewController]; - } - - self.statusBarViewController = newStatusBarViewController; - self.mainViewController = newMainViewController; - self.detailsViewController = newDetailsViewController; - self.tabBarViewController = newTabBarViewController; - self.sideMenuViewController = newSideMenuViewController; - - // Update rotation - UIInterfaceOrientation correctOrientation = [self - getCorrectInterfaceOrientation:(UIDeviceOrientation)[UIApplication sharedApplication].statusBarOrientation]; - if (currentOrientation != correctOrientation) { - [UICompositeView setOrientation:correctOrientation - animated:currentOrientation != UIDeviceOrientationUnknown]; - if (UIInterfaceOrientationIsLandscape(correctOrientation)) { - [self.mainViewController willAnimateRotationToInterfaceOrientation:correctOrientation duration:0]; - [self.detailsViewController willAnimateRotationToInterfaceOrientation:correctOrientation duration:0]; - [self.tabBarViewController willAnimateRotationToInterfaceOrientation:correctOrientation duration:0]; - [self.statusBarViewController willAnimateRotationToInterfaceOrientation:correctOrientation duration:0]; - [self.sideMenuViewController willAnimateRotationToInterfaceOrientation:correctOrientation duration:0]; - } - } else { - if (oldMainViewController != newMainViewController) { - UIInterfaceOrientation oldOrientation = self.mainViewController.interfaceOrientation; - [self.mainViewController willRotateToInterfaceOrientation:correctOrientation duration:0]; - [self.mainViewController willAnimateRotationToInterfaceOrientation:correctOrientation duration:0]; - [self.mainViewController didRotateFromInterfaceOrientation:oldOrientation]; - } - if (oldDetailsViewController != newDetailsViewController) { - UIInterfaceOrientation oldOrientation = self.detailsViewController.interfaceOrientation; - [self.detailsViewController willRotateToInterfaceOrientation:correctOrientation duration:0]; - [self.detailsViewController willAnimateRotationToInterfaceOrientation:correctOrientation duration:0]; - [self.detailsViewController didRotateFromInterfaceOrientation:oldOrientation]; - } - if (oldTabBarViewController != newTabBarViewController) { - UIInterfaceOrientation oldOrientation = self.tabBarViewController.interfaceOrientation; - [self.tabBarViewController willRotateToInterfaceOrientation:correctOrientation duration:0]; - [self.tabBarViewController willAnimateRotationToInterfaceOrientation:correctOrientation duration:0]; - [self.tabBarViewController didRotateFromInterfaceOrientation:oldOrientation]; - } - if (oldSideMenuViewController != newSideMenuViewController) { - UIInterfaceOrientation oldOrientation = self.sideMenuViewController.interfaceOrientation; - [self.sideMenuViewController willRotateToInterfaceOrientation:correctOrientation duration:0]; - [self.sideMenuViewController willAnimateRotationToInterfaceOrientation:correctOrientation duration:0]; - [self.sideMenuViewController didRotateFromInterfaceOrientation:oldOrientation]; - } - } - } - - if (currentViewDescription == nil) { - return; - } - - if (tabBar != nil) { - if (currentViewDescription.tabBarEnabled != [tabBar boolValue]) { - currentViewDescription.tabBarEnabled = [tabBar boolValue]; - } else { - tabBar = nil; // No change = No Update - } - } - - if (statusBar != nil) { - if (currentViewDescription.statusBarEnabled != [statusBar boolValue]) { - currentViewDescription.statusBarEnabled = [statusBar boolValue]; - } else { - statusBar = nil; // No change = No Update - } - } - - if (sideMenu != nil) { - if (currentViewDescription.sideMenuEnabled != [sideMenu boolValue]) { - currentViewDescription.sideMenuEnabled = [sideMenu boolValue]; - if (currentViewDescription.sideMenuEnabled) { - [_sideMenuViewController viewWillAppear:YES]; - } else { - [_sideMenuViewController viewWillDisappear:YES]; - } - } else { - sideMenu = nil; // No change = No Update - } - } - - if (fullscreen != nil) { - if (currentViewDescription.fullscreen != [fullscreen boolValue]) { - currentViewDescription.fullscreen = [fullscreen boolValue]; - [[UIApplication sharedApplication] setStatusBarHidden:currentViewDescription.fullscreen - withAnimation:UIStatusBarAnimationSlide]; - } else { - fullscreen = nil; // No change = No Update - } - } else { - [[UIApplication sharedApplication] setStatusBarHidden:currentViewDescription.fullscreen - withAnimation:UIStatusBarAnimationNone]; - } - - // Start animation - if (tabBar != nil || statusBar != nil || sideMenu != nil || fullscreen != nil) { - [UIView beginAnimations:@"resize" context:nil]; - [UIView setAnimationDuration:0.35]; - } - - // Compute frame for each elements - CGRect viewFrame = self.view.frame; - int origin = currentViewDescription.fullscreen ? 0 : [PhoneMainView iphoneStatusBarHeight]; - - - // 1. status bar - fixed size on top - CGRect statusBarFrame = self.statusBarView.frame; - if (self.statusBarViewController != nil && currentViewDescription.statusBarEnabled) { - statusBarFrame.origin.y = origin; - // move origin below status bar - origin += statusBarFrame.size.height; - } else { - statusBarFrame.origin.y = -statusBarFrame.size.height; - } - - // 2. side menu - fixed size, always starting below status bar (hack: except in fullscreen) - CGRect sideMenuFrame = viewFrame; - sideMenuFrame.origin.y = origin - (currentViewDescription.fullscreen ? statusBarFrame.size.height : 0); - sideMenuFrame.size.height -= sideMenuFrame.origin.y; - if (!currentViewDescription.sideMenuEnabled) { - // hack bis: really hide; -width won't be enough since some animations may use this... - sideMenuFrame.origin.x = -3 * sideMenuFrame.size.width; - } - - // 3. tab bar - on portrait full width at bottom / on landscape on left, starting below status bar - // Resize TabBar - CGRect tabFrame = self.tabBarView.frame; - if (self.tabBarViewController != nil && currentViewDescription.tabBarEnabled) { - tabFrame.origin.x = 0; - if (UIInterfaceOrientationIsPortrait([self currentOrientation])) { - tabFrame.origin.y = viewFrame.size.height - tabFrame.size.height; - } else { - tabFrame.origin.y = origin; - tabFrame.size.height = viewFrame.size.height - tabFrame.origin.y; - } - } else { - tabFrame.origin.x = -tabFrame.size.width; - tabFrame.origin.y = viewFrame.size.height; - } - - // 4. main view and details view - space left width of 35%/65% each - CGRect mainFrame = viewFrame; - mainFrame.origin.y = origin; - mainFrame.size.height -= mainFrame.origin.y; - if (!currentViewDescription.fullscreen) { - if (UIInterfaceOrientationIsPortrait([self currentOrientation])) { - mainFrame.size.height -= viewFrame.size.height - tabFrame.origin.y; - } else { - mainFrame.origin.x = tabFrame.origin.x + tabFrame.size.width; - mainFrame.size.width -= mainFrame.origin.x; - } - } - CGRect detailsFrame = mainFrame; - if (self.detailsViewController != nil) { - detailsFrame = mainFrame; - mainFrame.size.width = ceil(mainFrame.size.width * .35); - detailsFrame.size.width -= mainFrame.size.width; - detailsFrame.origin.x += mainFrame.size.width; - } - - // Set frames - // 1. main view and details view - self.mainView.frame = mainFrame; - self.mainViewController.view.frame = self.mainView.bounds; - self.detailsView.frame = detailsFrame; - self.detailsViewController.view.frame = self.detailsView.bounds; - - // 2. tab bar - self.tabBarView.frame = tabFrame; - CGRect frame = self.tabBarViewController.view.frame; - frame.size = self.tabBarView.bounds.size; - self.tabBarViewController.view.frame = frame; - - // 3. status bar - self.statusBarView.frame = statusBarFrame; - frame = self.statusBarViewController.view.frame; - frame.size = self.statusBarView.bounds.size; - self.statusBarViewController.view.frame = frame; - - // 4. side menu - self.sideMenuView.frame = sideMenuFrame; - self.sideMenuViewController.view.frame = self.sideMenuView.bounds; - [PhoneMainView.instance.mainViewController.view bringSubviewToFront:_sideMenuView]; - [PhoneMainView.instance.mainViewController.view bringSubviewToFront:_sideMenuViewController.view]; - - // Commit animation - if (tabBar != nil || statusBar != nil || sideMenu != nil || fullscreen != nil) { - [UIView commitAnimations]; - } - - // Change view - if (description != nil) { - if (oldMainViewController == nil || oldMainViewController != self.tabBarViewController) { - [UICompositeView addSubView:self.mainViewController view:self.mainView]; - } - if (oldDetailsViewController == nil || oldDetailsViewController != self.detailsViewController) { - [UICompositeView addSubView:self.detailsViewController view:self.detailsView]; - } - if (oldTabBarViewController == nil || oldTabBarViewController != self.tabBarViewController) { - [UICompositeView addSubView:self.tabBarViewController view:self.tabBarView]; - } - if (oldStatusBarViewController == nil || oldStatusBarViewController != self.statusBarViewController) { - [UICompositeView addSubView:self.statusBarViewController view:self.statusBarView]; - } - if (oldSideMenuViewController == nil || oldSideMenuViewController != self.sideMenuViewController) { - [UICompositeView addSubView:self.sideMenuViewController view:self.sideMenuView]; - } - } - if (currentViewDescription.sideMenuEnabled) { - [_sideMenuViewController viewDidAppear:YES]; - } else { - [_sideMenuViewController viewDidDisappear:YES]; - } - // Dealloc old view description - UIView *viewToRemove = [self.view viewWithTag:999]; - [viewToRemove removeFromSuperview]; -} - -- (void)changeView:(UICompositeViewDescription *)description { - [self view]; // Force view load - [self update:description tabBar:nil statusBar:nil sideMenu:nil fullscreen:nil]; -} - -- (void)setFullscreen:(BOOL)enabled { - [self update:nil tabBar:nil statusBar:nil sideMenu:nil fullscreen:[NSNumber numberWithBool:enabled]]; -} - -- (void)hideTabBar:(BOOL)hidden { - [self update:nil tabBar:[NSNumber numberWithBool:!hidden] statusBar:nil sideMenu:nil fullscreen:nil]; -} - -- (void)hideStatusBar:(BOOL)hidden { - [self update:nil tabBar:nil statusBar:[NSNumber numberWithBool:!hidden] sideMenu:nil fullscreen:nil]; -} - -- (void)hideSideMenu:(BOOL)hidden { - [self update:nil tabBar:nil statusBar:nil sideMenu:[NSNumber numberWithBool:!hidden] fullscreen:nil]; -} -- (UIViewController *)getCurrentViewController { - return self.mainViewController; -} - -- (BOOL)currentViewSupportsLandscape { - return currentViewDescription ? currentViewDescription.landscapeMode : FALSE; -} - -@end diff --git a/Classes/LinphoneUI/UIConfirmationDialog.h b/Classes/LinphoneUI/UIConfirmationDialog.h deleted file mode 100644 index 08dadf985..000000000 --- a/Classes/LinphoneUI/UIConfirmationDialog.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UICompositeView.h" -#import "UIRoundBorderedButton.h" - -typedef void (^UIConfirmationBlock)(void); - -@interface UIConfirmationDialog : UIViewController { - UIConfirmationBlock onCancelCb; - UIConfirmationBlock onConfirmCb; -} - -+ (UIConfirmationDialog *)ShowWithMessage:(NSString *)message - cancelMessage:(NSString *)cancel - confirmMessage:(NSString *)confirm - onCancelClick:(UIConfirmationBlock)onCancel - onConfirmationClick:(UIConfirmationBlock)onConfirm; -+ (UIConfirmationDialog *)ShowWithMessage:(NSString *)message - cancelMessage:(NSString *)cancel - confirmMessage:(NSString *)confirm - onCancelClick:(UIConfirmationBlock)onCancel - onConfirmationClick:(UIConfirmationBlock)onConfirm - inController:(UIViewController *)controller; -+ (UIConfirmationDialog *)ShowWithAttributedMessage:(NSMutableAttributedString *)attributedText - cancelMessage:(NSString *)cancel - confirmMessage:(NSString *)confirm - onCancelClick:(UIConfirmationBlock)onCancel - onConfirmationClick:(UIConfirmationBlock)onConfirm; - -@property(weak, nonatomic) IBOutlet UIRoundBorderedButton *cancelButton; -@property (weak, nonatomic) IBOutlet UIImageView *securityImage; -@property (weak, nonatomic) IBOutlet UIImageView *forwardImage; -@property (weak, nonatomic) IBOutlet UIImageView *groupCallImage; -@property(weak, nonatomic) IBOutlet UIRoundBorderedButton *confirmationButton; -@property (weak, nonatomic) IBOutlet UIView *authView; -@property (weak, nonatomic) IBOutlet UIImageView *backgroundColor; -@property(weak, nonatomic) IBOutlet UILabel *titleLabel; -@property(weak, nonatomic) IBOutlet UIView *firstView; -@property (weak, nonatomic) IBOutlet UIButton *authButton; -@property(weak, nonatomic) IBOutlet UILabel *subscribeLabel; - - -- (void)setSpecialColor; --(void) setWhiteCancel; -- (IBAction)onCancelClick:(id)sender; -- (IBAction)onConfirmationClick:(id)sender; -- (IBAction)onAuthClick:(id)sender; -- (IBAction)onSubscribeTap:(id)sender; -- (void)dismiss; -@end diff --git a/Classes/LinphoneUI/UIConfirmationDialog.m b/Classes/LinphoneUI/UIConfirmationDialog.m deleted file mode 100644 index 0abd0ecc4..000000000 --- a/Classes/LinphoneUI/UIConfirmationDialog.m +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIConfirmationDialog.h" -#import "PhoneMainView.h" -#import "linphoneapp-Swift.h" - -@implementation UIConfirmationDialog -+ (UIConfirmationDialog *)initDialog:(NSString *)cancel - confirmMessage:(NSString *)confirm - onCancelClick:(UIConfirmationBlock)onCancel - onConfirmationClick:(UIConfirmationBlock)onConfirm - inController:(UIViewController *)controller { - UIConfirmationDialog *dialog = - [[UIConfirmationDialog alloc] initWithNibName:NSStringFromClass(self.class) bundle:NSBundle.mainBundle]; - - dialog.view.frame = PhoneMainView.instance.mainViewController.view.frame; - [controller.view addSubview:dialog.view]; - [controller addChildViewController:dialog]; - dialog.backgroundColor.layer.cornerRadius = 10; - dialog.backgroundColor.layer.masksToBounds = true; - - dialog->onCancelCb = onCancel; - dialog->onConfirmCb = onConfirm; - - if (cancel) { - [dialog.cancelButton setTitle:cancel forState:UIControlStateNormal]; - } - if (confirm) { - [dialog.confirmationButton setTitle:confirm forState:UIControlStateNormal]; - } - - dialog.confirmationButton.layer.borderColor = - [[UIColor colorWithPatternImage:[UIImage imageNamed:@"color_A.png"]] CGColor]; - dialog.cancelButton.layer.borderColor = - [[UIColor colorWithPatternImage:[UIImage imageNamed:@"color_F.png"]] CGColor]; - if (linphone_core_get_post_quantum_available()) { - [dialog.securityImage setImage:[UIImage imageNamed:@"post_quantum_secure.png"]]; - } - return dialog; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self - action:@selector(onCancelClick:)]; - tapGestureRecognizer.delegate = self; - [self.firstView addGestureRecognizer:tapGestureRecognizer]; -} - - -+ (UIConfirmationDialog *)ShowWithMessage:(NSString *)message - cancelMessage:(NSString *)cancel - confirmMessage:(NSString *)confirm - onCancelClick:(UIConfirmationBlock)onCancel - onConfirmationClick:(UIConfirmationBlock)onConfirm - inController:(UIViewController *)controller { - UIConfirmationDialog *dialog = - [UIConfirmationDialog initDialog:cancel confirmMessage:confirm onCancelClick:onCancel onConfirmationClick:onConfirm inController:controller]; - [dialog.titleLabel setText:message]; - return dialog; -} - -+ (UIConfirmationDialog *)ShowWithMessage:(NSString *)message - cancelMessage:(NSString *)cancel - confirmMessage:(NSString *)confirm - onCancelClick:(UIConfirmationBlock)onCancel - onConfirmationClick:(UIConfirmationBlock)onConfirm { - return [self ShowWithMessage:message - cancelMessage:cancel - confirmMessage:confirm - onCancelClick:onCancel - onConfirmationClick:onConfirm - inController:PhoneMainView.instance.mainViewController]; -} - -+ (UIConfirmationDialog *)ShowWithAttributedMessage:(NSMutableAttributedString *)attributedText - cancelMessage:(NSString *)cancel - confirmMessage:(NSString *)confirm - onCancelClick:(UIConfirmationBlock)onCancel - onConfirmationClick:(UIConfirmationBlock)onConfirm { - UIConfirmationDialog *dialog = - [UIConfirmationDialog initDialog:cancel confirmMessage:confirm onCancelClick:onCancel onConfirmationClick:onConfirm inController:PhoneMainView.instance.mainViewController]; - dialog.titleLabel.attributedText = attributedText; - return dialog; -} - -- (void)setSpecialColor { - [_confirmationButton setBackgroundImage:[UIImage imageNamed:@"color_L.png"] forState:UIControlStateNormal]; - [_cancelButton setBackgroundImage:[UIImage imageNamed:@"color_I.png"] forState:UIControlStateNormal]; - [_cancelButton setTitleColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"color_H.png"]] forState:UIControlStateNormal]; - - _confirmationButton.layer.borderColor = - [[UIColor colorWithPatternImage:[UIImage imageNamed:@"color_L.png"]] CGColor]; - _cancelButton.layer.borderColor = - [[UIColor colorWithPatternImage:[UIImage imageNamed:@"color_A.png"]] CGColor]; -} - --(void) setWhiteCancel { - [_cancelButton setBackgroundImage:nil forState:UIControlStateNormal]; - [_cancelButton setBackgroundColor:UIColor.whiteColor]; - [_cancelButton setTitleColor:VoipTheme.voip_dark_gray forState:UIControlStateNormal]; - _cancelButton.layer.borderColor = UIColor.whiteColor.CGColor; -} - -- (IBAction)onCancelClick:(id)sender { - [self.view removeFromSuperview]; - [self removeFromParentViewController]; - if (onCancelCb) { - onCancelCb(); - } -} - -- (IBAction)onConfirmationClick:(id)sender { - [self.view removeFromSuperview]; - [self removeFromParentViewController]; - if (onConfirmCb) { - onConfirmCb(); - } -} - -- (IBAction)onAuthClick:(id)sender { - BOOL notAskAgain = ![LinphoneManager.instance lpConfigBoolForKey:@"confirmation_dialog_before_sas_call_not_ask_again"]; - UIImage *image = notAskAgain ? [UIImage imageNamed:@"checkbox_checked.png"] : [UIImage imageNamed:@"checkbox_unchecked.png"]; - [_authButton setImage:image forState:UIControlStateNormal]; - [LinphoneManager.instance lpConfigSetBool:notAskAgain forKey:@"confirmation_dialog_before_sas_call_not_ask_again"]; -} - -- (void)dismiss { - [self onCancelClick:nil]; -} - -- (IBAction)onSubscribeTap:(id)sender { - UIGestureRecognizer *gest = sender; - NSString *url = ((UILabel *)gest.view).text; - if (![UIApplication.sharedApplication openURL:[NSURL URLWithString:url]]) { - LOGE(@"Failed to open %@, invalid URL", url); - } -} -@end diff --git a/Classes/LinphoneUI/UIContactCell.h b/Classes/LinphoneUI/UIContactCell.h deleted file mode 100644 index ac838d96d..000000000 --- a/Classes/LinphoneUI/UIContactCell.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import -#import "UIRoundedImageView.h" - -@interface UIContactCell : UITableViewCell - -@property(nonatomic, strong) IBOutlet UILabel *nameLabel; -@property(nonatomic, strong) IBOutlet UILabel *organizationLabel; -@property(nonatomic, strong) IBOutlet UIImageView *avatarImage; -@property(weak, nonatomic) IBOutlet UIImageView *linphoneImage; -@property(nonatomic, assign) Contact *contact; - -- (id)initWithIdentifier:(NSString*)identifier; - -@end diff --git a/Classes/LinphoneUI/UIContactCell.m b/Classes/LinphoneUI/UIContactCell.m deleted file mode 100644 index cf960b591..000000000 --- a/Classes/LinphoneUI/UIContactCell.m +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIContactCell.h" -#import "ContactsListTableView.h" -#import "FastAddressBook.h" -#import "PhoneMainView.h" -#import "UILabel+Boldify.h" -#import "Utils.h" - -@implementation UIContactCell - -#pragma mark - Lifecycle Functions - -- (id)initWithIdentifier:(NSString *)identifier { - if ((self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]) != nil) { - NSArray *arrayOfViews = - [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil]; - - // resize cell to match .nib size. It is needed when resized the cell to - // correctly adapt its height too - UIView *sub = ((UIView *)[arrayOfViews objectAtIndex:0]); - [self setFrame:CGRectMake(0, 0, sub.frame.size.width, sub.frame.size.height)]; - [self addSubview:sub]; - _contact = NULL; - // Sections are wider on iPad and overlap linphone image - let's move it a bit - if (IPAD) { - CGRect frame = _linphoneImage.frame; - frame.origin.x -= frame.size.width / 2; - _linphoneImage.frame = frame; - } - - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(onPresenceChanged:) - name:kLinphoneNotifyPresenceReceivedForUriOrTel - object:nil]; - } - return self; -} - -- (void)dealloc { - self.contact = NULL; - [NSNotificationCenter.defaultCenter removeObserver:self]; -} - -#pragma mark - Notif - -- (void)onPresenceChanged:(NSNotification *)k { - LinphoneFriend *f = [[k.userInfo valueForKey:@"friend"] pointerValue]; - // only consider event if it's about us when not in ContactsListView - if (_contact && (PhoneMainView.instance.currentView == ContactsListView.compositeViewDescription || _nameLabel.text == PhoneMainView.instance.currentName)) { - if (!_contact.friend || f != _contact.friend) { - return; - } - [self setContact:_contact]; - } -} - -#pragma mark - Property Functions - -- (void)setContact:(Contact *)acontact { - _contact = acontact; - _linphoneImage.hidden = TRUE; - if(_contact) { - [ContactDisplay setDisplayNameLabel:_nameLabel forContact:_contact]; - _organizationLabel.text = [FastAddressBook ogrganizationForContact:_contact]; - _linphoneImage.hidden = [LinphoneManager.instance lpConfigBoolForKey:@"hide_linphone_contacts" inSection:@"app"] || - ! ((_contact.friend && linphone_presence_model_get_basic_status(linphone_friend_get_presence_model(_contact.friend)) == LinphonePresenceBasicStatusOpen) || [FastAddressBook contactHasValidSipDomain:_contact]); - } -} - -#pragma mark - - -- (void)touchUp:(id)sender { - [self setHighlighted:true animated:true]; -} - -- (void)touchDown:(id)sender { - [self setHighlighted:false animated:true]; -} - -- (NSString *)accessibilityLabel { - return _nameLabel.text; -} - -- (void)setEditing:(BOOL)editing { - [self setEditing:editing animated:FALSE]; -} - -- (void)setEditing:(BOOL)editing animated:(BOOL)animated { - if (animated) { - [UIView beginAnimations:nil context:nil]; - [UIView setAnimationDuration:0.3]; - } - _linphoneImage.alpha = editing ? 0 : 1; - if (animated) { - [UIView commitAnimations]; - } -} - -@end diff --git a/Classes/LinphoneUI/UIContactDetailsCell.h b/Classes/LinphoneUI/UIContactDetailsCell.h deleted file mode 100644 index a1fc40261..000000000 --- a/Classes/LinphoneUI/UIContactDetailsCell.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import - -#import "UIIconButton.h" - -@interface UIContactDetailsCell : UITableViewCell - -// this is broken design... but we need this to know which cell was modified -// last... must be totally revamped -@property(strong) NSIndexPath *indexPath; - -@property(weak, nonatomic) IBOutlet UIView *defaultView; -@property(weak, nonatomic) IBOutlet UILabel *addressLabel; -@property(weak, nonatomic) IBOutlet UITextField *editTextfield; -@property(weak, nonatomic) IBOutlet UIView *editView; -@property(weak, nonatomic) IBOutlet UIIconButton *deleteButton; -@property(weak, nonatomic) IBOutlet UIIconButton *callButton; -@property(weak, nonatomic) IBOutlet UIIconButton *chatButton; -@property (weak, nonatomic) IBOutlet UIIconButton *encryptedChatButton; -@property (weak, nonatomic) IBOutlet UIImageView *linphoneImage; -@property (weak, nonatomic) UIView *waitView; -@property (strong, nonatomic) IBOutlet UIButton *inviteButton; -@property (weak, nonatomic) IBOutlet UIView *encryptedChatView; -@property (weak, nonatomic) IBOutlet UIView *optionsView; - -- (id)initWithIdentifier:(NSString *)identifier; -- (void)setAddress:(NSString *)address; -- (void)hideDeleteButton:(BOOL)hidden; -- (void)shouldHideLinphoneImageOfAddress; - -- (IBAction)onCallClick:(id)sender; -- (IBAction)onChatClick:(id)sender; -- (IBAction)onEncrptedChatClick:(id)sender; -- (IBAction)onDeleteClick:(id)sender; -- (IBAction)onSMSInviteClick:(id)sender; -@end diff --git a/Classes/LinphoneUI/UIContactDetailsCell.m b/Classes/LinphoneUI/UIContactDetailsCell.m deleted file mode 100644 index 2b52ca496..000000000 --- a/Classes/LinphoneUI/UIContactDetailsCell.m +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIContactDetailsCell.h" -#import "FastAddressBook.h" -#import "Contact.h" -#import "PhoneMainView.h" - -@implementation UIContactDetailsCell - -#pragma mark - Lifecycle Functions - -- (id)initWithIdentifier:(NSString *)identifier { - if ((self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]) != nil) { - NSArray *arrayOfViews = - [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil]; - - // resize cell to match .nib size. It is needed when resized the cell to - // correctly adapt its height too - UIView *sub = ((UIView *)[arrayOfViews objectAtIndex:0]); - [self setFrame:CGRectMake(0, 0, sub.frame.size.width, sub.frame.size.height)]; - [self addSubview:sub]; - } - return self; -} - -#pragma mark - UITableViewCell Functions - -- (void)setAddress:(NSString *)address { - _addressLabel.text = _editTextfield.text = address; - char *normAddr = (char *)_addressLabel.text.UTF8String; - LinphoneAccount *account = linphone_core_get_default_account(LC); - if(_addressLabel.text && account && linphone_account_is_phone_number(account, _addressLabel.text.UTF8String)) { - normAddr = linphone_account_normalize_phone_number(account, - _addressLabel.text.UTF8String); - } - LinphoneAddress *addr = linphone_core_interpret_url_2(LC, normAddr, true); - _chatButton.enabled = _callButton.enabled = _encryptedChatButton.enabled = (addr != NULL); - - _chatButton.accessibilityLabel = - [NSString stringWithFormat:NSLocalizedString(@"Chat with %@", nil), _addressLabel.text]; - _callButton.accessibilityLabel = [NSString stringWithFormat:NSLocalizedString(@"Call %@", nil), _addressLabel.text]; - // Test presence - Contact *contact = addr ? [FastAddressBook getContactWithAddress:(addr)] : NULL; - LinphoneFriend *contactFriend = NULL; - if (contact && contact.friend) { - contactFriend = contact.friend; - } else if (addr) { - contactFriend = linphone_core_find_friend(LC, addr); - } - - ContactDetailsView *contactDetailsView = VIEW(ContactDetailsView); - _linphoneImage.hidden = TRUE; - if (contactFriend) { - const LinphonePresenceModel *model = contactFriend ? linphone_friend_get_presence_model_for_uri_or_tel(contactFriend, _addressLabel.text.UTF8String) : NULL; - - self.linphoneImage.hidden = [LinphoneManager.instance lpConfigBoolForKey:@"hide_linphone_contacts" inSection:@"app"] || - !((model && linphone_presence_model_get_basic_status(model) == LinphonePresenceBasicStatusOpen) || - (account && !linphone_account_is_phone_number(account, - _addressLabel.text.UTF8String) && - [FastAddressBook isSipURIValid:_addressLabel.text])); - self.inviteButton.hidden = !ENABLE_SMS_INVITE || [[contactDetailsView.contact sipAddresses] count] > 0 || !self.linphoneImage.hidden; - [self shouldHideEncryptedChatView:account && linphone_account_params_get_conference_factory_uri(linphone_account_get_params(account)) && model && linphone_presence_model_has_capability(model, LinphoneFriendCapabilityLimeX3dh)]; - _chatButton.hidden = [LinphoneManager.instance lpConfigBoolForKey:@"force_lime_chat_rooms"] || [LinphoneManager.instance lpConfigBoolForKey:@"disable_chat_feature"]; - } - - if (addr) { - linphone_address_unref(addr); - } -} - -- (void)shouldHideEncryptedChatView:(BOOL)hasLime { - _encryptedChatView.hidden = !hasLime || [LinphoneManager.instance lpConfigBoolForKey:@"disable_chat_feature"]; - CGRect newFrame = _optionsView.frame; - if (!hasLime) { - newFrame.origin.x = _addressLabel.frame.origin.x + _callButton.frame.size.width * 2/3; - - } else { - newFrame.origin.x = _addressLabel.frame.origin.x; - } - _optionsView.frame = newFrame; -} - -- (void)shouldHideLinphoneImageOfAddress { - if (!_addressLabel.text) { - return; - } - - char *normAddr = (char *)_addressLabel.text.UTF8String; - LinphoneAccount *account = linphone_core_get_default_account(LC); - if (account && linphone_account_is_phone_number(account, - _addressLabel.text.UTF8String)) { - normAddr = linphone_account_normalize_phone_number(account, - _addressLabel.text.UTF8String); - } - LinphoneAddress *addr = linphone_core_interpret_url_2(LC, normAddr, true); - - // Test presence - Contact *contact = [FastAddressBook getContactWithAddress:(addr)]; - - if (contact) { - self.linphoneImage.hidden =[LinphoneManager.instance lpConfigBoolForKey:@"hide_linphone_contacts" inSection:@"app"] || ! ((contact.friend && linphone_presence_model_get_basic_status(linphone_friend_get_presence_model_for_uri_or_tel(contact.friend, _addressLabel.text.UTF8String)) == LinphonePresenceBasicStatusOpen) || (account && !linphone_account_is_phone_number(account, _addressLabel.text.UTF8String) && [FastAddressBook isSipURIValid:_addressLabel.text])); - } - - if (addr) { - linphone_address_unref(addr); - } -} - -- (void)hideDeleteButton:(BOOL)hidden { - if (_deleteButton.hidden == hidden) - return; - - CGRect newFrame = _editTextfield.frame; - newFrame.size.width = _editView.frame.size.width - newFrame.origin.x; - if (hidden) { - newFrame.size.width -= newFrame.origin.x; /* center view in super view */ - } else { - newFrame.size.width -= _deleteButton.frame.size.width; - } - _editTextfield.frame = newFrame; - _deleteButton.hidden = hidden; -} - -- (void)setEditing:(BOOL)editing animated:(BOOL)animated { - [super setEditing:editing animated:animated]; - - _defaultView.hidden = editing; - _editView.hidden = !editing; -} - -- (void)setEditing:(BOOL)editing { - [self setEditing:editing animated:FALSE]; -} - -- (IBAction)onCallClick:(id)event { - LinphoneAddress *addr = [LinphoneUtils normalizeSipOrPhoneAddress:_addressLabel.text]; - [LinphoneManager.instance call:addr]; - if (addr) - linphone_address_unref(addr); -} - -- (IBAction)onChatClick:(id)event { - LinphoneAddress *addr = [LinphoneUtils normalizeSipOrPhoneAddress:_addressLabel.text]; - [LinphoneManager.instance lpConfigSetBool:TRUE forKey:@"create_chat"]; - [PhoneMainView.instance getOrCreateOneToOneChatRoom:addr waitView:_waitView isEncrypted:FALSE]; - linphone_address_unref(addr); -} - -- (IBAction)onEncrptedChatClick:(id)sender { - LinphoneAddress *addr = [LinphoneUtils normalizeSipOrPhoneAddress:_addressLabel.text]; - [LinphoneManager.instance lpConfigSetBool:TRUE forKey:@"create_chat"]; - [PhoneMainView.instance getOrCreateOneToOneChatRoom:addr waitView:_waitView isEncrypted:TRUE]; - linphone_address_unref(addr); -} - -- (IBAction)onDeleteClick:(id)sender { - UITableView *tableView = VIEW(ContactDetailsView).tableController.tableView; - NSIndexPath *indexPath = [tableView indexPathForCell:self]; - [tableView.dataSource tableView:tableView - commitEditingStyle:UITableViewCellEditingStyleDelete - forRowAtIndexPath:indexPath]; -} - -#pragma mark - SMS invite - -- (IBAction)onSMSInviteClick:(id)sender { - MFMessageComposeViewController *controller = [[MFMessageComposeViewController alloc] init]; - if([MFMessageComposeViewController canSendText]) { - controller.body = NSLocalizedString(@"Hello! Join me on Linphone! You can download it for free at: https://www.linphone.org/download",nil); - controller.recipients = [NSArray arrayWithObjects:[self.addressLabel text], nil]; - - controller.messageComposeDelegate = PhoneMainView.instance; - [PhoneMainView.instance presentViewController:controller animated:YES completion:nil]; - } -} - -@end diff --git a/Classes/LinphoneUI/UIDeviceCell.h b/Classes/LinphoneUI/UIDeviceCell.h deleted file mode 100644 index 518f5ea75..000000000 --- a/Classes/LinphoneUI/UIDeviceCell.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -@interface UIDeviceCell : UITableViewCell - -@property (weak, nonatomic) IBOutlet UIRoundedImageView *avatarImage; -@property (weak, nonatomic) IBOutlet UIImageView *securityImage; -@property (weak, nonatomic) IBOutlet UILabel *deviceLabel; -@property (weak, nonatomic) IBOutlet UIButton *securityButton; -@property (weak, nonatomic) IBOutlet UIButton *dropMenuButton; - -@property LinphoneParticipantDevice *device; -@property BOOL isFirst; -@property BOOL isUnique; -@property BOOL isListOpen; - - -- (id)initWithIdentifier:(NSString *)identifier; -- (void)update; -@end diff --git a/Classes/LinphoneUI/UIDeviceCell.m b/Classes/LinphoneUI/UIDeviceCell.m deleted file mode 100644 index 192b7f3c0..000000000 --- a/Classes/LinphoneUI/UIDeviceCell.m +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIDeviceCell.h" - -@implementation UIDeviceCell -#pragma mark - Lifecycle Functions -- (id)initWithIdentifier:(NSString *)identifier { - if ((self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]) != nil) { - NSArray *arrayOfViews = - [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil]; - - // resize cell to match .nib size. It is needed when resized the cell to - // correctly adapt its height too - UIView *sub = ((UIView *)[arrayOfViews objectAtIndex:0]); - [self setFrame:CGRectMake(0, 0, sub.frame.size.width, sub.frame.size.height)]; - [self addSubview:sub]; - } - return self; -} - -- (void)update { - if (!_device) { - LOGE(@"Can not update, because the device is null."); - _securityButton.hidden = FALSE; - _dropMenuButton.hidden = TRUE; - return; - } - - if (_isFirst) { - _securityImage.hidden = _avatarImage.hidden = FALSE; - if (@available(iOS 13, *)) { - self.backgroundColor = [UIColor systemBackgroundColor]; - } else { - self.backgroundColor = [UIColor whiteColor]; - } - } else { - _securityImage.hidden = _avatarImage.hidden = TRUE; - char *uri = linphone_address_as_string_uri_only(linphone_participant_device_get_address(_device)); - _deviceLabel.text = [NSString stringWithUTF8String:linphone_participant_device_get_name(_device) ? : - uri]; - ms_free(uri); - self.backgroundColor = [UIColor colorWithRed:(245 / 255.0) green:(245 / 255.0) blue:(245 / 255.0) alpha:1.0]; - } - if (_isUnique || !_isFirst) { - [_securityButton setImage:[FastAddressBook imageForSecurityLevel:linphone_participant_device_get_security_level(_device)] forState:UIControlStateNormal]; - _securityButton.hidden = FALSE; - _dropMenuButton.hidden = TRUE; - } else { - UIImage *image = _isListOpen ? [UIImage imageNamed:@"chevron_list_open"] : [UIImage imageNamed:@"chevron_list_close"]; - [_dropMenuButton setImage:image forState:UIControlStateNormal]; - _securityButton.hidden = TRUE; - _dropMenuButton.hidden = FALSE; - } -} - -@end diff --git a/Classes/LinphoneUI/UIDeviceCell.xib b/Classes/LinphoneUI/UIDeviceCell.xib deleted file mode 100644 index 29a6c6eb4..000000000 --- a/Classes/LinphoneUI/UIDeviceCell.xib +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/LinphoneUI/UIDigitButton.h b/Classes/LinphoneUI/UIDigitButton.h deleted file mode 100644 index 95bda10ca..000000000 --- a/Classes/LinphoneUI/UIDigitButton.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UIIconButton.h" - -@interface UIDigitButton : UIIconButton { -} - -@property(nonatomic, strong) IBOutlet UITextField *addressField; -@property char digit; -@property bool dtmf; - -@end diff --git a/Classes/LinphoneUI/UIDigitButton.m b/Classes/LinphoneUI/UIDigitButton.m deleted file mode 100644 index 21c43525f..000000000 --- a/Classes/LinphoneUI/UIDigitButton.m +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIDigitButton.h" -#include "linphone/linphonecore.h" -#import "LinphoneManager.h" - -@implementation UIDigitButton - -@synthesize dtmf; -@synthesize digit; -@synthesize addressField; - -#pragma mark - Lifecycle Functions - -- (void)initUIDigitButton { - dtmf = FALSE; - [self addTarget:self action:@selector(touchDown:) forControlEvents:UIControlEventTouchDown]; - [self addTarget:self - action:@selector(touchUp:) - forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside]; -} - -- (id)init { - self = [super init]; - if (self) { - [self initUIDigitButton]; - } - return self; -} - -- (id)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - [self initUIDigitButton]; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)decoder { - self = [super initWithCoder:decoder]; - if (self) { - [self initUIDigitButton]; - } - return self; -} - -#pragma mark - Actions Functions - -- (void)touchDown:(id)sender { - if (addressField && (!dtmf || !linphone_core_in_call(LC))) { - NSString *newAddress = [NSString stringWithFormat:@"%@%c", addressField.text, digit]; - [addressField setText:newAddress]; - } else { - linphone_call_send_dtmf(linphone_core_get_current_call(LC), digit); - linphone_core_play_dtmf(LC, digit, 100); - } -} - -- (void)touchUp:(id)sender { - linphone_core_stop_dtmf(LC); -} - -@end diff --git a/Classes/LinphoneUI/UIHistoryCell.h b/Classes/LinphoneUI/UIHistoryCell.h deleted file mode 100644 index 95e8368c4..000000000 --- a/Classes/LinphoneUI/UIHistoryCell.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UIRoundedImageView.h" -#import "UIIconButton.h" - -#include "linphone/linphonecore.h" - -@interface UIHistoryCell : UITableViewCell - -@property (nonatomic, assign) LinphoneCallLog *callLog; - -@property(weak, nonatomic) IBOutlet UIImageView *avatarImage; -@property(nonatomic, strong) IBOutlet UILabel *displayNameLabel; -@property(weak, nonatomic) IBOutlet UIImageView *stateImage; -@property(weak, nonatomic) IBOutlet UIIconButton *detailsButton; - -- (id)initWithIdentifier:(NSString*)identifier; - -- (IBAction)onDetails:(id)event; - -@end diff --git a/Classes/LinphoneUI/UIHistoryCell.m b/Classes/LinphoneUI/UIHistoryCell.m deleted file mode 100644 index b7efa0a3d..000000000 --- a/Classes/LinphoneUI/UIHistoryCell.m +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIHistoryCell.h" -#import "LinphoneManager.h" -#import "PhoneMainView.h" -#import "Utils.h" -#import "linphoneapp-Swift.h" - -@implementation UIHistoryCell - -@synthesize callLog; -@synthesize displayNameLabel; - -#pragma mark - Lifecycle Functions - -- (id)initWithIdentifier:(NSString *)identifier { - if ((self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]) != nil) { - NSArray *arrayOfViews = - [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil]; - - // resize cell to match .nib size. It is needed when resized the cell to - // correctly adapt its height too - UIView *sub = ((UIView *)[arrayOfViews objectAtIndex:0]); - [self setFrame:CGRectMake(0, 0, sub.frame.size.width, sub.frame.size.height)]; - [self addSubview:sub]; - _detailsButton.hidden = IPAD; - callLog = NULL; - } - return self; -} - -#pragma mark - Action Functions - -- (void)setCallLog:(LinphoneCallLog *)acallLog { - callLog = acallLog; - - [self update]; -} - -#pragma mark - Action Functions - -- (IBAction)onDetails:(id)event { - if (callLog != NULL) { - HistoryDetailsView *view = VIEW(HistoryDetailsView); - if (linphone_call_log_get_call_id(callLog) != NULL) { - if (linphone_call_log_was_conference(callLog)) { - ConferenceHistoryDetailsView *view = VIEW(ConferenceHistoryDetailsView); - [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; - [view setCallLogWithCallLog:callLog]; - } else { - // Go to History details view - [view setCallLogId:[NSString stringWithUTF8String:linphone_call_log_get_call_id(callLog)]]; - [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; - } - } - } -} - -#pragma mark - - -- (NSString *)accessibilityValue { - BOOL incoming = linphone_call_log_get_dir(callLog) == LinphoneCallIncoming; - BOOL missed = [SwiftUtil isCallLogMissedWithCLog:callLog]; - NSString *call_type = incoming ? (missed ? @"Missed" : @"Incoming") : @"Outgoing"; - return [NSString stringWithFormat:@"%@ call from %@", call_type, displayNameLabel.text]; -} - -- (void)update { - if (callLog == NULL) { - LOGW(@"Cannot update history cell: null callLog"); - return; - } - - // Set up the cell... - if (linphone_call_log_was_conference(callLog)) { - const char *subject = linphone_conference_info_get_subject(linphone_call_log_get_conference_info(callLog)); - displayNameLabel.text = [NSString stringWithUTF8String:subject]; - [_avatarImage setImage:[UIImage imageNamed:@"voip_multiple_contacts_avatar"]]; - _stateImage.hidden = true; - } else { - _stateImage.hidden = false; - const LinphoneAddress *addr; - UIImage *image; - if (linphone_call_log_get_dir(callLog) == LinphoneCallIncoming) { - if (![SwiftUtil isCallLogMissedWithCLog:callLog]) { - image = [UIImage imageNamed:@"call_status_incoming.png"]; - } else { - image = [UIImage imageNamed:@"call_status_missed.png"]; - } - addr = linphone_call_log_get_from_address(callLog); - } else { - image = [UIImage imageNamed:@"call_status_outgoing.png"]; - addr = linphone_call_log_get_to_address(callLog); - } - _stateImage.image = image; - [ContactDisplay setDisplayNameLabel:displayNameLabel forAddress:addr]; - - size_t count = bctbx_list_size(linphone_call_log_get_user_data(callLog)) + 1; - if (count > 1) { - displayNameLabel.text = - [displayNameLabel.text stringByAppendingString:[NSString stringWithFormat:@" (%lu)", count]]; - } - - [_avatarImage setImage:[FastAddressBook imageForAddress:addr]]; - } -} - -- (void)setEditing:(BOOL)editing { - [self setEditing:editing animated:FALSE]; -} - -- (void)setEditing:(BOOL)editing animated:(BOOL)animated { - if (animated) { - [UIView beginAnimations:nil context:nil]; - [UIView setAnimationDuration:0.3]; - } - if (editing) { - [_detailsButton setAlpha:0.0f]; - } else { - [_detailsButton setAlpha:1.0f]; - } - if (animated) { - [UIView commitAnimations]; - } -} - -@end diff --git a/Classes/LinphoneUI/UIIconButton.h b/Classes/LinphoneUI/UIIconButton.h deleted file mode 100644 index 84c6e4c93..000000000 --- a/Classes/LinphoneUI/UIIconButton.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -@interface UIIconButton : UIButton - -@end diff --git a/Classes/LinphoneUI/UIIconButton.m b/Classes/LinphoneUI/UIIconButton.m deleted file mode 100644 index 305562ec1..000000000 --- a/Classes/LinphoneUI/UIIconButton.m +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIIconButton.h" - -#import "Utils.h" - -@implementation UIIconButton - -INIT_WITH_COMMON_CF { - [super setImage:[self imageForState:UIControlStateNormal] - forState:(UIControlStateHighlighted | UIControlStateSelected)]; - [super setImage:[self imageForState:UIControlStateDisabled] - forState:(UIControlStateDisabled | UIControlStateSelected)]; - - [self setBackgroundImage:[self backgroundImageForState:UIControlStateHighlighted] - forState:(UIControlStateHighlighted | UIControlStateSelected)]; - [self setBackgroundImage:[self backgroundImageForState:UIControlStateDisabled] - forState:(UIControlStateDisabled | UIControlStateSelected)]; - [LinphoneUtils buttonFixStates:self]; - [self.titleLabel setAdjustsFontSizeToFitWidth:TRUE]; - - return self; -} - -- (void)setImage:(UIImage *)image forState:(UIControlState)state { - [super setImage:image forState:state]; - [self commonInit]; -} -@end diff --git a/Classes/LinphoneUI/UIImageViewDeletable.h b/Classes/LinphoneUI/UIImageViewDeletable.h deleted file mode 100644 index 5048b8303..000000000 --- a/Classes/LinphoneUI/UIImageViewDeletable.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -@protocol UIImageViewDeletableDelegate - -@required - -- (void)deleteFileWithUuid:(NSUUID *)uuid; - -@end - -@interface UIImageViewDeletable : UICollectionViewCell - -@property NSUUID *uuid; -@property(nonatomic, strong) id deleteDelegate; -@property (weak, nonatomic) IBOutlet UIImageView *image; - -- (IBAction)onDeletePressed; - -@end diff --git a/Classes/LinphoneUI/UIImageViewDeletable.m b/Classes/LinphoneUI/UIImageViewDeletable.m deleted file mode 100644 index aa8294c31..000000000 --- a/Classes/LinphoneUI/UIImageViewDeletable.m +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIImageViewDeletable.h" - -@interface UIImageViewDeletable () - -@end - -@implementation UIImageViewDeletable - -- (UIImageViewDeletable *)init { - self = [super init]; - if (self) { - NSArray *arrayOfViews = - [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil]; - // resize cell to match .nib size. It is needed when resized the cell to - // correctly adapt its height too - UIView *sub = ((UIView *)[arrayOfViews objectAtIndex:arrayOfViews.count - 1]); - [self setFrame:CGRectMake(0, 0, sub.frame.size.width, sub.frame.size.height)]; - [self addSubview:sub]; - } - return self; -} - - -- (UIImageViewDeletable *)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - NSArray *arrayOfViews = - [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil]; - // resize cell to match .nib size. It is needed when resized the cell to - // correctly adapt its height too - UIView *sub = ((UIView *)[arrayOfViews objectAtIndex:arrayOfViews.count - 1]); - [self setFrame:frame]; - [self addSubview:sub]; - } - return self; -} - -- (IBAction)onDeletePressed { - [_deleteDelegate deleteFileWithUuid:_uuid]; -} - -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ - -@end diff --git a/Classes/LinphoneUI/UIImageViewDeletable.xib b/Classes/LinphoneUI/UIImageViewDeletable.xib deleted file mode 100644 index 4d0dea67a..000000000 --- a/Classes/LinphoneUI/UIImageViewDeletable.xib +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/LinphoneUI/UIInterfaceStyleButton.h b/Classes/LinphoneUI/UIInterfaceStyleButton.h deleted file mode 100644 index 745ca511b..000000000 --- a/Classes/LinphoneUI/UIInterfaceStyleButton.h +++ /dev/null @@ -1,28 +0,0 @@ -/* -* Copyright (c) 2010-2020 Belledonne Communications SARL. -* -* This file is part of linphone-iphone -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*/ - -#ifndef UIInterfaceStyleButton_h -#define UIInterfaceStyleButton_h -#import - -@interface UIInterfaceStyleButton : UIButton - -@end - -#endif /* UIInterfaceStyleButton_h */ diff --git a/Classes/LinphoneUI/UIInterfaceStyleButton.m b/Classes/LinphoneUI/UIInterfaceStyleButton.m deleted file mode 100644 index 3ca5640b6..000000000 --- a/Classes/LinphoneUI/UIInterfaceStyleButton.m +++ /dev/null @@ -1,79 +0,0 @@ -/* -* Copyright (c) 2010-2020 Belledonne Communications SARL. -* -* This file is part of linphone-iphone -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*/ - -#import -#import "UIInterfaceStyleButton.h" -#import "Utils.h" - - -@implementation UIInterfaceStyleButton -- (void)initUIInterfaceStyleButton { - if(@available(iOS 13,*)){ - [super setImage:[[self imageForState:UIControlStateNormal] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] forState:UIControlStateNormal]; - [super setImage:[[self imageForState:UIControlStateDisabled] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] forState:UIControlStateDisabled]; - UITraitCollection *collection = [UITraitCollection currentTraitCollection]; - switch (collection.userInterfaceStyle) { - case UIUserInterfaceStyleDark: - self.tintColor = [UIColor whiteColor]; - break; - case UIUserInterfaceStyleUnspecified: - case UIUserInterfaceStyleLight: - self.tintColor = [UIColor darkGrayColor]; - break; - default: - break; - } - } else { - self.tintColor = [UIColor darkGrayColor]; - } -} - -- (id)init { - self = [super init]; - if (self) { - [self initUIInterfaceStyleButton]; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)decoder { - self = [super initWithCoder:decoder]; - if (self) { - [self initUIInterfaceStyleButton]; - } - return self; -} - -- (id)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - [self initUIInterfaceStyleButton]; - } - return self; -} - --(void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection { - [super traitCollectionDidChange:previousTraitCollection]; - [self initUIInterfaceStyleButton]; -} - --(void)setImage:(UIImage *)image forState:(UIControlState)state { - [super setImage:[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] forState:state]; -} -@end diff --git a/Classes/LinphoneUI/UIInterfaceStyleToggleButton.h b/Classes/LinphoneUI/UIInterfaceStyleToggleButton.h deleted file mode 100644 index 8f4af8655..000000000 --- a/Classes/LinphoneUI/UIInterfaceStyleToggleButton.h +++ /dev/null @@ -1,30 +0,0 @@ -/* -* Copyright (c) 2010-2020 Belledonne Communications SARL. -* -* This file is part of linphone-iphone -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*/ - -#ifndef UIInterfaceStyleToggleButton_h -#define UIInterfaceStyleToggleButton_h -#import "UIToggleButton.h" - -@interface UIInterfaceStyleToggleButton : UIToggleButton { -} - -@end - - -#endif /* UIInterfaceStyleToggleButton_h */ diff --git a/Classes/LinphoneUI/UIInterfaceStyleToggleButton.m b/Classes/LinphoneUI/UIInterfaceStyleToggleButton.m deleted file mode 100644 index 42e2536a2..000000000 --- a/Classes/LinphoneUI/UIInterfaceStyleToggleButton.m +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIInterfaceStyleToggleButton.h" - -@implementation UIInterfaceStyleToggleButton - -#pragma mark - Lifecycle Functions - -- (void)initUIInterfaceStyleToggleButton { - if(@available(iOS 13,*)){ - [super setImage:[[self imageForState:UIControlStateNormal] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] forState:UIControlStateNormal]; - [super setImage:[[self imageForState:UIControlStateDisabled] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] forState:UIControlStateDisabled]; - UITraitCollection *collection = [UITraitCollection currentTraitCollection]; - switch (collection.userInterfaceStyle) { - case UIUserInterfaceStyleDark: - self.tintColor = [UIColor whiteColor]; - break; - case UIUserInterfaceStyleUnspecified: - case UIUserInterfaceStyleLight: - self.tintColor = [UIColor darkGrayColor]; - break; - default: - break; - } - } else { - self.tintColor = [UIColor darkGrayColor]; - } -} - -- (id)init { - self = [super init]; - if (self) { - [self initUIInterfaceStyleToggleButton]; - } - return self; -} - -- (id)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - [self initUIInterfaceStyleToggleButton]; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)decoder { - self = [super initWithCoder:decoder]; - if (self) { - [self initUIInterfaceStyleToggleButton]; - } - return self; -} - --(void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection { - [super traitCollectionDidChange:previousTraitCollection]; - [self initUIInterfaceStyleToggleButton]; -} - --(void)setImage:(UIImage *)image forState:(UIControlState)state { - [super setImage:[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] forState:state]; -} - -@end diff --git a/Classes/LinphoneUI/UILabel+Boldify.h b/Classes/LinphoneUI/UILabel+Boldify.h deleted file mode 100644 index 1a20654c2..000000000 --- a/Classes/LinphoneUI/UILabel+Boldify.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import - -@interface UILabel (Boldify) - -- (void)boldSubstring:(NSString *)substring; -- (void)boldRange:(NSRange)range; - -@end diff --git a/Classes/LinphoneUI/UILabel+Boldify.m b/Classes/LinphoneUI/UILabel+Boldify.m deleted file mode 100644 index d44af3133..000000000 --- a/Classes/LinphoneUI/UILabel+Boldify.m +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UILabel+Boldify.h" - -@implementation UILabel (Boldify) - -- (void)boldRange:(NSRange)range { - if (![self respondsToSelector:@selector(setAttributedText:)]) { - return; - } - NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:self.text]; - [attributedText setAttributes:@{ - NSFontAttributeName : [UIFont boldSystemFontOfSize:self.font.pointSize] - } - range:range]; - - self.attributedText = attributedText; -} - -- (void)boldSubstring:(NSString *)substring { - NSRange range = [self.text rangeOfString:substring]; - [self boldRange:range]; -} - -@end diff --git a/Classes/LinphoneUI/UILinphoneAudioPlayer.h b/Classes/LinphoneUI/UILinphoneAudioPlayer.h deleted file mode 100644 index 2d48a7e07..000000000 --- a/Classes/LinphoneUI/UILinphoneAudioPlayer.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -@interface UILinphoneAudioPlayer : UIViewController -@property (weak, nonatomic) IBOutlet UIButton *playButton; -@property (weak, nonatomic) IBOutlet UIButton *stopButton; -@property (weak, nonatomic) IBOutlet UILabel *timeLabel; -@property (weak, nonatomic) IBOutlet UIProgressView *timeProgress; -@property (weak, nonatomic) NSString *file; -@property (weak, nonatomic) NSTimer *refreshTimer; - -+ (id)audioPlayerWithFilePath:(NSString *)filePath; -- (void)close; -- (BOOL)isOpened; -- (BOOL)isCreated; -- (void)open; -- (void)pause; -- (void)setFile:(NSString *)fileName; -- (IBAction)onPlay:(id)sender; -- (IBAction)onStop:(id)sender; -- (IBAction)onTapTimeBar:(UITapGestureRecognizer *)sender; -@end diff --git a/Classes/LinphoneUI/UILinphoneAudioPlayer.m b/Classes/LinphoneUI/UILinphoneAudioPlayer.m deleted file mode 100644 index 89498b027..000000000 --- a/Classes/LinphoneUI/UILinphoneAudioPlayer.m +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UILinphoneAudioPlayer.h" -#import "Utils.h" -#import "PhoneMainView.h" - -@implementation UILinphoneAudioPlayer { - @private - LinphonePlayer *player; - LinphonePlayerCbs *cbs; - int duration; - BOOL eofReached; -} - -@synthesize file; - -#pragma mark - Factory - -+ (id)audioPlayerWithFilePath:(NSString *)filePath { - return [[self alloc] initWithFilePath:filePath]; -} - -#pragma mark - Life cycle - -- (instancetype)initWithFilePath:(NSString *)filePath { - if (self = [super initWithNibName:NSStringFromClass(self.class) bundle:[NSBundle mainBundle]]) { - player = linphone_core_create_local_player(LC, NULL, "IOSDisplay", NULL); - cbs = linphone_player_get_callbacks(player); - linphone_player_set_user_data(player, (__bridge void *)self); - linphone_player_cbs_set_eof_reached(cbs, on_eof_reached); - file = filePath; - eofReached = NO; - _refreshTimer = nil; - } - return self; -} - -- (void)dealloc { - [self close]; -} - -- (void)close { - if (player) { - [_refreshTimer invalidate]; - _refreshTimer = nil; - linphone_player_close(player); - linphone_player_unref(player); - player = NULL; - } - [self.view removeFromSuperview]; -} - -- (void)viewDidAppear:(BOOL)animated { - [_playButton setTitle:@"" forState:UIControlStateNormal]; - if (player && linphone_player_get_state(player) == LinphonePlayerPlaying) - [_playButton setImage:[UIImage imageFromSystemBarButton:UIBarButtonSystemItemPause:[UIColor blackColor]] forState:UIControlStateNormal]; - else - [_playButton setImage:[UIImage imageFromSystemBarButton:UIBarButtonSystemItemPlay:[UIColor blackColor]] forState:UIControlStateNormal]; - [_stopButton setTitle:@"" forState:UIControlStateNormal]; - [_stopButton setImage:[UIImage imageFromSystemBarButton:UIBarButtonSystemItemRefresh:[UIColor blackColor]] forState:UIControlStateNormal]; -} - -- (void)viewWillDisappear:(BOOL)animated { - [self close]; -} - -- (void)open { - linphone_player_open(player, file.UTF8String); - duration = linphone_player_get_duration(player); - [self updateTimeLabel:0]; - _timeProgress.progress = 0; - - eofReached = NO; - [_playButton setTitle:@"" forState:UIControlStateNormal]; - [_playButton setImage:[UIImage imageFromSystemBarButton:UIBarButtonSystemItemPlay:[UIColor blackColor]] forState:UIControlStateNormal]; - [_stopButton setTitle:@"" forState:UIControlStateNormal]; - [_stopButton setImage:[UIImage imageFromSystemBarButton:UIBarButtonSystemItemRefresh:[UIColor blackColor]] forState:UIControlStateNormal]; -} - -- (BOOL)isOpened { - return player && linphone_player_get_state(player) != LinphonePlayerClosed; -} - -- (BOOL)isCreated { - return player!=nil; -} - -- (void)setFile:(NSString *)fileName { - if (player) linphone_player_close(player); - file = fileName; -} - -#pragma mark - Callbacks - -void on_eof_reached(LinphonePlayer *pl) { - NSLog(@"EOF reached"); - UILinphoneAudioPlayer *player = (__bridge UILinphoneAudioPlayer *)linphone_player_get_user_data(pl); - dispatch_async(dispatch_get_main_queue(), ^{ - [player.playButton setTitle:@"" forState:UIControlStateNormal]; - [player.playButton setImage:[UIImage imageFromSystemBarButton:UIBarButtonSystemItemPlay:[UIColor blackColor]] forState:UIControlStateNormal]; - }); - player->eofReached = YES; - VIEW(RecordingsListView).videoView.hidden = YES; -} - -#pragma mark - ViewController methods - -- (void)viewDidLoad { - [super viewDidLoad]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; -} - -#pragma mark - Utils - -+ (NSString *)timeToString:(int)time { - time /= 1000; - int hours = time / 3600; - time %= 3600; - int minutes = time / 60; - int seconds = time % 60; - NSNumberFormatter *formatter = [NSNumberFormatter new]; - formatter.maximumIntegerDigits = 2; - formatter.minimumIntegerDigits = 2; - NSString *ret = [NSString stringWithFormat:@"%@:%@", - [formatter stringFromNumber:[NSNumber numberWithInt:minutes]], - [formatter stringFromNumber:[NSNumber numberWithInt:seconds]]]; - ret = (hours == 0)?ret:[[NSString stringWithFormat:@"%d:", hours] stringByAppendingString:ret]; - return ret; -} - -#pragma mark - Updating - -- (void)updateTimeLabel:(int)currentTime { - _timeLabel.text = [NSString stringWithFormat:@"%@ / %@", [self.class timeToString:currentTime], [self.class timeToString:duration]]; -} - -- (void)displayProgress{ - int pos = linphone_player_get_current_position(player); - _timeProgress.progress = (float)pos / (float)duration; - [self updateTimeLabel:pos]; -} - -- (void)update { - if (!_refreshTimer) - _refreshTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(displayProgress) userInfo:nil repeats:YES]; -} - -- (void)pause { - if ([self isOpened]) { - linphone_player_pause(player); - [_playButton setTitle:@"" forState:UIControlStateNormal]; - [_playButton setImage:[UIImage imageFromSystemBarButton:UIBarButtonSystemItemPlay:[UIColor blackColor]] forState:UIControlStateNormal]; - } -} - -#pragma mark - Event handlers - -- (IBAction)onPlay:(id)sender { - if (eofReached) { - linphone_player_seek(player, 0); - eofReached = NO; - } - LinphonePlayerState state = linphone_player_get_state(player); - switch (state) { - case LinphonePlayerClosed: - break; - case LinphonePlayerPaused: - NSLog(@"Play"); - [_playButton setTitle:@"" forState:UIControlStateNormal]; - [_playButton setImage:[UIImage imageFromSystemBarButton:UIBarButtonSystemItemPause:[UIColor blackColor]] forState:UIControlStateNormal]; - linphone_player_start(player); - if (linphone_player_get_is_video_available(player)) { - linphone_player_set_window_id(player, (__bridge void *)VIEW(RecordingsListView).videoView); - VIEW(RecordingsListView).videoView.hidden = NO; - } else { - VIEW(RecordingsListView).videoView.hidden = YES; - } - break; - case LinphonePlayerPlaying: - NSLog(@"Pause"); - [_playButton setTitle:@"" forState:UIControlStateNormal]; - [_playButton setImage:[UIImage imageFromSystemBarButton:UIBarButtonSystemItemPlay:[UIColor blackColor]] forState:UIControlStateNormal]; - linphone_player_pause(player); - break; - } - [self update]; -} - -- (IBAction)onStop:(id)sender { - NSLog(@"Stop"); - linphone_player_pause(player); - linphone_player_seek(player, 0); - eofReached = NO; - [_playButton setTitle:@"" forState:UIControlStateNormal]; - [_playButton setImage:[UIImage imageFromSystemBarButton:UIBarButtonSystemItemPlay:[UIColor blackColor]] forState:UIControlStateNormal]; - _timeProgress.progress = 0; - [self updateTimeLabel:0]; -} - -- (IBAction)onTapTimeBar:(UITapGestureRecognizer *)sender { - if (sender.state != UIGestureRecognizerStateEnded) - return; - CGPoint loc = [sender locationInView:self.view]; - CGPoint timeLoc = _timeProgress.frame.origin; - CGSize timeSize = _timeProgress.frame.size; - if (loc.x >= timeLoc.x && loc.x <= timeLoc.x + timeSize.width && loc.y >= timeLoc.y - 10 && loc.y <= timeLoc.y + timeSize.height + 10) { - float progress = (loc.x - timeLoc.x) / timeSize.width; - _timeProgress.progress = progress; - [self updateTimeLabel:(int)(progress * duration)]; - linphone_player_seek(player, (int)(progress * duration)); - } -} -@end diff --git a/Classes/LinphoneUI/UILinphoneAudioPlayer.xib b/Classes/LinphoneUI/UILinphoneAudioPlayer.xib deleted file mode 100644 index 3e7e29729..000000000 --- a/Classes/LinphoneUI/UILinphoneAudioPlayer.xib +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/LinphoneUI/UILoadingImageView.h b/Classes/LinphoneUI/UILoadingImageView.h deleted file mode 100644 index a3746b356..000000000 --- a/Classes/LinphoneUI/UILoadingImageView.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import -#import - -@interface UILoadingImageView : UIImageView - - -- (void)startLoading; -- (BOOL)isLoading; -- (void)stopLoading; - -@property(nonatomic, strong) PHAsset *asset; -@property (nonatomic, readonly) IBOutlet UIActivityIndicatorView *waitIndicatorView; - -@end diff --git a/Classes/LinphoneUI/UILoadingImageView.m b/Classes/LinphoneUI/UILoadingImageView.m deleted file mode 100644 index 21bfa1c48..000000000 --- a/Classes/LinphoneUI/UILoadingImageView.m +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UILoadingImageView.h" - -@implementation UILoadingImageView - -@synthesize waitIndicatorView; - -#pragma mark - Lifecycle Functions - -- (void)initUIRemoteImageView { - waitIndicatorView = - [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; - waitIndicatorView.hidesWhenStopped = TRUE; - waitIndicatorView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | - UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin; - waitIndicatorView.center = self.center; - [self addSubview:waitIndicatorView]; -} - -- (id)init { - self = [super init]; - if (self != nil) { - [self initUIRemoteImageView]; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)aDecoder { - self = [super initWithCoder:aDecoder]; - if (self != nil) { - [self initUIRemoteImageView]; - } - return self; -} - -- (id)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self != nil) { - [self initUIRemoteImageView]; - } - return self; -} - -- (id)initWithImage:(UIImage *)image { - self = [super initWithImage:image]; - if (self != nil) { - [self initUIRemoteImageView]; - } - return self; -} - -- (id)initWithImage:(UIImage *)image highlightedImage:(UIImage *)highlightedImage { - self = [super initWithImage:image highlightedImage:highlightedImage]; - if (self != nil) { - [self initUIRemoteImageView]; - } - return self; -} - -#pragma mark - - -- (void)startLoading { - [waitIndicatorView startAnimating]; -} - -- (void)stopLoading { - - [waitIndicatorView stopAnimating]; -} - -- (BOOL)isLoading { - return [waitIndicatorView isAnimating]; -} - -@end diff --git a/Classes/LinphoneUI/UIRecordingCell.h b/Classes/LinphoneUI/UIRecordingCell.h deleted file mode 100644 index 37a9bd458..000000000 --- a/Classes/LinphoneUI/UIRecordingCell.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -@interface UIRecordingCell : UITableViewCell - -@property (weak, nonatomic) IBOutlet UIView *playerView; -@property (weak, nonatomic) IBOutlet UILabel *nameLabel; -@property (strong, nonatomic) IBOutlet UIToolbar *toolbar; -@property (weak, nonatomic) IBOutlet UIBarButtonItem *shareButton; -@property(nonatomic, assign) __block NSString *recording; - -- (id)initWithIdentifier:(NSString*)identifier; - -- (void)updateFrame; - -@end diff --git a/Classes/LinphoneUI/UIRecordingCell.m b/Classes/LinphoneUI/UIRecordingCell.m deleted file mode 100644 index d0492af7e..000000000 --- a/Classes/LinphoneUI/UIRecordingCell.m +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIRecordingCell.h" -#import "PhoneMainView.h" -#import "UILabel+Boldify.h" -#import "Utils.h" -#import "UILinphoneAudioPlayer.h" - -@implementation UIRecordingCell - -static UILinphoneAudioPlayer *player; - -#pragma mark - Lifecycle Functions -/* - * TODO: - * - When we scroll past a selected row, the player loads incorrectly (no buttons). Probably a problem in the player code. - * - mkv recording is probably buggy, wrong eof. wav playing works but does not display the length/timestamp. - * - The share button is greyed out when not clicking it. idk why, it's really weird. -*/ -- (id)initWithIdentifier:(NSString *)identifier { - if ((self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier])) { - NSArray *arrayOfViews = - [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil]; - - // resize cell to match .nib size. It is needed when resized the cell to - // correctly adapt its height too - UIRecordingCell *sub = [arrayOfViews objectAtIndex:0]; - [self setFrame:CGRectMake(0, 0, sub.frame.size.width, 40)]; - self = sub; - self.recording = NULL; - _shareButton.target = self; - _shareButton.action = @selector(onShareButtonPressed); - } - return self; -} - -- (void)dealloc { - self.recording = NULL; - [NSNotificationCenter.defaultCenter removeObserver:self]; -} - -#pragma mark - Property Functions - -- (void)setRecording:(NSString *)arecording { - _recording = arecording; - if(_recording) { - NSArray *parsedRecording = [LinphoneUtils parseRecordingName:_recording]; - NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; - [dateFormat setDateFormat:@"HH:mm:ss"]; - NSString *b = [[parsedRecording objectAtIndex:0] containsString:@"conf-id"] ? NSLocalizedString(@"Meeting", nil) : [parsedRecording objectAtIndex:0]; - _nameLabel.text = [[b stringByAppendingString:@" @ "] stringByAppendingString:[dateFormat stringFromDate:[parsedRecording objectAtIndex:1]]]; - } -} - -#pragma mark - - -- (NSString *)accessibilityLabel { - return _nameLabel.text; -} - -- (void)setEditing:(BOOL)editing { - [self setEditing:editing animated:FALSE]; -} - -- (void)setEditing:(BOOL)editing animated:(BOOL)animated { - if (animated) { - [UIView beginAnimations:nil context:nil]; - [UIView setAnimationDuration:0.3]; - } - if (animated) { - [UIView commitAnimations]; - } -} - -- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { - if (!VIEW(RecordingsListView).tableController.isEditing) - self.selectionStyle = UITableViewCellSelectionStyleNone; -} - -- (void)updateFrame { - CGRect frame = self.frame; - if (!self.selected) { - frame.size.height = 40; - } else { - frame.size.height = 150; - } - [self setFrame:frame]; -} - --(void)setSelected:(BOOL)selected animated:(BOOL)animated{ - [super setSelected:selected animated:animated]; - - if (!selected || (selected && VIEW(RecordingsListView).tableController.isEditing)) { - _toolbar.hidden = true; - return; - } - if (player && [player isCreated]) { - [player close]; - } - - VIEW(RecordingsListView).videoView.hidden = YES; - player = [UILinphoneAudioPlayer audioPlayerWithFilePath:[self recording]]; - - [player.view removeFromSuperview]; - [self addSubview:player.view]; - [self bringSubviewToFront:player.view]; - player.view.frame = _playerView.frame; - player.view.bounds = _playerView.bounds; - [player open]; - _toolbar.hidden = false; -} - -- (void)onShareButtonPressed { - UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:@[[NSURL fileURLWithPath:_recording]] applicationActivities:nil]; - [activityVC setCompletionWithItemsHandler:^(UIActivityType __nullable activityType, BOOL completed, NSArray * __nullable returnedItems, NSError * __nullable activityError) { - //This is used to select the same row when we get back to the recordings view. - NSString *file = player.file; - [[(RecordingsListView *)VIEW(RecordingsListView) tableController] setSelected:file]; - }]; - [PhoneMainView.instance presentViewController:activityVC animated:YES completion:nil]; -} - -@end diff --git a/Classes/LinphoneUI/UIRecordingCell.xib b/Classes/LinphoneUI/UIRecordingCell.xib deleted file mode 100644 index 4646c053d..000000000 --- a/Classes/LinphoneUI/UIRecordingCell.xib +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/LinphoneUI/UIRoundBorderedButton.h b/Classes/LinphoneUI/UIRoundBorderedButton.h deleted file mode 100644 index 5b2ad798b..000000000 --- a/Classes/LinphoneUI/UIRoundBorderedButton.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UIIconButton.h" - -@interface UIRoundBorderedButton : UIIconButton - -@end diff --git a/Classes/LinphoneUI/UIRoundBorderedButton.m b/Classes/LinphoneUI/UIRoundBorderedButton.m deleted file mode 100644 index f33161688..000000000 --- a/Classes/LinphoneUI/UIRoundBorderedButton.m +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIRoundBorderedButton.h" - -#import "Utils.h" - -@implementation UIRoundBorderedButton - -- (id)initBorders { - self.layer.borderWidth = .8; - self.layer.borderColor = [self.titleLabel.textColor CGColor]; - self.layer.cornerRadius = 4.f; - self.layer.masksToBounds = YES; - - // capitalize title (should be already done though) - UIControlState states[] = {UIControlStateNormal, - UIControlStateHighlighted, - UIControlStateSelected, - UIControlStateDisabled, - UIControlStateDisabled | UIControlStateHighlighted, - UIControlStateSelected | UIControlStateHighlighted, - UIControlStateSelected | UIControlStateDisabled}; - for (int i = 0; i < sizeof(states) / sizeof(UIControlState); i++) { - if (![[self titleForState:UIControlStateNormal] - .uppercaseString isEqualToString:[self titleForState:states[i]]]) { - [self setTitle:[[self titleForState:states[i]] uppercaseString] forState:states[i]]; - } - } - return self; -} - -- (id)init { - return [[super init] initBorders]; -} - -- (id)initWithCoder:(NSCoder *)aDecoder { - return [[super initWithCoder:aDecoder] initBorders]; -} - -- (id)initWithFrame:(CGRect)frame { - return [[super initWithFrame:frame] initBorders]; -} - -- (void)setEnabled:(BOOL)enabled { - [super setEnabled:enabled]; - self.layer.borderColor = [self.titleLabel.textColor CGColor]; -} - -- (BOOL)becomeFirstResponder { - if ([super becomeFirstResponder]) { - [LinphoneUtils findAndResignFirstResponder:self.superview]; - return YES; - } - return NO; -} - --(void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection { - self.layer.borderColor = [self.titleLabel.textColor CGColor]; -} - -@end diff --git a/Classes/LinphoneUI/UIRoundedImageView.h b/Classes/LinphoneUI/UIRoundedImageView.h deleted file mode 100644 index c949d1dd8..000000000 --- a/Classes/LinphoneUI/UIRoundedImageView.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -@interface UIRoundedImageView : UIImageView - -- (void)setImage:(UIImage *)image; -- (void)setImage:(UIImage *)image bordered:(BOOL)bordered withRoundedRadius:(BOOL)rounded; - -- (void)setBordered:(BOOL)bordered; -- (void)setRoundRadius; - -@end diff --git a/Classes/LinphoneUI/UIRoundedImageView.m b/Classes/LinphoneUI/UIRoundedImageView.m deleted file mode 100644 index 1ecc07c50..000000000 --- a/Classes/LinphoneUI/UIRoundedImageView.m +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIRoundedImageView.h" -#import -#import "Utils.h" - -@implementation UIRoundedImageView { - UIView *borderView; -} - -INIT_WITH_COMMON_CF { - borderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; - borderView.layer.borderWidth = 10; - borderView.layer.borderColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"color_A.png"]].CGColor; - borderView.hidden = YES; - [self addSubview:borderView]; - - [self setBordered:NO]; - [self setRoundRadius]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(orientationDidChange:) - name:UIDeviceOrientationDidChangeNotification - object:nil]; - return self; -} - -- (void)dealloc { - [NSNotificationCenter.defaultCenter removeObserver:self]; -} - -- (void)orientationDidChange:(NSNotification *)k { - [self setRoundRadius]; - [self layoutSubviews]; -} - -- (void)setImage:(UIImage *)image { - [self setImage:image bordered:NO withRoundedRadius:TRUE]; -} - -- (void)setImage:(UIImage *)image bordered:(BOOL)bordered withRoundedRadius:(BOOL)rounded { - // We have to scale image to layers limits so that when we round image, we have a proper circle - [super setImage:[image squareCrop]]; - [self setBordered:bordered]; - [self setRoundRadius]; -} - -- (void)setBordered:(BOOL)bordered { - // bugged on rotation yet - borderView.hidden = TRUE; //! bordered; -} -- (CGRect)computeBox { - CGFloat min = MIN(self.frame.size.width, self.frame.size.height); - CGRect box = CGRectMake((self.frame.size.width - min) / 2, (self.frame.size.height - min) / 2, min, min); - return box; -} -- (void)setRoundRadius { - CGRect box = [self computeBox]; - - borderView.frame = box; - borderView.layer.cornerRadius = borderView.frame.size.height / 2; - - CGPathRef path = CGPathCreateWithEllipseInRect(box, NULL); - UIBezierPath *maskPath = [UIBezierPath bezierPathWithCGPath:path]; - CGPathRelease(path); - CAShapeLayer *maskLayer = [CAShapeLayer layer]; - maskLayer.frame = self.bounds; - maskLayer.path = maskPath.CGPath; - self.layer.mask = maskLayer; -} - -- (void)layoutSubviews { - [super layoutSubviews]; - borderView.frame = [self computeBox]; - borderView.layer.cornerRadius = borderView.frame.size.height / 2; -} -@end diff --git a/Classes/LinphoneUI/UIShopTableCell.h b/Classes/LinphoneUI/UIShopTableCell.h deleted file mode 100644 index c51159165..000000000 --- a/Classes/LinphoneUI/UIShopTableCell.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -@interface UIShopTableCell : UITableViewCell - -@property(nonatomic, strong) IBOutlet UILabel *nameLabel; -@property(nonatomic, strong) IBOutlet UILabel *descriptionLabel; -@property(weak, nonatomic) IBOutlet UIImageView *linphoneImage; -@property(weak, nonatomic) IBOutlet UIImageView *infoImage; - -- (id)initWithIdentifier:(NSString *)identifier; - -@end diff --git a/Classes/LinphoneUI/UIShopTableCell.m b/Classes/LinphoneUI/UIShopTableCell.m deleted file mode 100644 index 287014128..000000000 --- a/Classes/LinphoneUI/UIShopTableCell.m +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIShopTableCell.h" -#import "Utils.h" -#import "UILabel+Boldify.h" -#import "PhoneMainView.h" - -@implementation UIShopTableCell - -UILabel *nameLabel; -UILabel *descriptionLabel; -UIImageView *linphoneImage; -UIImageView *infoImage; - -#pragma mark - Lifecycle Functions - -- (id)initWithIdentifier:(NSString *)identifier { - if ((self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]) != nil) { - NSArray *arrayOfViews = - [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil]; - - // resize cell to match .nib size. It is needed when resized the cell to - // correctly adapt its height too - UIView *sub = ((UIView *)[arrayOfViews objectAtIndex:0]); - [self setFrame:CGRectMake(0, 0, sub.frame.size.width, sub.frame.size.height)]; - [self addSubview:sub]; - - // Sections are wider on iPad and overlap linphone image - let's move it a bit - if (IPAD) { - CGRect frame = _linphoneImage.frame; - frame.origin.x -= frame.size.width / 2; - _linphoneImage.frame = frame; - } - } - return self; -} - -#pragma mark - - -- (IBAction)onDetails:(id)event { - NSString *msg = [NSString stringWithFormat:@"Product - %@", self.nameLabel.text]; - UIAlertController *errView = [UIAlertController alertControllerWithTitle:msg - message:self.descriptionLabel.text - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; -} - -- (void)touchUp:(id)sender { - [self setHighlighted:true animated:true]; -} - -- (void)touchDown:(id)sender { - [self setHighlighted:false animated:true]; -} - -- (NSString *)accessibilityLabel { - return _nameLabel.text; -} - -- (void)setEditing:(BOOL)editing { - [self setEditing:editing animated:FALSE]; -} - -- (void)setEditing:(BOOL)editing animated:(BOOL)animated { - if (animated) { - [UIView beginAnimations:nil context:nil]; - [UIView setAnimationDuration:0.3]; - } - _linphoneImage.alpha = editing ? 0 : 1; - if (animated) { - [UIView commitAnimations]; - } -} - -@end diff --git a/Classes/LinphoneUI/UIShopTableCell.xib b/Classes/LinphoneUI/UIShopTableCell.xib deleted file mode 100644 index 07077ffab..000000000 --- a/Classes/LinphoneUI/UIShopTableCell.xib +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/LinphoneUI/UITextField+DoneButton.h b/Classes/LinphoneUI/UITextField+DoneButton.h deleted file mode 100644 index c5372b9ad..000000000 --- a/Classes/LinphoneUI/UITextField+DoneButton.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import - -@interface UITextField (DoneButton) -- (void)addDoneButton; -@end diff --git a/Classes/LinphoneUI/UITextField+DoneButton.m b/Classes/LinphoneUI/UITextField+DoneButton.m deleted file mode 100644 index 08999e854..000000000 --- a/Classes/LinphoneUI/UITextField+DoneButton.m +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UITextField+DoneButton.h" - -#import "LinphoneManager.h" - -@implementation UITextField (DoneButton) - -- (void)addDoneButton { - // actually on iPad there is a done button - if (!IPAD) { - UIToolbar *numberToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 50)]; - numberToolbar.items = [NSArray - arrayWithObjects:[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Cancel", nil) - style:UIBarButtonItemStyleBordered - target:self - action:@selector(cancelNumberPad)], - [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace - target:nil - action:nil], - [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Done", nil) - style:UIBarButtonItemStyleDone - target:self - action:@selector(doneWithNumberPad)], - nil]; - [numberToolbar sizeToFit]; - - self.inputAccessoryView = numberToolbar; - } -} - -- (void)cancelNumberPad { - [self resignFirstResponder]; - self.text = @""; -} - -- (void)doneWithNumberPad { - [self resignFirstResponder]; -} -@end diff --git a/Classes/LinphoneUI/UITextViewNoDefine.h b/Classes/LinphoneUI/UITextViewNoDefine.h deleted file mode 100644 index cc370c6d1..000000000 --- a/Classes/LinphoneUI/UITextViewNoDefine.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -@interface UITextViewNoDefine : UITextView - -@property BOOL allowSelectAll; - -@end diff --git a/Classes/LinphoneUI/UITextViewNoDefine.m b/Classes/LinphoneUI/UITextViewNoDefine.m deleted file mode 100644 index 023852314..000000000 --- a/Classes/LinphoneUI/UITextViewNoDefine.m +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UITextViewNoDefine.h" - -@implementation UITextViewNoDefine - -@synthesize allowSelectAll; - --(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/LinphoneUI/UIToggleButton.h b/Classes/LinphoneUI/UIToggleButton.h deleted file mode 100644 index f06204c6e..000000000 --- a/Classes/LinphoneUI/UIToggleButton.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UIIconButton.h" - -@protocol UIToggleButtonDelegate - - (void)onOn; - - (void)onOff; - - (bool)onUpdate; -@end - -@interface UIToggleButton : UIButton { -} - -- (bool)update; -- (void)setOn; -- (void)setOff; -- (bool)toggle; - -@end diff --git a/Classes/LinphoneUI/UIToggleButton.m b/Classes/LinphoneUI/UIToggleButton.m deleted file mode 100644 index 63c13f691..000000000 --- a/Classes/LinphoneUI/UIToggleButton.m +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "UIToggleButton.h" - -@implementation UIToggleButton - -#pragma mark - Lifecycle Functions - -- (void)initUIToggleButton { - [self update]; - [self addTarget:self action:@selector(touchUp:) forControlEvents:UIControlEventTouchUpInside]; -} - -- (id)init { - self = [super init]; - if (self) { - [self initUIToggleButton]; - } - return self; -} - -- (id)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - [self initUIToggleButton]; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)decoder { - self = [super initWithCoder:decoder]; - if (self) { - [self initUIToggleButton]; - } - return self; -} -#pragma mark - - -- (void)touchUp:(id)sender { - [self toggle]; -} - -- (bool)toggle { - if (self.selected) { - self.selected = !self.selected; - [self onOff]; - } else { - self.selected = !self.selected; - [self onOn]; - } - return self.selected; -} - -- (void)setOn { - if (!self.selected) { - [self toggle]; - } -} - -- (void)setOff { - if (self.selected) { - [self toggle]; - } -} - -- (bool)update { - self.selected = [self onUpdate]; - return self.selected; -} - -#pragma mark - UIToggleButtonDelegate Functions - -- (void)onOn { - /*[NSException raise:NSInternalInconsistencyException - format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)];*/ -} - -- (void)onOff { - /*[NSException raise:NSInternalInconsistencyException - format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)];*/ -} - -- (bool)onUpdate { - /*[NSException raise:NSInternalInconsistencyException - format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)];*/ - return false; -} - -@end diff --git a/Classes/LinphoneUI/ar.lproj/StatusBarView.strings b/Classes/LinphoneUI/ar.lproj/StatusBarView.strings deleted file mode 100644 index cc48f6aa8..000000000 Binary files a/Classes/LinphoneUI/ar.lproj/StatusBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ar.lproj/TabBarView.strings b/Classes/LinphoneUI/ar.lproj/TabBarView.strings deleted file mode 100644 index f25d2a044..000000000 Binary files a/Classes/LinphoneUI/ar.lproj/TabBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ar.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/ar.lproj/UICallConferenceCell.strings deleted file mode 100644 index 6a3f24223..000000000 Binary files a/Classes/LinphoneUI/ar.lproj/UICallConferenceCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ar.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/ar.lproj/UICallPausedCell.strings deleted file mode 100644 index 2bdc4c562..000000000 Binary files a/Classes/LinphoneUI/ar.lproj/UICallPausedCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ar.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/ar.lproj/UIChatBubblePhotoCell.strings deleted file mode 100644 index 8460ae012..000000000 Binary files a/Classes/LinphoneUI/ar.lproj/UIChatBubblePhotoCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ar.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/ar.lproj/UIChatBubbleTextCell.strings deleted file mode 100644 index 7cfb33387..000000000 Binary files a/Classes/LinphoneUI/ar.lproj/UIChatBubbleTextCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ar.lproj/UIChatCell.strings b/Classes/LinphoneUI/ar.lproj/UIChatCell.strings deleted file mode 100644 index 033313d54..000000000 Binary files a/Classes/LinphoneUI/ar.lproj/UIChatCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ar.lproj/UIChatConversationImdnTableViewCell.strings b/Classes/LinphoneUI/ar.lproj/UIChatConversationImdnTableViewCell.strings deleted file mode 100644 index 7d73096c3..000000000 Binary files a/Classes/LinphoneUI/ar.lproj/UIChatConversationImdnTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ar.lproj/UIChatConversationInfoTableViewCell.strings b/Classes/LinphoneUI/ar.lproj/UIChatConversationInfoTableViewCell.strings deleted file mode 100644 index ebf55e5ab..000000000 Binary files a/Classes/LinphoneUI/ar.lproj/UIChatConversationInfoTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ar.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/ar.lproj/UIChatCreateCell.strings deleted file mode 100644 index 341ac5841..000000000 Binary files a/Classes/LinphoneUI/ar.lproj/UIChatCreateCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ar.lproj/UIChatCreateCollectionViewCell.strings b/Classes/LinphoneUI/ar.lproj/UIChatCreateCollectionViewCell.strings deleted file mode 100644 index 4ce79bd40..000000000 Binary files a/Classes/LinphoneUI/ar.lproj/UIChatCreateCollectionViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ar.lproj/UICompositeView.strings b/Classes/LinphoneUI/ar.lproj/UICompositeView.strings deleted file mode 100644 index e69de29bb..000000000 diff --git a/Classes/LinphoneUI/ar.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/ar.lproj/UIConfirmationDialog.strings deleted file mode 100644 index 74a766b08..000000000 Binary files a/Classes/LinphoneUI/ar.lproj/UIConfirmationDialog.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ar.lproj/UIContactCell.strings b/Classes/LinphoneUI/ar.lproj/UIContactCell.strings deleted file mode 100644 index fda1daa5c..000000000 Binary files a/Classes/LinphoneUI/ar.lproj/UIContactCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ar.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/ar.lproj/UIContactDetailsCell.strings deleted file mode 100644 index 3532146a4..000000000 Binary files a/Classes/LinphoneUI/ar.lproj/UIContactDetailsCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ar.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/ar.lproj/UIHistoryCell.strings deleted file mode 100644 index 589abcd1b..000000000 Binary files a/Classes/LinphoneUI/ar.lproj/UIHistoryCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/cs.lproj/StatusBarView.strings b/Classes/LinphoneUI/cs.lproj/StatusBarView.strings deleted file mode 100644 index d42f8aa88..000000000 Binary files a/Classes/LinphoneUI/cs.lproj/StatusBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/cs.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/cs.lproj/UICallConferenceCell.strings deleted file mode 100644 index 4c2cd3ced..000000000 Binary files a/Classes/LinphoneUI/cs.lproj/UICallConferenceCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/cs.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/cs.lproj/UICallPausedCell.strings deleted file mode 100644 index 2fea9e515..000000000 Binary files a/Classes/LinphoneUI/cs.lproj/UICallPausedCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/cs.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/cs.lproj/UIChatBubblePhotoCell.strings deleted file mode 100644 index 22d199321..000000000 Binary files a/Classes/LinphoneUI/cs.lproj/UIChatBubblePhotoCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/cs.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/cs.lproj/UIChatBubbleTextCell.strings deleted file mode 100644 index 9454fe87f..000000000 Binary files a/Classes/LinphoneUI/cs.lproj/UIChatBubbleTextCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/cs.lproj/UIChatCell.strings b/Classes/LinphoneUI/cs.lproj/UIChatCell.strings deleted file mode 100644 index 390ec8d16..000000000 Binary files a/Classes/LinphoneUI/cs.lproj/UIChatCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/cs.lproj/UIChatConversationImdnTableViewCell.strings b/Classes/LinphoneUI/cs.lproj/UIChatConversationImdnTableViewCell.strings deleted file mode 100644 index 7b9d17108..000000000 Binary files a/Classes/LinphoneUI/cs.lproj/UIChatConversationImdnTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/cs.lproj/UIChatConversationInfoTableViewCell.strings b/Classes/LinphoneUI/cs.lproj/UIChatConversationInfoTableViewCell.strings deleted file mode 100644 index a4c11bafe..000000000 Binary files a/Classes/LinphoneUI/cs.lproj/UIChatConversationInfoTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/cs.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/cs.lproj/UIContactDetailsCell.strings deleted file mode 100644 index 325fc8cc0..000000000 Binary files a/Classes/LinphoneUI/cs.lproj/UIContactDetailsCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/de.lproj/StatusBarView.strings b/Classes/LinphoneUI/de.lproj/StatusBarView.strings deleted file mode 100644 index cc88620b7..000000000 Binary files a/Classes/LinphoneUI/de.lproj/StatusBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/de.lproj/TabBarView.strings b/Classes/LinphoneUI/de.lproj/TabBarView.strings deleted file mode 100644 index a4002c3a8..000000000 Binary files a/Classes/LinphoneUI/de.lproj/TabBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/de.lproj/UICallCell.strings b/Classes/LinphoneUI/de.lproj/UICallCell.strings deleted file mode 100644 index 3329cc3f6..000000000 Binary files a/Classes/LinphoneUI/de.lproj/UICallCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/de.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/de.lproj/UICallConferenceCell.strings deleted file mode 100644 index 16e672aa2..000000000 Binary files a/Classes/LinphoneUI/de.lproj/UICallConferenceCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/de.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/de.lproj/UICallPausedCell.strings deleted file mode 100644 index 1230f3af0..000000000 Binary files a/Classes/LinphoneUI/de.lproj/UICallPausedCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/de.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/de.lproj/UIChatBubblePhotoCell.strings deleted file mode 100644 index b605a995d..000000000 Binary files a/Classes/LinphoneUI/de.lproj/UIChatBubblePhotoCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/de.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/de.lproj/UIChatBubbleTextCell.strings deleted file mode 100644 index 8d4b51f36..000000000 Binary files a/Classes/LinphoneUI/de.lproj/UIChatBubbleTextCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/de.lproj/UIChatCell.strings b/Classes/LinphoneUI/de.lproj/UIChatCell.strings deleted file mode 100644 index 687a0d86e..000000000 Binary files a/Classes/LinphoneUI/de.lproj/UIChatCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/de.lproj/UIChatConversationImdnTableViewCell.strings b/Classes/LinphoneUI/de.lproj/UIChatConversationImdnTableViewCell.strings deleted file mode 100644 index c2f9a76ab..000000000 Binary files a/Classes/LinphoneUI/de.lproj/UIChatConversationImdnTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/de.lproj/UIChatConversationInfoTableViewCell.strings b/Classes/LinphoneUI/de.lproj/UIChatConversationInfoTableViewCell.strings deleted file mode 100644 index 86c2316ff..000000000 Binary files a/Classes/LinphoneUI/de.lproj/UIChatConversationInfoTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/de.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/de.lproj/UIChatCreateCell.strings deleted file mode 100644 index 25adeb24d..000000000 Binary files a/Classes/LinphoneUI/de.lproj/UIChatCreateCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/de.lproj/UIChatCreateCollectionViewCell.strings b/Classes/LinphoneUI/de.lproj/UIChatCreateCollectionViewCell.strings deleted file mode 100644 index 653fdef7d..000000000 Binary files a/Classes/LinphoneUI/de.lproj/UIChatCreateCollectionViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/de.lproj/UIChatRoomCell.strings b/Classes/LinphoneUI/de.lproj/UIChatRoomCell.strings deleted file mode 100644 index e2110e9a8..000000000 Binary files a/Classes/LinphoneUI/de.lproj/UIChatRoomCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/de.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/de.lproj/UIConfirmationDialog.strings deleted file mode 100644 index 174ca40f2..000000000 Binary files a/Classes/LinphoneUI/de.lproj/UIConfirmationDialog.strings and /dev/null differ diff --git a/Classes/LinphoneUI/de.lproj/UIContactCell.strings b/Classes/LinphoneUI/de.lproj/UIContactCell.strings deleted file mode 100644 index 76b3b42f2..000000000 Binary files a/Classes/LinphoneUI/de.lproj/UIContactCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/de.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/de.lproj/UIContactDetailsCell.strings deleted file mode 100644 index b2960f6e8..000000000 Binary files a/Classes/LinphoneUI/de.lproj/UIContactDetailsCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/de.lproj/UIContactDetailsFooter.strings b/Classes/LinphoneUI/de.lproj/UIContactDetailsFooter.strings deleted file mode 100644 index 9dc62be3d..000000000 Binary files a/Classes/LinphoneUI/de.lproj/UIContactDetailsFooter.strings and /dev/null differ diff --git a/Classes/LinphoneUI/de.lproj/UIContactDetailsHeader.strings b/Classes/LinphoneUI/de.lproj/UIContactDetailsHeader.strings deleted file mode 100644 index 8ec7e8bdb..000000000 Binary files a/Classes/LinphoneUI/de.lproj/UIContactDetailsHeader.strings and /dev/null differ diff --git a/Classes/LinphoneUI/de.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/de.lproj/UIHistoryCell.strings deleted file mode 100644 index 262639846..000000000 Binary files a/Classes/LinphoneUI/de.lproj/UIHistoryCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/de.lproj/UIMainBar.strings b/Classes/LinphoneUI/de.lproj/UIMainBar.strings deleted file mode 100644 index 1396b82fd..000000000 Binary files a/Classes/LinphoneUI/de.lproj/UIMainBar.strings and /dev/null differ diff --git a/Classes/LinphoneUI/de.lproj/UIMainBar~ipad.strings b/Classes/LinphoneUI/de.lproj/UIMainBar~ipad.strings deleted file mode 100644 index f5c0b2c61..000000000 Binary files a/Classes/LinphoneUI/de.lproj/UIMainBar~ipad.strings and /dev/null differ diff --git a/Classes/LinphoneUI/de.lproj/UIStateBar.strings b/Classes/LinphoneUI/de.lproj/UIStateBar.strings deleted file mode 100644 index 8be33cdc4..000000000 Binary files a/Classes/LinphoneUI/de.lproj/UIStateBar.strings and /dev/null differ diff --git a/Classes/LinphoneUI/en.lproj/UIChatReplyBubbleView.strings b/Classes/LinphoneUI/en.lproj/UIChatReplyBubbleView.strings deleted file mode 100644 index cfa28ba85..000000000 --- a/Classes/LinphoneUI/en.lproj/UIChatReplyBubbleView.strings +++ /dev/null @@ -1,9 +0,0 @@ - -/* Class = "UILabel"; text = "Original message removed"; ObjectID = "B26-sw-o4w"; */ -"B26-sw-o4w.text" = "Original message does not exist anymore."; - -/* Class = "UILabel"; text = "Label"; ObjectID = "Czc-VH-qiH"; */ -"Czc-VH-qiH.text" = "Label"; - -/* Class = "UILabel"; text = "Label"; ObjectID = "uuW-tW-1Sj"; */ -"uuW-tW-1Sj.text" = "Label"; diff --git a/Classes/LinphoneUI/es.lproj/StatusBarView.strings b/Classes/LinphoneUI/es.lproj/StatusBarView.strings deleted file mode 100644 index 49754b1a6..000000000 Binary files a/Classes/LinphoneUI/es.lproj/StatusBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es.lproj/TabBarView.strings b/Classes/LinphoneUI/es.lproj/TabBarView.strings deleted file mode 100644 index 555cc1b0c..000000000 Binary files a/Classes/LinphoneUI/es.lproj/TabBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/es.lproj/UICallConferenceCell.strings deleted file mode 100644 index 729c7f8c0..000000000 Binary files a/Classes/LinphoneUI/es.lproj/UICallConferenceCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/es.lproj/UICallPausedCell.strings deleted file mode 100644 index 33049fc41..000000000 Binary files a/Classes/LinphoneUI/es.lproj/UICallPausedCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/es.lproj/UIChatBubblePhotoCell.strings deleted file mode 100644 index e41dd9fdb..000000000 Binary files a/Classes/LinphoneUI/es.lproj/UIChatBubblePhotoCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/es.lproj/UIChatBubbleTextCell.strings deleted file mode 100644 index 9ae512e79..000000000 Binary files a/Classes/LinphoneUI/es.lproj/UIChatBubbleTextCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es.lproj/UIChatCell.strings b/Classes/LinphoneUI/es.lproj/UIChatCell.strings deleted file mode 100644 index eedfd842e..000000000 Binary files a/Classes/LinphoneUI/es.lproj/UIChatCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es.lproj/UIChatConversationImdnTableViewCell.strings b/Classes/LinphoneUI/es.lproj/UIChatConversationImdnTableViewCell.strings deleted file mode 100644 index 8cbe239ca..000000000 Binary files a/Classes/LinphoneUI/es.lproj/UIChatConversationImdnTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es.lproj/UIChatConversationInfoTableViewCell.strings b/Classes/LinphoneUI/es.lproj/UIChatConversationInfoTableViewCell.strings deleted file mode 100644 index 94264b3c4..000000000 Binary files a/Classes/LinphoneUI/es.lproj/UIChatConversationInfoTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/es.lproj/UIChatCreateCell.strings deleted file mode 100644 index 2c2a4ba7f..000000000 Binary files a/Classes/LinphoneUI/es.lproj/UIChatCreateCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es.lproj/UIChatCreateCollectionViewCell.strings b/Classes/LinphoneUI/es.lproj/UIChatCreateCollectionViewCell.strings deleted file mode 100644 index c4186dcaa..000000000 Binary files a/Classes/LinphoneUI/es.lproj/UIChatCreateCollectionViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/es.lproj/UIConfirmationDialog.strings deleted file mode 100644 index 38f3ebc91..000000000 Binary files a/Classes/LinphoneUI/es.lproj/UIConfirmationDialog.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es.lproj/UIContactCell.strings b/Classes/LinphoneUI/es.lproj/UIContactCell.strings deleted file mode 100644 index db608de43..000000000 Binary files a/Classes/LinphoneUI/es.lproj/UIContactCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/es.lproj/UIContactDetailsCell.strings deleted file mode 100644 index 124adfeaf..000000000 Binary files a/Classes/LinphoneUI/es.lproj/UIContactDetailsCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/es.lproj/UIHistoryCell.strings deleted file mode 100644 index 3453ea541..000000000 Binary files a/Classes/LinphoneUI/es.lproj/UIHistoryCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es_AR.lproj/StatusBarView.strings b/Classes/LinphoneUI/es_AR.lproj/StatusBarView.strings deleted file mode 100644 index 49754b1a6..000000000 Binary files a/Classes/LinphoneUI/es_AR.lproj/StatusBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es_AR.lproj/TabBarView.strings b/Classes/LinphoneUI/es_AR.lproj/TabBarView.strings deleted file mode 100644 index 555cc1b0c..000000000 Binary files a/Classes/LinphoneUI/es_AR.lproj/TabBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/es_AR.lproj/UICallConferenceCell.strings deleted file mode 100644 index 729c7f8c0..000000000 Binary files a/Classes/LinphoneUI/es_AR.lproj/UICallConferenceCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/es_AR.lproj/UICallPausedCell.strings deleted file mode 100644 index 33049fc41..000000000 Binary files a/Classes/LinphoneUI/es_AR.lproj/UICallPausedCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/es_AR.lproj/UIChatBubblePhotoCell.strings deleted file mode 100644 index e41dd9fdb..000000000 Binary files a/Classes/LinphoneUI/es_AR.lproj/UIChatBubblePhotoCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/es_AR.lproj/UIChatBubbleTextCell.strings deleted file mode 100644 index 9ae512e79..000000000 Binary files a/Classes/LinphoneUI/es_AR.lproj/UIChatBubbleTextCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UIChatCell.strings b/Classes/LinphoneUI/es_AR.lproj/UIChatCell.strings deleted file mode 100644 index eedfd842e..000000000 Binary files a/Classes/LinphoneUI/es_AR.lproj/UIChatCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UIChatConversationImdnTableViewCell.strings b/Classes/LinphoneUI/es_AR.lproj/UIChatConversationImdnTableViewCell.strings deleted file mode 100644 index 60ac30453..000000000 Binary files a/Classes/LinphoneUI/es_AR.lproj/UIChatConversationImdnTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UIChatConversationInfoTableViewCell.strings b/Classes/LinphoneUI/es_AR.lproj/UIChatConversationInfoTableViewCell.strings deleted file mode 100644 index 03b52b524..000000000 Binary files a/Classes/LinphoneUI/es_AR.lproj/UIChatConversationInfoTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/es_AR.lproj/UIChatCreateCell.strings deleted file mode 100644 index 2c2a4ba7f..000000000 Binary files a/Classes/LinphoneUI/es_AR.lproj/UIChatCreateCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UIChatCreateCollectionViewCell.strings b/Classes/LinphoneUI/es_AR.lproj/UIChatCreateCollectionViewCell.strings deleted file mode 100644 index c4186dcaa..000000000 Binary files a/Classes/LinphoneUI/es_AR.lproj/UIChatCreateCollectionViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/es_AR.lproj/UIConfirmationDialog.strings deleted file mode 100644 index 38f3ebc91..000000000 Binary files a/Classes/LinphoneUI/es_AR.lproj/UIConfirmationDialog.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UIContactCell.strings b/Classes/LinphoneUI/es_AR.lproj/UIContactCell.strings deleted file mode 100644 index db608de43..000000000 Binary files a/Classes/LinphoneUI/es_AR.lproj/UIContactCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/es_AR.lproj/UIContactDetailsCell.strings deleted file mode 100644 index 124adfeaf..000000000 Binary files a/Classes/LinphoneUI/es_AR.lproj/UIContactDetailsCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/es_AR.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/es_AR.lproj/UIHistoryCell.strings deleted file mode 100644 index 3453ea541..000000000 Binary files a/Classes/LinphoneUI/es_AR.lproj/UIHistoryCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/fr.lproj/StatusBarView.strings b/Classes/LinphoneUI/fr.lproj/StatusBarView.strings deleted file mode 100644 index 332db0f25..000000000 Binary files a/Classes/LinphoneUI/fr.lproj/StatusBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/fr.lproj/TabBarView.strings b/Classes/LinphoneUI/fr.lproj/TabBarView.strings deleted file mode 100644 index 4c42c1561..000000000 Binary files a/Classes/LinphoneUI/fr.lproj/TabBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/fr.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/fr.lproj/UIChatBubblePhotoCell.strings deleted file mode 100644 index 2959335b4..000000000 Binary files a/Classes/LinphoneUI/fr.lproj/UIChatBubblePhotoCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/fr.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/fr.lproj/UIChatBubbleTextCell.strings deleted file mode 100644 index 68e6fff9a..000000000 Binary files a/Classes/LinphoneUI/fr.lproj/UIChatBubbleTextCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/fr.lproj/UIChatCell.strings b/Classes/LinphoneUI/fr.lproj/UIChatCell.strings deleted file mode 100644 index 0caff72dc..000000000 Binary files a/Classes/LinphoneUI/fr.lproj/UIChatCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/fr.lproj/UIChatConversationImdnTableViewCell.strings b/Classes/LinphoneUI/fr.lproj/UIChatConversationImdnTableViewCell.strings deleted file mode 100644 index 373495d24..000000000 Binary files a/Classes/LinphoneUI/fr.lproj/UIChatConversationImdnTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/fr.lproj/UIChatConversationInfoTableViewCell.strings b/Classes/LinphoneUI/fr.lproj/UIChatConversationInfoTableViewCell.strings deleted file mode 100644 index 6eacd195d..000000000 Binary files a/Classes/LinphoneUI/fr.lproj/UIChatConversationInfoTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/fr.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/fr.lproj/UIChatCreateCell.strings deleted file mode 100644 index 2c2a4ba7f..000000000 Binary files a/Classes/LinphoneUI/fr.lproj/UIChatCreateCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/fr.lproj/UIChatReplyBubbleView.strings b/Classes/LinphoneUI/fr.lproj/UIChatReplyBubbleView.strings deleted file mode 100644 index de5a5c443..000000000 --- a/Classes/LinphoneUI/fr.lproj/UIChatReplyBubbleView.strings +++ /dev/null @@ -1,9 +0,0 @@ - -/* Class = "UILabel"; text = "Original message removed"; ObjectID = "B26-sw-o4w"; */ -"B26-sw-o4w.text" = "Le message original n'existe plus."; - -/* Class = "UILabel"; text = "Label"; ObjectID = "Czc-VH-qiH"; */ -"Czc-VH-qiH.text" = "Label"; - -/* Class = "UILabel"; text = "Label"; ObjectID = "uuW-tW-1Sj"; */ -"uuW-tW-1Sj.text" = "Label"; diff --git a/Classes/LinphoneUI/fr.lproj/UIChatRoomCell.strings b/Classes/LinphoneUI/fr.lproj/UIChatRoomCell.strings deleted file mode 100644 index de063b598..000000000 Binary files a/Classes/LinphoneUI/fr.lproj/UIChatRoomCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/fr.lproj/UICompositeView.strings b/Classes/LinphoneUI/fr.lproj/UICompositeView.strings deleted file mode 100644 index 8b1378917..000000000 --- a/Classes/LinphoneUI/fr.lproj/UICompositeView.strings +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Classes/LinphoneUI/fr.lproj/UICompositeView~ipad.strings b/Classes/LinphoneUI/fr.lproj/UICompositeView~ipad.strings deleted file mode 100644 index 8b1378917..000000000 --- a/Classes/LinphoneUI/fr.lproj/UICompositeView~ipad.strings +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Classes/LinphoneUI/fr.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/fr.lproj/UIConfirmationDialog.strings deleted file mode 100644 index 558d67110..000000000 Binary files a/Classes/LinphoneUI/fr.lproj/UIConfirmationDialog.strings and /dev/null differ diff --git a/Classes/LinphoneUI/fr.lproj/UIContactCell.strings b/Classes/LinphoneUI/fr.lproj/UIContactCell.strings deleted file mode 100644 index 6099fa96e..000000000 Binary files a/Classes/LinphoneUI/fr.lproj/UIContactCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/fr.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/fr.lproj/UIContactDetailsCell.strings deleted file mode 100644 index 755b5bdb5..000000000 Binary files a/Classes/LinphoneUI/fr.lproj/UIContactDetailsCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/fr.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/fr.lproj/UIHistoryCell.strings deleted file mode 100644 index c0f90ab0f..000000000 Binary files a/Classes/LinphoneUI/fr.lproj/UIHistoryCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/fr.lproj/UIStateBar.strings b/Classes/LinphoneUI/fr.lproj/UIStateBar.strings deleted file mode 100644 index c1ef43fcb..000000000 Binary files a/Classes/LinphoneUI/fr.lproj/UIStateBar.strings and /dev/null differ diff --git a/Classes/LinphoneUI/hu.lproj/StatusBarView.strings b/Classes/LinphoneUI/hu.lproj/StatusBarView.strings deleted file mode 100644 index 6570de5cc..000000000 Binary files a/Classes/LinphoneUI/hu.lproj/StatusBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/hu.lproj/TabBarView.strings b/Classes/LinphoneUI/hu.lproj/TabBarView.strings deleted file mode 100644 index 194440eab..000000000 Binary files a/Classes/LinphoneUI/hu.lproj/TabBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/hu.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/hu.lproj/UIChatBubblePhotoCell.strings deleted file mode 100644 index 1b57cb0c5..000000000 Binary files a/Classes/LinphoneUI/hu.lproj/UIChatBubblePhotoCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/hu.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/hu.lproj/UIChatBubbleTextCell.strings deleted file mode 100644 index 33890946d..000000000 Binary files a/Classes/LinphoneUI/hu.lproj/UIChatBubbleTextCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/hu.lproj/UIChatCell.strings b/Classes/LinphoneUI/hu.lproj/UIChatCell.strings deleted file mode 100644 index 7f4ca4789..000000000 Binary files a/Classes/LinphoneUI/hu.lproj/UIChatCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/hu.lproj/UIChatConversationImdnTableViewCell.strings b/Classes/LinphoneUI/hu.lproj/UIChatConversationImdnTableViewCell.strings deleted file mode 100644 index 4e98cccc5..000000000 Binary files a/Classes/LinphoneUI/hu.lproj/UIChatConversationImdnTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/hu.lproj/UIChatConversationInfoTableViewCell.strings b/Classes/LinphoneUI/hu.lproj/UIChatConversationInfoTableViewCell.strings deleted file mode 100644 index c6db46701..000000000 Binary files a/Classes/LinphoneUI/hu.lproj/UIChatConversationInfoTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/hu.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/hu.lproj/UIChatCreateCell.strings deleted file mode 100644 index 30e8b1f1c..000000000 Binary files a/Classes/LinphoneUI/hu.lproj/UIChatCreateCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/hu.lproj/UICompositeView.strings b/Classes/LinphoneUI/hu.lproj/UICompositeView.strings deleted file mode 100644 index 8b1378917..000000000 --- a/Classes/LinphoneUI/hu.lproj/UICompositeView.strings +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Classes/LinphoneUI/hu.lproj/UICompositeView~ipad.strings b/Classes/LinphoneUI/hu.lproj/UICompositeView~ipad.strings deleted file mode 100644 index 8b1378917..000000000 --- a/Classes/LinphoneUI/hu.lproj/UICompositeView~ipad.strings +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Classes/LinphoneUI/hu.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/hu.lproj/UIConfirmationDialog.strings deleted file mode 100644 index 4e7b3535a..000000000 Binary files a/Classes/LinphoneUI/hu.lproj/UIConfirmationDialog.strings and /dev/null differ diff --git a/Classes/LinphoneUI/hu.lproj/UIContactCell.strings b/Classes/LinphoneUI/hu.lproj/UIContactCell.strings deleted file mode 100644 index 4766ac619..000000000 Binary files a/Classes/LinphoneUI/hu.lproj/UIContactCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/hu.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/hu.lproj/UIContactDetailsCell.strings deleted file mode 100644 index 86c3ec110..000000000 Binary files a/Classes/LinphoneUI/hu.lproj/UIContactDetailsCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/hu.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/hu.lproj/UIHistoryCell.strings deleted file mode 100644 index d7748d3ec..000000000 Binary files a/Classes/LinphoneUI/hu.lproj/UIHistoryCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/it.lproj/StatusBarView.strings b/Classes/LinphoneUI/it.lproj/StatusBarView.strings deleted file mode 100644 index fb8b02c03..000000000 Binary files a/Classes/LinphoneUI/it.lproj/StatusBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/it.lproj/TabBarView.strings b/Classes/LinphoneUI/it.lproj/TabBarView.strings deleted file mode 100644 index afb90f810..000000000 Binary files a/Classes/LinphoneUI/it.lproj/TabBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/it.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/it.lproj/UICallConferenceCell.strings deleted file mode 100644 index 80860330f..000000000 Binary files a/Classes/LinphoneUI/it.lproj/UICallConferenceCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/it.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/it.lproj/UICallPausedCell.strings deleted file mode 100644 index a1ec8e047..000000000 Binary files a/Classes/LinphoneUI/it.lproj/UICallPausedCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/it.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/it.lproj/UIChatBubblePhotoCell.strings deleted file mode 100644 index d98271300..000000000 Binary files a/Classes/LinphoneUI/it.lproj/UIChatBubblePhotoCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/it.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/it.lproj/UIChatBubbleTextCell.strings deleted file mode 100644 index 8878f1b0d..000000000 Binary files a/Classes/LinphoneUI/it.lproj/UIChatBubbleTextCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/it.lproj/UIChatCell.strings b/Classes/LinphoneUI/it.lproj/UIChatCell.strings deleted file mode 100644 index 9b38e3f6a..000000000 Binary files a/Classes/LinphoneUI/it.lproj/UIChatCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/it.lproj/UIChatConversationImdnTableViewCell.strings b/Classes/LinphoneUI/it.lproj/UIChatConversationImdnTableViewCell.strings deleted file mode 100644 index 2af25db3c..000000000 Binary files a/Classes/LinphoneUI/it.lproj/UIChatConversationImdnTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/it.lproj/UIChatConversationInfoTableViewCell.strings b/Classes/LinphoneUI/it.lproj/UIChatConversationInfoTableViewCell.strings deleted file mode 100644 index a1ca26d0c..000000000 Binary files a/Classes/LinphoneUI/it.lproj/UIChatConversationInfoTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/it.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/it.lproj/UIChatCreateCell.strings deleted file mode 100644 index 25d0f2f51..000000000 Binary files a/Classes/LinphoneUI/it.lproj/UIChatCreateCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/it.lproj/UIChatCreateCollectionViewCell.strings b/Classes/LinphoneUI/it.lproj/UIChatCreateCollectionViewCell.strings deleted file mode 100644 index 1e1e09866..000000000 Binary files a/Classes/LinphoneUI/it.lproj/UIChatCreateCollectionViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/it.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/it.lproj/UIConfirmationDialog.strings deleted file mode 100644 index 4a3571fa3..000000000 Binary files a/Classes/LinphoneUI/it.lproj/UIConfirmationDialog.strings and /dev/null differ diff --git a/Classes/LinphoneUI/it.lproj/UIContactCell.strings b/Classes/LinphoneUI/it.lproj/UIContactCell.strings deleted file mode 100644 index b34226d30..000000000 Binary files a/Classes/LinphoneUI/it.lproj/UIContactCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/it.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/it.lproj/UIContactDetailsCell.strings deleted file mode 100644 index 20f09f131..000000000 Binary files a/Classes/LinphoneUI/it.lproj/UIContactDetailsCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/it.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/it.lproj/UIHistoryCell.strings deleted file mode 100644 index fe850ab28..000000000 Binary files a/Classes/LinphoneUI/it.lproj/UIHistoryCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ja.lproj/StatusBarView.strings b/Classes/LinphoneUI/ja.lproj/StatusBarView.strings deleted file mode 100644 index e4df9ea43..000000000 Binary files a/Classes/LinphoneUI/ja.lproj/StatusBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ja.lproj/TabBarView.strings b/Classes/LinphoneUI/ja.lproj/TabBarView.strings deleted file mode 100644 index c4d9013ae..000000000 Binary files a/Classes/LinphoneUI/ja.lproj/TabBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ja.lproj/UICallCell.strings b/Classes/LinphoneUI/ja.lproj/UICallCell.strings deleted file mode 100644 index a5a987148..000000000 Binary files a/Classes/LinphoneUI/ja.lproj/UICallCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ja.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/ja.lproj/UICallConferenceCell.strings deleted file mode 100644 index 20a98486c..000000000 Binary files a/Classes/LinphoneUI/ja.lproj/UICallConferenceCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ja.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/ja.lproj/UICallPausedCell.strings deleted file mode 100644 index 860e87800..000000000 Binary files a/Classes/LinphoneUI/ja.lproj/UICallPausedCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ja.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/ja.lproj/UIChatBubblePhotoCell.strings deleted file mode 100644 index d5d576801..000000000 Binary files a/Classes/LinphoneUI/ja.lproj/UIChatBubblePhotoCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ja.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/ja.lproj/UIChatBubbleTextCell.strings deleted file mode 100644 index 3c85b2cb5..000000000 Binary files a/Classes/LinphoneUI/ja.lproj/UIChatBubbleTextCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ja.lproj/UIChatCell.strings b/Classes/LinphoneUI/ja.lproj/UIChatCell.strings deleted file mode 100644 index dbdb6124d..000000000 Binary files a/Classes/LinphoneUI/ja.lproj/UIChatCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ja.lproj/UIChatConversationImdnTableViewCell.strings b/Classes/LinphoneUI/ja.lproj/UIChatConversationImdnTableViewCell.strings deleted file mode 100644 index c88957ec4..000000000 Binary files a/Classes/LinphoneUI/ja.lproj/UIChatConversationImdnTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ja.lproj/UIChatConversationInfoTableViewCell.strings b/Classes/LinphoneUI/ja.lproj/UIChatConversationInfoTableViewCell.strings deleted file mode 100644 index ef731267f..000000000 Binary files a/Classes/LinphoneUI/ja.lproj/UIChatConversationInfoTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ja.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/ja.lproj/UIChatCreateCell.strings deleted file mode 100644 index 2c2a4ba7f..000000000 Binary files a/Classes/LinphoneUI/ja.lproj/UIChatCreateCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ja.lproj/UIChatCreateCollectionViewCell.strings b/Classes/LinphoneUI/ja.lproj/UIChatCreateCollectionViewCell.strings deleted file mode 100644 index c4186dcaa..000000000 Binary files a/Classes/LinphoneUI/ja.lproj/UIChatCreateCollectionViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ja.lproj/UIChatRoomCell.strings b/Classes/LinphoneUI/ja.lproj/UIChatRoomCell.strings deleted file mode 100644 index 1c2582d0b..000000000 Binary files a/Classes/LinphoneUI/ja.lproj/UIChatRoomCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ja.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/ja.lproj/UIConfirmationDialog.strings deleted file mode 100644 index 05c813e2b..000000000 Binary files a/Classes/LinphoneUI/ja.lproj/UIConfirmationDialog.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ja.lproj/UIContactCell.strings b/Classes/LinphoneUI/ja.lproj/UIContactCell.strings deleted file mode 100644 index d3c268b97..000000000 Binary files a/Classes/LinphoneUI/ja.lproj/UIContactCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ja.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/ja.lproj/UIContactDetailsCell.strings deleted file mode 100644 index b8c0d586b..000000000 Binary files a/Classes/LinphoneUI/ja.lproj/UIContactDetailsCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ja.lproj/UIContactDetailsFooter.strings b/Classes/LinphoneUI/ja.lproj/UIContactDetailsFooter.strings deleted file mode 100644 index c80219512..000000000 Binary files a/Classes/LinphoneUI/ja.lproj/UIContactDetailsFooter.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ja.lproj/UIContactDetailsHeader.strings b/Classes/LinphoneUI/ja.lproj/UIContactDetailsHeader.strings deleted file mode 100644 index 365a60206..000000000 Binary files a/Classes/LinphoneUI/ja.lproj/UIContactDetailsHeader.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ja.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/ja.lproj/UIHistoryCell.strings deleted file mode 100644 index ffe51fc89..000000000 Binary files a/Classes/LinphoneUI/ja.lproj/UIHistoryCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ja.lproj/UIMainBar.strings b/Classes/LinphoneUI/ja.lproj/UIMainBar.strings deleted file mode 100644 index 71c32926d..000000000 Binary files a/Classes/LinphoneUI/ja.lproj/UIMainBar.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ja.lproj/UIMainBar~ipad.strings b/Classes/LinphoneUI/ja.lproj/UIMainBar~ipad.strings deleted file mode 100644 index 8dacacba8..000000000 Binary files a/Classes/LinphoneUI/ja.lproj/UIMainBar~ipad.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ja.lproj/UIStateBar.strings b/Classes/LinphoneUI/ja.lproj/UIStateBar.strings deleted file mode 100644 index 07eaea128..000000000 Binary files a/Classes/LinphoneUI/ja.lproj/UIStateBar.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ka.lproj/StatusBarView.strings b/Classes/LinphoneUI/ka.lproj/StatusBarView.strings deleted file mode 100644 index 3999e6ae1..000000000 Binary files a/Classes/LinphoneUI/ka.lproj/StatusBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ka.lproj/TabBarView.strings b/Classes/LinphoneUI/ka.lproj/TabBarView.strings deleted file mode 100644 index e9a560b0d..000000000 Binary files a/Classes/LinphoneUI/ka.lproj/TabBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ka.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/ka.lproj/UICallConferenceCell.strings deleted file mode 100644 index c64971be4..000000000 Binary files a/Classes/LinphoneUI/ka.lproj/UICallConferenceCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ka.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/ka.lproj/UICallPausedCell.strings deleted file mode 100644 index 0f794318f..000000000 Binary files a/Classes/LinphoneUI/ka.lproj/UICallPausedCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ka.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/ka.lproj/UIChatBubblePhotoCell.strings deleted file mode 100644 index fcacb39e6..000000000 Binary files a/Classes/LinphoneUI/ka.lproj/UIChatBubblePhotoCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ka.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/ka.lproj/UIChatBubbleTextCell.strings deleted file mode 100644 index 36b6f65c2..000000000 Binary files a/Classes/LinphoneUI/ka.lproj/UIChatBubbleTextCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ka.lproj/UIChatCell.strings b/Classes/LinphoneUI/ka.lproj/UIChatCell.strings deleted file mode 100644 index 9554fe3f8..000000000 Binary files a/Classes/LinphoneUI/ka.lproj/UIChatCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ka.lproj/UIChatConversationImdnTableViewCell.strings b/Classes/LinphoneUI/ka.lproj/UIChatConversationImdnTableViewCell.strings deleted file mode 100644 index 7d9bd6946..000000000 Binary files a/Classes/LinphoneUI/ka.lproj/UIChatConversationImdnTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ka.lproj/UIChatConversationInfoTableViewCell.strings b/Classes/LinphoneUI/ka.lproj/UIChatConversationInfoTableViewCell.strings deleted file mode 100644 index 94f2cc3ea..000000000 Binary files a/Classes/LinphoneUI/ka.lproj/UIChatConversationInfoTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ka.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/ka.lproj/UIChatCreateCell.strings deleted file mode 100644 index 2c2a4ba7f..000000000 Binary files a/Classes/LinphoneUI/ka.lproj/UIChatCreateCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ka.lproj/UIChatCreateCollectionViewCell.strings b/Classes/LinphoneUI/ka.lproj/UIChatCreateCollectionViewCell.strings deleted file mode 100644 index c4186dcaa..000000000 Binary files a/Classes/LinphoneUI/ka.lproj/UIChatCreateCollectionViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ka.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/ka.lproj/UIConfirmationDialog.strings deleted file mode 100644 index 252a4a03a..000000000 Binary files a/Classes/LinphoneUI/ka.lproj/UIConfirmationDialog.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ka.lproj/UIContactCell.strings b/Classes/LinphoneUI/ka.lproj/UIContactCell.strings deleted file mode 100644 index a310dd9ea..000000000 Binary files a/Classes/LinphoneUI/ka.lproj/UIContactCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ka.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/ka.lproj/UIContactDetailsCell.strings deleted file mode 100644 index 1bf2537c6..000000000 Binary files a/Classes/LinphoneUI/ka.lproj/UIContactDetailsCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ka.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/ka.lproj/UIHistoryCell.strings deleted file mode 100644 index 7fd385e38..000000000 Binary files a/Classes/LinphoneUI/ka.lproj/UIHistoryCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/nl.lproj/StatusBarView.strings b/Classes/LinphoneUI/nl.lproj/StatusBarView.strings deleted file mode 100644 index 64396588d..000000000 Binary files a/Classes/LinphoneUI/nl.lproj/StatusBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/nl.lproj/TabBarView.strings b/Classes/LinphoneUI/nl.lproj/TabBarView.strings deleted file mode 100644 index 539a1bd73..000000000 Binary files a/Classes/LinphoneUI/nl.lproj/TabBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/nl.lproj/UICallCell.strings b/Classes/LinphoneUI/nl.lproj/UICallCell.strings deleted file mode 100644 index bc7116b5f..000000000 Binary files a/Classes/LinphoneUI/nl.lproj/UICallCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/nl.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/nl.lproj/UICallConferenceCell.strings deleted file mode 100644 index b4ef1be4e..000000000 Binary files a/Classes/LinphoneUI/nl.lproj/UICallConferenceCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/nl.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/nl.lproj/UICallPausedCell.strings deleted file mode 100644 index 15274b5ed..000000000 Binary files a/Classes/LinphoneUI/nl.lproj/UICallPausedCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/nl.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/nl.lproj/UIChatBubblePhotoCell.strings deleted file mode 100644 index 496d6fffe..000000000 Binary files a/Classes/LinphoneUI/nl.lproj/UIChatBubblePhotoCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/nl.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/nl.lproj/UIChatBubbleTextCell.strings deleted file mode 100644 index 24f415f1f..000000000 Binary files a/Classes/LinphoneUI/nl.lproj/UIChatBubbleTextCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/nl.lproj/UIChatCell.strings b/Classes/LinphoneUI/nl.lproj/UIChatCell.strings deleted file mode 100644 index e71e37f14..000000000 Binary files a/Classes/LinphoneUI/nl.lproj/UIChatCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/nl.lproj/UIChatConversationImdnTableViewCell.strings b/Classes/LinphoneUI/nl.lproj/UIChatConversationImdnTableViewCell.strings deleted file mode 100644 index 0b2176558..000000000 Binary files a/Classes/LinphoneUI/nl.lproj/UIChatConversationImdnTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/nl.lproj/UIChatConversationInfoTableViewCell.strings b/Classes/LinphoneUI/nl.lproj/UIChatConversationInfoTableViewCell.strings deleted file mode 100644 index e20c08706..000000000 Binary files a/Classes/LinphoneUI/nl.lproj/UIChatConversationInfoTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/nl.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/nl.lproj/UIChatCreateCell.strings deleted file mode 100644 index 2c2a4ba7f..000000000 Binary files a/Classes/LinphoneUI/nl.lproj/UIChatCreateCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/nl.lproj/UIChatRoomCell.strings b/Classes/LinphoneUI/nl.lproj/UIChatRoomCell.strings deleted file mode 100644 index 254e8b072..000000000 Binary files a/Classes/LinphoneUI/nl.lproj/UIChatRoomCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/nl.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/nl.lproj/UIConfirmationDialog.strings deleted file mode 100644 index b5fb5e334..000000000 Binary files a/Classes/LinphoneUI/nl.lproj/UIConfirmationDialog.strings and /dev/null differ diff --git a/Classes/LinphoneUI/nl.lproj/UIContactCell.strings b/Classes/LinphoneUI/nl.lproj/UIContactCell.strings deleted file mode 100644 index b54f1b4f4..000000000 Binary files a/Classes/LinphoneUI/nl.lproj/UIContactCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/nl.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/nl.lproj/UIContactDetailsCell.strings deleted file mode 100644 index 811247b0c..000000000 Binary files a/Classes/LinphoneUI/nl.lproj/UIContactDetailsCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/nl.lproj/UIContactDetailsFooter.strings b/Classes/LinphoneUI/nl.lproj/UIContactDetailsFooter.strings deleted file mode 100644 index 047ac0813..000000000 Binary files a/Classes/LinphoneUI/nl.lproj/UIContactDetailsFooter.strings and /dev/null differ diff --git a/Classes/LinphoneUI/nl.lproj/UIContactDetailsHeader.strings b/Classes/LinphoneUI/nl.lproj/UIContactDetailsHeader.strings deleted file mode 100644 index a2145195e..000000000 Binary files a/Classes/LinphoneUI/nl.lproj/UIContactDetailsHeader.strings and /dev/null differ diff --git a/Classes/LinphoneUI/nl.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/nl.lproj/UIHistoryCell.strings deleted file mode 100644 index bc4787143..000000000 Binary files a/Classes/LinphoneUI/nl.lproj/UIHistoryCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/nl.lproj/UIMainBar.strings b/Classes/LinphoneUI/nl.lproj/UIMainBar.strings deleted file mode 100644 index e9c155f5d..000000000 Binary files a/Classes/LinphoneUI/nl.lproj/UIMainBar.strings and /dev/null differ diff --git a/Classes/LinphoneUI/nl.lproj/UIMainBar~ipad.strings b/Classes/LinphoneUI/nl.lproj/UIMainBar~ipad.strings deleted file mode 100644 index 86a7400f9..000000000 Binary files a/Classes/LinphoneUI/nl.lproj/UIMainBar~ipad.strings and /dev/null differ diff --git a/Classes/LinphoneUI/nl.lproj/UIStateBar.strings b/Classes/LinphoneUI/nl.lproj/UIStateBar.strings deleted file mode 100644 index 9d9e3299b..000000000 Binary files a/Classes/LinphoneUI/nl.lproj/UIStateBar.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pl.lproj/StatusBarView.strings b/Classes/LinphoneUI/pl.lproj/StatusBarView.strings deleted file mode 100644 index 59c215860..000000000 Binary files a/Classes/LinphoneUI/pl.lproj/StatusBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pl.lproj/TabBarView.strings b/Classes/LinphoneUI/pl.lproj/TabBarView.strings deleted file mode 100644 index 93990593d..000000000 Binary files a/Classes/LinphoneUI/pl.lproj/TabBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pl.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/pl.lproj/UICallConferenceCell.strings deleted file mode 100644 index 573d8a763..000000000 Binary files a/Classes/LinphoneUI/pl.lproj/UICallConferenceCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pl.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/pl.lproj/UICallPausedCell.strings deleted file mode 100644 index 086d10f05..000000000 Binary files a/Classes/LinphoneUI/pl.lproj/UICallPausedCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pl.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/pl.lproj/UIChatBubblePhotoCell.strings deleted file mode 100644 index 429cac58e..000000000 Binary files a/Classes/LinphoneUI/pl.lproj/UIChatBubblePhotoCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pl.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/pl.lproj/UIChatBubbleTextCell.strings deleted file mode 100644 index f08b70ddd..000000000 Binary files a/Classes/LinphoneUI/pl.lproj/UIChatBubbleTextCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pl.lproj/UIChatCell.strings b/Classes/LinphoneUI/pl.lproj/UIChatCell.strings deleted file mode 100644 index ec8047db1..000000000 Binary files a/Classes/LinphoneUI/pl.lproj/UIChatCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pl.lproj/UIChatConversationImdnTableViewCell.strings b/Classes/LinphoneUI/pl.lproj/UIChatConversationImdnTableViewCell.strings deleted file mode 100644 index 86ed2b76d..000000000 Binary files a/Classes/LinphoneUI/pl.lproj/UIChatConversationImdnTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pl.lproj/UIChatConversationInfoTableViewCell.strings b/Classes/LinphoneUI/pl.lproj/UIChatConversationInfoTableViewCell.strings deleted file mode 100644 index 3de94ccdf..000000000 Binary files a/Classes/LinphoneUI/pl.lproj/UIChatConversationInfoTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pl.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/pl.lproj/UIChatCreateCell.strings deleted file mode 100644 index 95d5792bd..000000000 Binary files a/Classes/LinphoneUI/pl.lproj/UIChatCreateCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pl.lproj/UIChatCreateCollectionViewCell.strings b/Classes/LinphoneUI/pl.lproj/UIChatCreateCollectionViewCell.strings deleted file mode 100644 index 76f827b3d..000000000 Binary files a/Classes/LinphoneUI/pl.lproj/UIChatCreateCollectionViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pl.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/pl.lproj/UIConfirmationDialog.strings deleted file mode 100644 index 624cd0cc0..000000000 Binary files a/Classes/LinphoneUI/pl.lproj/UIConfirmationDialog.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pl.lproj/UIContactCell.strings b/Classes/LinphoneUI/pl.lproj/UIContactCell.strings deleted file mode 100644 index 97ae0a806..000000000 Binary files a/Classes/LinphoneUI/pl.lproj/UIContactCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pl.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/pl.lproj/UIContactDetailsCell.strings deleted file mode 100644 index 172a32ed2..000000000 Binary files a/Classes/LinphoneUI/pl.lproj/UIContactDetailsCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pl.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/pl.lproj/UIHistoryCell.strings deleted file mode 100644 index 17842cf13..000000000 Binary files a/Classes/LinphoneUI/pl.lproj/UIHistoryCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pt_BR.lproj/StatusBarView.strings b/Classes/LinphoneUI/pt_BR.lproj/StatusBarView.strings deleted file mode 100644 index ac06c63a5..000000000 Binary files a/Classes/LinphoneUI/pt_BR.lproj/StatusBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pt_BR.lproj/TabBarView.strings b/Classes/LinphoneUI/pt_BR.lproj/TabBarView.strings deleted file mode 100644 index 92f1e5d33..000000000 Binary files a/Classes/LinphoneUI/pt_BR.lproj/TabBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pt_BR.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/pt_BR.lproj/UICallConferenceCell.strings deleted file mode 100644 index 80a0179af..000000000 Binary files a/Classes/LinphoneUI/pt_BR.lproj/UICallConferenceCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pt_BR.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/pt_BR.lproj/UICallPausedCell.strings deleted file mode 100644 index f633bf196..000000000 Binary files a/Classes/LinphoneUI/pt_BR.lproj/UICallPausedCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pt_BR.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/pt_BR.lproj/UIChatBubblePhotoCell.strings deleted file mode 100644 index c59e795bb..000000000 Binary files a/Classes/LinphoneUI/pt_BR.lproj/UIChatBubblePhotoCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pt_BR.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/pt_BR.lproj/UIChatBubbleTextCell.strings deleted file mode 100644 index 532d94e8a..000000000 Binary files a/Classes/LinphoneUI/pt_BR.lproj/UIChatBubbleTextCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pt_BR.lproj/UIChatCell.strings b/Classes/LinphoneUI/pt_BR.lproj/UIChatCell.strings deleted file mode 100644 index 6272b7c09..000000000 Binary files a/Classes/LinphoneUI/pt_BR.lproj/UIChatCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pt_BR.lproj/UIChatConversationImdnTableViewCell.strings b/Classes/LinphoneUI/pt_BR.lproj/UIChatConversationImdnTableViewCell.strings deleted file mode 100644 index 1d11499c1..000000000 Binary files a/Classes/LinphoneUI/pt_BR.lproj/UIChatConversationImdnTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pt_BR.lproj/UIChatConversationInfoTableViewCell.strings b/Classes/LinphoneUI/pt_BR.lproj/UIChatConversationInfoTableViewCell.strings deleted file mode 100644 index 18a179d63..000000000 Binary files a/Classes/LinphoneUI/pt_BR.lproj/UIChatConversationInfoTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pt_BR.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/pt_BR.lproj/UIChatCreateCell.strings deleted file mode 100644 index 2c2a4ba7f..000000000 Binary files a/Classes/LinphoneUI/pt_BR.lproj/UIChatCreateCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pt_BR.lproj/UIChatCreateCollectionViewCell.strings b/Classes/LinphoneUI/pt_BR.lproj/UIChatCreateCollectionViewCell.strings deleted file mode 100644 index c4186dcaa..000000000 Binary files a/Classes/LinphoneUI/pt_BR.lproj/UIChatCreateCollectionViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pt_BR.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/pt_BR.lproj/UIConfirmationDialog.strings deleted file mode 100644 index 9859038a2..000000000 Binary files a/Classes/LinphoneUI/pt_BR.lproj/UIConfirmationDialog.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pt_BR.lproj/UIContactCell.strings b/Classes/LinphoneUI/pt_BR.lproj/UIContactCell.strings deleted file mode 100644 index eaa6d9fba..000000000 Binary files a/Classes/LinphoneUI/pt_BR.lproj/UIContactCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pt_BR.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/pt_BR.lproj/UIContactDetailsCell.strings deleted file mode 100644 index 7401466e4..000000000 Binary files a/Classes/LinphoneUI/pt_BR.lproj/UIContactDetailsCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/pt_BR.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/pt_BR.lproj/UIHistoryCell.strings deleted file mode 100644 index f76ca8503..000000000 Binary files a/Classes/LinphoneUI/pt_BR.lproj/UIHistoryCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ru.lproj/StatusBarView.strings b/Classes/LinphoneUI/ru.lproj/StatusBarView.strings deleted file mode 100644 index 9a48b1e5b..000000000 Binary files a/Classes/LinphoneUI/ru.lproj/StatusBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ru.lproj/TabBarView.strings b/Classes/LinphoneUI/ru.lproj/TabBarView.strings deleted file mode 100644 index ed635fcaa..000000000 Binary files a/Classes/LinphoneUI/ru.lproj/TabBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ru.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/ru.lproj/UICallConferenceCell.strings deleted file mode 100644 index b464a9b5d..000000000 Binary files a/Classes/LinphoneUI/ru.lproj/UICallConferenceCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ru.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/ru.lproj/UICallPausedCell.strings deleted file mode 100644 index 4f5e4241b..000000000 Binary files a/Classes/LinphoneUI/ru.lproj/UICallPausedCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ru.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/ru.lproj/UIChatBubblePhotoCell.strings deleted file mode 100644 index b9ffacc6a..000000000 Binary files a/Classes/LinphoneUI/ru.lproj/UIChatBubblePhotoCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ru.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/ru.lproj/UIChatBubbleTextCell.strings deleted file mode 100644 index bcebe71c6..000000000 Binary files a/Classes/LinphoneUI/ru.lproj/UIChatBubbleTextCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ru.lproj/UIChatCell.strings b/Classes/LinphoneUI/ru.lproj/UIChatCell.strings deleted file mode 100644 index 9db126230..000000000 Binary files a/Classes/LinphoneUI/ru.lproj/UIChatCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ru.lproj/UIChatConversationImdnTableViewCell.strings b/Classes/LinphoneUI/ru.lproj/UIChatConversationImdnTableViewCell.strings deleted file mode 100644 index 5db05ba21..000000000 Binary files a/Classes/LinphoneUI/ru.lproj/UIChatConversationImdnTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ru.lproj/UIChatConversationInfoTableViewCell.strings b/Classes/LinphoneUI/ru.lproj/UIChatConversationInfoTableViewCell.strings deleted file mode 100644 index 378c577b7..000000000 Binary files a/Classes/LinphoneUI/ru.lproj/UIChatConversationInfoTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ru.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/ru.lproj/UIChatCreateCell.strings deleted file mode 100644 index 21e71a185..000000000 Binary files a/Classes/LinphoneUI/ru.lproj/UIChatCreateCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ru.lproj/UIChatCreateCollectionViewCell.strings b/Classes/LinphoneUI/ru.lproj/UIChatCreateCollectionViewCell.strings deleted file mode 100644 index f9de88a5b..000000000 Binary files a/Classes/LinphoneUI/ru.lproj/UIChatCreateCollectionViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ru.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/ru.lproj/UIConfirmationDialog.strings deleted file mode 100644 index d501e82eb..000000000 Binary files a/Classes/LinphoneUI/ru.lproj/UIConfirmationDialog.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ru.lproj/UIContactCell.strings b/Classes/LinphoneUI/ru.lproj/UIContactCell.strings deleted file mode 100644 index b28b6a083..000000000 Binary files a/Classes/LinphoneUI/ru.lproj/UIContactCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ru.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/ru.lproj/UIContactDetailsCell.strings deleted file mode 100644 index c521206a4..000000000 Binary files a/Classes/LinphoneUI/ru.lproj/UIContactDetailsCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/ru.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/ru.lproj/UIHistoryCell.strings deleted file mode 100644 index 658926e58..000000000 Binary files a/Classes/LinphoneUI/ru.lproj/UIHistoryCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/sv.lproj/StatusBarView.strings b/Classes/LinphoneUI/sv.lproj/StatusBarView.strings deleted file mode 100644 index 1a41aa2d6..000000000 Binary files a/Classes/LinphoneUI/sv.lproj/StatusBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/sv.lproj/TabBarView.strings b/Classes/LinphoneUI/sv.lproj/TabBarView.strings deleted file mode 100644 index e99aef7eb..000000000 Binary files a/Classes/LinphoneUI/sv.lproj/TabBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/sv.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/sv.lproj/UICallConferenceCell.strings deleted file mode 100644 index 59189566f..000000000 Binary files a/Classes/LinphoneUI/sv.lproj/UICallConferenceCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/sv.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/sv.lproj/UICallPausedCell.strings deleted file mode 100644 index ea73a7198..000000000 Binary files a/Classes/LinphoneUI/sv.lproj/UICallPausedCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/sv.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/sv.lproj/UIChatBubblePhotoCell.strings deleted file mode 100644 index 4d2c4929d..000000000 Binary files a/Classes/LinphoneUI/sv.lproj/UIChatBubblePhotoCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/sv.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/sv.lproj/UIChatBubbleTextCell.strings deleted file mode 100644 index b9ed74c6c..000000000 Binary files a/Classes/LinphoneUI/sv.lproj/UIChatBubbleTextCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/sv.lproj/UIChatCell.strings b/Classes/LinphoneUI/sv.lproj/UIChatCell.strings deleted file mode 100644 index 82db68abc..000000000 Binary files a/Classes/LinphoneUI/sv.lproj/UIChatCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/sv.lproj/UIChatConversationImdnTableViewCell.strings b/Classes/LinphoneUI/sv.lproj/UIChatConversationImdnTableViewCell.strings deleted file mode 100644 index f7c53a65c..000000000 Binary files a/Classes/LinphoneUI/sv.lproj/UIChatConversationImdnTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/sv.lproj/UIChatConversationInfoTableViewCell.strings b/Classes/LinphoneUI/sv.lproj/UIChatConversationInfoTableViewCell.strings deleted file mode 100644 index 353d704cf..000000000 Binary files a/Classes/LinphoneUI/sv.lproj/UIChatConversationInfoTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/sv.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/sv.lproj/UIChatCreateCell.strings deleted file mode 100644 index 2c2a4ba7f..000000000 Binary files a/Classes/LinphoneUI/sv.lproj/UIChatCreateCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/sv.lproj/UIChatCreateCollectionViewCell.strings b/Classes/LinphoneUI/sv.lproj/UIChatCreateCollectionViewCell.strings deleted file mode 100644 index c4186dcaa..000000000 Binary files a/Classes/LinphoneUI/sv.lproj/UIChatCreateCollectionViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/sv.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/sv.lproj/UIConfirmationDialog.strings deleted file mode 100644 index eed68f5e0..000000000 Binary files a/Classes/LinphoneUI/sv.lproj/UIConfirmationDialog.strings and /dev/null differ diff --git a/Classes/LinphoneUI/sv.lproj/UIContactCell.strings b/Classes/LinphoneUI/sv.lproj/UIContactCell.strings deleted file mode 100644 index c672025c5..000000000 Binary files a/Classes/LinphoneUI/sv.lproj/UIContactCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/sv.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/sv.lproj/UIContactDetailsCell.strings deleted file mode 100644 index 07f0a2ea5..000000000 Binary files a/Classes/LinphoneUI/sv.lproj/UIContactDetailsCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/sv.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/sv.lproj/UIHistoryCell.strings deleted file mode 100644 index 8d91da573..000000000 Binary files a/Classes/LinphoneUI/sv.lproj/UIHistoryCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/tr.lproj/StatusBarView.strings b/Classes/LinphoneUI/tr.lproj/StatusBarView.strings deleted file mode 100644 index be34e71a5..000000000 Binary files a/Classes/LinphoneUI/tr.lproj/StatusBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/tr.lproj/TabBarView.strings b/Classes/LinphoneUI/tr.lproj/TabBarView.strings deleted file mode 100644 index 4d96b3ef9..000000000 Binary files a/Classes/LinphoneUI/tr.lproj/TabBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/tr.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/tr.lproj/UICallConferenceCell.strings deleted file mode 100644 index 2b7d2123e..000000000 Binary files a/Classes/LinphoneUI/tr.lproj/UICallConferenceCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/tr.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/tr.lproj/UICallPausedCell.strings deleted file mode 100644 index 512a00492..000000000 Binary files a/Classes/LinphoneUI/tr.lproj/UICallPausedCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/tr.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/tr.lproj/UIChatBubblePhotoCell.strings deleted file mode 100644 index 845cc6c27..000000000 Binary files a/Classes/LinphoneUI/tr.lproj/UIChatBubblePhotoCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/tr.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/tr.lproj/UIChatBubbleTextCell.strings deleted file mode 100644 index 2656fcb8b..000000000 Binary files a/Classes/LinphoneUI/tr.lproj/UIChatBubbleTextCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/tr.lproj/UIChatCell.strings b/Classes/LinphoneUI/tr.lproj/UIChatCell.strings deleted file mode 100644 index af350eac6..000000000 Binary files a/Classes/LinphoneUI/tr.lproj/UIChatCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/tr.lproj/UIChatConversationImdnTableViewCell.strings b/Classes/LinphoneUI/tr.lproj/UIChatConversationImdnTableViewCell.strings deleted file mode 100644 index 5bc212364..000000000 Binary files a/Classes/LinphoneUI/tr.lproj/UIChatConversationImdnTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/tr.lproj/UIChatConversationInfoTableViewCell.strings b/Classes/LinphoneUI/tr.lproj/UIChatConversationInfoTableViewCell.strings deleted file mode 100644 index 993066bf1..000000000 Binary files a/Classes/LinphoneUI/tr.lproj/UIChatConversationInfoTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/tr.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/tr.lproj/UIChatCreateCell.strings deleted file mode 100644 index 2e1f311ff..000000000 Binary files a/Classes/LinphoneUI/tr.lproj/UIChatCreateCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/tr.lproj/UIChatCreateCollectionViewCell.strings b/Classes/LinphoneUI/tr.lproj/UIChatCreateCollectionViewCell.strings deleted file mode 100644 index 445daf3e4..000000000 Binary files a/Classes/LinphoneUI/tr.lproj/UIChatCreateCollectionViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/tr.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/tr.lproj/UIConfirmationDialog.strings deleted file mode 100644 index d9b67ad99..000000000 Binary files a/Classes/LinphoneUI/tr.lproj/UIConfirmationDialog.strings and /dev/null differ diff --git a/Classes/LinphoneUI/tr.lproj/UIContactCell.strings b/Classes/LinphoneUI/tr.lproj/UIContactCell.strings deleted file mode 100644 index 9cee140a8..000000000 Binary files a/Classes/LinphoneUI/tr.lproj/UIContactCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/tr.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/tr.lproj/UIContactDetailsCell.strings deleted file mode 100644 index c346a9349..000000000 Binary files a/Classes/LinphoneUI/tr.lproj/UIContactDetailsCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/tr.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/tr.lproj/UIHistoryCell.strings deleted file mode 100644 index 29d0f923e..000000000 Binary files a/Classes/LinphoneUI/tr.lproj/UIHistoryCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/uk.lproj/StatusBarView.strings b/Classes/LinphoneUI/uk.lproj/StatusBarView.strings deleted file mode 100644 index e1ed7ee4a..000000000 Binary files a/Classes/LinphoneUI/uk.lproj/StatusBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/uk.lproj/TabBarView.strings b/Classes/LinphoneUI/uk.lproj/TabBarView.strings deleted file mode 100644 index 24344edb6..000000000 Binary files a/Classes/LinphoneUI/uk.lproj/TabBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/uk.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/uk.lproj/UICallConferenceCell.strings deleted file mode 100644 index 6711f86e9..000000000 Binary files a/Classes/LinphoneUI/uk.lproj/UICallConferenceCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/uk.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/uk.lproj/UICallPausedCell.strings deleted file mode 100644 index a8ba34de3..000000000 Binary files a/Classes/LinphoneUI/uk.lproj/UICallPausedCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/uk.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/uk.lproj/UIChatBubblePhotoCell.strings deleted file mode 100644 index dd7cb34f3..000000000 Binary files a/Classes/LinphoneUI/uk.lproj/UIChatBubblePhotoCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/uk.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/uk.lproj/UIChatBubbleTextCell.strings deleted file mode 100644 index 3a12c6bc1..000000000 Binary files a/Classes/LinphoneUI/uk.lproj/UIChatBubbleTextCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/uk.lproj/UIChatCell.strings b/Classes/LinphoneUI/uk.lproj/UIChatCell.strings deleted file mode 100644 index 114a37fbf..000000000 Binary files a/Classes/LinphoneUI/uk.lproj/UIChatCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/uk.lproj/UIChatConversationImdnTableViewCell.strings b/Classes/LinphoneUI/uk.lproj/UIChatConversationImdnTableViewCell.strings deleted file mode 100644 index 1e53ebcc8..000000000 Binary files a/Classes/LinphoneUI/uk.lproj/UIChatConversationImdnTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/uk.lproj/UIChatConversationInfoTableViewCell.strings b/Classes/LinphoneUI/uk.lproj/UIChatConversationInfoTableViewCell.strings deleted file mode 100644 index 4ca38384f..000000000 Binary files a/Classes/LinphoneUI/uk.lproj/UIChatConversationInfoTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/uk.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/uk.lproj/UIChatCreateCell.strings deleted file mode 100644 index b9dbbb12e..000000000 Binary files a/Classes/LinphoneUI/uk.lproj/UIChatCreateCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/uk.lproj/UIChatCreateCollectionViewCell.strings b/Classes/LinphoneUI/uk.lproj/UIChatCreateCollectionViewCell.strings deleted file mode 100644 index e36ba3f3a..000000000 Binary files a/Classes/LinphoneUI/uk.lproj/UIChatCreateCollectionViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/uk.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/uk.lproj/UIConfirmationDialog.strings deleted file mode 100644 index cae8ce036..000000000 Binary files a/Classes/LinphoneUI/uk.lproj/UIConfirmationDialog.strings and /dev/null differ diff --git a/Classes/LinphoneUI/uk.lproj/UIContactCell.strings b/Classes/LinphoneUI/uk.lproj/UIContactCell.strings deleted file mode 100644 index 3736603d7..000000000 Binary files a/Classes/LinphoneUI/uk.lproj/UIContactCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/uk.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/uk.lproj/UIContactDetailsCell.strings deleted file mode 100644 index ff647674d..000000000 Binary files a/Classes/LinphoneUI/uk.lproj/UIContactDetailsCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/uk.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/uk.lproj/UIHistoryCell.strings deleted file mode 100644 index 66f0d06f1..000000000 Binary files a/Classes/LinphoneUI/uk.lproj/UIHistoryCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_CN.lproj/StatusBarView.strings b/Classes/LinphoneUI/zh_CN.lproj/StatusBarView.strings deleted file mode 100644 index 6d87e3a1c..000000000 Binary files a/Classes/LinphoneUI/zh_CN.lproj/StatusBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_CN.lproj/TabBarView.strings b/Classes/LinphoneUI/zh_CN.lproj/TabBarView.strings deleted file mode 100644 index 8758e3b7b..000000000 Binary files a/Classes/LinphoneUI/zh_CN.lproj/TabBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_CN.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/zh_CN.lproj/UICallConferenceCell.strings deleted file mode 100644 index dc75b0893..000000000 Binary files a/Classes/LinphoneUI/zh_CN.lproj/UICallConferenceCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_CN.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/zh_CN.lproj/UICallPausedCell.strings deleted file mode 100644 index 6ad6c398b..000000000 Binary files a/Classes/LinphoneUI/zh_CN.lproj/UICallPausedCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_CN.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/zh_CN.lproj/UIChatBubblePhotoCell.strings deleted file mode 100644 index bb5fb0545..000000000 Binary files a/Classes/LinphoneUI/zh_CN.lproj/UIChatBubblePhotoCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_CN.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/zh_CN.lproj/UIChatBubbleTextCell.strings deleted file mode 100644 index 53a366e62..000000000 Binary files a/Classes/LinphoneUI/zh_CN.lproj/UIChatBubbleTextCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_CN.lproj/UIChatCell.strings b/Classes/LinphoneUI/zh_CN.lproj/UIChatCell.strings deleted file mode 100644 index 9cdd76c8c..000000000 Binary files a/Classes/LinphoneUI/zh_CN.lproj/UIChatCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_CN.lproj/UIChatConversationImdnTableViewCell.strings b/Classes/LinphoneUI/zh_CN.lproj/UIChatConversationImdnTableViewCell.strings deleted file mode 100644 index 39bd13748..000000000 Binary files a/Classes/LinphoneUI/zh_CN.lproj/UIChatConversationImdnTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_CN.lproj/UIChatConversationInfoTableViewCell.strings b/Classes/LinphoneUI/zh_CN.lproj/UIChatConversationInfoTableViewCell.strings deleted file mode 100644 index 4b20376e1..000000000 Binary files a/Classes/LinphoneUI/zh_CN.lproj/UIChatConversationInfoTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_CN.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/zh_CN.lproj/UIChatCreateCell.strings deleted file mode 100644 index f658afa34..000000000 Binary files a/Classes/LinphoneUI/zh_CN.lproj/UIChatCreateCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_CN.lproj/UIChatCreateCollectionViewCell.strings b/Classes/LinphoneUI/zh_CN.lproj/UIChatCreateCollectionViewCell.strings deleted file mode 100644 index 1dd79ed61..000000000 Binary files a/Classes/LinphoneUI/zh_CN.lproj/UIChatCreateCollectionViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_CN.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/zh_CN.lproj/UIConfirmationDialog.strings deleted file mode 100644 index c47145c83..000000000 Binary files a/Classes/LinphoneUI/zh_CN.lproj/UIConfirmationDialog.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_CN.lproj/UIContactCell.strings b/Classes/LinphoneUI/zh_CN.lproj/UIContactCell.strings deleted file mode 100644 index 1e5f89a9a..000000000 Binary files a/Classes/LinphoneUI/zh_CN.lproj/UIContactCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_CN.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/zh_CN.lproj/UIContactDetailsCell.strings deleted file mode 100644 index 3c2f1562a..000000000 Binary files a/Classes/LinphoneUI/zh_CN.lproj/UIContactDetailsCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_CN.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/zh_CN.lproj/UIHistoryCell.strings deleted file mode 100644 index 62b3dd0dd..000000000 Binary files a/Classes/LinphoneUI/zh_CN.lproj/UIHistoryCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_TW.lproj/StatusBarView.strings b/Classes/LinphoneUI/zh_TW.lproj/StatusBarView.strings deleted file mode 100644 index 04075db51..000000000 Binary files a/Classes/LinphoneUI/zh_TW.lproj/StatusBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_TW.lproj/TabBarView.strings b/Classes/LinphoneUI/zh_TW.lproj/TabBarView.strings deleted file mode 100644 index d2d5d3131..000000000 Binary files a/Classes/LinphoneUI/zh_TW.lproj/TabBarView.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_TW.lproj/UICallCell.strings b/Classes/LinphoneUI/zh_TW.lproj/UICallCell.strings deleted file mode 100644 index df97e341e..000000000 Binary files a/Classes/LinphoneUI/zh_TW.lproj/UICallCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_TW.lproj/UICallConferenceCell.strings b/Classes/LinphoneUI/zh_TW.lproj/UICallConferenceCell.strings deleted file mode 100644 index b23b692fb..000000000 Binary files a/Classes/LinphoneUI/zh_TW.lproj/UICallConferenceCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_TW.lproj/UICallPausedCell.strings b/Classes/LinphoneUI/zh_TW.lproj/UICallPausedCell.strings deleted file mode 100644 index af9becbf9..000000000 Binary files a/Classes/LinphoneUI/zh_TW.lproj/UICallPausedCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_TW.lproj/UIChatBubblePhotoCell.strings b/Classes/LinphoneUI/zh_TW.lproj/UIChatBubblePhotoCell.strings deleted file mode 100644 index bfa6fe56e..000000000 Binary files a/Classes/LinphoneUI/zh_TW.lproj/UIChatBubblePhotoCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_TW.lproj/UIChatBubbleTextCell.strings b/Classes/LinphoneUI/zh_TW.lproj/UIChatBubbleTextCell.strings deleted file mode 100644 index 5e0ec4c7f..000000000 Binary files a/Classes/LinphoneUI/zh_TW.lproj/UIChatBubbleTextCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_TW.lproj/UIChatCell.strings b/Classes/LinphoneUI/zh_TW.lproj/UIChatCell.strings deleted file mode 100644 index 8a2c9920f..000000000 Binary files a/Classes/LinphoneUI/zh_TW.lproj/UIChatCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_TW.lproj/UIChatConversationImdnTableViewCell.strings b/Classes/LinphoneUI/zh_TW.lproj/UIChatConversationImdnTableViewCell.strings deleted file mode 100644 index 30f88c754..000000000 Binary files a/Classes/LinphoneUI/zh_TW.lproj/UIChatConversationImdnTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_TW.lproj/UIChatConversationInfoTableViewCell.strings b/Classes/LinphoneUI/zh_TW.lproj/UIChatConversationInfoTableViewCell.strings deleted file mode 100644 index 8132fcd6b..000000000 Binary files a/Classes/LinphoneUI/zh_TW.lproj/UIChatConversationInfoTableViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_TW.lproj/UIChatCreateCell.strings b/Classes/LinphoneUI/zh_TW.lproj/UIChatCreateCell.strings deleted file mode 100644 index 09be65eaa..000000000 Binary files a/Classes/LinphoneUI/zh_TW.lproj/UIChatCreateCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_TW.lproj/UIChatCreateCollectionViewCell.strings b/Classes/LinphoneUI/zh_TW.lproj/UIChatCreateCollectionViewCell.strings deleted file mode 100644 index f315523c9..000000000 Binary files a/Classes/LinphoneUI/zh_TW.lproj/UIChatCreateCollectionViewCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_TW.lproj/UIConfirmationDialog.strings b/Classes/LinphoneUI/zh_TW.lproj/UIConfirmationDialog.strings deleted file mode 100644 index 17adc01a8..000000000 Binary files a/Classes/LinphoneUI/zh_TW.lproj/UIConfirmationDialog.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_TW.lproj/UIContactCell.strings b/Classes/LinphoneUI/zh_TW.lproj/UIContactCell.strings deleted file mode 100644 index 778d2299d..000000000 Binary files a/Classes/LinphoneUI/zh_TW.lproj/UIContactCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_TW.lproj/UIContactDetailsCell.strings b/Classes/LinphoneUI/zh_TW.lproj/UIContactDetailsCell.strings deleted file mode 100644 index 2eb4675c3..000000000 Binary files a/Classes/LinphoneUI/zh_TW.lproj/UIContactDetailsCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_TW.lproj/UIContactDetailsFooter.strings b/Classes/LinphoneUI/zh_TW.lproj/UIContactDetailsFooter.strings deleted file mode 100644 index d8404ad2e..000000000 Binary files a/Classes/LinphoneUI/zh_TW.lproj/UIContactDetailsFooter.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_TW.lproj/UIContactDetailsHeader.strings b/Classes/LinphoneUI/zh_TW.lproj/UIContactDetailsHeader.strings deleted file mode 100644 index 29afde9b2..000000000 Binary files a/Classes/LinphoneUI/zh_TW.lproj/UIContactDetailsHeader.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_TW.lproj/UIHistoryCell.strings b/Classes/LinphoneUI/zh_TW.lproj/UIHistoryCell.strings deleted file mode 100644 index e80d5e658..000000000 Binary files a/Classes/LinphoneUI/zh_TW.lproj/UIHistoryCell.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_TW.lproj/UIMainBar.strings b/Classes/LinphoneUI/zh_TW.lproj/UIMainBar.strings deleted file mode 100644 index 7dcd85f93..000000000 Binary files a/Classes/LinphoneUI/zh_TW.lproj/UIMainBar.strings and /dev/null differ diff --git a/Classes/LinphoneUI/zh_TW.lproj/UIMainBar~ipad.strings b/Classes/LinphoneUI/zh_TW.lproj/UIMainBar~ipad.strings deleted file mode 100644 index 670e50eb1..000000000 Binary files a/Classes/LinphoneUI/zh_TW.lproj/UIMainBar~ipad.strings and /dev/null differ diff --git a/Classes/Log.h b/Classes/Log.h deleted file mode 100644 index c838afa12..000000000 --- a/Classes/Log.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "linphone/core.h" - -#define LOGV(level, ...) [Log log:level file:__FILE__ line:__LINE__ format:__VA_ARGS__] -#define LOGD(...) LOGV(ORTP_DEBUG, __VA_ARGS__) -#define LOGI(...) LOGV(ORTP_MESSAGE, __VA_ARGS__) -#define LOGW(...) LOGV(ORTP_WARNING, __VA_ARGS__) -#define LOGE(...) LOGV(ORTP_ERROR, __VA_ARGS__) -#define LOGF(...) LOGV(ORTP_FATAL, __VA_ARGS__) - -@interface Log : NSObject { -} - -+ (void)log:(OrtpLogLevel)severity file:(const char *)file line:(int)line format:(NSString *)format, ...; -+ (void)enableLogs:(OrtpLogLevel)level; -+ (void)directLog:(OrtpLogLevel)level text:(NSString *)text; -+ (void)d:(NSString *)text; -+ (void)i:(NSString *)text; -+ (void)w:(NSString *)text; -+ (void)e:(NSString *)text; -+ (void)f:(NSString *)text; - -void linphone_iphone_log_handler(const char *domain, OrtpLogLevel lev, const char *fmt, va_list args); -@end diff --git a/Classes/MagicSearch.swift b/Classes/MagicSearch.swift deleted file mode 100644 index 2dac0586c..000000000 --- a/Classes/MagicSearch.swift +++ /dev/null @@ -1,153 +0,0 @@ -// -// ContactListMagicSearch.swift -// linphone -// -// Created by QuentinArguillere on 25/03/2022. -// - -import Foundation -import linphonesw - -@objc class MagicSearchSingleton : NSObject { - static var theMagicSearchSingleton: MagicSearchSingleton? - - var lc = CallManager.instance().lc - var ongoingSearch = false - var needUpdateLastSearchContacts = false - var lastSearchContacts : [Contact] = [] - - @objc var currentFilter : String = "" - var previousFilter : String? - var magicSearch : MagicSearch - var magicSearchDelegate : MagicSearchDelegate? - var lastSearch : [SearchResult]? - - - override init() { - magicSearch = try! lc!.createMagicSearch() - magicSearch.limitedSearch = false - super.init() - - magicSearchDelegate = MagicSearchDelegateStub(onSearchResultsReceived: { (magicSearch: MagicSearch) in - self.needUpdateLastSearchContacts = true - self.ongoingSearch = false - self.lastSearch = magicSearch.lastSearch - Log.directLog(BCTBX_LOG_MESSAGE, text: "Contact magic search -- filter = \(String(describing: self.previousFilter)) -- \(magicSearch.lastSearch.count) contact founds") - NotificationCenter.default.post(name: Notification.Name(kLinphoneMagicSearchFinished), object: self) - }, onLdapHaveMoreResults: { (magicSearch: MagicSearch, ldap: Ldap) in - Log.directLog(BCTBX_LOG_MESSAGE, text: "Ldap have more result") - NotificationCenter.default.post(name: Notification.Name(kLinphoneMagicSearchMoreAvailable), object: self) - }) - - magicSearch.addDelegate(delegate: magicSearchDelegate!) - } - - - @objc static func instance() -> MagicSearchSingleton { - if (theMagicSearchSingleton == nil) { - theMagicSearchSingleton = MagicSearchSingleton() - } - return theMagicSearchSingleton! - } - - @objc static func destroyInstance() { - theMagicSearchSingleton = nil - } - - - func getContactFromAddr(addr: Address) -> Contact? { - return LinphoneManager.instance().fastAddressBook.addressBookMap.object(forKey: addr.asStringUriOnly() as Any) as? Contact - } - func getContactFromPhoneNb(phoneNb: String) -> Contact? { - let contactKey = FastAddressBook.localizedLabel(FastAddressBook.normalizeSipURI(lc?.defaultAccount?.normalizePhoneNumber(username: phoneNb) ?? phoneNb, use_prefix: true)) - return LinphoneManager.instance().fastAddressBook.addressBookMap.object(forKey: contactKey as Any) as? Contact - } - - func searchAndAddMatchingContact(searchResult: SearchResult) -> Contact? { - if let friend = searchResult.friend { - if (searchResult.sourceFlags == MagicSearch.Source.LdapServers.rawValue), let newContact = Contact(friend: friend.getCobject) { - // Contact comes from LDAP, creating a new one - newContact.createdFromLdapOrProvisioning = true - return newContact - } - if let addr = friend.address, let foundContact = getContactFromAddr(addr: addr) { - return foundContact - } - for phoneNb in friend.phoneNumbers { - if let foundContact = getContactFromPhoneNb(phoneNb: phoneNb) { - return foundContact - } - } - } - - if let addr = searchResult.address, let foundContact = getContactFromAddr(addr: addr) { - return foundContact - } - - if searchResult.phoneNumber != nil { - if let foundContact = getContactFromPhoneNb(phoneNb: searchResult.phoneNumber!) { - return foundContact - } - } - - // Friend comes from provisioning - if let addr = searchResult.address, let friend = searchResult.friend, let newContact = Contact(friend: friend.getCobject) { - newContact.createdFromLdapOrProvisioning = true - return newContact - } - return nil - } - - @objc func isSearchOngoing() -> Bool { - return ongoingSearch - } - - @objc func getLastSearchResults() -> UnsafeMutablePointer? { - - var cList: UnsafeMutablePointer? = nil - if let search = lastSearch { - for data in search { - cList = bctbx_list_append(cList, UnsafeMutableRawPointer(data.getCobject)) - } - } - return cList - } - - @objc func getLastSearchContacts() -> [Contact] { - if (needUpdateLastSearchContacts) { - lastSearchContacts = [] - for res in magicSearch.lastSearch { - if let contact = searchAndAddMatchingContact(searchResult: res) { - lastSearchContacts.append(contact) - } - } - needUpdateLastSearchContacts = false - } - - return lastSearchContacts - } - - @objc func searchForContacts(domain: String, sourceFlags: Int, clearCache: Bool) { - if (clearCache) { - magicSearch.resetSearchCache() - } - if let oldFilter = previousFilter { - if (oldFilter.count > currentFilter.count || oldFilter != currentFilter) { - magicSearch.resetSearchCache() - } - } - previousFilter = currentFilter - - ongoingSearch = true - DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { - if (self.ongoingSearch) { - NotificationCenter.default.post(name: Notification.Name(kLinphoneMagicSearchStarted), object: self) - } - } - magicSearch.getContactsListAsync(filter: currentFilter, domain: domain, sourceFlags: sourceFlags, aggregation: MagicSearch.Aggregation.Friend) - } - - - func setupLDAPTestSettings() { - } -} diff --git a/Classes/MainStoryboard.storyboard b/Classes/MainStoryboard.storyboard deleted file mode 100644 index c153f01fd..000000000 --- a/Classes/MainStoryboard.storyboard +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/PhoneMainView.h b/Classes/PhoneMainView.h deleted file mode 100644 index 0740a0eb6..000000000 --- a/Classes/PhoneMainView.h +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import - -/* These imports are here so that we can import PhoneMainView.h without bothering to import all the rest of the view headers */ -#import "StatusBarView.h" -#import "TabBarView.h" - -#import "AboutView.h" -#import "AssistantLinkView.h" -#import "AssistantView.h" -#import "ChatConversationCreateView.h" -#import "ChatConversationInfoView.h" -#import "ChatConversationImdnView.h" -#import "ChatConversationView.h" -#import "ChatsListView.h" -#import "ContactDetailsView.h" -#import "ContactsListView.h" -#import "CountryListView.h" -#import "DTActionSheet.h" -#import "DialerView.h" -#import "FirstLoginView.h" -#import "HistoryDetailsView.h" -#import "HistoryListView.h" -#import "ImageView.h" -#import "RecordingsListView.h" -#import "SettingsView.h" -#import "SideMenuView.h" -#import "UIConfirmationDialog.h" -#import "Utils.h" -#import "LaunchScreen.h" -#import "DevicesListView.h" - -#define DYNAMIC_CAST(x, cls) \ - ({ \ - cls *inst_ = (cls *)(x); \ - [inst_ isKindOfClass:[cls class]] ? inst_ : nil; \ - }) - -#define VIEW(x) \ - DYNAMIC_CAST([PhoneMainView.instance.mainViewController getCachedController:x.compositeViewDescription.name], x) - -#define LINPHONE_DUMMY_SUBJECT "dummy subject" - -@class PhoneMainView; - -@interface RootViewManager : NSObject - -@property(nonatomic, strong) PhoneMainView *portraitViewController; -@property(nonatomic, strong) PhoneMainView *rotatingViewController; -@property(nonatomic, strong) NSMutableArray *viewDescriptionStack; - -+(RootViewManager*)instance; -+ (void)setupWithPortrait:(PhoneMainView*)portrait; -- (PhoneMainView*)currentView; - -@end - -@interface PhoneMainView : UIViewController { - @private - NSMutableArray *inhibitedEvents; -} - -@property(nonatomic, strong) IBOutlet UIView *statusBarBG; -@property(nonatomic, strong) IBOutlet UICompositeView *mainViewController; - -@property(nonatomic, strong) NSString *currentName; -@property(nonatomic, strong) NSString *previousView; -@property(nonatomic, strong) NSString *name; -@property(weak, readonly) UICompositeViewDescription *currentView; -@property LinphoneChatRoom* currentRoom; -@property(readonly, strong) MPVolumeView *volumeView; -@property (weak, nonatomic) UIView *waitView; - -- (void)changeCurrentView:(UICompositeViewDescription *)view; -- (UIViewController*)popCurrentView; -- (UIViewController *)popView:(UICompositeViewDescription *)view; -- (UIViewController *)popToView:(UICompositeViewDescription *)currentView; -- (void) setPreviousViewName:(NSString*)previous; -- (NSString*) getPreviousViewName; -+ (NSString*) getPreviousViewName; -- (UICompositeViewDescription *)firstView; -- (void)hideStatusBar:(BOOL)hide; -- (void)hideTabBar:(BOOL)hide; -- (void)fullScreen:(BOOL)enabled; -- (void)updateStatusBar:(UICompositeViewDescription*)to_view; -- (void)startUp; -- (void)displayIncomingCall:(LinphoneCall*) call; -- (void)setVolumeHidden:(BOOL)hidden; -- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result; - -- (void)addInhibitedEvent:(id)event; -- (BOOL)removeInhibitedEvent:(id)event; - -- (void)updateApplicationBadgeNumber; -- (void)getOrCreateOneToOneChatRoom:(const LinphoneAddress *)remoteAddress waitView:(UIView *)waitView isEncrypted:(BOOL)isEncrypted; -- (LinphoneChatRoom *)createChatRoom:(const char *)subject addresses:(bctbx_list_t *)addresses andWaitView:(UIView *)waitView isEncrypted:(BOOL)isEncrypted isGroup:(BOOL)isGroup; -- (void)goToChatRoom:(LinphoneChatRoom *)cr; -- (void)goToChatRoomSwift:(LinphoneChatRoom *)cr; -- (void)resetBeforeGoToChatRoomSwift; -+ (PhoneMainView*) instance; - -- (BOOL)isIphoneXDevice; -+ (int)iphoneStatusBarHeight; --(BOOL) darkMode; - -@end - -void main_view_chat_room_state_changed(LinphoneChatRoom *cr, LinphoneChatRoomState newState); -void main_view_chat_room_conference_joined(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); diff --git a/Classes/PhoneMainView.m b/Classes/PhoneMainView.m deleted file mode 100644 index 61c2dda14..000000000 --- a/Classes/PhoneMainView.m +++ /dev/null @@ -1,1002 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import -#import "LinphoneAppDelegate.h" -#import "Log.h" -#import "PhoneMainView.h" -#import "linphoneapp-Swift.h" - - -static RootViewManager *rootViewManagerInstance = nil; - -@implementation RootViewManager { - PhoneMainView *currentViewController; -} - -+ (void)setupWithPortrait:(PhoneMainView *)portrait { - assert(rootViewManagerInstance == nil); - rootViewManagerInstance = [[RootViewManager alloc] initWithPortrait:portrait]; -} - -- (instancetype)initWithPortrait:(PhoneMainView *)portrait { - self = [super init]; - if (self) { - self.portraitViewController = portrait; - self.rotatingViewController = [[PhoneMainView alloc] init]; - - self.portraitViewController.name = @"Portrait"; - self.rotatingViewController.name = @"Rotating"; - - currentViewController = portrait; - self.viewDescriptionStack = [NSMutableArray array]; - } - return self; -} - -+ (RootViewManager *)instance { - if (!rootViewManagerInstance) { - @throw [NSException exceptionWithName:@"RootViewManager" reason:@"nil instance" userInfo:nil]; - } - return rootViewManagerInstance; -} - -- (PhoneMainView *)currentView { - return currentViewController; -} - -- (PhoneMainView *)setViewControllerForDescription:(UICompositeViewDescription *)description { - return currentViewController; - -// not sure what this code was doing... but since iphone does support rotation as well now... -#if 0 - if (IPAD) - return currentViewController; - - PhoneMainView *newMainView = description.landscapeMode ? self.rotatingViewController : self.portraitViewController; - if (newMainView != currentViewController) { - PhoneMainView *previousMainView = currentViewController; - UIInterfaceOrientation nextViewOrientation = newMainView.interfaceOrientation; - UIInterfaceOrientation previousOrientation = currentViewController.interfaceOrientation; - - LOGI(@"Changing rootViewController: %@ -> %@", currentViewController.name, newMainView.name); - currentViewController = newMainView; - LinphoneAppDelegate *delegate = (LinphoneAppDelegate *)[UIApplication sharedApplication].delegate; - - if (ANIMATED) { - [UIView transitionWithView:delegate.window - duration:0.3 - options:UIViewAnimationOptionTransitionFlipFromLeft | UIViewAnimationOptionAllowAnimatedContent - animations:^{ - delegate.window.rootViewController = newMainView; - // when going to landscape-enabled view, we have to get the current portrait frame and orientation, - // because it could still have landscape-based size - if (nextViewOrientation != previousOrientation && newMainView == self.rotatingViewController) { - newMainView.view.frame = previousMainView.view.frame; - [newMainView.mainViewController.view setFrame:previousMainView.mainViewController.view.frame]; - [newMainView willRotateToInterfaceOrientation:previousOrientation duration:0.3]; - [newMainView willAnimateRotationToInterfaceOrientation:previousOrientation duration:0.3]; - [newMainView didRotateFromInterfaceOrientation:nextViewOrientation]; - } - } - completion:^(BOOL finished){ - }]; - } else { - delegate.window.rootViewController = newMainView; - // when going to landscape-enabled view, we have to get the current portrait frame and orientation, - // because it could still have landscape-based size - if (nextViewOrientation != previousOrientation && newMainView == self.rotatingViewController) { - newMainView.view.frame = previousMainView.view.frame; - [newMainView.mainViewController.view setFrame:previousMainView.mainViewController.view.frame]; - [newMainView willRotateToInterfaceOrientation:previousOrientation duration:0.]; - [newMainView willAnimateRotationToInterfaceOrientation:previousOrientation duration:0.]; - [newMainView didRotateFromInterfaceOrientation:nextViewOrientation]; - } - } - } - return currentViewController; -#endif -} - -@end - -@implementation PhoneMainView - -@synthesize mainViewController; -@synthesize currentView; -@synthesize statusBarBG; -@synthesize volumeView; - -#pragma mark - Lifecycle Functions - -- (void)initPhoneMainView { - currentView = nil; - _currentRoom = NULL; - _currentName = NULL; - _previousView = nil; - inhibitedEvents = [[NSMutableArray alloc] init]; -} - -- (id)init { - self = [super init]; - if (self) { - [self initPhoneMainView]; - } - return self; -} - -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - [self initPhoneMainView]; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)decoder { - self = [super initWithCoder:decoder]; - if (self) { - [self initPhoneMainView]; - } - return self; -} - -- (void)dealloc { - [NSNotificationCenter.defaultCenter removeObserver:self]; -} - -#pragma mark - ViewController Functions - -- (void)viewDidLoad { - [super viewDidLoad]; - - volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(-100, -100, 16, 16)]; - volumeView.showsRouteButton = false; - volumeView.userInteractionEnabled = false; - - [self.view addSubview:mainViewController.view]; - self.view.accessibilityIdentifier = @"phone_view"; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - - // Set observers - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(callUpdate:) - name:kLinphoneCallUpdate - object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(registrationUpdate:) - name:kLinphoneRegistrationUpdate - object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(textReceived:) - name:kLinphoneMessageReceived - object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(onGlobalStateChanged:) - name:kLinphoneGlobalStateUpdate - object:nil]; - [[UIDevice currentDevice] setBatteryMonitoringEnabled:YES]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(batteryLevelChanged:) - name:UIDeviceBatteryLevelDidChangeNotification - object:nil]; -} - -- (void)viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; - [NSNotificationCenter.defaultCenter removeObserver:self]; - [NSNotificationCenter.defaultCenter removeObserver:self name:UIDeviceBatteryLevelDidChangeNotification object:nil]; - [[UIDevice currentDevice] setBatteryMonitoringEnabled:NO]; -} - -/* IPHONE X specific : hide the HomeIndcator when not used */ -#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) -#define IS_IPHONE_X (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height >= 812.0) -#define IPHONE_STATUSBAR_HEIGHT (IS_IPHONE_X ? 35 : 20) - -- (BOOL)isIphoneXDevice{ - return IS_IPHONE_X; -} - -+ (int)iphoneStatusBarHeight{ - return IPHONE_STATUSBAR_HEIGHT; -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - if([self isIphoneXDevice]){ - if(@available(iOS 11.0, *)) { - [self childViewControllerForHomeIndicatorAutoHidden]; - [self prefersHomeIndicatorAutoHidden]; - [self setNeedsUpdateOfHomeIndicatorAutoHidden]; - } - } - -} - -- (BOOL)prefersHomeIndicatorAutoHidden{ - return YES; -} - -- (void)setVolumeHidden:(BOOL)hidden { - // sometimes when placing a call, the volume view will appear. Inserting a - // carefully hidden MPVolumeView into the view hierarchy will hide it - if (hidden) { - if (!(volumeView.superview == self.view)) { - [self.view addSubview:volumeView]; - } - } else { - if (volumeView.superview == self.view) { - [volumeView removeFromSuperview]; - } - } -} - -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 90000 -- (UIInterfaceOrientationMask)supportedInterfaceOrientations -#else -- (NSUInteger)supportedInterfaceOrientations -#endif -{ - return UIInterfaceOrientationMaskAll; -} - -- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation - duration:(NSTimeInterval)duration { - if (toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) - return; - - [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; - [mainViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; - [self orientationUpdate:toInterfaceOrientation]; -} - -- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation - duration:(NSTimeInterval)duration { - if (toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) - return; - - [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; - [mainViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; -} - -- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { - [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; - [mainViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation]; -} - -- (UIInterfaceOrientation)interfaceOrientation { - return [mainViewController currentOrientation]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - [mainViewController clearCache:[RootViewManager instance].viewDescriptionStack]; -} - -#pragma mark - Event Functions - -- (void)textReceived:(NSNotification *)notif { - LinphoneChatMessage *msg = [[notif.userInfo objectForKey:@"message"] pointerValue]; - NSString *callID = [notif.userInfo objectForKey:@"call-id"]; - [self updateApplicationBadgeNumber]; - - if (!msg) - return; - - if (linphone_chat_message_is_outgoing(msg)) - return; - - ChatConversationViewSwift *view = VIEW(ChatConversationViewSwift); - // if we already are in the conversation, we should not ring/vibrate - if (view.linphoneChatRoom && _currentRoom == view.linphoneChatRoom) - return; - - if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) - return; - - LinphoneManager *lm = LinphoneManager.instance; - // if the message was already received through a push notif, we don't need to ring - if (![lm popPushCallID:callID]) { - [lm playMessageSound]; - } -} - -- (void)registrationUpdate:(NSNotification *)notif { - LinphoneRegistrationState state = [[notif.userInfo objectForKey:@"state"] intValue]; - if (state == LinphoneRegistrationFailed && ![currentView equal:AssistantView.compositeViewDescription] && - [UIApplication sharedApplication].applicationState == UIApplicationStateActive) { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Connection failure", nil) - message:[notif.userInfo objectForKey:@"message"] - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Continue", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; - } else if (state == LinphoneRegistrationOk && [currentView equal:ChatsListView.compositeViewDescription]) { - // update avatarImages - //ChatsListView *view = VIEW(ChatsListView); - //[view.tableController loadData]; - } -} - -- (void)onGlobalStateChanged:(NSNotification *)notif { - LinphoneGlobalState state = (LinphoneGlobalState)[[[notif userInfo] valueForKey:@"state"] integerValue]; - static BOOL already_shown = FALSE; - if (state == LinphoneGlobalOn && !already_shown && LinphoneManager.instance.wasRemoteProvisioned) { - LinphoneAccount *account = linphone_core_get_default_account(LC); - if ([LinphoneManager.instance lpConfigBoolForKey:@"show_login_view" inSection:@"app"] && account == NULL) { - already_shown = TRUE; - AssistantView *view = VIEW(AssistantView); - [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; - [view fillDefaultValues]; - } - } -} - -- (void)callUpdate:(NSNotification *)notif { - LinphoneCall *call = [[notif.userInfo objectForKey:@"call"] pointerValue]; - LinphoneCallState state = [[notif.userInfo objectForKey:@"state"] intValue]; - NSString *message = [notif.userInfo objectForKey:@"message"]; - - switch (state) { - case LinphoneCallIncomingReceived: - if (!CallManager.callKitEnabled) { - [self displayIncomingCall:call]; - } - break; - case LinphoneCallIncomingEarlyMedia: { - if (linphone_core_get_calls_nb(LC) > 1 || - (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max)) { - [self displayIncomingCall:call]; - } - break; - } - case LinphoneCallOutgoingEarlyMedia: - case LinphoneCallOutgoingProgress: - case LinphoneCallOutgoingRinging: { - CallAppData *data = [CallManager getAppDataWithCall:call]; - if (!data.isConference) { - OutgoingCallView *v = VIEW(OutgoingCallView); - [self changeCurrentView:OutgoingCallView.compositeViewDescription]; - [v setCallWithCall:call]; - } - break; - } - case LinphoneCallPausedByRemote:break; - case LinphoneCallConnected: { - if (![LinphoneManager.instance isCTCallCenterExist]) { - /*only register CT call center CB for connected call*/ - [LinphoneManager.instance setupGSMInteraction]; - } - break; - } - case LinphoneCallError: { - [self displayCallError:call message:message]; - } - case LinphoneCallEarlyUpdatedByRemote: - case LinphoneCallEarlyUpdating: - case LinphoneCallIdle: - break; - case LinphoneCallReleased: - if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) { - dispatch_async(dispatch_get_main_queue(), ^{ - [PhoneMainView.instance popToView:DialerView.compositeViewDescription]; - [CallManager.instance stopLinphoneCore]; - }); - } - break; - case LinphoneCallPaused: - case LinphoneCallPausing: - case LinphoneCallRefered: - break; - case LinphoneCallResuming: { - break; - } - case LinphoneCallUpdating: - break; - - } - if (state == LinphoneCallEnd || state == LinphoneCallError || floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) - [self updateApplicationBadgeNumber]; -} - -#pragma mark - - -- (void)orientationUpdate:(UIInterfaceOrientation)orientation { - int oldLinphoneOrientation = linphone_core_get_device_rotation(LC); - int newRotation = 0; - switch (orientation) { - case UIInterfaceOrientationPortrait: - newRotation = 0; - break; - case UIInterfaceOrientationPortraitUpsideDown: - newRotation = 180; - break; - case UIInterfaceOrientationLandscapeRight: - newRotation = 270; - break; - case UIInterfaceOrientationLandscapeLeft: - newRotation = 90; - break; - default: - newRotation = oldLinphoneOrientation; - } - if (oldLinphoneOrientation != newRotation) { - linphone_core_set_device_rotation(LC, newRotation); - } -} -- (void)startUp { - @try { - LinphoneManager *lm = LinphoneManager.instance; - LOGI(@"%s", linphone_global_state_to_string(linphone_core_get_global_state(LC))); - - NSString* groupName = [NSString stringWithFormat:@"group.%@.linphoneExtension",[[NSBundle mainBundle] bundleIdentifier]]; - - - NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:groupName]; - NSDictionary *dict = [defaults valueForKey:@"photoData"]; - NSDictionary *dictFile = [defaults valueForKey:@"icloudData"]; - NSDictionary *dictUrl = [defaults valueForKey:@"url"]; - - // If we've been started by a remote push notification, - // we'll already be on the corresponding chat conversation view, no need to go anywhere else - if (dict||dictFile||dictUrl){ - [self changeCurrentView:ChatsListView.compositeViewDescription]; - }else if (![[self currentView].name isEqualToString:@"ChatConversationViewSwift"]) { - - if (linphone_core_get_global_state(LC) != LinphoneGlobalOn) { - [self changeCurrentView:DialerView.compositeViewDescription]; - } else if ([LinphoneManager.instance lpConfigBoolForKey:@"enable_first_login_view_preference"] == true) { - [PhoneMainView.instance changeCurrentView:FirstLoginView.compositeViewDescription]; - } else { - // always start to dialer when testing - // Change to default view - const MSList *accountList = linphone_core_get_account_list(LC); - if (accountList != NULL || ([lm lpConfigBoolForKey:@"hide_assistant_preference"] == true) || lm.isTesting) { - [self changeCurrentView:DialerView.compositeViewDescription]; - } else { - AssistantView *view = VIEW(AssistantView); - [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; - [view reset]; - } - } - } - [self updateApplicationBadgeNumber]; // Update Badge at startup - - } @catch (NSException *exception) { - // we'll wait until the app transitions correctly - } -} - -- (void)updateApplicationBadgeNumber { - int count = 0; - count += linphone_core_get_missed_calls_count(LC); - count += [LinphoneManager unreadMessageCount]; - count += linphone_core_get_calls_nb(LC); - [[UIApplication sharedApplication] setApplicationIconBadgeNumber:count]; - TabBarView *view = (TabBarView *)[PhoneMainView.instance.mainViewController getCachedController:NSStringFromClass(TabBarView.class)]; - [view update:TRUE]; -} - -+ (CATransition *)getBackwardTransition { - BOOL RTL = [LinphoneManager langageDirectionIsRTL]; - BOOL land = UIInterfaceOrientationIsLandscape([self.instance interfaceOrientation]); - NSString *transition = land ? kCATransitionFromBottom : (RTL ? kCATransitionFromRight : kCATransitionFromLeft); - CATransition *trans = [CATransition animation]; - [trans setType:kCATransitionPush]; - [trans setDuration:0.35]; - [trans setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; - [trans setSubtype:transition]; - - return trans; -} - -+ (CATransition *)getForwardTransition { - BOOL RTL = [LinphoneManager langageDirectionIsRTL]; - BOOL land = UIInterfaceOrientationIsLandscape([self.instance interfaceOrientation]); - NSString *transition = land ? kCATransitionFromTop : (RTL ? kCATransitionFromLeft : kCATransitionFromRight); - CATransition *trans = [CATransition animation]; - [trans setType:kCATransitionPush]; - [trans setDuration:0.35]; - [trans setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; - [trans setSubtype:transition]; - - return trans; -} - -+ (CATransition *)getTransition:(UICompositeViewDescription *)old new:(UICompositeViewDescription *) new { - bool left = false; - - if ([old equal:ChatsListView.compositeViewDescription]) { - if ([new equal:ContactsListView.compositeViewDescription] || [new equal:DialerView.compositeViewDescription] || - [new equal:HistoryListView.compositeViewDescription]) { - left = true; - } - } else if ([old equal:SettingsView.compositeViewDescription]) { - if ([new equal:DialerView.compositeViewDescription] || [new equal:ContactsListView.compositeViewDescription] || - [new equal:HistoryListView.compositeViewDescription] || - [new equal:ChatsListView.compositeViewDescription]) { - left = true; - } - } else if ([old equal:DialerView.compositeViewDescription]) { - if ([new equal:ContactsListView.compositeViewDescription] || - [new equal:HistoryListView.compositeViewDescription]) { - left = true; - } - } else if ([old equal:ContactsListView.compositeViewDescription]) { - if ([new equal:HistoryListView.compositeViewDescription]) { - left = true; - } - } - - if (left) { - return [PhoneMainView getBackwardTransition]; - } else { - return [PhoneMainView getForwardTransition]; - } -} - -+ (PhoneMainView *)instance { - return [[RootViewManager instance] currentView]; -} - -- (void)hideTabBar:(BOOL)hide { - [mainViewController hideTabBar:hide]; -} - -- (void)hideStatusBar:(BOOL)hide { - [mainViewController hideStatusBar:hide]; -} - -- (void)updateStatusBar:(UICompositeViewDescription *)to_view { - // Not used any more. It seems that there is no problem with new devices. -#pragma deploymate push "ignored-api-availability" - if (UIDevice.currentDevice.systemVersion.doubleValue >= 7.) { - // In iOS7, the app has a black background on dialer, incoming and incall, so we have to adjust the - // status bar style for each transition to/from these views - BOOL toLightStatus = (to_view != NULL) && ![to_view darkBackground]; - if (!toLightStatus) { - // black bg: white text on black background - [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; - - [UIView animateWithDuration:0.3f - animations:^{ - statusBarBG.backgroundColor = [UIColor blackColor]; - }]; - - } else { - // light bg: black text on white bg - [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault]; - [UIView animateWithDuration:0.3f - animations:^{ - statusBarBG.backgroundColor = [UIColor colorWithWhite:0.935 alpha:1]; - }]; - } - } -#pragma deploymate pop -} - -- (void)fullScreen:(BOOL)enabled { - [statusBarBG setHidden:enabled]; - [mainViewController setFullscreen:enabled]; -} - -- (UIViewController *)popCurrentView { - NSMutableArray *viewStack = [RootViewManager instance].viewDescriptionStack; - if (viewStack.count <= 1) { - [viewStack removeAllObjects]; - LOGW(@"PhoneMainView: Trying to pop view but none stacked, going to %@!", - DialerView.compositeViewDescription.name); - } else { - [viewStack removeLastObject]; - LOGI(@"PhoneMainView: Popping view %@, going to %@", currentView.name, - ((UICompositeViewDescription *)(viewStack.lastObject ?: DialerView.compositeViewDescription)).name); - } - [self _changeCurrentView:viewStack.lastObject ?: DialerView.compositeViewDescription - transition:[PhoneMainView getBackwardTransition] - animated:ANIMATED - addViewToStack:FALSE]; - return [mainViewController getCurrentViewController]; -} - -- (UIViewController *)popView:(UICompositeViewDescription *)view { - NSMutableArray *viewStack = [RootViewManager instance].viewDescriptionStack; - while (viewStack.count > 0 && [[viewStack lastObject] equal:view]) { - [viewStack removeLastObject]; - } - return [self popToView:viewStack.lastObject ?: DialerView.compositeViewDescription]; -} - - -- (void)changeCurrentView:(UICompositeViewDescription *)view { - [self _changeCurrentView:view transition:nil animated:ANIMATED addViewToStack:TRUE]; -} - -- (UIViewController *)_changeCurrentView:(UICompositeViewDescription *)view - transition:(CATransition *)transition - animated:(BOOL)animated - addViewToStack:(BOOL)addViewToStack { - PhoneMainView *vc = [[RootViewManager instance] setViewControllerForDescription:view]; - if (![view equal:vc.currentView] || vc != self) { - LOGI(@"Change current view to %@", view.name); - [self setPreviousViewName:vc.currentView.name]; - NSMutableArray *viewStack = [RootViewManager instance].viewDescriptionStack; - if (addViewToStack) [viewStack addObject:view]; - if (animated && transition == nil) - transition = [PhoneMainView getTransition:vc.currentView new:view]; - [vc.mainViewController setViewTransition:(animated ? transition : nil)]; - [vc.mainViewController changeView:view]; - vc->currentView = view; - } - - //[[RootViewManager instance] setViewControllerForDescription:view]; - - NSDictionary *mdict = [NSMutableDictionary dictionaryWithObject:vc->currentView forKey:@"view"]; - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneMainViewChange object:self userInfo:mdict]; - - return [vc->mainViewController getCurrentViewController]; -} - -- (UIViewController *)popToView:(UICompositeViewDescription *)view { - NSMutableArray *viewStack = [RootViewManager instance].viewDescriptionStack; - while (viewStack.count > 0 && ![[viewStack lastObject] equal:view]) { - [viewStack removeLastObject]; - } - BOOL addView = (viewStack.count == 0); // if we couldn't find the view in the stack, we need to add it - return [self _changeCurrentView:view transition:[PhoneMainView getBackwardTransition] animated:ANIMATED addViewToStack:addView]; -} - -- (void) setPreviousViewName:(NSString*)previous{ - _previousView = previous; -} - -- (NSString*) getPreviousViewName { - return _previousView; -} - -+ (NSString*) getPreviousViewName { - return [self getPreviousViewName]; -} - - -- (UICompositeViewDescription *)firstView { - UICompositeViewDescription *view = nil; - NSArray *viewStack = [RootViewManager instance].viewDescriptionStack; - if ([viewStack count]) { - view = [viewStack objectAtIndex:0]; - } - return view; -} - -- (void)displayCallError:(LinphoneCall *)call message:(NSString *)message { - const char *lUserNameChars = linphone_address_get_username(linphone_call_get_remote_address(call)); - NSString *lUserName = - lUserNameChars ? [[NSString alloc] initWithUTF8String:lUserNameChars] : NSLocalizedString(@"Unknown", nil); - NSString *lMessage; - NSString *lTitle; - - // get default account - LinphoneAccount *account = linphone_core_get_default_account(LC); - if (account == nil) { - lMessage = NSLocalizedString(@"Please make sure your device is connected to the internet and double check your " - @"SIP account configuration in the settings.", - nil); - } else { - lMessage = [NSString stringWithFormat:NSLocalizedString(@"Cannot call %@.", nil), lUserName]; - } - - switch (linphone_call_get_reason(call)) { - case LinphoneReasonNotFound: - lMessage = [NSString stringWithFormat:NSLocalizedString(@"%@ is not connected.", nil), lUserName]; - break; - case LinphoneReasonBusy: - lMessage = [NSString stringWithFormat:NSLocalizedString(@"%@ is busy.", nil), lUserName]; - break; - default: - if (message != nil) { - lMessage = [NSString stringWithFormat:NSLocalizedString(@"%@\nReason was: %@", nil), lMessage, message]; - } - break; - } - - lTitle = NSLocalizedString(@"Call failed", nil); - UIAlertController *errView = [UIAlertController alertControllerWithTitle:lTitle - message:lMessage - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; - errView.view.accessibilityIdentifier = @"call_failed_error_view"; - errView.view.subviews.firstObject.accessibilityIdentifier = @"call_failed_error_view"; - errView.actions.firstObject.accessibilityIdentifier = @"call_failed_error_view_action"; -} - -- (void)addInhibitedEvent:(id)event { - [inhibitedEvents addObject:event]; -} - -- (BOOL)removeInhibitedEvent:(id)event { - NSUInteger index = [inhibitedEvents indexOfObject:event]; - if (index != NSNotFound) { - [inhibitedEvents removeObjectAtIndex:index]; - return TRUE; - } - return FALSE; -} - -#pragma mark - ActionSheet Functions - -- (void)displayIncomingCall:(LinphoneCall *)call { - LinphoneCallLog *callLog = linphone_call_get_call_log(call); - NSString *callId = [NSString stringWithUTF8String:linphone_call_log_get_call_id(callLog)]; - - if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) { - LinphoneManager *lm = LinphoneManager.instance; - BOOL callIDFromPush = [lm popPushCallID:callId]; - BOOL autoAnswer = [lm lpConfigBoolForKey:@"autoanswer_notif_preference"]; - - if (callIDFromPush && autoAnswer) { - // accept call automatically - [CallManager.instance acceptCallWithCall:call hasVideo:YES]; - } else { - AudioServicesPlaySystemSound(lm.sounds.vibrate); - IncomingCallView *view = VIEW(IncomingCallView); - [self changeCurrentView:view.compositeViewDescription]; - [view setCallWithCall:call]; - //CDFIX [view setDelegate:self]; - } - } -} - -- (void)batteryLevelChanged:(NSNotification *)notif { - float level = [UIDevice currentDevice].batteryLevel; - UIDeviceBatteryState state = [UIDevice currentDevice].batteryState; - LOGD(@"Battery state:%d level:%.2f", state, level); - - LinphoneCall *call = linphone_core_get_current_call(LC); - if (call && linphone_call_params_video_enabled(linphone_call_get_current_params(call))) { - CallAppData *data = [CallManager getAppDataWithCall:call]; - if (data != nil) { - if (state == UIDeviceBatteryStateUnplugged) { - if (level <= 0.2f && !data.batteryWarningShown) { - LOGI(@"Battery warning"); - DTActionSheet *sheet = [[DTActionSheet alloc] - initWithTitle:NSLocalizedString(@"Battery is running low. Stop video ?", nil)]; - [sheet addCancelButtonWithTitle:NSLocalizedString(@"Continue video", nil) block:nil]; - [sheet - addDestructiveButtonWithTitle:NSLocalizedString(@"Stop video", nil) - block:^() { - LinphoneCallParams *params = - linphone_core_create_call_params(LC,call); - // stop video - linphone_call_params_enable_video(params, FALSE); - linphone_call_update(call, params); - }]; - [sheet showInView:self.view]; - data.batteryWarningShown = TRUE; - } - } - if (level > 0.2f) { - data.batteryWarningShown = FALSE; - } - [CallManager setAppDataWithCall:call appData:data]; - } - } -} - -#pragma mark - IncomingCallDelegate Functions - -- (void)incomingCallAborted:(LinphoneCall *)call { -} - -- (void)incomingCallAccepted:(LinphoneCall *)call evenWithVideo:(BOOL)video { - [CallManager.instance acceptCallWithCall:call hasVideo:video]; -} - -- (void)incomingCallDeclined:(LinphoneCall *)call { - [CallManager.instance terminateCallWithCall:call]; -} - -#pragma mark - Chat room Functions - -- (void)getOrCreateOneToOneChatRoom:(const LinphoneAddress *)remoteAddress waitView:(UIView *)waitView isEncrypted:(BOOL)isEncrypted{ - if (!remoteAddress) { - [self changeCurrentView:ChatsListView.compositeViewDescription]; - return; - } - - if (!linphone_core_is_network_reachable(LC)) { - [PhoneMainView.instance presentViewController:[LinphoneUtils networkErrorView:@"send a message"] animated:YES completion:nil]; - return; - } - - LinphoneAddress *local; - LinphoneAccount *account = linphone_core_get_default_account(LC); - if (account) { - local = linphone_address_clone(linphone_account_get_contact_address(account)); - } else { - local = linphone_core_create_primary_contact_parsed(LC); - } - LinphoneChatRoom *room = linphone_core_find_one_to_one_chat_room_2(LC, local, remoteAddress, isEncrypted); - linphone_address_unref(local); - - if (!room) { - bctbx_list_t *addresses = bctbx_list_new((void*)remoteAddress); - [self createChatRoom:LINPHONE_DUMMY_SUBJECT addresses:addresses andWaitView:waitView isEncrypted:isEncrypted isGroup:FALSE]; - bctbx_list_free(addresses); - return; - } - - [self goToChatRoomSwift:room]; -} - -- (LinphoneChatRoom *)createChatRoom:(const char *)subject addresses:(bctbx_list_t *)addresses andWaitView:(UIView *)waitView isEncrypted:(BOOL)isEncrypted isGroup:(BOOL)isGroup{ - LinphoneAccount *account = linphone_core_get_default_account(LC); - if (!(account && linphone_account_params_get_conference_factory_uri(linphone_account_get_params(account))) - || ((bctbx_list_size(addresses) == 1) && !isGroup && ([[LinphoneManager instance] lpConfigBoolForKey:@"prefer_basic_chat_room" inSection:@"misc"] || !isEncrypted))) { - // If there's no factory uri, create a basic chat room - if (bctbx_list_size(addresses) != 1) { - // Display Error: unsuported group chat - UIAlertController *errView = - [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Conversation creation error", nil) - message:NSLocalizedString(@"Group conversation is not supported.", nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"OK" - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *action) {}]; - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; - return nil; - } - LinphoneChatRoom *basicRoom = linphone_core_get_chat_room(LC, addresses->data); - [self goToChatRoomSwift:basicRoom]; - return nil; - } - - _waitView = waitView; - _waitView.hidden = NO; - // always use group chatroom - LinphoneChatRoomParams *param = linphone_core_create_default_chat_room_params(LC); - linphone_chat_room_params_enable_group(param, isGroup); - linphone_chat_room_params_enable_encryption(param, isEncrypted); - linphone_chat_room_params_set_ephemeral_mode(param,[LinphoneManager.instance lpConfigBoolForKey:@"ephemeral_chat_messages_settings_per_device" withDefault:true] ? - LinphoneChatRoomEphemeralModeDeviceManaged : - LinphoneChatRoomEphemeralModeAdminManaged); - linphone_chat_room_params_set_ephemeral_lifetime(param,0); - LinphoneChatRoom *room = linphone_core_create_chat_room_2(LC, param, subject ?: LINPHONE_DUMMY_SUBJECT, addresses); - - if (!room) { - _waitView.hidden = YES; - return nil; - } - - LinphoneChatRoomCbs *cbs = linphone_factory_create_chat_room_cbs(linphone_factory_get()); - linphone_chat_room_cbs_set_state_changed(cbs, main_view_chat_room_state_changed); - linphone_chat_room_cbs_set_conference_joined(cbs, main_view_chat_room_conference_joined); - linphone_chat_room_add_callbacks(room, cbs); - - return room; -} - -- (void)goToChatRoom:(LinphoneChatRoom *)cr { - _waitView.hidden = YES; - _waitView = NULL; - ChatConversationView *view = VIEW(ChatConversationView); - if (view.chatRoom && view.chatRoomCbs) - linphone_chat_room_remove_callbacks(view.chatRoom, view.chatRoomCbs); - - view.chatRoomCbs = NULL; - if (view.chatRoom != cr) - [view clearMessageView]; - view.chatRoom = cr; - view.peerAddress = linphone_address_as_string(linphone_chat_room_get_peer_address(cr)); - view.localAddress = linphone_address_as_string(linphone_chat_room_get_local_address(cr)); - self.currentRoom = view.chatRoom; - - if (PhoneMainView.instance.currentView == view.compositeViewDescription) - [view configureForRoom:FALSE]; - else - [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; -} - - -- (void)goToChatRoomSwift:(LinphoneChatRoom *)cr { - _waitView.hidden = YES; - _waitView = NULL; - ChatConversationViewSwift *view = VIEW(ChatConversationViewSwift); - self.currentRoom = view.linphoneChatRoom; - [view initChatRoomWithCChatRoom:cr]; - - [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; -} - -- (void)resetBeforeGoToChatRoomSwift{ - ChatConversationViewSwift *view = VIEW(ChatConversationViewSwift); - [view resetView]; -} - -void main_view_chat_room_conference_joined(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { - PhoneMainView *view = PhoneMainView.instance; - LOGI(@"Chat room [%p] conference joined.", cr); - linphone_chat_room_remove_callbacks(cr, linphone_chat_room_get_current_callbacks(cr)); - [view goToChatRoomSwift:cr]; - if (!IPAD) - return; - - if (PhoneMainView.instance.currentView != ChatsListView.compositeViewDescription && PhoneMainView.instance.currentView != ChatConversationViewSwift.compositeViewDescription) - return; - - ChatsListView *mainView = VIEW(ChatsListView); - [mainView.tableController loadData]; - [mainView.tableController selectFirstRow]; -} - -void main_view_chat_room_state_changed(LinphoneChatRoom *cr, LinphoneChatRoomState newState) { - PhoneMainView *view = PhoneMainView.instance; - switch (newState) { - case LinphoneChatRoomStateCreationFailed: - LOGE(@"Chat room [%p] could not be created on server.", cr); - linphone_chat_room_remove_callbacks(cr, linphone_chat_room_get_current_callbacks(cr)); - view.waitView.hidden = YES; - [ChatConversationInfoView displayCreationError]; - break; - case LinphoneChatRoomStateTerminated: - LOGI(@"Chat room [%p] has been terminated.", cr); - [view goToChatRoomSwift:cr]; - break; - default: - break; - } -} - -#pragma mark - SMS invite callback - -- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result { - [controller dismissModalViewControllerAnimated:YES]; -} - -#pragma mark - Light/Dark mode - --(BOOL) darkMode { - if (@available(iOS 13.0, *)) { - UITraitCollection *collection = [UITraitCollection currentTraitCollection]; - return collection.userInterfaceStyle == UIUserInterfaceStyleDark; - } else { - return false; - } -} - --(void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection { - [UIDeviceBridge notifyDisplayModeSwitch]; -} - -@end diff --git a/Classes/RecordingsListTableView.h b/Classes/RecordingsListTableView.h deleted file mode 100644 index 5ac649415..000000000 --- a/Classes/RecordingsListTableView.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UICheckBoxTableView.h" - -@interface RecordingsListTableView : UICheckBoxTableView { -@private - NSMutableDictionary *recordings; - //This has sub arrays indexed with the date of the recordings, themselves containings the recordings. - NSString *writablePath; - //This is the path to the folder where we write the recordings to. We should probably define it in LinphoneManager though. -} -- (void)loadData; -- (void)removeAllRecordings; -- (void)setSelected:(NSString *)filepath; - -@end diff --git a/Classes/RecordingsListTableView.m b/Classes/RecordingsListTableView.m deleted file mode 100644 index 2260c261d..000000000 --- a/Classes/RecordingsListTableView.m +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "RecordingsListTableView.h" -#import "UIRecordingCell.h" -#import "LinphoneManager.h" -#import "PhoneMainView.h" -#import "Utils.h" - -@implementation RecordingsListTableView - -#pragma mark - Lifecycle Functions - -- (void)initRecordingsTableViewController { - recordings = [NSMutableDictionary dictionary]; - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); - writablePath = [paths objectAtIndex:0]; - writablePath = [writablePath stringByAppendingString:@"/"]; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - if (![self selectFirstRow]) { - //TODO: Make first cell expand to show player - } - [self loadData]; -} - -- (id)init { - self = [super init]; - if (self) { - [self initRecordingsTableViewController]; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)decoder { - self = [super initWithCoder:decoder]; - if (self) { - [self initRecordingsTableViewController]; - } - return self; -} - -- (void)dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [self removeAllRecordings]; -} - -- (void)removeAllRecordings { - for (NSInteger j = 0; j < [self.tableView numberOfSections]; ++j) { - for (NSInteger i = 0; i < [self.tableView numberOfRowsInSection:j]; ++i) { - [[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:j]] setRecording:nil]; - } - } -} - - -- (void)loadData { - LOGI(@"====>>>> Load recording list - Start"); - - recordings = [NSMutableDictionary dictionary]; - NSArray *directoryContent = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:writablePath error:NULL]; - for (NSString *file in directoryContent) { - if (![file hasPrefix:@"recording_"]) { - continue; - } - NSArray *parsedName = [LinphoneUtils parseRecordingName:file]; - NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; - [dateFormat setDateFormat:@"EEEE, MMM d, yyyy"]; - if ([parsedName count] < 2) { - LOGW(@"Can not parse this recoding file: %@", file); - continue; - } - NSString *dayPretty = [dateFormat stringFromDate:[parsedName objectAtIndex:1]]; - NSMutableArray *recOfDay = [recordings objectForKey:dayPretty]; - if (recOfDay) { - // Loop through the object until a later object, then insert it right before - int i; - for (i = 0; i < [recOfDay count]; ++i) { - NSString *fileAtIndex = [recOfDay objectAtIndex:i]; - NSArray *parsedNameAtIndex = [LinphoneUtils parseRecordingName:fileAtIndex]; - if ([[parsedName objectAtIndex:1] compare:[parsedNameAtIndex objectAtIndex:1]] == NSOrderedDescending) { - break; - } - } - [recOfDay insertObject:[writablePath stringByAppendingString:file] atIndex:i]; - } else { - recOfDay = [NSMutableArray arrayWithObjects:[writablePath stringByAppendingString:file], nil]; - [recordings setObject:recOfDay forKey:dayPretty]; - } - } - - - LOGI(@"====>>>> Load recording list - End"); - [super loadData]; -} - -- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { - NSIndexPath *selectedRow = [self.tableView indexPathForSelectedRow]; - if (selectedRow && [selectedRow compare:indexPath] == NSOrderedSame) { - return 150; - } else { - return 40; - } -} - -#pragma mark - UITableViewDataSource Functions - -- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { - return nil; -} - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return [recordings count]; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - NSArray *sortedKey = [self getSortedKeys]; - return [(NSArray *)[recordings objectForKey:[sortedKey objectAtIndex:section]] count]; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - NSString *kCellId = NSStringFromClass(UIRecordingCell.class); - UIRecordingCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId]; - if (cell == nil) { - cell = [[UIRecordingCell alloc] initWithIdentifier:kCellId]; - } - NSString *date = [[self getSortedKeys] objectAtIndex:[indexPath section]]; - NSMutableArray *subAr = [recordings objectForKey:date]; - NSString *recordingPath = subAr[indexPath.row]; - [cell setRecording:recordingPath]; - [super accessoryForCell:cell atPath:indexPath]; - [cell updateFrame]; - cell.contentView.userInteractionEnabled = false; - return cell; -} - -- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { - CGRect frame = CGRectMake(0, 0, tableView.frame.size.width, tableView.sectionHeaderHeight); - UIView *tempView = [[UIView alloc] initWithFrame:frame]; - if (@available(iOS 13, *)) { - tempView.backgroundColor = [UIColor systemBackgroundColor]; - } else { - tempView.backgroundColor = [UIColor whiteColor]; - } - - UILabel *tempLabel = [[UILabel alloc] initWithFrame:frame]; - tempLabel.backgroundColor = [UIColor clearColor]; - tempLabel.textColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"color_A.png"]]; - tempLabel.text = [[self getSortedKeys] objectAtIndex:section]; - tempLabel.textAlignment = NSTextAlignmentCenter; - tempLabel.font = [UIFont boldSystemFontOfSize:17]; - tempLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; - [tempView addSubview:tempLabel]; - - return tempView; -} - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - [super tableView:tableView didSelectRowAtIndexPath:indexPath]; - if (![self isEditing]) { - [tableView beginUpdates]; - [(UIRecordingCell *)[self tableView:tableView cellForRowAtIndexPath:indexPath] updateFrame]; - [tableView endUpdates]; - } -} - -- (void)tableView:(UITableView *)tableView -commitEditingStyle:(UITableViewCellEditingStyle)editingStyle -forRowAtIndexPath:(NSIndexPath *)indexPath { - if (editingStyle == UITableViewCellEditingStyleDelete) { - [NSNotificationCenter.defaultCenter removeObserver:self]; - [tableView beginUpdates]; - - - NSString *date = [[self getSortedKeys] objectAtIndex:[indexPath section]]; - NSMutableArray *subAr = [recordings objectForKey:date]; - NSString *recordingPath = subAr[indexPath.row]; - [subAr removeObjectAtIndex:indexPath.row]; - if (subAr.count == 0) { - [recordings removeObjectForKey:date]; - [tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] - withRowAnimation:UITableViewRowAnimationFade]; - } - - UIRecordingCell* cell = [self.tableView cellForRowAtIndexPath:indexPath]; - [cell setRecording:NULL]; - - remove([recordingPath cStringUsingEncoding:NSUTF8StringEncoding]); - - [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; - [tableView endUpdates]; - - [self loadData]; - } -} - -- (void)removeSelectionUsing:(void (^)(NSIndexPath *))remover { - [super removeSelectionUsing:^(NSIndexPath *indexPath) { - [NSNotificationCenter.defaultCenter removeObserver:self]; - - NSString *date = [[self getSortedKeys] objectAtIndex:[indexPath section]]; - NSMutableArray *subAr = [recordings objectForKey:date]; - NSString *recordingPath = subAr[indexPath.row]; - [subAr removeObjectAtIndex:indexPath.row]; - if (subAr.count == 0) { - [recordings removeObjectForKey:date]; - } - UIRecordingCell* cell = [self.tableView cellForRowAtIndexPath:indexPath]; - [cell setRecording:NULL]; - remove([recordingPath cStringUsingEncoding:NSUTF8StringEncoding]); - }]; -} - -- (void)setSelected:(NSString *)filepath { - NSArray *parsedName = [LinphoneUtils parseRecordingName:filepath]; - NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; - [dateFormat setDateFormat:@"EEEE, MMM d, yyyy"]; - NSString *dayPretty = [dateFormat stringFromDate:[parsedName objectAtIndex:1]]; - NSUInteger section; - NSArray *keys = [recordings allKeys]; - for (section = 0; section < [keys count]; ++section) { - if ([dayPretty isEqualToString:(NSString *)[keys objectAtIndex:section]]) { - break; - } - } - NSUInteger row; - NSArray *recs = [recordings objectForKey:dayPretty]; - for (row = 0; row < [recs count]; ++row) { - if ([filepath isEqualToString:(NSString *)[recs objectAtIndex:row]]) { - break; - } - } - NSUInteger indexes[] = {section, row}; - [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathWithIndexes:indexes length:2] animated:TRUE scrollPosition:UITableViewScrollPositionNone]; -} - -#pragma mark - Utilities - -- (NSArray *)getSortedKeys { - return [[recordings allKeys] sortedArrayUsingComparator:^NSComparisonResult(NSString *day2, NSString *day1){ - NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; - [dateFormat setDateFormat:@"EEEE, MMM d, yyyy"]; - NSDate *date1 = [dateFormat dateFromString:day1]; - NSDate *date2 = [dateFormat dateFromString:day2]; - return [date1 compare:date2]; - }]; -} - - -@end diff --git a/Classes/RecordingsListView.h b/Classes/RecordingsListView.h deleted file mode 100644 index aa7face6c..000000000 --- a/Classes/RecordingsListView.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UICompositeView.h" -#import "RecordingsListTableView.h" -#import "UIInterfaceStyleButton.h" - -typedef enum _RecordingSelectionMode { RecordingSelectionModeNone, RecordingSelectionModeEdit } RecordingSelectionMode; - -@interface RecordingSelection : NSObject { -} - -+ (void)setSelectionMode:(RecordingSelectionMode)selectionMode; -+ (RecordingSelectionMode)getSelectionMode; - -@end - -@interface RecordingsListView : UIViewController - -@property(strong, nonatomic) IBOutlet RecordingsListTableView *tableController; -@property(strong, nonatomic) IBOutlet UIView *topBar; -@property(weak, nonatomic) IBOutlet UIButton *deleteButton; -@property (strong, nonatomic) IBOutlet UIButton *backButton; -@property (weak, nonatomic) IBOutlet UIInterfaceStyleButton *toggleSelectionButton; -@property (weak, nonatomic) IBOutlet UIView *videoView; - -- (IBAction)onDeleteClick:(id)sender; -- (IBAction)onEditionChangeClick:(id)sender; -- (IBAction)onBackPressed:(id)sender; - -@end diff --git a/Classes/RecordingsListView.m b/Classes/RecordingsListView.m deleted file mode 100644 index 7420a9e37..000000000 --- a/Classes/RecordingsListView.m +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "RecordingsListView.h" -#import "PhoneMainView.h" - -@implementation RecordingSelection - -static RecordingSelectionMode sSelectionMode = RecordingSelectionModeNone; - -+ (void)setSelectionMode:(RecordingSelectionMode)selectionMode { - sSelectionMode = selectionMode; -} - -+ (RecordingSelectionMode)getSelectionMode { - return sSelectionMode; -} - -@end - -@implementation RecordingsListView - -@synthesize tableController; -@synthesize topBar; - -#pragma mark - UICompositeViewDelegate Functions - -static UICompositeViewDescription *compositeDescription = nil; - -+ (UICompositeViewDescription *)compositeViewDescription { - if (compositeDescription == nil) { - compositeDescription = [[UICompositeViewDescription alloc] init:self.class - statusBar:StatusBarView.class - tabBar:TabBarView.class - sideMenu:SideMenuView.class - fullscreen:false - isLeftFragment:YES - fragmentWith:ContactDetailsView.class]; - } - return compositeDescription; -} - -- (UICompositeViewDescription *)compositeViewDescription { - return self.class.compositeViewDescription; -} - -#pragma mark - ViewController Functions - -- (void)viewDidLoad { - [super viewDidLoad]; - tableController.tableView.accessibilityIdentifier = @"Recordings table"; - tableController.tableView.tableFooterView = [[UIView alloc] init]; - UIPanGestureRecognizer *dragndrop = - [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(moveVideoView:)]; - dragndrop.minimumNumberOfTouches = 1; - [_videoView addGestureRecognizer:dragndrop]; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - if (tableController.isEditing) { - tableController.editing = NO; - } - [_toggleSelectionButton setImage:[UIImage imageNamed:@"select_all_default.png"] forState:UIControlStateSelected]; -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; -} - -- (void) viewWillDisappear:(BOOL)animated { - self.view = NULL; - [self.tableController removeAllRecordings]; -} - -#pragma mark - Action Functions - -- (IBAction)onDeleteClick:(id)sender { - NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"Do you want to delete selected recordings?", nil)]; - [LinphoneManager.instance setContactsUpdated:TRUE]; - [UIConfirmationDialog ShowWithMessage:msg - cancelMessage:nil - confirmMessage:nil - onCancelClick:^() { - [self onEditionChangeClick:nil]; - } - onConfirmationClick:^() { - [tableController removeSelectionUsing:nil]; - [tableController loadData]; - [self onEditionChangeClick:nil]; - }]; -} - -- (IBAction)onEditionChangeClick:(id)sender { - _backButton.hidden = self.tableController.isEditing; -} - -- (IBAction)onBackPressed:(id)sender { - [PhoneMainView.instance popCurrentView]; -} - -#pragma mark VideoViewMoving - -- (void)moveVideoView:(UIPanGestureRecognizer *)dragndrop { - CGPoint center = [dragndrop locationInView:_videoView.superview]; - _videoView.center = center; - if (dragndrop.state == UIGestureRecognizerStateEnded) { - [self previewTouchLift]; - } -} - -- (CGFloat)coerce:(CGFloat)value betweenMin:(CGFloat)min andMax:(CGFloat)max { - return MAX(min, MIN(value, max)); -} - -- (void)previewTouchLift { - CGRect previewFrame = _videoView.frame; - previewFrame.origin.x = [self coerce:previewFrame.origin.x - betweenMin:5 - andMax:(UIScreen.mainScreen.bounds.size.width - 5 - previewFrame.size.width)]; - previewFrame.origin.y = [self coerce:previewFrame.origin.y - betweenMin:5 - andMax:(UIScreen.mainScreen.bounds.size.height - 5 - previewFrame.size.height)]; - - if (!CGRectEqualToRect(previewFrame, _videoView.frame)) { - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [UIView animateWithDuration:0.3 - animations:^{ - LOGD(@"Recentering preview to %@", NSStringFromCGRect(previewFrame)); - _videoView.frame = previewFrame; - }]; - }); - } -} - - -@end diff --git a/Classes/SettingsView.h b/Classes/SettingsView.h deleted file mode 100644 index 90a6a023f..000000000 --- a/Classes/SettingsView.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "UICompositeView.h" -#import "IASKAppSettingsViewController.h" -#import "LinphoneCoreSettingsStore.h" - -@interface SettingsView - : UIViewController { - @private - LinphoneCoreSettingsStore *settingsStore; - BOOL isRoot; -} - -@property(nonatomic, strong) IBOutlet UINavigationController *navigationController; -@property(nonatomic, strong) IBOutlet IASKAppSettingsViewController *settingsController; -@property(weak, nonatomic) IBOutlet UIView *subView; -@property(weak, nonatomic) IBOutlet UIButton *backButton; -@property(weak, nonatomic) IBOutlet UILabel *titleLabel; -@property(nonatomic) NSString* tmpPwd; - -- (IBAction)onDialerBackClick:(id)sender; -- (IBAction)onBackClick:(id)sender; - -@end diff --git a/Classes/SettingsView.m b/Classes/SettingsView.m deleted file mode 100644 index e36226fee..000000000 --- a/Classes/SettingsView.m +++ /dev/null @@ -1,1387 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "SettingsView.h" -#import "LinphoneManager.h" -#import "LinphoneAppDelegate.h" -#import "PhoneMainView.h" -#import "Utils.h" -#import "linphoneapp-Swift.h" - -#import "DCRoundSwitch.h" - -#import "IASKSpecifierValuesViewController.h" -#import "IASKPSTextFieldSpecifierViewCell.h" -#import "IASKSpecifier.h" -#import "IASKTextField.h" -#include "linphone/lpconfig.h" - -#ifdef DEBUG -@interface UIDevice (debug) - -- (void)setBatteryLevel:(float)level; -- (void)setBatteryState:(int)state; - -@end -#endif - -@interface SettingsView (private) - -+ (IASKSpecifier *)filterSpecifier:(IASKSpecifier *)specifier; - -@end - -#pragma mark - IASKSwitchEx Class - -@interface IASKSwitchEx : DCRoundSwitch { - NSString *_key; -} - -@property(nonatomic, strong) NSString *key; - -@end - -@implementation IASKSwitchEx - -@synthesize key = _key; - -- (void)dealloc { - _key = nil; -} - -@end - -#pragma mark - IASKSpecifierValuesViewControllerEx Class - -// Patch IASKSpecifierValuesViewController -@interface IASKSpecifierValuesViewControllerEx : IASKSpecifierValuesViewController - -@end - -@implementation IASKSpecifierValuesViewControllerEx - -- (void)initIASKSpecifierValuesViewControllerEx { - [self.view setBackgroundColor:[UIColor clearColor]]; -} - -- (id)init { - self = [super init]; - if (self != nil) { - [self initIASKSpecifierValuesViewControllerEx]; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)aDecoder { - self = [super initWithCoder:aDecoder]; - if (self != nil) { - [self initIASKSpecifierValuesViewControllerEx]; - } - return self; -} - -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self != nil) { - [self initIASKSpecifierValuesViewControllerEx]; - } - return self; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath]; - return cell; -} - -@end - -#pragma mark - IASKAppSettingsViewControllerEx Class - -@interface IASKAppSettingsViewController (PrivateInterface) -- (UITableViewCell *)newCellForIdentifier:(NSString *)identifier; -@end -; - -@interface IASKAppSettingsViewControllerEx : IASKAppSettingsViewController - -@end - -@implementation IASKAppSettingsViewControllerEx - -- (UITableViewCell *)newCellForIdentifier:(NSString *)identifier { - UITableViewCell *cell = nil; - if ([identifier isEqualToString:kIASKPSToggleSwitchSpecifier]) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault - reuseIdentifier:kIASKPSToggleSwitchSpecifier]; - cell.accessoryView = [[IASKSwitchEx alloc] initWithFrame:CGRectMake(0, 0, 79, 27)]; - [((IASKSwitchEx *)cell.accessoryView) addTarget:self - action:@selector(toggledValue:) - forControlEvents:UIControlEventValueChanged]; - [((IASKSwitchEx *)cell.accessoryView) setOnTintColor:LINPHONE_MAIN_COLOR]; - cell.selectionStyle = UITableViewCellSelectionStyleNone; - cell.textLabel.minimumScaleFactor = kIASKMinimumFontSize / [UIFont systemFontSize]; - cell.detailTextLabel.minimumScaleFactor = kIASKMinimumFontSize / [UIFont systemFontSize]; - } else { - cell = [super newCellForIdentifier:identifier]; - } - return cell; -} - -- (void)toggledValue:(id)sender { - IASKSwitchEx *toggle = (IASKSwitchEx *)sender; - IASKSpecifier *spec = [_settingsReader specifierForKey:[toggle key]]; - - if ([toggle isOn]) { - if ([spec trueValue] != nil) { - [self.settingsStore setObject:[spec trueValue] forKey:[toggle key]]; - } else { - [self.settingsStore setBool:YES forKey:[toggle key]]; - } - } else { - if ([spec falseValue] != nil) { - [self.settingsStore setObject:[spec falseValue] forKey:[toggle key]]; - } else { - [self.settingsStore setBool:NO forKey:[toggle key]]; - } - } - // Start notification after animation of DCRoundSwitch - dispatch_async(dispatch_get_main_queue(), ^{ - [NSNotificationCenter.defaultCenter - postNotificationName:kIASKAppSettingChanged - object:[toggle key] - userInfo:[NSDictionary dictionaryWithObject:[self.settingsStore objectForKey:[toggle key]] - forKey:[toggle key]]]; - }); -} - -- (void)initIASKAppSettingsViewControllerEx { - [self.view setBackgroundColor:[UIColor clearColor]]; - - // Force kIASKSpecifierValuesViewControllerIndex - static int kIASKSpecifierValuesViewControllerIndex = 0; - _viewList = [[NSMutableArray alloc] init]; - [_viewList addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"IASKSpecifierValuesView", @"ViewName", nil]]; - [_viewList addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"IASKAppSettingsView", @"ViewName", nil]]; - - NSMutableDictionary *newItemDict = [NSMutableDictionary dictionaryWithCapacity:3]; - [newItemDict addEntriesFromDictionary:[_viewList objectAtIndex:kIASKSpecifierValuesViewControllerIndex]]; // copy - // the - // title - // and - // explain - // strings - - IASKSpecifierValuesViewController *targetViewController = [[IASKSpecifierValuesViewControllerEx alloc] init]; - // add the new view controller to the dictionary and then to the 'viewList' array - [newItemDict setObject:targetViewController forKey:@"viewController"]; - [_viewList replaceObjectAtIndex:kIASKSpecifierValuesViewControllerIndex withObject:newItemDict]; -} - -- (IASKSettingsReader *)settingsReader { - IASKSettingsReader *r = [super settingsReader]; - NSMutableArray *dataSource = [NSMutableArray arrayWithArray:[r dataSource]]; - if ([[UIApplication sharedApplication] applicationState] != UIApplicationStateBackground) { - for (int i = 0; i < [dataSource count]; ++i) { - NSMutableArray *specifiers = [NSMutableArray arrayWithArray:[dataSource objectAtIndex:i]]; - for (int j = 0; j < [specifiers count]; ++j) { - id sp = [specifiers objectAtIndex:j]; - if ([sp isKindOfClass:[IASKSpecifier class]]) { - sp = [SettingsView filterSpecifier:sp]; - } - [specifiers replaceObjectAtIndex:j withObject:sp]; - } - - [dataSource replaceObjectAtIndex:i withObject:specifiers]; - } - } else { - NSLog(@"Application is in background, linphonecore is off, skiping filter specifier."); - } - - [r setDataSource:dataSource]; - return r; -} - -- (id)initWithStyle:(UITableViewStyle)style { - self = [super initWithStyle:style]; - if (self != nil) { - [self initIASKAppSettingsViewControllerEx]; - } - return self; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - - UIEdgeInsets inset = {0, 0, 10, 0}; - UIScrollView *scrollView = self.tableView; - [scrollView setContentInset:inset]; - [scrollView setScrollIndicatorInsets:inset]; - // specific for media encryption - if (linphone_core_get_media_encryption(LC) == LinphoneMediaEncryptionNone && linphone_core_is_media_encryption_mandatory(LC)) { - linphone_core_set_media_encryption_mandatory(LC, FALSE); - [self.tableView reloadData]; - } -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath]; - - if ([cell isKindOfClass:[IASKPSTextFieldSpecifierViewCell class]]) { - UITextField *field = ((IASKPSTextFieldSpecifierViewCell *)cell).textField; - [field setTextColor:LINPHONE_MAIN_COLOR]; - } - - if ([cell isKindOfClass:[UITableViewCell class]]) { - cell.detailTextLabel.textColor = [UIColor grayColor]; - } else { - cell.detailTextLabel.textColor = LINPHONE_MAIN_COLOR; - } - return cell; -} -@end - -#pragma mark - UINavigationBarEx Class - -@interface UINavigationBarEx : UINavigationBar -@end - -@implementation UINavigationBarEx - -INIT_WITH_COMMON_CF { - [self setTintColor:[LINPHONE_MAIN_COLOR adjustHue:5.0f / 180.0f saturation:0.0f brightness:0.0f alpha:0.0f]]; - return self; -} - -@end - -#pragma mark - UINavigationControllerEx Class - -@interface UINavigationControllerEx : UINavigationController - -@end - -@implementation UINavigationControllerEx - -- (id)initWithRootViewController:(UIViewController *)rootViewController { - [UINavigationControllerEx removeBackground:rootViewController.view]; - return [super initWithRootViewController:rootViewController]; -} - -+ (void)removeBackground:(UIView *)view { - // iOS7 transparent background is *really* transparent: with an alpha != 0 - // it messes up the transitions. Use non-transparent BG for iOS7 - if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) - [view setBackgroundColor:LINPHONE_SETTINGS_BG_IOS7]; - else - [view setBackgroundColor:[UIColor clearColor]]; -} - -- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { - - @try { - [UINavigationControllerEx removeBackground:viewController.view]; - - [viewController view]; // Force view - UILabel *labelTitleView = [[UILabel alloc] init]; - labelTitleView.backgroundColor = [UIColor clearColor]; - labelTitleView.textColor = - [UIColor colorWithRed:0x41 / 255.0f green:0x48 / 255.0f blue:0x4f / 255.0f alpha:1.0]; - labelTitleView.shadowColor = [UIColor colorWithWhite:1.0 alpha:0.5]; - labelTitleView.font = [UIFont boldSystemFontOfSize:20]; - labelTitleView.shadowOffset = CGSizeMake(0, 1); - labelTitleView.textAlignment = NSTextAlignmentCenter; - labelTitleView.text = viewController.title; - [labelTitleView sizeToFit]; - viewController.navigationItem.titleView = labelTitleView; - - [super pushViewController:viewController animated:animated]; - } @catch (NSException *e) { - // when device is slow and you are typing an item too much, a crash may happen - // because we try to push the same view multiple times - in that case we should - // do nothing but wait for device to respond again. - LOGI(@"Failed to push view because it's already there: %@", e.reason); - [self popToViewController:viewController animated:YES]; - } -} - -- (void)setViewControllers:(NSArray *)viewControllers { - for (UIViewController *controller in viewControllers) { - [UINavigationControllerEx removeBackground:controller.view]; - } - [super setViewControllers:viewControllers]; -} - -- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated { - for (UIViewController *controller in viewControllers) { - [UINavigationControllerEx removeBackground:controller.view]; - } - [super setViewControllers:viewControllers animated:animated]; -} - -@end - -@implementation SettingsView - -#pragma mark - UICompositeViewDelegate Functions - -id thisClass; - -UIActivityIndicatorView *indicator = nil; - -- (id) init -{ - if (self = [super init]) - { - thisClass = self; - } - return self; -} - -static UICompositeViewDescription *compositeDescription = nil; - -+ (UICompositeViewDescription *)compositeViewDescription { - if (compositeDescription == nil) { - compositeDescription = [[UICompositeViewDescription alloc] init:self.class - statusBar:StatusBarView.class - tabBar:nil - sideMenu:SideMenuView.class - fullscreen:false - isLeftFragment:YES - fragmentWith:nil]; - } - return compositeDescription; -} - -- (UICompositeViewDescription *)compositeViewDescription { - return self.class.compositeViewDescription; -} - -#pragma mark - ViewController Functions - -- (void)viewDidLoad { - [super viewDidLoad]; - - settingsStore = [[LinphoneCoreSettingsStore alloc] init]; - - _settingsController.showDoneButton = FALSE; - _settingsController.delegate = self; - _settingsController.showCreditsFooter = FALSE; - _settingsController.settingsStore = settingsStore; - - [_navigationController.view setBackgroundColor:[UIColor clearColor]]; - - _navigationController.view.frame = self.subView.frame; - [_navigationController pushViewController:_settingsController animated:FALSE]; - [self.view addSubview:_navigationController.view]; - - indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; - indicator.center = CGPointMake(self.view.bounds.size.width / 2 , (self.view.bounds.size.height) /2); - [self.view addSubview:indicator]; -} - -- (void)viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; - [_settingsController dismiss:self]; - // Set observer - [NSNotificationCenter.defaultCenter removeObserver:self name:kIASKAppSettingChanged object:nil]; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - - // Sync settings with linphone core settings - [settingsStore transformLinphoneCoreToKeys]; - [self recomputeAccountLabelsAndSync]; - - // Set observer - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(appSettingChanged:) - name:kIASKAppSettingChanged - object:nil]; -} - -#pragma mark - Account Creator callbacks - -void update_hash_cbs(LinphoneAccountCreator *creator, LinphoneAccountCreatorStatus status, const char *resp) { - SettingsView *thiz = (__bridge SettingsView *)(linphone_account_creator_cbs_get_user_data( - linphone_account_creator_get_callbacks(creator))); - - switch (status) { - case LinphoneAccountCreatorStatusRequestOk: - [thiz updatePassword:creator]; - break; - default: - [thiz showError:status]; - break; - } -} - -- (void) showError:(LinphoneAccountCreatorStatus) status { - _tmpPwd = NULL; - NSString* err; - switch (status) { - case LinphoneAccountCreatorStatusAccountNotExist: - err = NSLocalizedString(@"Bad credentials, check your account settings", nil); - break; - case LinphoneAccountCreatorStatusServerError: - err = NSLocalizedString(@"Server error, please try again later.", nil); - break; - default: - err = NSLocalizedString(@"Unknown error, please try again later.", nil); - break; - } - - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Error while changing your password", nil) - message:err - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; -} - -- (void) updatePassword:(LinphoneAccountCreator*) creator { - linphone_account_creator_set_password(creator, _tmpPwd.UTF8String); - [settingsStore setObject:_tmpPwd forKey:@"account_mandatory_password_preference"]; - - MSList *accountList = [LinphoneManager.instance createAccountsNotHiddenList]; - LinphoneAccount *account = bctbx_list_nth_data(linphone_core_get_account_list(LC), - [settingsStore integerForKey:@"current_proxy_config_preference"]); - bctbx_free(accountList); - - if (account != NULL) { - const LinphoneAuthInfo *auth = linphone_account_find_auth_info(account); - if (auth) { - LinphoneAuthInfo * newAuth = linphone_auth_info_clone(auth); - linphone_auth_info_set_passwd(newAuth, _tmpPwd.UTF8String); - linphone_core_remove_auth_info(LC, auth); - linphone_core_add_auth_info(LC, newAuth); - } - } - [self recomputeAccountLabelsAndSync]; - [settingsStore setObject:_tmpPwd forKey:@"account_mandatory_password_preference"]; - _tmpPwd = NULL; - - - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Changing your password", nil) - message:NSLocalizedString(@"Your password has been successfully changed", nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; -} - -#pragma mark - Event Functions - -- (void)appSettingChanged:(NSNotification *)notif { - NSMutableSet *hiddenKeys = [NSMutableSet setWithSet:[_settingsController hiddenKeys]]; - NSMutableArray *keys = [NSMutableArray array]; - BOOL removeFromHiddenKeys = TRUE; - - if ([@"enable_video_preference" compare:notif.object] == NSOrderedSame) { - removeFromHiddenKeys = [[notif.userInfo objectForKey:@"enable_video_preference"] boolValue]; - [keys addObject:@"video_menu"]; - } else if ([@"random_port_preference" compare:notif.object] == NSOrderedSame) { - removeFromHiddenKeys = ![[notif.userInfo objectForKey:@"random_port_preference"] boolValue]; - [keys addObject:@"port_preference"]; - } else if ([@"backgroundmode_preference" compare:notif.object] == NSOrderedSame) { - removeFromHiddenKeys = [[notif.userInfo objectForKey:@"backgroundmode_preference"] boolValue]; - [keys addObject:@"start_at_boot_preference"]; - } else if ([@"stun_preference" compare:notif.object] == NSOrderedSame) { - NSString *stun_server = [notif.userInfo objectForKey:@"stun_preference"]; - removeFromHiddenKeys = (stun_server && ([stun_server length] > 0)); - [keys addObject:@"ice_preference"]; - } else if ([@"turn_preference" compare:notif.object] == NSOrderedSame) { - LinphoneNatPolicy *LNP = linphone_core_get_nat_policy(LC); - linphone_nat_policy_enable_turn(LNP, !linphone_nat_policy_turn_enabled(LNP)); - [keys addObject:@"turn_preference"]; - } else if ([@"debugenable_preference" compare:notif.object] == NSOrderedSame) { - int debugLevel = [[notif.userInfo objectForKey:@"debugenable_preference"] intValue]; - BOOL debugEnabled = (debugLevel >= ORTP_DEBUG && debugLevel < ORTP_ERROR); - removeFromHiddenKeys = debugEnabled; - [keys addObject:@"send_logs_button"]; - [keys addObject:@"reset_logs_button"]; - if ([LinphoneManager.instance lpConfigBoolForKey:@"send_db"]) { - [keys addObject:@"send_db_button"]; - } - [Log enableLogs:debugLevel]; - [LinphoneManager.instance lpConfigSetInt:debugLevel forKey:@"debugenable_preference"]; - } else if ([@"account_mandatory_advanced_preference" compare:notif.object] == NSOrderedSame) { - removeFromHiddenKeys = [[notif.userInfo objectForKey:@"account_mandatory_advanced_preference"] boolValue]; - for (NSString *key in settingsStore->dict) { - if (([key hasPrefix:@"account_"]) && (![key hasPrefix:@"account_mandatory_"])) { - [keys addObject:key]; - } - } - } else if ([@"video_preset_preference" compare:notif.object] == NSOrderedSame) { - NSString *video_preset = [notif.userInfo objectForKey:@"video_preset_preference"]; - removeFromHiddenKeys = [video_preset isEqualToString:@"custom"]; - [keys addObject:@"video_preferred_fps_preference"]; - [keys addObject:@"download_bandwidth_preference"]; - } else if ([@"auto_download_mode" compare:notif.object] == NSOrderedSame) { - NSString *download_mode = [notif.userInfo objectForKey:@"auto_download_mode"]; - if([download_mode isEqualToString:@"Customize"]){ - [LinphoneManager.instance lpConfigSetBool:FALSE forKey:@"auto_download_mode_is_never"]; - removeFromHiddenKeys = [download_mode isEqualToString:@"Customize"]; - [LinphoneManager.instance lpConfigSetInt:10000000 forKey:@"auto_download_incoming_files_max_size"]; - [keys addObject:@"auto_download_incoming_files_max_size"]; - [hiddenKeys addObject:@"auto_write_to_gallery_mode"]; - } else { - [LinphoneManager.instance lpConfigSetBool:FALSE forKey:@"auto_download_mode_is_never"]; - [hiddenKeys addObject:@"auto_download_incoming_files_max_size"]; - } - }else if ([@"vfs_enabled_mode" compare:notif.object] == NSOrderedSame) { - removeFromHiddenKeys = [[notif.userInfo objectForKey:@"vfs_enabled_mode"] boolValue]; - if(removeFromHiddenKeys){ - [LinphoneManager.instance lpConfigSetBool:TRUE forKey:@"vfs_enabled_mode"]; - [LinphoneManager.instance lpConfigSetBool:FALSE forKey:@"auto_write_to_gallery_preference"]; - [hiddenKeys addObject:@"auto_write_to_gallery_mode"]; - [hiddenKeys addObject:@"vfs_enabled_mode"]; - [keys addObject:@"vfs_enabled"]; - } - } - - for (NSString *key in keys) { - if (removeFromHiddenKeys) - [hiddenKeys removeObject:key]; - else - [hiddenKeys addObject:key]; - } - - [_settingsController setHiddenKeys:hiddenKeys animated:TRUE]; -} - -#pragma mark - - -+ (IASKSpecifier *)filterSpecifier:(IASKSpecifier *)specifier { - if (!linphone_core_sip_transport_supported(LC, LinphoneTransportTls)) { - if ([[specifier key] isEqualToString:@"account_transport_preference"]) { - NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:[specifier specifierDict]]; - NSMutableArray *titles = [NSMutableArray arrayWithArray:[dict objectForKey:@"Titles"]]; - [titles removeObject:@"TLS"]; - [dict setObject:titles forKey:@"Titles"]; - NSMutableArray *values = [NSMutableArray arrayWithArray:[dict objectForKey:@"Values"]]; - [values removeObject:@"tls"]; - [dict setObject:values forKey:@"Values"]; - return [[IASKSpecifier alloc] initWithSpecifier:dict]; - } - } else { - BOOL pq_available = linphone_core_get_post_quantum_available(); - if ([[specifier key] isEqualToString:pq_available ? @"media_encryption_preference_pq_enabled" : @"media_encryption_preference"]) { - NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:[specifier specifierDict]]; - if (!linphone_core_media_encryption_supported(LC, LinphoneMediaEncryptionZRTP)) { - NSMutableArray *titles = [NSMutableArray arrayWithArray:[dict objectForKey:@"Titles"]]; - [titles removeObject:pq_available ? @"ZRTP" : @"ZRTP Post Quantum"]; - [dict setObject:titles forKey:@"Titles"]; - NSMutableArray *values = [NSMutableArray arrayWithArray:[dict objectForKey:@"Values"]]; - [values removeObject:@"ZRTP"]; - [dict setObject:values forKey:@"Values"]; - } - if (!linphone_core_media_encryption_supported(LC, LinphoneMediaEncryptionSRTP)) { - NSMutableArray *titles = [NSMutableArray arrayWithArray:[dict objectForKey:@"Titles"]]; - [titles removeObject:@"SRTP"]; - [dict setObject:titles forKey:@"Titles"]; - NSMutableArray *values = [NSMutableArray arrayWithArray:[dict objectForKey:@"Values"]]; - [values removeObject:@"SRTP"]; - [dict setObject:values forKey:@"Values"]; - } - if (!linphone_core_media_encryption_supported(LC, LinphoneMediaEncryptionDTLS)) { - NSMutableArray *titles = [NSMutableArray arrayWithArray:[dict objectForKey:@"Titles"]]; - [titles removeObject:@"DTLS"]; - [dict setObject:titles forKey:@"Titles"]; - NSMutableArray *values = [NSMutableArray arrayWithArray:[dict objectForKey:@"Values"]]; - [values removeObject:@"DTLS"]; - [dict setObject:values forKey:@"Values"]; - } - return [[IASKSpecifier alloc] initWithSpecifier:dict]; - } - } - - if ([specifier.key hasPrefix:@"menu_account_"]) { - MSList *accounts = [LinphoneManager.instance createAccountsNotHiddenList]; - int index = [specifier.key substringFromIndex:@"menu_account_".length].intValue - 1; - if (index < bctbx_list_size(accounts)) { - LinphoneAccount *account = (LinphoneAccount *)bctbx_list_nth_data(accounts, index); - NSString *name = [NSString - stringWithUTF8String:linphone_address_get_username(linphone_account_params_get_identity_address(linphone_account_get_params(account)))]; - [specifier.specifierDict setValue:name forKey:kIASKTitle]; - } - bctbx_free(accounts); - } - - if ([specifier.key hasPrefix:@"ldap_"]) { - if (linphone_core_ldap_available(LC)) { - const bctbx_list_t *ldaps = linphone_core_get_ldap_list(LC); - int index = [specifier.key substringFromIndex:@"ldap_".length].intValue - 1; - if (index < bctbx_list_size(ldaps)) { - const LinphoneLdapParams *ldapParams = linphone_ldap_get_params(bctbx_list_nth_data(ldaps, index)); - - NSString *name = [NSString - stringWithUTF8String:linphone_ldap_params_get_server(ldapParams)]; - [specifier.specifierDict setValue:name forKey:kIASKTitle]; - } - } - } - - - if ([[specifier key] isEqualToString:@"ldap_auth_method"]) { - NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:[specifier specifierDict]]; - NSMutableArray *titles = [NSMutableArray arrayWithArray:[dict objectForKey:@"Titles"]]; - [titles removeObject:@"TLS"]; - [dict setObject:titles forKey:@"Titles"]; - NSMutableArray *values = [NSMutableArray arrayWithArray:[dict objectForKey:@"Values"]]; - [values removeObject:@"tls"]; - [dict setObject:values forKey:@"Values"]; - return [[IASKSpecifier alloc] initWithSpecifier:dict]; - } - - return specifier; -} - -- (NSSet *)findHiddenKeys { - LinphoneManager *lm = LinphoneManager.instance; - NSMutableSet *hiddenKeys = [NSMutableSet set]; - - MSList *accounts = [LinphoneManager.instance createAccountsNotHiddenList]; - for (size_t i = bctbx_list_size(accounts) + 1; i <= 5; i++) { - [hiddenKeys addObject:[NSString stringWithFormat:@"menu_account_%lu", i]]; - } - bctbx_free(accounts); - const MSList *ldaps = linphone_core_get_ldap_list(LC); - for (size_t i = bctbx_list_size(ldaps) + 1; i <= 5; i++) { - [hiddenKeys addObject:[NSString stringWithFormat:@"ldap_%lu", i]]; - } - if (!linphone_core_sip_transport_supported(LC, LinphoneTransportTls)) { - [hiddenKeys addObject:@"media_encryption_preference"]; - [hiddenKeys addObject:@"media_encryption_preference_pq_enabled"]; - } else { - if (linphone_core_get_post_quantum_available()) { - [hiddenKeys addObject:@"media_encryption_preference"]; - } else { - [hiddenKeys addObject:@"media_encryption_preference_pq_enabled"]; - } - } - - if (!linphone_core_ldap_available(LC)) { - [hiddenKeys addObject:@"contacts_menu"]; - } - - if ([LinphoneManager.instance lpConfigBoolForKey:@"disable_chat_feature"]){ - [hiddenKeys addObject:@"message_menu"]; - } - - if ([LinphoneManager.instance lpConfigBoolForKey:@"disable_video_feature"]) { - [hiddenKeys addObject:@"enable_video_preference"]; - [hiddenKeys addObject:@"video_menu"]; - } - - [hiddenKeys addObject:@"enable_broadcast_conference_feature"]; - [hiddenKeys addObject:@"meeting_menu"]; - -#ifndef DEBUG - [hiddenKeys addObject:@"debug_actions_group"]; - [hiddenKeys addObject:@"release_button"]; - [hiddenKeys addObject:@"clear_cache_button"]; - [hiddenKeys addObject:@"battery_alert_button"]; - [hiddenKeys addObject:@"enable_auto_answer_preference"]; - [hiddenKeys addObject:@"flush_images_button"]; -#endif - - int debugLevel = [LinphoneManager.instance lpConfigIntForKey:@"debugenable_preference"]; - BOOL debugEnabled = (debugLevel >= ORTP_DEBUG && debugLevel < ORTP_ERROR); - if (!debugEnabled) { - [hiddenKeys addObject:@"send_logs_button"]; - [hiddenKeys addObject:@"reset_logs_button"]; - } - - if (![LinphoneManager.instance lpConfigBoolForKey:@"send_db"]) { - [hiddenKeys addObject:@"send_db_button"]; - } - - [hiddenKeys addObject:@"playback_gain_preference"]; - [hiddenKeys addObject:@"microphone_gain_preference"]; - - [hiddenKeys addObject:@"network_limit_group"]; - - [hiddenKeys addObject:@"incoming_call_timeout_preference"]; - [hiddenKeys addObject:@"in_call_timeout_preference"]; - - [hiddenKeys addObject:@"wifi_only_preference"]; - - if (!linphone_core_video_supported(LC)) { - [hiddenKeys addObject:@"video_menu"]; - } - - if (![LinphoneManager isCodecSupported:"h264"]) { - [hiddenKeys addObject:@"h264_preference"]; - } - if (![LinphoneManager isCodecSupported:"mp4v-es"]) { - [hiddenKeys addObject:@"mp4v-es_preference"]; - } - - if (![LinphoneManager isNotIphone3G]) - [hiddenKeys addObject:@"silk_24k_preference"]; - - UIDevice *device = [UIDevice currentDevice]; - if (![device respondsToSelector:@selector(isMultitaskingSupported)] || ![device isMultitaskingSupported]) { - [hiddenKeys addObject:@"backgroundmode_preference"]; - [hiddenKeys addObject:@"start_at_boot_preference"]; - } else { - if (![lm lpConfigBoolForKey:@"backgroundmode_preference"]) { - [hiddenKeys addObject:@"start_at_boot_preference"]; - } - } - - [hiddenKeys addObject:@"enable_first_login_view_preference"]; - - if (!linphone_core_video_supported(LC)) { - [hiddenKeys addObject:@"enable_video_preference"]; - } - - if (!linphone_core_video_display_enabled(LC)) { - [hiddenKeys addObject:@"video_menu"]; - } - - if (!linphone_core_get_video_preset(LC) || strcmp(linphone_core_get_video_preset(LC), "custom") != 0) { - [hiddenKeys addObject:@"video_preferred_fps_preference"]; - [hiddenKeys addObject:@"download_bandwidth_preference"]; - } - - [hiddenKeys addObjectsFromArray:[[LinphoneManager unsupportedCodecs] allObjects]]; - - BOOL random_port = [lm lpConfigBoolForKey:@"random_port_preference"]; - if (random_port) { - [hiddenKeys addObject:@"port_preference"]; - } - - if (linphone_core_get_stun_server(LC) == NULL) { - [hiddenKeys addObject:@"ice_preference"]; - } - - if (![lm lpConfigBoolForKey:@"debugenable_preference"]) { - [hiddenKeys addObject:@"console_button"]; - } - - if (!IPAD) { - [hiddenKeys addObject:@"preview_preference"]; - } - - if ([lm lpConfigBoolForKey:@"hide_run_assistant_preference"]) { - [hiddenKeys addObject:@"assistant_button"]; - } - - if (!linphone_core_tunnel_available()) { - [hiddenKeys addObject:@"tunnel_menu"]; - } - - if (![lm lpConfigBoolForKey:@"account_mandatory_advanced_preference"]) { - for (NSString *key in settingsStore->dict) { - if (([key hasPrefix:@"account_"]) && (![key hasPrefix:@"account_mandatory_"])) { - [hiddenKeys addObject:key]; - } - } - } - - if (![[LinphoneManager.instance iapManager] enabled]) { - [hiddenKeys addObject:@"in_app_products_button"]; - } - - if ([[UIDevice currentDevice].systemVersion floatValue] < 8) { - [hiddenKeys addObject:@"repeat_call_notification_preference"]; - } - - if (![lm lpConfigBoolForKey:@"accept_early_media" inSection:@"app"]) { - [hiddenKeys addObject:@"pref_accept_early_media_preference"]; - } - - if (![[lm lpConfigStringForKey:@"auto_download_mode"] isEqualToString:@"Customize"]) { - [hiddenKeys addObject:@"auto_download_incoming_files_max_size"]; - } - - if ([lm lpConfigBoolForKey:@"vfs_enabled_mode"]) { - [hiddenKeys addObject:@"auto_write_to_gallery_mode"]; - [hiddenKeys addObject:@"vfs_enabled_mode"]; - }else{ - [hiddenKeys addObject:@"vfs_enabled"]; - } - - - if (@available(iOS 15.0, *)) {} else { - [hiddenKeys addObject:@"local_push"]; - [hiddenKeys addObject:@"local_ssids"]; - } - - return hiddenKeys; -} - -- (void)recomputeAccountLabelsAndSync { - // it's a bit violent... but IASK is not designed to dynamically change subviews' name - _settingsController.hiddenKeys = [self findHiddenKeys]; - [_settingsController.settingsReader indexPathForKey:@"menu_account_1"]; // force refresh username' - [_settingsController.settingsReader indexPathForKey:@"menu_account_2"]; // force refresh username' - [_settingsController.settingsReader indexPathForKey:@"menu_account_3"]; // force refresh username' - [_settingsController.settingsReader indexPathForKey:@"menu_account_4"]; // force refresh username' - [_settingsController.settingsReader indexPathForKey:@"menu_account_5"]; // force refresh username' - [[_settingsController tableView] reloadData]; -} - --(void)recomputeLdapLabelsAndSync { - // it's a bit violent... but IASK is not designed to dynamically change subviews' name - _settingsController.hiddenKeys = [self findHiddenKeys]; - [_settingsController.settingsReader indexPathForKey:@"ldap_1"]; // force refresh ldap server name display - [_settingsController.settingsReader indexPathForKey:@"ldap_2"]; // force refresh ldap server name display - [_settingsController.settingsReader indexPathForKey:@"ldap_3"]; // force refresh ldap server name display - [_settingsController.settingsReader indexPathForKey:@"ldap_4"]; // force refresh ldap server name display - [_settingsController.settingsReader indexPathForKey:@"ldap_5"]; // force refresh ldap server name display - [[_settingsController tableView] reloadData]; -} - -#pragma mark - IASKSettingsDelegate Functions - -- (void)settingsViewControllerDidEnd:(IASKAppSettingsViewController *)sender { -} - -- (void)settingsViewControllerWillAppear:(IASKAppSettingsViewController *)sender { - isRoot = (sender.file == nil || [sender.file isEqualToString:@"Root"]); - _titleLabel.text = sender.title; - - // going to account: fill account specific info - if ([sender.file isEqualToString:@"Account"]) { - LOGI(@"Going editing account %@", sender.title); - [settingsStore transformAccountToKeys:sender.title]; - } else if ([sender.file isEqualToString:@"Contacts"]) { - [settingsStore synchronize]; - [self recomputeLdapLabelsAndSync]; - } else if ([sender.file isEqualToString:@"LDAP"]) { - LOGI(@"Going editing LDAP config %@", sender.title); - [settingsStore transformLdapToKeys:sender.title]; - } else if ([sender.file isEqualToString:@"Root"]) { // coming back to default: if we were in account, we must synchronize account now - [settingsStore synchronize]; - [self recomputeAccountLabelsAndSync]; - } -} - -- (void)settingsViewController:(IASKAppSettingsViewController *)sender - buttonTappedForSpecifier:(IASKSpecifier *)specifier { - NSString *key = [specifier.specifierDict objectForKey:kIASKKey]; -#ifdef DEBUG - if ([key isEqual:@"release_button"]) { - [UIApplication sharedApplication].keyWindow.rootViewController = nil; - [[UIApplication sharedApplication].keyWindow setRootViewController:nil]; - [LinphoneManager.instance destroyLinphoneCore]; - [LinphoneManager instanceRelease]; - } else if ([key isEqual:@"clear_cache_button"]) { - [PhoneMainView.instance.mainViewController - clearCache:[NSArray arrayWithObject:[PhoneMainView.instance currentView]]]; - } else if ([key isEqual:@"battery_alert_button"]) { - [[UIDevice currentDevice] setBatteryState:UIDeviceBatteryStateUnplugged]; - [[UIDevice currentDevice] setBatteryLevel:0.01f]; - [NSNotificationCenter.defaultCenter postNotificationName:UIDeviceBatteryLevelDidChangeNotification object:self]; - } else if ([key isEqual:@"flush_images_button"]) { - const MSList *rooms = linphone_core_get_chat_rooms(LC); - while (rooms) { - const MSList *events = linphone_chat_room_get_history_message_events(rooms->data, 0); - while (events) { - LinphoneEventLog *event = events->data; - LinphoneChatMessage *msg = linphone_event_log_get_chat_message(event); - if (!linphone_chat_message_is_outgoing(msg)) { - [LinphoneManager setValueInMessageAppData:nil forKey:@"localimage" inMessage:msg]; - [LinphoneManager setValueInMessageAppData:nil forKey:@"uploadQuality" inMessage:msg]; - [LinphoneManager setValueInMessageAppData:nil forKey:@"localvideo" inMessage:msg]; - [LinphoneManager setValueInMessageAppData:nil forKey:@"localfile" inMessage:msg]; - } - events = events->next; - } - rooms = rooms->next; - } - } -#endif - if ([key isEqual:@"assistant_button"]) { - [PhoneMainView.instance changeCurrentView:AssistantView.compositeViewDescription]; - return; - } else if ([key isEqual:@"account_mandatory_remove_button"]) { - NSString *popUpText; - NSString *appDomain = [LinphoneManager.instance lpConfigStringForKey:@"domain_name" - inSection:@"app" - withDefault:@"sip.linphone.org"]; - - MSList *accountList = [LinphoneManager.instance createAccountsNotHiddenList]; - LinphoneAccount *account = bctbx_list_nth_data(accountList, - [settingsStore integerForKey:@"current_proxy_config_preference"]); - - bool isLinphoneAccount = strcmp(appDomain.UTF8String, linphone_account_params_get_domain(linphone_account_get_params(account))) == 0; - if (isLinphoneAccount) { - popUpText = NSLocalizedString(@"Your account will only be deleted locally.\nTo delete it permanently, go to our account management platform:", nil); - } else { - popUpText = NSLocalizedString(@"Your account will only be deleted locally.\nTo delete it permanently, go on your SIP provider website.", nil); - } - bctbx_free(accountList); - - UIConfirmationDialog *dialog = [UIConfirmationDialog ShowWithMessage:popUpText - cancelMessage:nil - confirmMessage:nil - onCancelClick:nil - onConfirmationClick:^() { - [settingsStore removeAccount]; - [self recomputeAccountLabelsAndSync]; - [_settingsController.navigationController popViewControllerAnimated:NO]; - }]; - dialog.subscribeLabel.hidden = !isLinphoneAccount; // Only display link to https://subscribe.linphone.org for linphone accounts - - } else if ([key isEqual:@"account_mandatory_change_password"]) { - UIAlertController *alertView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Change your password", nil) - message:NSLocalizedString(@"Please enter and confirm your new password", nil) - preferredStyle:UIAlertControllerStyleAlert]; - - [alertView addTextFieldWithConfigurationHandler:^(UITextField *textField) { - textField.placeholder = NSLocalizedString(@"Password", nil); - textField.clearButtonMode = UITextFieldViewModeWhileEditing; - textField.borderStyle = UITextBorderStyleRoundedRect; - textField.secureTextEntry = YES; - }]; - - [alertView addTextFieldWithConfigurationHandler:^(UITextField *textField) { - textField.placeholder = NSLocalizedString(@"Confirm password", nil); - textField.clearButtonMode = UITextFieldViewModeWhileEditing; - textField.borderStyle = UITextBorderStyleRoundedRect; - textField.secureTextEntry = YES; - }]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - UIAlertAction* continueAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Save", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - NSString * pwd = alertView.textFields[0].text; - NSString * conf_pwd = alertView.textFields[1].text; - if (pwd && ![pwd isEqualToString:@""]) { - if ([pwd isEqualToString:conf_pwd]) { - _tmpPwd = pwd; - - MSList *accounts = [LinphoneManager.instance createAccountsNotHiddenList]; - LinphoneAccount *account = bctbx_list_nth_data(accounts, - [settingsStore integerForKey:@"current_proxy_config_preference"]); - bctbx_free(accounts); - const LinphoneAuthInfo *ai = linphone_account_find_auth_info(account); - - LinphoneAccountCreator *account_creator = linphone_account_creator_new( - LC, [LinphoneManager.instance lpConfigStringForKey:@"xmlrpc_url" inSection:@"assistant" withDefault:@""] - .UTF8String); - if (!ai) { - UIAlertController *errView = [UIAlertController - alertControllerWithTitle: - NSLocalizedString( - @"Error while changing your " - @"password", - nil) - message: - NSLocalizedString( - @"Your " - @"account " - @"is not " - @"a " - @"Linphone" - @" account" - @".\n" - @"We can " - @"not " - @"change " - @"your " - @"password" - @".", - nil) - preferredStyle: - UIAlertControllerStyleAlert]; - - UIAlertAction *defaultAction = [UIAlertAction - actionWithTitle:@"OK" - style: - UIAlertActionStyleDefault - handler:^( - UIAlertAction *action){ - }]; - - [errView addAction:defaultAction]; - [self presentViewController:errView - animated:YES - completion:nil]; - return; - } - linphone_account_creator_set_algorithm(account_creator, ""); - linphone_account_creator_set_username(account_creator, linphone_auth_info_get_username(ai)); - if (linphone_auth_info_get_passwd(ai) && !(strcmp(linphone_auth_info_get_passwd(ai),"") == 0)) { - linphone_account_creator_set_password(account_creator, linphone_auth_info_get_passwd(ai)); - } else { - linphone_account_creator_set_ha1(account_creator, linphone_auth_info_get_ha1(ai)); - } - - linphone_account_creator_set_domain(account_creator, linphone_auth_info_get_domain(ai)); - linphone_account_creator_set_user_data( - account_creator, (void *)pwd.UTF8String); - linphone_account_creator_cbs_set_update_account( - linphone_account_creator_get_callbacks( - account_creator), - update_hash_cbs); - linphone_account_creator_cbs_set_user_data( - linphone_account_creator_get_callbacks( - account_creator), - (__bridge void *)(self)); - linphone_account_creator_update_account( - account_creator); - } else { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Error while changing your password", nil) - message:NSLocalizedString(@"Your confirmation password doesn't match your password", nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; - } - } else { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Error while changing your password", nil) - message:NSLocalizedString(@"Please enter and confirm your new password", nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; - } - }]; - - - [alertView addAction:defaultAction]; - [alertView addAction:continueAction]; - [self presentViewController:alertView animated:YES completion:nil]; - } else if ([key isEqual:@"reset_logs_button"]) { - linphone_core_reset_log_collection(); - } else if ([key isEqual:@"send_logs_button"]) { - NSString *message; - - if ([LinphoneManager.instance lpConfigBoolForKey:@"send_logs_include_linphonerc_and_chathistory"]) { - message = NSLocalizedString( - @"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.", - nil); - } else { - message = NSLocalizedString(@"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.", - nil); - } - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Sending logs", nil) - message:message - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - UIAlertAction* continueAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"I got it, continue", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - [self sendEmailWithDebugAttachments]; - }]; - - [errView addAction:defaultAction]; - [errView addAction:continueAction]; - [self presentViewController:errView animated:YES completion:nil]; - } else if ([key isEqual:@"send_db_button"]) { - [self sendEmailWithPrivacyAttachments]; - } else if ([key isEqual:@"new_ldap_button"]) { - if (bctbx_list_size(linphone_core_get_ldap_list(LC)) < 5 ) { - linphone_core_add_ldap(LC, linphone_core_create_ldap(LC)); - [self recomputeLdapLabelsAndSync]; - } - } else if ([key isEqual:@"ldap_remove_button"]) { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Warning", nil) - message:NSLocalizedString(@"Are you sure to want to remove your LDAP config?", nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - UIAlertAction* continueAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Yes", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - [settingsStore removeLdap]; - [self recomputeLdapLabelsAndSync]; - [_settingsController.navigationController popViewControllerAnimated:NO]; - }]; - - - [errView addAction:defaultAction]; - [errView addAction:continueAction]; - [self presentViewController:errView animated:YES completion:nil]; - } -} - -#pragma mark - Mail composer for sending logs - -- (void)sendEmailWithDebugAttachments { - //NSMutableArray *attachments = [[NSMutableArray alloc] initWithCapacity:3]; - - // retrieve linphone logs if available - //char *filepath = linphone_core_compress_log_collection(); - - - LinphoneCoreCbs *coreCbs = linphone_factory_create_core_cbs(linphone_factory_get()); - linphone_core_cbs_set_log_collection_upload_state_changed(coreCbs, core_log_collection_upload_state_changed); - linphone_core_add_callbacks(LC, coreCbs); - - linphone_core_upload_log_collection(LC); - - [indicator startAnimating]; - - /* - if (filepath != NULL) { - NSString *filename = [[NSString stringWithUTF8String:filepath] componentsSeparatedByString:@"/"].lastObject; - NSString *mimeType = nil; - if ([filename hasSuffix:@".txt"]) { - mimeType = @"text/plain"; - } else if ([filename hasSuffix:@".gz"]) { - mimeType = @"application/gzip"; - } else { - LOGE(@"Unknown extension type: %@, not attaching logs", filename); - } - - if (mimeType != nil) { - [attachments addObject:@[ [NSString stringWithUTF8String:filepath], mimeType, filename ]]; - } - } - ms_free(filepath); - - if ([LinphoneManager.instance lpConfigBoolForKey:@"send_logs_include_linphonerc_and_chathistory"]) { - // retrieve linphone rc - [attachments - addObject:@[ [LinphoneManager preferenceFile:@"linphonerc"], @"text/plain", @"linphone-configuration.rc" ]]; - - // retrieve historydb - [attachments addObject:@[ - [LinphoneManager dataFile:@"linphone_chats.db"], - @"application/x-sqlite3", - @"linphone-chats-history.db" - ]]; - } - - if (attachments.count == 0) { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Cannot send logs", nil) - message:NSLocalizedString(@"Nothing could be collected from your application, aborting now.", nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; - return; - } - - //[self emailAttachments:attachments]; - */ -} - -void core_log_collection_upload_state_changed(LinphoneCore *core, LinphoneCoreLogCollectionUploadState state , const char* info) { - - LOGD(@"LinphoneCoreLogCollectionUploadStateDelivered core_log_collection_upload_state_changed %s", info); - if (state == LinphoneCoreLogCollectionUploadStateDelivered) { - - [thisClass newEmailAttachments:info]; - - LOGD(@"LinphoneCoreLogCollectionUploadStateDelivered %s", info); - UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; - - pasteboard.string = [NSString stringWithUTF8String: info]; - } -} - -- (void)sendEmailWithPrivacyAttachments { - NSMutableArray *attachments = [[NSMutableArray alloc] initWithCapacity:4]; - - // retrieve historydb - [attachments addObject:@[ - [LinphoneManager dataFile:@"linphone_chats.db"], - @"application/db", - @"linphone-chats-history.db" - ]]; - [attachments addObject:@[ - [LinphoneManager dataFile:@"zrtp_secrets"], - @"application/zrtp", - @"zrtp_secrets" - ]]; - [attachments addObject:@[ - [LinphoneManager dataFile:@"linphone.db"], - @"application/db", - @"linphone.db" - ]]; - [attachments addObject:@[ - [LinphoneManager dataFile:@"x3dh.c25519.sqlite3"], - @"application/db", - @"x3dh.c25519.sqlite3" - ]]; - - if (attachments.count == 0) { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Cannot send files", nil) - message:NSLocalizedString(@"Nothing could be collected from your application, aborting now.", nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; - return; - } - - [self emailAttachments:attachments]; -} - -- (void) newEmailAttachments:(const char *)info { - NSString *error = nil; -#if TARGET_IPHONE_SIMULATOR - error = @"Cannot send emails on the Simulator. To test this feature, please use a real device."; -#else - if ([MFMailComposeViewController canSendMail] == NO) { - error = NSLocalizedString( - @"Your device is not configured to send emails. Please configure mail application prior to send logs.", - nil); - } -#endif - - if (error != nil) { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Cannot send email", nil) - message:error - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Continue", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; - } else { - MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; - picker.mailComposeDelegate = self; - - [picker setSubject:@"Linphone Logs"]; - - [picker setToRecipients:[NSArray - arrayWithObjects:[LinphoneManager.instance lpConfigStringForKey:@"debug_popup_email" - withDefault:@""], - nil]]; - - [picker setMessageBody:[NSString stringWithFormat:@"%s",info] isHTML:NO]; - - [self.view.window.rootViewController presentViewController:picker animated:true completion:nil]; - - [indicator stopAnimating]; - } -} - -- (void)emailAttachments:(NSArray *)attachments { - NSString *error = nil; -#if TARGET_IPHONE_SIMULATOR - error = @"Cannot send emails on the Simulator. To test this feature, please use a real device."; -#else - if ([MFMailComposeViewController canSendMail] == NO) { - error = NSLocalizedString( - @"Your device is not configured to send emails. Please configure mail application prior to send logs.", - nil); - } -#endif - - if (error != nil) { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Cannot send email", nil) - message:error - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Continue", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; - } else { - MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; - picker.mailComposeDelegate = self; - - [picker setSubject:NSLocalizedString(@"", - @"Email title for people wanting to send a bug report")]; - [picker setToRecipients:[NSArray - arrayWithObjects:[LinphoneManager.instance lpConfigStringForKey:@"debug_popup_email" - withDefault:@""], - nil]]; - [picker setMessageBody:NSLocalizedString(@"Here are information about an issue I had on my device.\nI was " - @"doing ...\nI expected Linphone to ...\nInstead, I got an " - @"unexpected result: ...", - @"Template email for people wanting to send a bug report") - isHTML:NO]; - for (NSArray *attachment in attachments) { - if ([[NSFileManager defaultManager] fileExistsAtPath:attachment[0]]) { - [picker addAttachmentData:[NSData dataWithContentsOfFile:attachment[0]] - mimeType:attachment[1] - fileName:attachment[2]]; - } - } - [self.view.window.rootViewController presentViewController:picker animated:true completion:nil]; - } -} - -- (void)mailComposeController:(MFMailComposeViewController *)controller - didFinishWithResult:(MFMailComposeResult)result - error:(NSError *)error { - if (error != nil) { - LOGW(@"Error while sending mail: %@", error); - } else { - LOGI(@"Mail completed with status: %d", result); - } - [controller dismissViewControllerAnimated:true completion:nil]; -} - -- (IBAction)onDialerBackClick:(id)sender { - [_settingsController.navigationController popViewControllerAnimated:NO]; - [PhoneMainView.instance popToView:DialerView.compositeViewDescription]; -} - -- (IBAction)onBackClick:(id)sender { - if (isRoot) { - [_settingsController.navigationController popViewControllerAnimated:NO]; - [PhoneMainView.instance popCurrentView]; - } else { - [_settingsController.navigationController popViewControllerAnimated:YES]; - } -} -@end diff --git a/Classes/ShopTableView.h b/Classes/ShopTableView.h deleted file mode 100644 index 6fc74a3dc..000000000 --- a/Classes/ShopTableView.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -@interface ShopTableView : UITableViewController - -@end diff --git a/Classes/ShopTableView.m b/Classes/ShopTableView.m deleted file mode 100644 index b11df0922..000000000 --- a/Classes/ShopTableView.m +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "ShopTableView.h" -#import "ShopView.h" -#import "PhoneMainView.h" -#import "LinphoneUI/UIShopTableCell.h" - -@implementation ShopTableView - -- (void)viewDidLoad { - [super viewDidLoad]; - - // remove separators between empty items, cf - self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; -} - -#pragma mark - Table view data source - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 1; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return LinphoneManager.instance.iapManager.productsAvailable.count; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - - static NSString *kCellId = @"UIShopTableCell"; - UIShopTableCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId]; - if (cell == nil) { - cell = [[UIShopTableCell alloc] initWithIdentifier:kCellId]; - } - - SKProduct *product = LinphoneManager.instance.iapManager.productsAvailable[indexPath.row]; - - NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; - [numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4]; - [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle]; - [numberFormatter setLocale:product.priceLocale]; - NSString *price = [numberFormatter stringFromNumber:product.price]; - - cell.nameLabel.text = [NSString stringWithFormat:@"%@ (%@)", product.localizedTitle, price]; - cell.descriptionLabel.numberOfLines = 2; - cell.descriptionLabel.minimumScaleFactor = .5; - cell.descriptionLabel.adjustsFontSizeToFitWidth = cell.detailTextLabel.adjustsLetterSpacingToFitWidth = YES; - cell.descriptionLabel.text = [NSString stringWithFormat:@"%@", product.localizedDescription]; - // LOGE(@"ShopTableView : name = %@ - descr = %@", - // [NSString stringWithFormat:@"%@ (%@)", product.localizedTitle, price], product.localizedDescription); - [cell.linphoneImage setImage:[UIImage imageNamed:@"linphone_logo"]]; - - return cell; -} - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - [tableView deselectRowAtIndexPath:indexPath animated:NO]; - - SKProduct *product = LinphoneManager.instance.iapManager.productsAvailable[indexPath.row]; - [LinphoneManager.instance.iapManager purchaseWithID:product.productIdentifier]; -} - -@end diff --git a/Classes/ShopView.h b/Classes/ShopView.h deleted file mode 100644 index 97172bc76..000000000 --- a/Classes/ShopView.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "ShopTableView.h" -#import "UICompositeView.h" - -@interface ShopView : UIViewController - -@property(strong, nonatomic) IBOutlet ShopTableView *tableViewController; -@property(weak, nonatomic) IBOutlet UIView *waitingView; -- (IBAction)onDialerBackClick:(id)sender; - -@end diff --git a/Classes/ShopView.m b/Classes/ShopView.m deleted file mode 100644 index 146d49aee..000000000 --- a/Classes/ShopView.m +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "PhoneMainView.h" -#import "ShopView.h" -#import "LinphoneManager.h" -#import "LinphoneIOSVersion.h" - -@implementation ShopView - -#pragma mark - UICompositeViewDelegate Functions - -static UICompositeViewDescription *compositeDescription = nil; - -+ (UICompositeViewDescription *)compositeViewDescription { - if (compositeDescription == nil) { - compositeDescription = [[UICompositeViewDescription alloc] init:self.class - statusBar:StatusBarView.class - tabBar:nil - sideMenu:SideMenuView.class - fullscreen:false - isLeftFragment:YES - fragmentWith:nil]; - } - return compositeDescription; -} - -- (UICompositeViewDescription *)compositeViewDescription { - return self.class.compositeViewDescription; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - [_tableViewController.tableView reloadData]; -} - -- (void)viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; - [_waitingView setHidden:TRUE]; -} -#pragma mark - Action Functions - -- (IBAction)onDialerBackClick:(id)sender { - [PhoneMainView.instance popToView:DialerView.compositeViewDescription]; -} - -@end diff --git a/Classes/SideMenuTableView.h b/Classes/SideMenuTableView.h deleted file mode 100644 index 2807acd39..000000000 --- a/Classes/SideMenuTableView.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -// the block to execute when an entry tapped -typedef void (^SideMenuEntryBlock)(void); - -@interface SideMenuEntry : NSObject { - @public - UIImage *img; - NSString *title; - SideMenuEntryBlock onTapBlock; -}; -@end - -@interface SideMenuTableView : UITableViewController - -@property(nonatomic, retain) NSMutableArray *sideMenuEntries; - -@end diff --git a/Classes/SideMenuTableView.m b/Classes/SideMenuTableView.m deleted file mode 100644 index 30bc8d0f5..000000000 --- a/Classes/SideMenuTableView.m +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "linphone/core_utils.h" - -#import "SideMenuTableView.h" -#import "Utils.h" - -#import "PhoneMainView.h" -#import "StatusBarView.h" -#import "ShopView.h" -#import "LinphoneManager.h" -#import "RecordingsListView.h" -#import "linphoneapp-Swift.h" - -@implementation SideMenuEntry - -- (id)initWithTitle:(NSString *)atitle image:(UIImage *)image tapBlock:(SideMenuEntryBlock)tapBlock { - if ((self = [super init])) { - img = image; - title = atitle; - onTapBlock = tapBlock; - } - return self; -} - -@end - -@implementation SideMenuTableView - -- (void)viewDidLoad { - [super viewDidLoad]; - - // remove separators between empty items, cf - // http://stackoverflow.com/questions/1633966/can-i-force-a-uitableview-to-hide-the-separator-between-empty-cells - self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; -} - -- (void)viewWillAppear:(BOOL)animated { - linphone_core_stop_dtmf_stream(LC); - [super viewWillAppear:animated]; - - _sideMenuEntries = [[NSMutableArray alloc] init]; - - [_sideMenuEntries - addObject:[[SideMenuEntry alloc] initWithTitle:NSLocalizedString(@"Assistant", nil) - image:[UIImage imageNamed:@"menu_assistant.png"] - tapBlock:^() { - [PhoneMainView.instance - changeCurrentView:AssistantView.compositeViewDescription]; - }]]; - BOOL mustLink = ([LinphoneManager.instance lpConfigIntForKey:@"must_link_account_time"] > 0); - - MSList *accounts = [LinphoneManager.instance createAccountsNotHiddenList]; - BOOL hasAccount = accounts != NULL; - bctbx_free(accounts); - if (mustLink && hasAccount && ![LinphoneManager.instance lpConfigIntForKey:@"hide_link_phone_number"]) { - [_sideMenuEntries - addObject:[[SideMenuEntry alloc] initWithTitle:NSLocalizedString(@"Link my account", nil) - image:[UIImage imageNamed:@"menu_link_account.png"] - tapBlock:^() { - [PhoneMainView.instance - changeCurrentView:AssistantLinkView.compositeViewDescription]; - }]]; - } - - - [_sideMenuEntries - addObject:[[SideMenuEntry alloc] initWithTitle:NSLocalizedString(@"Settings", nil) - image:[UIImage imageNamed:@"menu_options.png"] - tapBlock:^() { - [PhoneMainView.instance - changeCurrentView:SettingsView.compositeViewDescription]; - }]]; - [_sideMenuEntries - addObject:[[SideMenuEntry alloc] initWithTitle:NSLocalizedString(@"Recordings", nil) - image:[UIImage imageNamed:@"menu_recordings.png"] - tapBlock:^() { - [PhoneMainView.instance - changeCurrentView:RecordingsListView.compositeViewDescription]; - }]]; - InAppProductsManager *iapm = LinphoneManager.instance.iapManager; - if (iapm.enabled){ - [_sideMenuEntries - addObject:[[SideMenuEntry alloc] initWithTitle:NSLocalizedString(@"Shop", nil) - image:nil - tapBlock:^() { - [PhoneMainView.instance - changeCurrentView:ShopView.compositeViewDescription]; - }]]; - } - - LinphoneAccount *defaultAccount = linphone_core_get_default_account(LC); - if (defaultAccount && linphone_account_params_get_audio_video_conference_factory_address(linphone_account_get_params(defaultAccount))){ - - [_sideMenuEntries addObject:[[SideMenuEntry alloc] initWithTitle:VoipTexts.conference_scheduled - image:[UIImage imageNamed:@"side_menu_voip_meeting_schedule"] - tapBlock:^() { - [PhoneMainView.instance - changeCurrentView:ScheduledConferencesView.compositeViewDescription]; - - }]]; - } - - [_sideMenuEntries addObject:[[SideMenuEntry alloc] initWithTitle:NSLocalizedString(@"About", nil) - image:[UIImage imageNamed:@"menu_about.png"] - tapBlock:^() { - [PhoneMainView.instance - changeCurrentView:AboutView.compositeViewDescription]; - - }]]; -} - -#pragma mark - Table View Controller -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 2; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - if (section == 0) { - - BOOL hasDefault = (linphone_core_get_default_account(LC) != NULL); - // default account is shown in the header already - MSList *accounts = [LinphoneManager.instance createAccountsNotHiddenList]; - size_t count = bctbx_list_size(accounts); - bctbx_free(accounts); - return MAX(0, (int)count - (hasDefault ? 1 : 0)); - } else { - return [_sideMenuEntries count]; - } -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell *cell = [[UITableViewCell alloc] init]; - - // isLcInitialized called here because this is called when going in bg after LC destroy - if (indexPath.section == 0 && [LinphoneManager isLcInitialized]) { - // do not display default account here, it is already in header view - MSList *accounts = [LinphoneManager.instance createAccountsNotHiddenList]; - int idx = - linphone_core_get_default_account(LC) - ? bctbx_list_index(accounts, linphone_core_get_default_account(LC)) - : HUGE_VAL; - LinphoneAccount *account = bctbx_list_nth_data(accounts, - (int)indexPath.row + (idx <= indexPath.row ? 1 : 0)); - bctbx_free(accounts); - if (account) { - cell.textLabel.text = [NSString stringWithUTF8String:linphone_account_params_get_identity(linphone_account_get_params(account))]; - cell.imageView.image = [StatusBarView imageForState:linphone_account_get_state(account)]; - } else { - LOGE(@"Invalid index requested, no proxy for row %d", indexPath.row); - } - cell.transform = CGAffineTransformMakeScale(-1.0, 1.0); - cell.textLabel.transform = CGAffineTransformMakeScale(-1.0, 1.0); - cell.imageView.transform = CGAffineTransformMakeScale(-1.0, 1.0); - } else { - SideMenuEntry *entry = [_sideMenuEntries objectAtIndex:indexPath.row]; - cell.imageView.image = entry->img; - cell.textLabel.text = entry->title; - } - return cell; -} - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - [tableView deselectRowAtIndexPath:indexPath animated:NO]; - - if (indexPath.section == 0) { - [PhoneMainView.instance changeCurrentView:SettingsView.compositeViewDescription]; - } else { - SideMenuEntry *entry = [_sideMenuEntries objectAtIndex:indexPath.row]; - LOGI(@"Entry %@ has been tapped", entry->title); - if (entry->onTapBlock == nil) { - LOGF(@"Entry %@ has no onTapBlock!", entry->title); - } else { - entry->onTapBlock(); - } - } - [PhoneMainView.instance.mainViewController hideSideMenu:YES]; -} - -@end diff --git a/Classes/SideMenuView.h b/Classes/SideMenuView.h deleted file mode 100644 index bb4c8e4bb..000000000 --- a/Classes/SideMenuView.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "SideMenuTableView.h" -#import "PhoneMainView.h" - -@interface SideMenuView : UIViewController - -@property(strong, nonatomic) IBOutlet UISwipeGestureRecognizer *swipeGestureRecognizer; -@property(weak, nonatomic) IBOutlet UIRoundedImageView *avatarImage; -@property(weak, nonatomic) IBOutlet UILabel *nameLabel; -@property(weak, nonatomic) IBOutlet UILabel *addressLabel; -@property(weak, nonatomic) IBOutlet UIImageView *presenceImage; -@property(strong, nonatomic) IBOutlet SideMenuTableView *sideMenuTableViewController; -@property(weak, nonatomic) IBOutlet UIView *grayBackground; -- (IBAction)onLateralSwipe:(id)sender; -- (IBAction)onHeaderClick:(id)sender; -- (IBAction)onAvatarClick:(id)sender; -- (IBAction)onBackgroundClicked:(id)sender; - -@end diff --git a/Classes/SideMenuView.m b/Classes/SideMenuView.m deleted file mode 100644 index debd16b03..000000000 --- a/Classes/SideMenuView.m +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "SideMenuView.h" -#import "LinphoneManager.h" -#import "PhoneMainView.h" - -@implementation SideMenuView - -- (void)viewDidLoad { - [super viewDidLoad]; - -#pragma deploymate push "ignored-api-availability" - if (UIDevice.currentDevice.systemVersion.doubleValue >= 7) { - // it's better to detect only pan from screen edges - UIScreenEdgePanGestureRecognizer *pan = - [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(onLateralSwipe:)]; - pan.edges = UIRectEdgeRight; - [self.view addGestureRecognizer:pan]; - _swipeGestureRecognizer.enabled = NO; - } -#pragma deploymate pop -} -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - [_sideMenuTableViewController viewWillAppear:animated]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(registrationUpdateEvent:) - name:kLinphoneRegistrationUpdate - object:nil]; - - [self updateHeader]; - [_sideMenuTableViewController.tableView reloadData]; -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - _grayBackground.hidden = NO; -} - -- (void)viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; - _grayBackground.hidden = YES; - // should be better than that with alpha animation.. -} - -- (void)updateHeader { - LinphoneAccount *default_account = linphone_core_get_default_account(LC); - - if (default_account != NULL) { - const LinphoneAddress *addr = linphone_account_params_get_identity_address(linphone_account_get_params(default_account)); - [ContactDisplay setDisplayNameLabel:_nameLabel forAddress:addr]; - char *str = addr ? linphone_address_as_string(addr) : nil; - _addressLabel.text = str ? [NSString stringWithUTF8String:str] : NSLocalizedString(@"No address", nil); - if (str) ms_free(str); - } else { - MSList *accounts = [LinphoneManager.instance createAccountsNotHiddenList]; - _nameLabel.text = accounts ? NSLocalizedString(@"No default account", nil) : NSLocalizedString(@"No account", nil); - bctbx_free(accounts); - // display direct IP:port address so that we can be reached - LinphoneAddress *addr = linphone_core_get_primary_contact_parsed(LC); - if (addr) { - char *as_string = linphone_address_as_string(addr); - _addressLabel.text = [NSString stringWithFormat:@"%s", as_string]; - ms_free(as_string); - linphone_address_unref(addr); - } else { - _addressLabel.text = NSLocalizedString(@"No address", nil); - } - _presenceImage.image = nil; - } - _avatarImage.image = [LinphoneUtils selfAvatar]; -} - -#pragma deploymate push "ignored-api-availability" -- (void)onLateralSwipe:(UIScreenEdgePanGestureRecognizer *)pan { - [PhoneMainView.instance.mainViewController hideSideMenu:YES]; -} -#pragma deploymate pop - -- (IBAction)onHeaderClick:(id)sender { - [PhoneMainView.instance changeCurrentView:SettingsView.compositeViewDescription]; - [PhoneMainView.instance.mainViewController hideSideMenu:YES]; -} - -- (IBAction)onAvatarClick:(id)sender { - // hide ourself because we are on top of image picker - if (!IPAD) { - [PhoneMainView.instance.mainViewController hideSideMenu:YES]; - } - [ImagePickerView SelectImageFromDevice:self atPosition:_avatarImage inView:self.view withDocumentMenuDelegate:nil]; -} - -- (IBAction)onBackgroundClicked:(id)sender { - [PhoneMainView.instance.mainViewController hideSideMenu:YES]; -} - -- (void)registrationUpdateEvent:(NSNotification *)notif { - [self updateHeader]; - [_sideMenuTableViewController.tableView reloadData]; -} - -#pragma mark - Image picker delegate - -- (void)imagePickerDelegateImage:(UIImage *)image info:(NSString *)phAssetId { - // When getting image from the camera, it may be 90° rotated due to orientation - // (image.imageOrientation = UIImageOrientationRight). Just rotate it to be face up. - if (image.imageOrientation != UIImageOrientationUp) { - UIGraphicsBeginImageContextWithOptions(image.size, false, image.scale); - [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)]; - image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - } - - [LinphoneManager.instance lpConfigSetString:phAssetId forKey:@"avatar"]; - _avatarImage.image = [LinphoneUtils selfAvatar]; - [LinphoneManager.instance loadAvatar]; - - // Dismiss popover on iPad - if (IPAD) { - [VIEW(ImagePickerView).popoverController dismissPopoverAnimated:TRUE]; - } else { - [PhoneMainView.instance.mainViewController hideSideMenu:NO]; - } -} - -- (void)imagePickerDelegateVideo:(NSURL*)url info:(NSDictionary *)info { - return; // Avatar video not supported (yet ;) ) -} - -@end diff --git a/Classes/Swift/AppManager.swift b/Classes/Swift/AppManager.swift deleted file mode 100644 index b546b05ef..000000000 --- a/Classes/Swift/AppManager.swift +++ /dev/null @@ -1,79 +0,0 @@ -/* -* Copyright (c) 2010-2020 Belledonne Communications SARL. -* -* This file is part of linphone-iphone -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*/ - -import Foundation -import CoreTelephony - -enum NetworkType: Int { - case network_none = 0 - case network_2g = 1 - case network_3g = 2 - case network_4g = 3 - case network_lte = 4 - case network_wifi = 5 -} - -/* -* AppManager is a class that includes some useful functions. -*/ -@objc class AppManager: NSObject { - static func network() -> NetworkType { - let info = CTTelephonyNetworkInfo() - let currentRadio = info.currentRadioAccessTechnology - if (currentRadio == CTRadioAccessTechnologyEdge) { - return NetworkType.network_2g - } else if (currentRadio == CTRadioAccessTechnologyLTE) { - return NetworkType.network_4g - } - return NetworkType.network_3g - } - - @objc static func recordingFilePathFromCall(address: String) -> String { - var filePath = "recording_" - filePath = filePath.appending(address.isEmpty ? "unknow" : address) - let now = Date() - let dateFormat = DateFormatter() - dateFormat.dateFormat = "E-d-MMM-yyyy-HH-mm-ss" - let date = dateFormat.string(from: now) - - filePath = filePath.appending("_\(date).mkv") - - let paths = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true) - var writablePath = paths[0] - writablePath = writablePath.appending("/\(filePath)") - let message:String = "file path is \(writablePath)" - Log.directLog(BCTBX_LOG_MESSAGE, text: message) - return writablePath - //file name is recording_contact-name_dayName-day-monthName-year-hour-minutes-seconds - //The recording prefix is used to identify recordings in the cache directory. - //We will use name_dayName-day-monthName-year to separate recordings by days, then hour-minutes-seconds to order them in each day. - } - - @objc static func removeFile(file: String) { - let fileManager = FileManager.default - do { - try fileManager.removeItem(atPath: file) - Log.directLog(BCTBX_LOG_MESSAGE, text: "File :\(file) removed") - - } catch { - Log.e("Could not remove file : \(file) \(error)") - } - } - -} diff --git a/Classes/Swift/CallManager.swift b/Classes/Swift/CallManager.swift deleted file mode 100644 index 0a9398b6e..000000000 --- a/Classes/Swift/CallManager.swift +++ /dev/null @@ -1,833 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import linphonesw -import UserNotifications -import os -import CallKit -import AVFoundation - -@objc class CallAppData: NSObject { - @objc var batteryWarningShown = false - @objc var videoRequested = false /*set when user has requested for video*/ - @objc var isConference = false - -} - -/* - * CallManager is a class that manages application calls and supports callkit. - * There is only one CallManager by calling CallManager.instance(). - */ -@objc class CallManager: NSObject, CoreDelegate { - static var theCallManager: CallManager? - let providerDelegate: ProviderDelegate! // to support callkit - let callController: CXCallController! // to support callkit - var lc: Core? - @objc var speakerBeforePause : Bool = false - @objc var nextCallIsTransfer: Bool = false - var referedFromCall: String? - var referedToCall: String? - var endCallkit: Bool = false - var globalState : GlobalState = .Off - var actionsToPerformOnceWhenCoreIsOn : [(()->Void)] = [] - var conference: Conference? - var callkitAudioSessionActivated : Bool? = nil // if "nil", ignore. - var actionToFulFill : CXCallAction? = nil - var endCallKitReplacedCall: Bool = true - static var uuidReplacedCall: String? - - var backgroundContextCall : Call? - @objc var backgroundContextCameraIsEnabled : Bool = false - - fileprivate override init() { - providerDelegate = ProviderDelegate.shared - callController = CXCallController() - } - - @objc static func instance() -> CallManager { - if (theCallManager == nil) { - theCallManager = CallManager() - } - return theCallManager! - } - - - @objc func setCore(core: OpaquePointer) { - lc = Core.getSwiftObject(cObject: core) - lc?.addDelegate(delegate: self) - } - - @objc static func getAppData(call: OpaquePointer) -> CallAppData? { - let sCall = Call.getSwiftObject(cObject: call) - return getAppData(sCall: sCall) - } - - static func getAppData(sCall:Call) -> CallAppData? { - if (sCall.userData == nil) { - return nil - } - return Unmanaged.fromOpaque(sCall.userData!).takeUnretainedValue() - } - - @objc static func setAppData(call:OpaquePointer, appData: CallAppData) { - let sCall = Call.getSwiftObject(cObject: call) - setAppData(sCall: sCall, appData: appData) - } - - static func setAppData(sCall:Call, appData:CallAppData?) { - if (sCall.userData != nil) { - Unmanaged.fromOpaque(sCall.userData!).release() - } - if (appData == nil) { - sCall.userData = nil - } else { - sCall.userData = UnsafeMutableRawPointer(Unmanaged.passRetained(appData!).toOpaque()) - } - } - - @objc func findCall(callId: String?) -> OpaquePointer? { - let call = callByCallId(callId: callId) - return call?.getCobject - } - - func callByCallId(callId: String?) -> Call? { - if (callId == nil) { - return nil - } - let calls = lc?.calls - if let callTmp = calls?.first(where: { $0.callLog?.callId == callId }) { - return callTmp - } - return nil - } - - @objc func stopLinphoneCore() { - if (lc?.callsNb == 0) { - lc?.stopAsync() - } - } - - @objc func getBackgroundContextCall() -> OpaquePointer? { - return backgroundContextCall?.getCobject - } - @objc func setBackgroundContextCall(call: OpaquePointer?) { - if (call == nil) { - backgroundContextCall = nil - } else { - backgroundContextCall = Call.getSwiftObject(cObject: call!) - } - } - - @objc static func callKitEnabled() -> Bool { -#if !targetEnvironment(simulator) - if ConfigManager.instance().lpConfigBoolForKey(key: "use_callkit", section: "app") { - return true - } -#endif - return false - } - - @objc func changeRouteToSpeaker() { - lc?.outputAudioDevice = lc?.audioDevices.first { $0.type == AudioDevice.Kind.Speaker } - UIDevice.current.isProximityMonitoringEnabled = false - } - - @objc func changeRouteToBluetooth() { - lc?.outputAudioDevice = lc?.audioDevices.first { $0.type == AudioDevice.Kind.BluetoothA2DP || $0.type == AudioDevice.Kind.Bluetooth } - UIDevice.current.isProximityMonitoringEnabled = (lc!.callsNb > 0) - } - - @objc func changeRouteToDefault() { - lc?.outputAudioDevice = lc?.defaultOutputAudioDevice - } - - @objc func isBluetoothAvailable() -> Bool { - for device in lc!.audioDevices { - if (device.type == AudioDevice.Kind.Bluetooth || device.type == AudioDevice.Kind.BluetoothA2DP) { - return true; - } - } - return false; - } - - @objc func isSpeakerEnabled() -> Bool { - if let outputDevice = lc!.outputAudioDevice { - return outputDevice.type == AudioDevice.Kind.Speaker - } - return false - } - - @objc func isBluetoothEnabled() -> Bool { - if let outputDevice = lc!.outputAudioDevice { - return (outputDevice.type == AudioDevice.Kind.Bluetooth || outputDevice.type == AudioDevice.Kind.BluetoothA2DP) - } - return false - } - - @objc func isReceiverEnabled() -> Bool { - if let outputDevice = lc!.outputAudioDevice { - return outputDevice.type == AudioDevice.Kind.Microphone - } - return false - } - - - func requestTransaction(_ transaction: CXTransaction, action: String) { - callController.request(transaction) { error in - if let error = error { - Log.directLog(BCTBX_LOG_ERROR, text: "CallKit: Requested transaction \(action) failed because: \(error)") - } else { - Log.directLog(BCTBX_LOG_MESSAGE, text: "CallKit: Requested transaction \(action) successfully") - } - } - } - - @objc func updateCallId(previous: String, current: String) { - let uuid = CallManager.instance().providerDelegate.uuids["\(previous)"] - if (uuid != nil) { - CallManager.instance().providerDelegate.uuids.removeValue(forKey: previous) - CallManager.instance().providerDelegate.uuids.updateValue(uuid!, forKey: current) - let callInfo = providerDelegate.callInfos[uuid!] - if (callInfo != nil) { - callInfo!.callId = current - providerDelegate.callInfos.updateValue(callInfo!, forKey: uuid!) - } - } - } - - func displayIncomingCall(call:Call?, handle: String, hasVideo: Bool, callId: String, displayName:String) { - let uuid = UUID() - let callInfo = CallInfo.newIncomingCallInfo(callId: callId) - - providerDelegate.callInfos.updateValue(callInfo, forKey: uuid) - providerDelegate.uuids.updateValue(uuid, forKey: callId) - providerDelegate.reportIncomingCall(call:call, uuid: uuid, handle: handle, hasVideo: hasVideo, displayName: displayName) - - } - - @objc func acceptCall(call: OpaquePointer?, hasVideo:Bool) { - if (call == nil) { - Log.directLog(BCTBX_LOG_ERROR, text: "Can not accept null call!") - return - } - let call = Call.getSwiftObject(cObject: call!) - acceptCall(call: call, hasVideo: hasVideo) - } - - func acceptCall(call: Call, hasVideo:Bool) { - do { - let callParams = try lc!.createCallParams(call: call) - callParams.videoEnabled = hasVideo - if (ConfigManager.instance().lpConfigBoolForKey(key: "edge_opt_preference")) { - let low_bandwidth = (AppManager.network() == .network_2g) - if (low_bandwidth) { - Log.directLog(BCTBX_LOG_MESSAGE, text: "Low bandwidth mode") - } - callParams.lowBandwidthEnabled = low_bandwidth - } - - //We set the record file name here because we can't do it after the call is started. - let address = call.callLog?.fromAddress - let writablePath = AppManager.recordingFilePathFromCall(address: address?.username ?? "") - Log.directLog(BCTBX_LOG_MESSAGE, text: "Record file path: \(String(describing: writablePath))") - callParams.recordFile = writablePath - - - if let chatView : ChatConversationView = PhoneMainView.instance().VIEW(ChatConversationView.compositeViewDescription()), chatView.isVoiceRecording { - Log.directLog(BCTBX_LOG_MESSAGE, text: "Voice recording in progress, stopping it befoce accepting the call.") - chatView.stopVoiceRecording() - } - - if (call.callLog?.wasConference() == true) { - // Prevent incoming group call to start in audio only layout - // Do the same as the conference waiting room - callParams.videoEnabled = true - callParams.videoDirection = Core.get().videoActivationPolicy?.automaticallyInitiate == true ? .SendRecv : .RecvOnly - Log.i("[Context] Enabling video on call params to prevent audio-only layout when answering") - } - - try call.acceptWithParams(params: callParams) - } catch { - Log.directLog(BCTBX_LOG_ERROR, text: "accept call failed \(error)") - } - } - - // for outgoing call. There is not yet callId - @objc func startCall(addr: OpaquePointer?, isSas: Bool, isVideo: Bool, isConference: Bool = false) { - if (addr == nil) { - Log.i("Can not start a call with null address!") - return - } - - let sAddr = Address.getSwiftObject(cObject: addr!) - if (CallManager.callKitEnabled() && !CallManager.instance().nextCallIsTransfer && lc?.conference?.isIn != true) { - let uuid = UUID() - let name = FastAddressBook.displayName(for: addr) ?? "unknow" - let handle = CXHandle(type: .generic, value: sAddr.asStringUriOnly()) - let startCallAction = CXStartCallAction(call: uuid, handle: handle) - let transaction = CXTransaction(action: startCallAction) - - let callInfo = CallInfo.newOutgoingCallInfo(addr: sAddr, isSas: isSas, displayName: name, isVideo: isVideo, isConference:isConference) - providerDelegate.callInfos.updateValue(callInfo, forKey: uuid) - providerDelegate.uuids.updateValue(uuid, forKey: "") - - setHeldOtherCalls(exceptCallid: "") - requestTransaction(transaction, action: "startCall") - }else { - try? doCall(addr: sAddr, isSas: isSas, isVideo:isVideo, isConference:isConference) - } - } - - func startCall(addr:String, isSas: Bool = false, isVideo: Bool, isConference: Bool = false) { - do { - let address = try Factory.Instance.createAddress(addr: addr) - startCall(addr: address.getCobject,isSas: isSas, isVideo: isVideo, isConference:isConference) - } catch { - Log.e("[CallManager] unable to create address for a new outgoing call : \(addr) \(error) ") - } - } - - func doCall(addr: Address, isSas: Bool, isVideo: Bool, isConference:Bool = false) throws { - let displayName = FastAddressBook.displayName(for: addr.getCobject) - - let lcallParams = try CallManager.instance().lc!.createCallParams(call: nil) - if ConfigManager.instance().lpConfigBoolForKey(key: "edge_opt_preference") && AppManager.network() == .network_2g { - Log.directLog(BCTBX_LOG_MESSAGE, text: "Enabling low bandwidth mode") - lcallParams.lowBandwidthEnabled = true - } - - if (displayName != nil) { - try addr.setDisplayname(newValue: displayName!) - } - - if(ConfigManager.instance().lpConfigBoolForKey(key: "override_domain_with_default_one")) { - try addr.setDomain(newValue: ConfigManager.instance().lpConfigStringForKey(key: "domain", section: "assistant")) - } - - if (CallManager.instance().nextCallIsTransfer) { - let call = CallManager.instance().lc!.currentCall - try call?.transferTo(referTo: addr) - CallManager.instance().nextCallIsTransfer = false - } else { - //We set the record file name here because we can't do it after the call is started. - let writablePath = AppManager.recordingFilePathFromCall(address: addr.username! ) - Log.directLog(BCTBX_LOG_DEBUG, text: "record file path: \(writablePath)") - lcallParams.recordFile = writablePath - if (isSas) { - lcallParams.mediaEncryption = .ZRTP - } - if (isConference) { - if (ConferenceWaitingRoomViewModel.sharedModel.joinLayout.value! != .AudioOnly) { - lcallParams.videoEnabled = true - lcallParams.videoDirection = ConferenceWaitingRoomViewModel.sharedModel.isVideoEnabled.value == true ? .SendRecv : .RecvOnly - lcallParams.conferenceVideoLayout = ConferenceWaitingRoomViewModel.sharedModel.joinLayout.value! == .Grid ? .Grid : .ActiveSpeaker - } else { - lcallParams.videoEnabled = false - } - } else { - lcallParams.videoEnabled = isVideo - } - - let call = CallManager.instance().lc!.inviteAddressWithParams(addr: addr, params: lcallParams) - if (call != nil) { - // The LinphoneCallAppData object should be set on call creation with callback - // - (void)onCall:StateChanged:withMessage:. If not, we are in big trouble and expect it to crash - // We are NOT responsible for creating the AppData. - let data = CallManager.getAppData(sCall: call!) - if (data == nil) { - Log.directLog(BCTBX_LOG_ERROR, text: "New call instanciated but app data was not set. Expect it to crash.") - /* will be used later to notify user if video was not activated because of the linphone core*/ - } else { - data!.isConference = isConference - data!.videoRequested = lcallParams.videoEnabled - CallManager.setAppData(sCall: call!, appData: data) - } - } - } - } - - @objc func groupCall() { - if (CallManager.callKitEnabled()) { - let calls = lc?.calls - if (calls == nil || calls!.isEmpty) { - return - } - let firstCall = calls!.first?.callLog?.callId ?? "" - let lastCall = (calls!.count > 1) ? calls!.last?.callLog?.callId ?? "" : "" - - let currentUuid = CallManager.instance().providerDelegate.uuids["\(firstCall)"] - if (currentUuid == nil) { - Log.directLog(BCTBX_LOG_ERROR, text: "Can not find correspondant call to group.") - return - } - - let newUuid = CallManager.instance().providerDelegate.uuids["\(lastCall)"] - let groupAction = CXSetGroupCallAction(call: currentUuid!, callUUIDToGroupWith: newUuid) - let transcation = CXTransaction(action: groupAction) - requestTransaction(transcation, action: "groupCall") - - setResumeCalls() - } else { - try? lc?.addAllToConference() - } - } - - @objc func removeAllCallInfos() { - providerDelegate.callInfos.removeAll() - providerDelegate.uuids.removeAll() - } - - @objc func terminateCall(call: OpaquePointer?) { - if (call == nil) { - Log.directLog(BCTBX_LOG_ERROR, text: "Can not terminate null call!") - return - } - let call = Call.getSwiftObject(cObject: call!) - do { - try call.terminate() - Log.directLog(BCTBX_LOG_DEBUG, text: "Call terminated") - } catch { - Log.directLog(BCTBX_LOG_ERROR, text: "Failed to terminate call failed because \(error)") - } - } - - @objc func markCallAsDeclined(callId: String) { - if !CallManager.callKitEnabled() { - return - } - - let uuid = providerDelegate.uuids["\(callId)"] - if (uuid == nil) { - Log.directLog(BCTBX_LOG_MESSAGE, text: "Mark call \(callId) as declined.") - let uuid = UUID() - providerDelegate.uuids.updateValue(uuid, forKey: callId) - let callInfo = CallInfo.newIncomingCallInfo(callId: callId) - callInfo.reason = Reason.Busy - providerDelegate.callInfos.updateValue(callInfo, forKey: uuid) - } else { - // end call - providerDelegate.endCall(uuid: uuid!) - } - } - - @objc func setHeld(call: OpaquePointer, hold: Bool) { - let sCall = Call.getSwiftObject(cObject: call) - if (!hold) { - setHeldOtherCalls(exceptCallid: sCall.callLog?.callId ?? "") - } - setHeld(call: sCall, hold: hold) - } - - func setHeld(call: Call, hold: Bool) { - -#if targetEnvironment(simulator) - if (hold) { - try?call.pause() - } else { - try?call.resume() - } -#else - let callid = call.callLog?.callId ?? "" - let uuid = providerDelegate.uuids["\(callid)"] - if (uuid == nil) { - Log.directLog(BCTBX_LOG_ERROR, text: "Can not find correspondant call to set held.") - return - } - let setHeldAction = CXSetHeldCallAction(call: uuid!, onHold: hold) - let transaction = CXTransaction(action: setHeldAction) - requestTransaction(transaction, action: "setHeld") -#endif - } - - @objc func setHeldOtherCalls(exceptCallid: String) { - for call in CallManager.instance().lc!.calls { - if (call.callLog?.callId != exceptCallid && call.state != .Paused && call.state != .Pausing && call.state != .PausedByRemote) { - setHeld(call: call, hold: true) - } - } - } - - func setResumeCalls() { - for call in CallManager.instance().lc!.calls { - if (call.state == .Paused || call.state == .Pausing || call.state == .PausedByRemote) { - setHeld(call: call, hold: false) - } - } - } - - @objc func performActionWhenCoreIsOn(action: @escaping ()->Void ) { - if (globalState == .On) { - action() - } else { - actionsToPerformOnceWhenCoreIsOn.append(action) - } - } - - @objc func acceptVideo(call: OpaquePointer, confirm: Bool) { - let sCall = Call.getSwiftObject(cObject: call) - let params = try? lc?.createCallParams(call: sCall) - params?.videoEnabled = confirm - try? sCall.acceptUpdate(params: params) - } - - func onGlobalStateChanged(core: Core, state: GlobalState, message: String) { - if (state == .On) { - actionsToPerformOnceWhenCoreIsOn.forEach { - $0() - } - actionsToPerformOnceWhenCoreIsOn.removeAll() - } - globalState = state - } - - func onRegistrationStateChanged(core: Core, proxyConfig: ProxyConfig, state: RegistrationState, message: String) { - if core.proxyConfigList.count == 1 && (state == .Failed || state == .Cleared){ - // terminate callkit immediately when registration failed or cleared, supporting single proxy configuration - for call in CallManager.instance().providerDelegate.uuids { - let callId = CallManager.instance().providerDelegate.callInfos[call.value]?.callId - if (callId != nil) { - let call = CallManager.instance().lc?.getCallByCallid(callId: callId!) - if (call != nil && call?.state != .PushIncomingReceived) { - // sometimes (for example) due to network, registration failed, in this case, keep the call - continue - } - } - - CallManager.instance().providerDelegate.endCall(uuid: call.value) - } - CallManager.instance().endCallkit = true - } else { - CallManager.instance().endCallkit = false - } - } - - func isConferenceCall(call:Call) -> Bool { - let remoteAddress = call.remoteAddress?.asStringUriOnly() - return remoteAddress?.contains("focus") == true || remoteAddress?.contains("audiovideo") == true - } - - func incomingDisplayName(call:Call) -> String { - let isConference = isConferenceCall(call: call) - let isEarlyConference = isConference && CallsViewModel.shared.currentCallData.value??.isConferenceCall.value != true // Conference info not be received yet. - if (isConference) { - if (isEarlyConference) { - return VoipTexts.conference_incoming_title - } else { - return "\(VoipTexts.conference_incoming_title): \(CallsViewModel.shared.currentCallData.value??.remoteConferenceSubject.value ?? "") (\(CallsViewModel.shared.currentCallData.value??.conferenceParticipantsCountLabel.value ?? ""))" - } - } else { - return FastAddressBook.displayName(for: call.remoteAddress?.getCobject) ?? "Unknown" - } - } - - func onCallStateChanged(core: Core, call: Call, state cstate: Call.State, message: String) { - let callLog = call.callLog - let callId = callLog?.callId ?? "" - if (cstate == .PushIncomingReceived) { - displayIncomingCall(call: call, handle: "Calling", hasVideo: false, callId: callId, displayName: "Calling") - } else { - let video = (core.videoActivationPolicy?.automaticallyAccept ?? false) && (call.remoteParams?.videoEnabled ?? false) - - if (call.userData == nil) { - let appData = CallAppData() - CallManager.setAppData(sCall: call, appData: appData) - } - - if let conference = call.conference, ConferenceViewModel.shared.conference.value == nil { - Log.i("[Call] Found conference attached to call and no conference in dedicated view model, init & configure it") - ConferenceViewModel.shared.initConference(conference) - ConferenceViewModel.shared.configureConference(conference) - } - - switch cstate { - case .IncomingReceived: - let addr = call.remoteAddress - var displayName = incomingDisplayName(call: call) - - if call.replacedCall != nil { - endCallKitReplacedCall = false - - let uuid = CallManager.instance().providerDelegate.uuids["\(CallManager.uuidReplacedCall ?? "")"] - let callInfo = CallManager.instance().providerDelegate.callInfos[uuid!] - callInfo!.callId = CallManager.instance().referedToCall ?? "" - if (callInfo != nil && uuid != nil && addr != nil) { - CallManager.instance().providerDelegate.callInfos.updateValue(callInfo!, forKey: uuid!) - CallManager.instance().providerDelegate.uuids.removeValue(forKey: callId) - CallManager.instance().providerDelegate.uuids.updateValue(uuid!, forKey: callInfo!.callId) - CallManager.instance().providerDelegate.updateCall(uuid: uuid!, handle: addr!.asStringUriOnly(), hasVideo: video, displayName: displayName) - } - } else if (CallManager.callKitEnabled()) { - let isConference = isConferenceCall(call: call) - let isEarlyConference = isConference && CallsViewModel.shared.currentCallData.value??.isConferenceCall.value != true // Conference info not be received yet. - if (isEarlyConference) { - CallsViewModel.shared.currentCallData.readCurrentAndObserve { _ in - let uuid = CallManager.instance().providerDelegate.uuids["\(callId)"] - if (uuid != nil) { - displayName = "\(VoipTexts.conference_incoming_title): \(CallsViewModel.shared.currentCallData.value??.remoteConferenceSubject.value ?? "") (\(CallsViewModel.shared.currentCallData.value??.conferenceParticipantsCountLabel.value ?? ""))" - CallManager.instance().providerDelegate.updateCall(uuid: uuid!, handle: addr!.asStringUriOnly(), hasVideo: video, displayName: displayName) - } - } - } - - let uuid = CallManager.instance().providerDelegate.uuids["\(callId)"] - if call.replacedCall == nil { - CallManager.uuidReplacedCall = callId - } - - if (uuid != nil) { - // Tha app is now registered, updated the call already existed. - CallManager.instance().providerDelegate.updateCall(uuid: uuid!, handle: addr!.asStringUriOnly(), hasVideo: video, displayName: displayName) - } else { - CallManager.instance().displayIncomingCall(call: call, handle: addr!.asStringUriOnly(), hasVideo: video, callId: callId, displayName: displayName) - } - } else if (UIApplication.shared.applicationState != .active) { - // not support callkit , use notif - let content = UNMutableNotificationContent() - content.title = NSLocalizedString("Incoming call", comment: "") - content.body = displayName - content.sound = UNNotificationSound.init(named: UNNotificationSoundName.init("notes_of_the_optimistic.caf")) - content.categoryIdentifier = "call_cat" - content.userInfo = ["CallId" : callId] - let req = UNNotificationRequest.init(identifier: "call_request", content: content, trigger: nil) - UNUserNotificationCenter.current().add(req, withCompletionHandler: nil) - } - break - case .StreamsRunning: - if (CallManager.callKitEnabled()) { - let uuid = CallManager.instance().providerDelegate.uuids["\(callId)"] - if (uuid != nil) { - let callInfo = CallManager.instance().providerDelegate.callInfos[uuid!] - if (callInfo != nil && callInfo!.isOutgoing && !callInfo!.connected) { - Log.directLog(BCTBX_LOG_MESSAGE, text: "CallKit: outgoing call connected with uuid \(uuid!) and callId \(callId)") - CallManager.instance().providerDelegate.reportOutgoingCallConnected(uuid: uuid!) - callInfo!.connected = true - CallManager.instance().providerDelegate.callInfos.updateValue(callInfo!, forKey: uuid!) - } - } - } - - if (CallManager.instance().speakerBeforePause) { - CallManager.instance().speakerBeforePause = false - CallManager.instance().changeRouteToSpeaker() - } - actionToFulFill?.fulfill() - actionToFulFill = nil - break - case .Paused: - actionToFulFill?.fulfill() - actionToFulFill = nil - break - case .OutgoingInit, - .OutgoingProgress, - .OutgoingRinging, - .OutgoingEarlyMedia: - if (CallManager.callKitEnabled()) { - let uuid = CallManager.instance().providerDelegate.uuids[""] - if (uuid != nil && callId != nil) { - let callInfo = CallManager.instance().providerDelegate.callInfos[uuid!] - callInfo!.callId = callId - CallManager.instance().providerDelegate.callInfos.updateValue(callInfo!, forKey: uuid!) - CallManager.instance().providerDelegate.uuids.removeValue(forKey: "") - CallManager.instance().providerDelegate.uuids.updateValue(uuid!, forKey: callId) - - Log.directLog(BCTBX_LOG_MESSAGE, text: "CallKit: outgoing call started connecting with uuid \(uuid!) and callId \(callId)") - CallManager.instance().providerDelegate.reportOutgoingCallStartedConnecting(uuid: uuid!) - } else { - if CallManager.instance().isConferenceCall(call: call) { - let uuid = UUID() - let callInfo = CallInfo.newOutgoingCallInfo(addr: call.remoteAddress!, isSas: call.params?.mediaEncryption == .ZRTP, displayName: VoipTexts.conference_default_title, isVideo: call.params?.videoEnabled == true, isConference:true) - CallManager.instance().providerDelegate.callInfos.updateValue(callInfo, forKey: uuid) - CallManager.instance().providerDelegate.uuids.updateValue(uuid, forKey: "") - CallManager.instance().providerDelegate.reportOutgoingCallStartedConnecting(uuid: uuid) - Core.get().activateAudioSession(actived: true) - } else { - CallManager.instance().referedToCall = callId - } - } - } - break - case .End, - .Error: - var displayName = "Unknown" - if (call.dir == .Incoming) { - displayName = incomingDisplayName(call: call) - } else if let addr = call.remoteAddress, let contactName = FastAddressBook.displayName(for: addr.getCobject) { - displayName = contactName - } - - UIDevice.current.isProximityMonitoringEnabled = false - if (CallManager.instance().lc!.callsNb == 0) { - CallManager.instance().changeRouteToDefault() - // disable this because I don't find anygood reason for it: _bluetoothAvailable = FALSE; - // furthermore it introduces a bug when calling multiple times since route may not be - // reconfigured between cause leading to bluetooth being disabled while it should not - //CallManager.instance().bluetoothEnabled = false - } - - if UIApplication.shared.applicationState != .active && (callLog == nil || callLog?.status == .Missed || callLog?.status == .Aborted || callLog?.status == .EarlyAborted) { - // Configure the notification's payload. - let content = UNMutableNotificationContent() - content.title = NSString.localizedUserNotificationString(forKey: NSLocalizedString("Missed call", comment: ""), arguments: nil) - content.body = NSString.localizedUserNotificationString(forKey: displayName, arguments: nil) - content.userInfo = ["missed_call" : true] - // Deliver the notification. - let request = UNNotificationRequest(identifier: "call_request", content: content, trigger: nil) // Schedule the notification. - let center = UNUserNotificationCenter.current() - center.add(request) { (error : Error?) in - if error != nil { - Log.directLog(BCTBX_LOG_ERROR, text: "Error while adding notification request : \(error!.localizedDescription)") - } - } - } - - if (CallManager.callKitEnabled()) { - var uuid = CallManager.instance().providerDelegate.uuids["\(callId)"] - if (callId == CallManager.instance().referedToCall) { - // refered call ended before connecting - Log.directLog(BCTBX_LOG_MESSAGE, text: "Callkit: end refered to call : \(String(describing: CallManager.instance().referedToCall))") - CallManager.instance().referedFromCall = nil - CallManager.instance().referedToCall = nil - } - if uuid == nil { - // the call not yet connected - uuid = CallManager.instance().providerDelegate.uuids[""] - } - if (uuid != nil) { - if (callId == CallManager.instance().referedFromCall) { - Log.directLog(BCTBX_LOG_MESSAGE, text: "Callkit: end refered from call : \(String(describing: CallManager.instance().referedFromCall))") - CallManager.instance().referedFromCall = nil - let callInfo = CallManager.instance().providerDelegate.callInfos[uuid!] - callInfo!.callId = CallManager.instance().referedToCall ?? "" - CallManager.instance().providerDelegate.callInfos.updateValue(callInfo!, forKey: uuid!) - CallManager.instance().providerDelegate.uuids.removeValue(forKey: callId) - CallManager.instance().providerDelegate.uuids.updateValue(uuid!, forKey: callInfo!.callId) - CallManager.instance().referedToCall = nil - break - } - if (endCallKitReplacedCall){ - let transaction = CXTransaction(action: - CXEndCallAction(call: uuid!)) - CallManager.instance().requestTransaction(transaction, action: "endCall") - }else{ - endCallKitReplacedCall = true - } - - } - } - break - case .Released: - CallManager.setAppData(sCall : call, appData : nil); - break - case .Referred: - CallManager.instance().referedFromCall = call.callLog?.callId - break - default: - break - } - - 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() && call.conference == nil) { - CallManager.instance().changeRouteToSpeaker() - } else if (isBluetoothAvailable()) { - // Use bluetooth device by default if one is available - CallManager.instance().changeRouteToBluetooth() - } - } - } - // post Notification kLinphoneCallUpdate - NotificationCenter.default.post(name: Notification.Name("LinphoneCallUpdate"), object: self, userInfo: [ - AnyHashable("call"): NSValue.init(pointer:UnsafeRawPointer(call.getCobject)), - AnyHashable("state"): NSNumber(value: cstate.rawValue), - AnyHashable("message"): message - ]) - } - - // Audio messages - - @objc func activateAudioSession() { - lc?.activateAudioSession(actived: true) - } - - @objc func getSpeakerSoundCard() -> String? { - var speakerCard: String? = nil - var earpieceCard: String? = nil - lc?.audioDevices.forEach { device in - if (device.hasCapability(capability: .CapabilityPlay)) { - if (device.type == .Speaker) { - speakerCard = device.id - } else if (device.type == .Earpiece) { - earpieceCard = device.id - } - } - } - return speakerCard != nil ? speakerCard : earpieceCard - } - - // Local Conference - - @objc func startLocalConference() { - if (CallManager.callKitEnabled()) { - let calls = lc?.calls - if (calls == nil || calls!.isEmpty) { - return - } - let firstCall = calls!.first?.callLog?.callId ?? "" - let lastCall = (calls!.count > 1) ? calls!.last?.callLog?.callId ?? "" : "" - - let currentUuid = CallManager.instance().providerDelegate.uuids["\(firstCall)"] - if (currentUuid == nil) { - Log.directLog(BCTBX_LOG_ERROR, text: "Can not find correspondant call to group.") - return - } - - let newUuid = CallManager.instance().providerDelegate.uuids["\(lastCall)"] - let groupAction = CXSetGroupCallAction(call: currentUuid!, callUUIDToGroupWith: newUuid) - let transcation = CXTransaction(action: groupAction) - requestTransaction(transcation, action: "groupCall") - - setResumeCalls() - } else { - addAllToLocalConference() - } - } - - func addAllToLocalConference() { - do { - if let core = lc, let params = try? core.createConferenceParams(conference: nil) { - params.videoEnabled = false // We disable video for local conferencing (cf Android) - params.subject = VoipTexts.conference_local_title - let conference = core.conference != nil ? core.conference : try core.createConferenceWithParams(params: params) - try conference?.addParticipants(calls: core.calls) - } - } catch { - Log.directLog(BCTBX_LOG_ERROR, text: "accept call failed \(error)") - } - } - - @objc func applyInternationalPrefix() -> Bool { - if let account = lc?.defaultAccount, let params = account.params { - return params.useInternationalPrefixForCallsAndChats - } - return true; // Legacy behavior - } -} - - diff --git a/Classes/Swift/Chat/Data/FileType.swift b/Classes/Swift/Chat/Data/FileType.swift deleted file mode 100644 index cbc6d48fa..000000000 --- a/Classes/Swift/Chat/Data/FileType.swift +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation - -enum FileType : String { - case pdf = "pdf"; - case png = "png"; - case jpg = "jpg"; - case jpeg = "jpeg"; - case bmp = "bmp"; - case heic = "heic"; - case mkv = "mkv"; - case avi = "avi"; - case mov = "mov"; - case mp4 = "mp4"; - case wav = "wav"; - case au = "au"; - case m4a = "m4a"; - case other = "other"; - - case file_pdf_default = "file_pdf_default"; - case file_picture_default = "file_picture_default"; - case file_video_default = "file_video_default"; - case file_audio_default = "file_audio_default"; - case file_default = "file_default"; - - func getGroupTypeFromFile() -> String? { - switch self { - case .pdf, .file_pdf_default: - return "file_pdf_default" - - case .png, .jpg, .jpeg, .bmp, .heic, .file_picture_default: - return "file_picture_default" - - case .mkv, .avi, .mov, .mp4, .file_video_default: - return "file_video_default" - - case .wav, .au, .m4a, .file_audio_default: - return "file_audio_default" - - default: - return "file_default" - } - } - - func getImageFromFile() -> UIImage? { - switch self { - case .pdf, .file_pdf_default: - return UIImage(named:"file_pdf_default") - - case .png, .jpg, .jpeg, .bmp, .heic, .file_picture_default: - return UIImage(named:"file_picture_default") - - case .mkv, .avi, .mov, .mp4, .file_video_default: - return UIImage(named:"file_video_default") - - case .wav, .au, .m4a, .file_audio_default: - return UIImage(named:"file_audio_default") - - default: - return UIImage(named:"file_default") - } - } -} - -extension FileType { - init() { - self = .file_default - } - - init?(_ value: String) { - switch value.lowercased() { - case "pdf", "file_pdf_default": - self = .file_pdf_default - - case "png", "jpg", "jpeg", "bmp", "heic", "file_picture_default": - self = .file_picture_default - - case "mkv", "avi", "mov", "mp4", "file_video_default": - self = .file_video_default - - case "wav", "au", "m4a", "file_audio_default": - self = .file_audio_default - - default: - self = .file_default - } - } -} diff --git a/Classes/Swift/Chat/ViewModels/ChatConversationTableViewModel.swift b/Classes/Swift/Chat/ViewModels/ChatConversationTableViewModel.swift deleted file mode 100644 index daf7e5be4..000000000 --- a/Classes/Swift/Chat/ViewModels/ChatConversationTableViewModel.swift +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import UIKit -import Foundation -import linphonesw - - -class ChatConversationTableViewModel { - - static let sharedModel = ChatConversationTableViewModel() - - var chatRoom: ChatRoom? = nil - - var refreshIndexPath = MutableLiveData(0) - - var onClickIndexPath = MutableLiveData(0) - var onClickMessageIndexPath = 0 - - - var editModeOn = MutableLiveData(false) - - var messageSelected = MutableLiveData(0) - var messageListSelected = MutableLiveData<[Bool]>([]) - - var messageListToDelete : [EventLog] = [] - - func getMessage(index: Int) -> EventLog? { - if (chatRoom != nil) { - let chatRoomEvents = chatRoom?.getHistoryRangeEvents(begin: index, end: index+1) - return chatRoomEvents?.first - }else{ - return nil - } - } - - func getIndexMessage(message: ChatMessage) -> Int { - var index = -1 - if (chatRoom == nil) { - return index - } - - var indexRange = 0 - let msgId = message.messageId - - while index == -1 { - let chatRoomEvents = chatRoom?.getHistoryRangeEvents(begin: indexRange, end: indexRange+20) - if chatRoomEvents?.count == 0 { - index = -2 - } - chatRoomEvents?.reversed().forEach({ event in - let chat = event.chatMessage - if (chat != nil && msgId == chat?.messageId) { - index = indexRange - } - indexRange += 1 - }) - } - return index - } - - func getNBMessages() -> Int { - if (chatRoom == nil) { - return 0 - } - return chatRoom!.historyEventsSize - } - - func eventTypeIsOfInterestForOne(toOneRoom type: EventLog.Kind) -> Bool { - return type.rawValue == LinphoneEventLogTypeConferenceChatMessage.rawValue || type.rawValue == LinphoneEventLogTypeConferenceEphemeralMessageEnabled.rawValue || type.rawValue == LinphoneEventLogTypeConferenceEphemeralMessageDisabled.rawValue || type.rawValue == LinphoneEventLogTypeConferenceEphemeralMessageLifetimeChanged.rawValue - } - - func reloadCollectionViewCell(){ - refreshIndexPath.value! += 1 - } - - func onGridClick(indexMessage: Int, index :Int){ - onClickMessageIndexPath = indexMessage - onClickIndexPath.value! = index - } - - func changeEditMode(editMode :Bool){ - editModeOn.value = editMode - } - - func selectAllMessages(){ - for i in 0...messageListSelected.value!.count - 1 { - messageListSelected.value![i] = true - messageSelected.value! += 1 - } - refreshIndexPath.value! += 1 - } - - func unSelectAllMessages(){ - for i in 0...messageListSelected.value!.count - 1 { - messageListSelected.value![i] = false - } - messageSelected.value! = 0 - refreshIndexPath.value! += 1 - } - - func deleteMessagesSelected(){ - for i in 0...(messageListSelected.value!.count - 1) { - if messageListSelected.value![i] == true { - let messageEvent = getMessage(index: i) - //if messageEvent - messageListToDelete.append((messageEvent)!) - } - } - - messageListToDelete.forEach { chatMessage in - chatMessage.deleteFromDatabase() - } - messageSelected.value! = 0 - refreshIndexPath.value! += 1 - } -} diff --git a/Classes/Swift/Chat/ViewModels/ChatConversationViewModel.swift b/Classes/Swift/Chat/ViewModels/ChatConversationViewModel.swift deleted file mode 100644 index 83bc46d40..000000000 --- a/Classes/Swift/Chat/ViewModels/ChatConversationViewModel.swift +++ /dev/null @@ -1,584 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import UIKit -import Foundation -import linphonesw - - -class ChatConversationViewModel { - - static let sharedModel = ChatConversationViewModel() - - let APP_GROUP_ID = "group.belledonne-communications.linphone.widget" - - var chatRoom: ChatRoom? = nil - var chatRoomDelegate: ChatRoomDelegate? = nil - - var mediaCount : Int = 0 - var newMediaCount : Int = 0 - - var address: String? = nil - var participants: String? = nil - var subject: String? = nil - var shareFileMessage: String? = nil - - var debugEnabled = false - var isVoiceRecording = false - var showVoiceRecorderView = false - var isPendingVoiceRecord = false - var isPlayingVoiceRecording = false - var isOneToOneChat = false - - var urlFile : [URL?] = [] - var mediaURLCollection : [URL] = [] - var replyURLCollection : [URL] = [] - - var data : [Data?] = [] - var fileContext : [Data] = [] - - var progress : [Progress] = [] - var workItem : DispatchWorkItem? = nil - - var replyMessage : OpaquePointer? = nil - - var vrRecordTimer = Timer() - - var voiceRecorder : Recorder? = nil - - var secureLevel : UIImage? - var imageT : [UIImage?] = [] - var mediaCollectionView : [UIImage] = [] - var replyCollectionView : [UIImage] = [] - - var isComposing = MutableLiveData(0) - var messageReceived = MutableLiveData() - var stateChanged = MutableLiveData() - var secureLevelChanged = MutableLiveData() - var subjectChanged = MutableLiveData() - var eventLog = MutableLiveData() - var indexPathVM = MutableLiveData() - var shareFileURL = MutableLiveData() - var shareFileName = MutableLiveData() - - func resetViewModel(){ - chatRoom?.removeDelegate(delegate: chatRoomDelegate!) - mediaURLCollection = [] - replyURLCollection.removeAll() - fileContext = [] - urlFile = [] - data = [] - workItem?.cancel() - for progressItem in progress{ - progressItem.cancel() - } - progress.removeAll() - } - - func createChatConversation(){ - chatRoomDelegate = ChatRoomDelegateStub( - onIsComposingReceived: { (room: ChatRoom, remoteAddress: Address, isComposing: Bool) -> Void in - self.on_chat_room_is_composing_received(room, remoteAddress, isComposing) - }, onChatMessageReceived: { (room: ChatRoom, event: EventLog) -> Void in - self.on_chat_room_chat_message_received(room, event) - }, onChatMessageSending: { (room: ChatRoom, event: EventLog) -> Void in - self.on_chat_room_event_log(room, event) - }, onParticipantAdded: { (room: ChatRoom, event: EventLog) -> Void in - self.on_chat_room_secure_level(room, event) - }, onParticipantRemoved: { (room: ChatRoom, event: EventLog) -> Void in - self.on_chat_room_secure_level(room, event) - }, onParticipantAdminStatusChanged: { (room: ChatRoom, event: EventLog) -> Void in - self.on_chat_room_event_log(room, event) - }, onStateChanged: { (room: ChatRoom, state: ChatRoom.State) -> Void in - self.on_chat_room_state_changed(room) - }, onSecurityEvent: { (room: ChatRoom, event: EventLog) -> Void in - self.on_chat_room_secure_level(room, event) - }, onSubjectChanged: { (room: ChatRoom, event: EventLog) -> Void in - self.on_chat_room_subject_changed(room, event) - }, onConferenceJoined: { (room: ChatRoom, event: EventLog) -> Void in - self.on_chat_room_event_log(room, event) - }, onConferenceLeft: { (room: ChatRoom, event: EventLog) -> Void in - self.on_chat_room_event_log(room, event) - } - ) - chatRoom?.addDelegate(delegate: chatRoomDelegate!) - - workItem = DispatchWorkItem { - let indexPath = IndexPath(row: self.mediaCollectionView.count, section: 0) - self.mediaURLCollection.append(self.urlFile[indexPath.row]!) - self.mediaCollectionView.append(self.imageT[indexPath.row]!) - - self.fileContext.append(self.data[indexPath.row]!) - if(self.mediaCount + self.newMediaCount <= indexPath.row+1){ - self.indexPathVM.value = indexPath.row - } - } - } - - func on_chat_room_is_composing_received(_ cr: ChatRoom?, _ remoteAddr: Address?, _ isComposingBool: Bool) { - isComposing.value = bctbx_list_size(linphone_chat_room_get_composing_addresses(cr?.getCobject)) - } - - func on_chat_room_chat_message_received(_ cr: ChatRoom?, _ event_log: EventLog?) { - let chat = event_log?.chatMessage - if chat == nil { - return - } - - var hasFile = false - // if auto_download is available and file is downloaded - if (linphone_core_get_max_size_for_auto_download_incoming_files(LinphoneManager.getLc()) > -1) && (chat?.fileTransferInformation != nil) { - hasFile = true - } - - var returnValue = false; - chat?.contents.forEach({ content in - if !content.isFileTransfer && !content.isText && !content.isVoiceRecording && !hasFile { - returnValue = true - } - }) - - if returnValue { - return - } - - let from = chat?.fromAddress - if from == nil { - return - } - - messageReceived.value = event_log - } - - func on_chat_room_state_changed(_ cr: ChatRoom?) { - isOneToOneChat = chatRoom!.hasCapability(mask: Int(LinphoneChatRoomCapabilitiesOneToOne.rawValue)) - secureLevel = FastAddressBook.image(for: linphone_chat_room_get_security_level(cr?.getCobject)) - stateChanged.value = cr - } - - func on_chat_room_subject_changed(_ cr: ChatRoom?, _ event_log: EventLog?) { - subject = event_log?.subject != nil ? event_log?.subject : cr?.subject - subjectChanged.value = event_log - } - - func on_chat_room_secure_level(_ cr: ChatRoom?, _ event_log: EventLog?) { - secureLevel = FastAddressBook.image(for: linphone_chat_room_get_security_level(cr?.getCobject)) - secureLevelChanged.value = event_log - } - - func on_chat_room_event_log(_ cr: ChatRoom?, _ event_log: EventLog?) { - eventLog.value = event_log - } - - func nsDataRead() -> Data? { - let groupName = "group.\(Bundle.main.bundleIdentifier ?? "").linphoneExtension" - let path = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: groupName)?.path - let fullCacheFilePathPath = "\(path ?? "")/\("nsData")" - return NSData(contentsOfFile: fullCacheFilePathPath) as Data? - } - - func sendMessage(message: String?, withExterlBodyUrl externalUrl: URL?, rootMessage: ChatMessage?) -> Bool { - if chatRoom == nil { - return false - } - - let msg = rootMessage - let basic = isBasicChatRoom(chatRoom?.getCobject) - let params = linphone_account_get_params(linphone_core_get_default_account(LinphoneManager.getLc())) - let cpimEnabled = linphone_account_params_cpim_in_basic_chat_room_enabled(params) - - if (!basic || (cpimEnabled != 0)) && (message != nil) && message!.count > 0 { - linphone_chat_message_add_utf8_text_content(msg?.getCobject, message) - } - - if (externalUrl != nil) { - linphone_chat_message_set_external_body_url(msg?.getCobject, externalUrl!.absoluteString) - } - - let contentList = linphone_chat_message_get_contents(msg?.getCobject) - if bctbx_list_size(contentList) > 0 { - linphone_chat_message_send(msg?.getCobject) - } - - if basic && (cpimEnabled == 0) && (message != nil) && message!.count > 0 { - linphone_chat_message_send(linphone_chat_room_create_message_from_utf8(chatRoom?.getCobject, message)) - } - - return true - } - - func isBasicChatRoom(_ room: OpaquePointer?) -> Bool { - if room == nil { - return true - } - - let charRoomBasic = ChatRoom.getSwiftObject(cObject: room!) - let isBasic = charRoomBasic.hasCapability(mask: Int(LinphoneChatRoomCapabilitiesBasic.rawValue)) - return isBasic - } - - func startUploadData(_ data: Data?, withType type: String?, withName name: String?, andMessage message: String?, rootMessage: ChatMessage?){ - let fileTransfer = FileTransferDelegate.init() - if let msg = message { - fileTransfer.text = msg - } - var resultType = "file" - var key = "localfile" - if type == "file_video_default" { - resultType = "video" - key = "localvideo" - } else if type == "file_picture_default" { - resultType = "image" - key = "localimage" - } - fileTransfer.uploadData(data, for: chatRoom?.getCobject, type: resultType, subtype: resultType, name: name, key: key, rootMessage: rootMessage?.getCobject) - } - - func startFileUpload(_ data: Data?, withName name: String?, rootMessage: ChatMessage?){ - let fileTransfer = FileTransferDelegate() - fileTransfer.uploadFile(data, for: ChatConversationViewModel.sharedModel.chatRoom?.getCobject, withName: name, rootMessage: rootMessage?.getCobject) - } - - func shareFile() { - let groupName = "group.\(Bundle.main.bundleIdentifier ?? "").linphoneExtension" - let defaults = UserDefaults(suiteName: groupName) - let dict = defaults?.value(forKey: "photoData") as? [AnyHashable : Any] - if let dict_notnil = dict { - //file shared from photo lib - shareFileMessage = dict_notnil["message"] as? String - shareFileName.value = dict_notnil["url"] as? String - defaults?.removeObject(forKey: "photoData") - } else if let dictFile = defaults?.value(forKey: "icloudData") as? [AnyHashable : Any] { - shareFileMessage = dict?["message"] as? String - shareFileName.value = dictFile["url"] as? String - defaults?.removeObject(forKey: "icloudData") - } else if let dictUrl = defaults?.value(forKey: "url") as? [AnyHashable : Any] { - shareFileMessage = dict?["message"] as? String - shareFileURL.value = dictUrl["url"] as? String - defaults?.removeObject(forKey: "url") - } - } - - func getImageFrom(_ content: OpaquePointer?, filePath: String?, forReplyBubble: Bool) -> UIImage? { - var filePath = filePath - let type = String(utf8String: linphone_content_get_type(content)) - let name = String(utf8String: linphone_content_get_name(content)) - if filePath == nil { - filePath = LinphoneManager.validFilePath(name) - } - - var image: UIImage? = nil - if type == "video" { - image = UIChatBubbleTextCell.getImageFromVideoUrl(URL(fileURLWithPath: filePath ?? "")) - } else if type == "image" { - image = UIImage(named: filePath ?? "") - } - - if let img = image { - return img - } else { - return getImageFromFileName(name, forReplyBubble: forReplyBubble) - } - } - - func getImageFromFileName(_ fileName: String?, forReplyBubble forReplyBubbble: Bool) -> UIImage? { - let extensionFile = fileName?.lowercased().components(separatedBy: ".").last - var image: UIImage? - var text = fileName - if fileName?.contains("voice-recording") ?? false { - image = UIImage(named: "file_voice_default") - text = recordingDuration(LinphoneManager.validFilePath(fileName)) - } else { - if extensionFile == "pdf" { - image = UIImage(named: "file_pdf_default") - } else if ["png", "jpg", "jpeg", "bmp", "heic"].contains(extensionFile ?? "") { - image = UIImage(named: "file_picture_default") - } else if ["mkv", "avi", "mov", "mp4"].contains(extensionFile ?? "") { - image = UIImage(named: "file_video_default") - } else if ["wav", "au", "m4a"].contains(extensionFile ?? "") { - image = UIImage(named: "file_audio_default") - } else { - image = UIImage(named: "file_default") - } - } - - return SwiftUtil.textToImage(drawText: text!, inImage: image!, forReplyBubble: forReplyBubbble) - } - - func recordingDuration(_ _voiceRecordingFile: String?) -> String? { - let core = Core.getSwiftObject(cObject: LinphoneManager.getLc()) - var result = "" - do{ - let linphonePlayer = try core.createLocalPlayer(soundCardName: nil, videoDisplayName: nil, windowId: nil) - try linphonePlayer.open(filename: _voiceRecordingFile!) - result = formattedDuration(linphonePlayer.duration)! - linphonePlayer.close() - }catch{ - Log.e(error.localizedDescription) - } - return result - } - - func formattedDuration(_ valueMs: Int) -> String? { - return String(format: "%02ld:%02ld", valueMs / 60000, (valueMs % 60000) / 1000) - } - - func writeMediaToGalleryFromName(_ name: String?, fileType: String?) { - let filePath = LinphoneManager.validFilePath(name) - let fileManager = FileManager.default - if fileManager.fileExists(atPath: filePath!) { - let data = NSData(contentsOfFile: filePath!) as Data? - let block: (() -> Void)? = { - if fileType == "image" { - // we're finished, save the image and update the message - let image = UIImage(data: data!) - if image == nil { - ChatConversationViewSwift.showFileDownloadError() - return - } - var placeHolder: PHObjectPlaceholder? = nil - PHPhotoLibrary.shared().performChanges({ - let request = PHAssetCreationRequest.creationRequestForAsset(from: image!) - placeHolder = request.placeholderForCreatedAsset - }) { success, error in - DispatchQueue.main.async(execute: { - if error != nil { - Log.e("Cannot save image data downloaded \(error!.localizedDescription)") - let errView = UIAlertController( - title: NSLocalizedString("Transfer error", comment: ""), - message: NSLocalizedString("Cannot write image to photo library", comment: ""), - preferredStyle: .alert) - - let defaultAction = UIAlertAction( - title: "OK", - style: .default, - handler: { action in - }) - - errView.addAction(defaultAction) - PhoneMainView.instance()!.present(errView, animated: true) - } else { - Log.i("Image saved to \(placeHolder!.localIdentifier)") - } - }) - } - } else if fileType == "video" { - var placeHolder: PHObjectPlaceholder? - PHPhotoLibrary.shared().performChanges({ - let request = PHAssetCreationRequest.creationRequestForAssetFromVideo(atFileURL: URL(fileURLWithPath: filePath!)) - placeHolder = request?.placeholderForCreatedAsset - }) { success, error in - DispatchQueue.main.async(execute: { - if error != nil { - Log.e("Cannot save video data downloaded \(error!.localizedDescription)") - let errView = UIAlertController( - title: NSLocalizedString("Transfer error", comment: ""), - message: NSLocalizedString("Cannot write video to photo library", comment: ""), - preferredStyle: .alert) - let defaultAction = UIAlertAction( - title: "OK", - style: .default, - handler: { action in - }) - - errView.addAction(defaultAction) - PhoneMainView.instance()!.present(errView, animated: true) - } else { - Log.i("video saved to \(placeHolder!.localIdentifier)") - } - }) - } - } - } - if PHPhotoLibrary.authorizationStatus() == .authorized { - block!() - } else { - PHPhotoLibrary.requestAuthorization({ status in - DispatchQueue.main.async(execute: { - if PHPhotoLibrary.authorizationStatus() == .authorized { - block!() - } else { - let alert = UIAlertController(title: NSLocalizedString("Photo's permission", comment: ""), message: NSLocalizedString("Photo not authorized", comment: ""), preferredStyle: .alert) - alert.addAction(UIAlertAction(title: NSLocalizedString("Continue", comment: ""), style: .default)) - PhoneMainView.instance()!.present(alert, animated: true) - } - }) - }) - } - } - } - - func createCollectionViewItem(urlFile: URL?, type: String) { - if let url = urlFile { - do { - if(type == "public.image"){ - let dataResult = try Data(contentsOf: url) - ChatConversationViewModel.sharedModel.data.append(dataResult) - if let image = UIImage(data: dataResult) { - ChatConversationViewModel.sharedModel.imageT.append(image) - }else{ - ChatConversationViewModel.sharedModel.imageT.append(UIImage(named: "chat_error")) - } - }else if(type == "public.movie"){ - ChatConversationViewModel.sharedModel.data.append(try Data(contentsOf: url)) - var tmpImage = ChatConversationViewModel.sharedModel.createThumbnailOfVideoFromFileURL(videoURL: url.relativeString) - if tmpImage == nil { tmpImage = UIImage(named: "chat_error")} - ChatConversationViewModel.sharedModel.imageT.append(tmpImage) - }else{ - - ChatConversationViewModel.sharedModel.data.append(try Data(contentsOf: url)) - let otherFile = FileType.init(url.pathExtension) - let otherFileImage = otherFile!.getImageFromFile() - ChatConversationViewModel.sharedModel.imageT.append(otherFileImage) - } - ChatConversationViewModel.sharedModel.urlFile.append(url) - DispatchQueue.main.async(execute: ChatConversationViewModel.sharedModel.workItem!) - }catch let error{ - Log.e(error.localizedDescription) - } - } - } - - - func createCollectionViewItemForReply(urlFile: URL?, type: String) -> UIImage { - if urlFile != nil { - do { - if(type == "public.image"){ - let dataResult = try Data(contentsOf: urlFile!) - if let image = UIImage(data: dataResult) { - return image - }else{ - return UIImage(named: "chat_error")! - } - }else if(type == "public.movie"){ - var tmpImage = ChatConversationViewModel.sharedModel.createThumbnailOfVideoFromFileURL(videoURL: urlFile!.relativeString) - if tmpImage == nil { tmpImage = UIImage(named: "chat_error")} - return tmpImage! - }else{ - let otherFile = FileType.init(urlFile!.pathExtension) - let otherFileImage = otherFile!.getImageFromFile() - return otherFileImage! - } - }catch let error{ - Log.e(error.localizedDescription) - } - } - return UIImage(named: "chat_error")! - } - - func createThumbnailOfVideoFromFileURL(videoURL: String) -> UIImage? { - if let urlVideo = URL(string: videoURL){ - let asset = AVAsset(url: urlVideo) - let assetImgGenerate = AVAssetImageGenerator(asset: asset) - assetImgGenerate.appliesPreferredTrackTransform = true - do { - let img = try assetImgGenerate.copyCGImage(at: CMTimeMake(value: 1, timescale: 10), actualTime: nil) - let thumbnail = UIImage(cgImage: img) - return thumbnail - } catch _{ - return nil - } - } else { - return nil - } - } - - //Voice recoder and player - func createVoiceRecorder() { - let core = Core.getSwiftObject(cObject: LinphoneManager.getLc()) - do{ - let p = try core.createRecorderParams() - p.fileFormat = Recorder.FileFormat.Mkv - ChatConversationViewModel.sharedModel.voiceRecorder = try core.createRecorder(params: p) - }catch{ - Log.e(error.localizedDescription) - } - } - - func startVoiceRecording() { - if (voiceRecorder == nil) { - createVoiceRecorder() - } - CallManager.instance().activateAudioSession() - - showVoiceRecorderView = true - isVoiceRecording = true - - switch linphone_recorder_get_state(voiceRecorder?.getCobject) { - case LinphoneRecorderClosed: - let filename = "\(String(describing: LinphoneManager.imagesDirectory()))/voice-recording-\(UUID().uuidString).mkv" - linphone_recorder_open(voiceRecorder?.getCobject, filename) - linphone_recorder_start(voiceRecorder?.getCobject) - Log.i("[Chat Message Sending] Recorder is closed opening it with \(filename)") - case LinphoneRecorderRunning: - Log.i("[Chat Message Sending] Recorder is already recording") - case LinphoneRecorderPaused: - Log.i("[Chat Message Sending] Recorder isn't closed, resuming recording") - linphone_recorder_start(voiceRecorder?.getCobject) - default: - break - } - } - - func stopVoiceRecording() { - if (ChatConversationViewModel.sharedModel.voiceRecorder != nil) && linphone_recorder_get_state(ChatConversationViewModel.sharedModel.voiceRecorder?.getCobject) == LinphoneRecorderRunning { - Log.i("[Chat Message Sending] Pausing / closing voice recorder") - linphone_recorder_pause(ChatConversationViewModel.sharedModel.voiceRecorder?.getCobject) - linphone_recorder_close(ChatConversationViewModel.sharedModel.voiceRecorder?.getCobject) - } - isVoiceRecording = false - vrRecordTimer.invalidate() - isPendingVoiceRecord = linphone_recorder_get_duration(ChatConversationViewModel.sharedModel.voiceRecorder?.getCobject) > 0 - } - - func initSharedPlayer() { - AudioPlayer.initSharedPlayer() - } - - func startSharedPlayer(_ path: String?) { - AudioPlayer.startSharedPlayer(path) - AudioPlayer.sharedModel.fileChanged.value = path - } - - func cancelVoiceRecordingVM() { - showVoiceRecorderView = false - isPendingVoiceRecord = false - isVoiceRecording = false - if (voiceRecorder != nil) && linphone_recorder_get_state(voiceRecorder?.getCobject) != LinphoneRecorderClosed { - AudioPlayer.cancelVoiceRecordingVM(voiceRecorder) - } - } - - func stopSharedPlayer() { - AudioPlayer.stopSharedPlayer() - } - - func removeTmpFile(filePath: String?){ - if (filePath != nil) { - if (filePath != "") { - do { - Log.i("[vfs] remove item at \(filePath)") - try FileManager.default.removeItem(atPath: filePath!) - }catch{ - Log.e("[vfs] remove item error") - } - } - } - } -} diff --git a/Classes/Swift/Chat/Views/ChatConversationTableViewSwift.swift b/Classes/Swift/Chat/Views/ChatConversationTableViewSwift.swift deleted file mode 100644 index df22ee135..000000000 --- a/Classes/Swift/Chat/Views/ChatConversationTableViewSwift.swift +++ /dev/null @@ -1,801 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import UIKit -import Foundation -import linphonesw -import DropDown -import QuickLook -import SwipeCellKit - -class ChatConversationTableViewSwift: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, QLPreviewControllerDelegate, QLPreviewControllerDataSource, SwipeCollectionViewCellDelegate { - - static let compositeDescription = UICompositeViewDescription(ChatConversationTableViewSwift.self, statusBar: StatusBarView.self, tabBar: nil, sideMenu: SideMenuView.self, fullscreen: false, isLeftFragment: false,fragmentWith: nil) - - static func compositeViewDescription() -> UICompositeViewDescription! { return compositeDescription } - - func compositeViewDescription() -> UICompositeViewDescription! { return type(of: self).compositeDescription } - - lazy var collectionView: UICollectionView = { - let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout()) - return collectionView - }() - - var menu: DropDown? = nil - - var basic :Bool = false - - var floatingScrollButton : UIButton? - var scrollBadge : UILabel? - var floatingScrollBackground : UIButton? - - var previewItems : [QLPreviewItem?] = [] - var afterPreviewIndex = -1 - - override func viewDidLoad() { - super.viewDidLoad() - - - self.initView() - - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - self.collectionView.backgroundColor = VoipTheme.backgroundWhiteBlack.get() - self.collectionView.reloadData() - } - - ChatConversationTableViewModel.sharedModel.refreshIndexPath.observe { index in - self.collectionView.reloadData() - } - - ChatConversationTableViewModel.sharedModel.onClickIndexPath.observe { index in - self.onGridClick(indexMessage: ChatConversationTableViewModel.sharedModel.onClickMessageIndexPath, index: index!) - } - - ChatConversationTableViewModel.sharedModel.editModeOn.observe { mode in - self.collectionView.reloadData() - } - - collectionView.isUserInteractionEnabled = true - collectionView.keyboardDismissMode = .interactive - } - - deinit { - NotificationCenter.default.removeObserver(self) - } - - func initView(){ - basic = isBasicChatRoom(ChatConversationTableViewModel.sharedModel.chatRoom?.getCobject) - - view.addSubview(collectionView) - collectionView.contentInsetAdjustmentBehavior = .always - collectionView.contentInset = UIEdgeInsets(top: 10, left: 0, bottom: 10, right: 0) - - collectionView.translatesAutoresizingMaskIntoConstraints = false - collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true - collectionView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true - collectionView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true - collectionView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: 0).isActive = true - - collectionView.dataSource = self - collectionView.delegate = self - collectionView.register(MultilineMessageCell.self, forCellWithReuseIdentifier: MultilineMessageCell.reuseId) - - (collectionView.collectionViewLayout as! UICollectionViewFlowLayout).estimatedItemSize = UICollectionViewFlowLayout.automaticSize - (collectionView.collectionViewLayout as! UICollectionViewFlowLayout).minimumLineSpacing = 2 - - collectionView.transform = CGAffineTransform(scaleX: 1, y: -1) - } - - override func viewDidAppear(_ animated: Bool) { - createFloatingButton() - if ChatConversationTableViewModel.sharedModel.getNBMessages() > 0 { - scrollToBottom(animated: false) - } - - NotificationCenter.default.addObserver(self, selector: #selector(self.receivePresenceNotification(notification:)), name: Notification.Name("LinphoneFriendPresenceUpdate"), object: nil) - } - - override func viewWillDisappear(_ animated: Bool) { - if ChatConversationTableViewModel.sharedModel.getNBMessages() > 0 { - scrollToBottom(animated: false, async:false) - } - NotificationCenter.default.removeObserver(self, name: Notification.Name("LinphoneFriendPresenceUpdate"), object: nil) - NotificationCenter.default.removeObserver(self) - } - - @objc func receivePresenceNotification(notification: NSNotification) { - if (notification.name.rawValue == "LinphoneFriendPresenceUpdate"){ - collectionView.reloadData() - } - } - - func scrollToMessage(message: ChatMessage){ - let messageIndex = ChatConversationTableViewModel.sharedModel.getIndexMessage(message: message) - self.collectionView.scrollToItem(at: IndexPath(row: messageIndex, section: 0), at: .bottom, animated: false) - } - - func scrollToBottom(animated: Bool, async: Bool = true){ - if (async) { - DispatchQueue.main.async{ - self.collectionView.scrollToItem(at: IndexPath(item: 0, section: 0), at: .top, animated: animated) - } - } else { - self.collectionView.scrollToItem(at: IndexPath(item: 0, section: 0), at: .top, animated: animated) - } - ChatConversationViewSwift.markAsRead(ChatConversationViewModel.sharedModel.chatRoom?.getCobject) - if self.floatingScrollButton != nil && self.floatingScrollBackground != nil { - self.floatingScrollButton!.isHidden = true - self.floatingScrollBackground!.isHidden = true - } - if scrollBadge != nil { - scrollBadge!.text = "0" - } - } - - func refreshDataAfterForeground(){ - DispatchQueue.main.async { - self.collectionView.reloadData() - } - } - - func refreshData(isOutgoing: Bool){ - if (ChatConversationTableViewModel.sharedModel.getNBMessages() > 1){ - let isDisplayingBottomOfTable = collectionView.contentOffset.y <= 20 - - if ChatConversationTableViewModel.sharedModel.getNBMessages() < 4 { - collectionView.reloadData() - ChatConversationViewSwift.markAsRead(ChatConversationViewModel.sharedModel.chatRoom?.getCobject) - } else if isDisplayingBottomOfTable { - if self.collectionView.numberOfItems(inSection: 0) > 2 { - self.collectionView.scrollToItem(at: IndexPath(item: 1, section: 0), at: .top, animated: false) - } - collectionView.reloadData() - self.scrollToBottom(animated: true) - } else if !isOutgoing { - if !collectionView.indexPathsForVisibleItems.isEmpty { - let selectedCellIndex = collectionView.indexPathsForVisibleItems.sorted().first! - let selectedCell = collectionView.cellForItem(at: selectedCellIndex) - let visibleRect = collectionView.convert(collectionView.bounds, to: selectedCell) - - UIView.performWithoutAnimation { - collectionView.reloadData() - DispatchQueue.main.asyncAfter(deadline: .now() + 0.2){ - let newSelectedCell = self.collectionView.cellForItem(at: IndexPath(row: selectedCellIndex.row + 1, section: 0)) - let updatedVisibleRect = self.collectionView.convert(self.collectionView.bounds, to: newSelectedCell) - - var contentOffset = self.collectionView.contentOffset - contentOffset.y = contentOffset.y + (visibleRect.origin.y - updatedVisibleRect.origin.y) - self.collectionView.contentOffset = contentOffset - } - } - scrollBadge!.isHidden = false - scrollBadge!.text = "\(ChatConversationViewModel.sharedModel.chatRoom?.unreadMessagesCount ?? 0)" - } - } else { - collectionView.reloadData() - self.scrollToBottom(animated: false) - } - - if ChatConversationTableViewModel.sharedModel.editModeOn.value! { - ChatConversationTableViewModel.sharedModel.messageListSelected.value!.insert(false, at: 0) - } - }else{ - collectionView.reloadData() - if(ChatConversationViewModel.sharedModel.chatRoom != nil){ - ChatConversationViewSwift.markAsRead(ChatConversationViewModel.sharedModel.chatRoom?.getCobject) - } - } - } - - func scrollViewDidScroll(_ scrollView: UIScrollView) { - let contentOffsetY = scrollView.contentOffset.y - if contentOffsetY <= 20{ - if floatingScrollButton != nil && floatingScrollBackground != nil { - floatingScrollButton?.isHidden = true - floatingScrollBackground?.isHidden = true - scrollBadge?.text = "0" - ChatConversationViewSwift.markAsRead(ChatConversationViewModel.sharedModel.chatRoom?.getCobject) - } - } else { - if floatingScrollButton != nil && floatingScrollBackground != nil { - floatingScrollButton?.isHidden = false - floatingScrollBackground?.isHidden = false; - if(scrollBadge?.text == "0"){ - scrollBadge?.isHidden = true - } - } - } - } - - // MARK: - UICollectionViewDataSource - - func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { - let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MultilineMessageCell.reuseId, for: indexPath) as! MultilineMessageCell - cell.delegate = self - if let event = ChatConversationTableViewModel.sharedModel.getMessage(index: indexPath.row){ - if(ChatConversationTableViewModel.sharedModel.editModeOn.value! && indexPath.row >= ChatConversationTableViewModel.sharedModel.messageListSelected.value!.count){ - for _ in ChatConversationTableViewModel.sharedModel.messageListSelected.value!.count...indexPath.row { - ChatConversationTableViewModel.sharedModel.messageListSelected.value!.append(false) - } - } - - cell.configure(event: event, selfIndexPathConfigure: indexPath, editMode: ChatConversationTableViewModel.sharedModel.editModeOn.value!, selected: ChatConversationTableViewModel.sharedModel.editModeOn.value! ? ChatConversationTableViewModel.sharedModel.messageListSelected.value![indexPath.row] : false) - - if (event.chatMessage != nil && ChatConversationViewModel.sharedModel.chatRoom != nil){ - cell.onLongClickOneClick { - if(cell.chatMessage != nil && ChatConversationViewModel.sharedModel.chatRoom != nil){ - self.initDataSource(message: cell.chatMessage!) - self.tapChooseMenuItemMessage(contentViewBubble: cell.contentViewBubble, event: cell.eventMessage!, preContentSize: cell.preContentViewBubble.frame.size.height) - } - } - } - - if (!cell.replyContent.isHidden && event.chatMessage?.replyMessage != nil){ - cell.replyContent.onClick { - self.scrollToMessage(message: (cell.chatMessage?.replyMessage)!) - } - } - - cell.imageViewBubble.onClick { - if (!cell.imageViewBubble.isHidden || !cell.imageVideoViewBubble.isHidden) && cell.chatMessage != nil && !cell.chatMessage!.isFileTransferInProgress { - self.onImageClick(chatMessage: cell.chatMessage!, index: indexPath.row) - } - } - cell.imageVideoViewBubble.onClick { - if (!cell.imageViewBubble.isHidden || !cell.imageVideoViewBubble.isHidden) && cell.chatMessage != nil && !cell.chatMessage!.isFileTransferInProgress { - self.onImageClick(chatMessage: cell.chatMessage!, index: indexPath.row) - } - } - } - cell.contentView.transform = CGAffineTransform(scaleX: 1, y: -1) - return cell - } - - func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { - let customCell = cell as! MultilineMessageCell - - if customCell.isPlayingVoiceRecording { - AudioPlayer.stopSharedPlayer() - } - - if customCell.ephemeralTimer != nil { - customCell.ephemeralTimer?.invalidate() - } - - if customCell.chatMessageDelegate != nil { - customCell.chatMessage?.removeDelegate(delegate: customCell.chatMessageDelegate!) - } - } - - func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return ChatConversationTableViewModel.sharedModel.getNBMessages() - } - - func collectionView(_ collectionView: UICollectionView, editActionsForItemAt indexPath: IndexPath, for orientation: SwipeActionsOrientation) -> [SwipeAction]? { - let message = ChatConversationTableViewModel.sharedModel.getMessage(index: indexPath.row) - if orientation == .left { - if message?.chatMessage != nil { - let replyAction = SwipeAction(style: .default, title: "Reply") { action, indexPath in - self.replyMessage(message: (message?.chatMessage)!) - } - return [replyAction] - } else { - return nil - } - } else { - let deleteAction = SwipeAction(style: .destructive, title: "Delete") { action, indexPath in - self.deleteMessage(message: message!) - } - return [deleteAction] - } - } - - func collectionView(_ collectionView: UICollectionView, editActionsOptionsForItemAt indexPath: IndexPath, for orientation: SwipeActionsOrientation) -> SwipeOptions { - var options = SwipeOptions() - if orientation == .left { - options.expansionStyle = .selection - } - return options - } - - func isBasicChatRoom(_ room: OpaquePointer?) -> Bool { - if room == nil { - return true - } - - let charRoomBasic = ChatRoom.getSwiftObject(cObject: room!) - let isBasic = charRoomBasic.hasCapability(mask: Int(LinphoneChatRoomCapabilitiesBasic.rawValue)) - return isBasic - } - - func tapChooseMenuItemMessage(contentViewBubble: UIView, event: EventLog, preContentSize: CGFloat) { - - menu!.anchorView = view - menu!.width = 240 - - let coordinateMin = contentViewBubble.convert(contentViewBubble.frame.origin, to: view) - let coordinateMax = contentViewBubble.convert(CGPoint(x: contentViewBubble.frame.maxX - 40, y: contentViewBubble.frame.maxY), to: view) - - if (coordinateMax.y + CGFloat(menu!.dataSource.count * 44) - preContentSize < view.frame.maxY) { - menu!.bottomOffset = CGPoint(x: event.chatMessage!.isOutgoing ? coordinateMax.x - 200 : coordinateMin.x, y: coordinateMax.y - preContentSize) - } else if ((coordinateMax.y + CGFloat(menu!.dataSource.count * 44) > view.frame.maxY) && coordinateMin.y > CGFloat(menu!.dataSource.count * 44) + (preContentSize * 2)) { - menu!.bottomOffset = CGPoint(x: event.chatMessage!.isOutgoing ? coordinateMax.x - 200 : coordinateMin.x, y: coordinateMin.y - (preContentSize * 2) - CGFloat(menu!.dataSource.count * 44)) - } else { - menu!.bottomOffset = CGPoint(x: event.chatMessage!.isOutgoing ? coordinateMax.x - 200 : coordinateMin.x, y: 0) - } - - let view: ChatConversationViewSwift = self.VIEW(ChatConversationViewSwift.compositeViewDescription()) - view.contentMessageView.messageView.endEditing(true) - - menu!.show() - menu!.selectionAction = { [weak self] (index: Int, item: String) in - guard let _ = self else { return } - switch item { - case VoipTexts.bubble_chat_dropDown_emojis: - self!.copyMessage(message: event.chatMessage!) - case VoipTexts.bubble_chat_dropDown_resend: - self!.resendMessage(message: event.chatMessage!) - case VoipTexts.bubble_chat_dropDown_copy_text: - self!.copyMessage(message: event.chatMessage!) - case VoipTexts.bubble_chat_dropDown_forward: - self!.forwardMessage(message: event.chatMessage!) - case VoipTexts.bubble_chat_dropDown_reply: - self!.replyMessage(message: event.chatMessage!) - case VoipTexts.bubble_chat_dropDown_infos: - if !event.chatMessage!.isFileTransferInProgress && !(event.chatMessage!.state.rawValue == LinphoneChatMessageStateNotDelivered.rawValue || event.chatMessage!.state.rawValue == LinphoneChatMessageStateFileTransferError.rawValue) { - self!.infoMessage(event: event) - } - case VoipTexts.bubble_chat_dropDown_add_to_contact: - self!.addToContacts(message: event.chatMessage!) - case VoipTexts.bubble_chat_dropDown_delete: - self!.deleteMessage(message: event) - default: - Log.e("Error Default tapChooseMenuItemMessage ChatConversationTableViewSwift") - } - self!.menu!.clearSelection() - } - } - - func initDataSource(message: ChatMessage) { - menu = { - let menu = DropDown() - menu.dataSource = [""] - let images = [ - "menu_resend_default", - "menu_copy_text_default", - "menu_forward_default", - "menu_reply_default", - "menu_info", - "contact_add_default", - "menu_delete", - "menu_info" - ] - menu.cellNib = UINib(nibName: "DropDownCell", bundle: nil) - menu.customCellConfiguration = { index, title, cell in - guard let cell = cell as? MyCell else { - return - } - if(index < images.count){ - switch menu.dataSource[index] { - case VoipTexts.bubble_chat_dropDown_emojis: - cell.myImageView.image = UIImage(named: images[7]) - cell.myEmojisView.isHidden = false - cell.myImageView.isHidden = true - cell.optionLabel.isHidden = true - - switch message.ownReaction?.body { - case "❤️": - cell.myEmojiButton1.layer.cornerRadius = 10 - cell.myEmojiButton1.backgroundColor = VoipTheme.light_grey_color - case "👍": - cell.myEmojiButton2.layer.cornerRadius = 10 - cell.myEmojiButton2.backgroundColor = VoipTheme.light_grey_color - case "😂": - cell.myEmojiButton3.layer.cornerRadius = 10 - cell.myEmojiButton3.backgroundColor = VoipTheme.light_grey_color - case "😮": - cell.myEmojiButton4.layer.cornerRadius = 10 - cell.myEmojiButton4.backgroundColor = VoipTheme.light_grey_color - case "😢": - cell.myEmojiButton5.layer.cornerRadius = 10 - cell.myEmojiButton5.backgroundColor = VoipTheme.light_grey_color - default: - print("No reaction") - } - - cell.myEmojiButton1.onClick { - do { - let messageReaction = try message.ownReaction?.body != "❤️" ? message.createReaction(utf8Reaction: "❤️") : message.createReaction(utf8Reaction: "") - messageReaction.send() - self.menu!.clearSelection() - self.menu?.removeFromSuperview() - } catch { - Log.e(error.localizedDescription) - } - } - cell.myEmojiButton2.onClick { - do { - let messageReaction = try message.ownReaction?.body != "👍" ? message.createReaction(utf8Reaction: "👍") : message.createReaction(utf8Reaction: "") - messageReaction.send() - self.menu!.clearSelection() - self.menu?.removeFromSuperview() - } catch { - Log.e(error.localizedDescription) - } - } - cell.myEmojiButton3.onClick { - do { - let messageReaction = try message.ownReaction?.body != "😂" ? message.createReaction(utf8Reaction: "😂") : message.createReaction(utf8Reaction: "") - messageReaction.send() - self.menu!.clearSelection() - self.menu?.removeFromSuperview() - } catch { - Log.e(error.localizedDescription) - } - } - cell.myEmojiButton4.onClick { - do { - let messageReaction = try message.ownReaction?.body != "😮" ? message.createReaction(utf8Reaction: "😮") : message.createReaction(utf8Reaction: "") - messageReaction.send() - self.menu!.clearSelection() - self.menu?.removeFromSuperview() - } catch { - Log.e(error.localizedDescription) - } - } - cell.myEmojiButton5.onClick { - do { - let messageReaction = try message.ownReaction?.body != "😢" ? message.createReaction(utf8Reaction: "😢") : message.createReaction(utf8Reaction: "") - messageReaction.send() - self.menu!.clearSelection() - self.menu?.removeFromSuperview() - } catch { - Log.e(error.localizedDescription) - } - } - case VoipTexts.bubble_chat_dropDown_resend: - if #available(iOS 13.0, *) { - cell.myImageView.image = UIImage(named: images[0])!.withTintColor(.darkGray) - } else { - cell.myImageView.image = UIImage(named: images[0]) - } - case VoipTexts.bubble_chat_dropDown_copy_text: - cell.myImageView.image = UIImage(named: images[1]) - case VoipTexts.bubble_chat_dropDown_forward: - cell.myImageView.image = UIImage(named: images[2]) - case VoipTexts.bubble_chat_dropDown_reply: - cell.myImageView.image = UIImage(named: images[3]) - case VoipTexts.bubble_chat_dropDown_infos: - cell.myImageView.image = UIImage(named: images[4]) - case VoipTexts.bubble_chat_dropDown_add_to_contact: - cell.myImageView.image = UIImage(named: images[5]) - case VoipTexts.bubble_chat_dropDown_delete: - cell.myImageView.image = UIImage(named: images[6]) - default: - cell.myImageView.image = UIImage(named: images[7]) - } - } - } - - return menu - }() - - menu!.dataSource.removeAll() - let state = message.state - - menu!.dataSource.append(VoipTexts.bubble_chat_dropDown_emojis) - - if (state.rawValue == LinphoneChatMessageStateNotDelivered.rawValue || state.rawValue == LinphoneChatMessageStateFileTransferError.rawValue) { - menu!.dataSource.append(VoipTexts.bubble_chat_dropDown_resend) - } - - if (message.utf8Text != "" && !ICSBubbleView.isConferenceInvitationMessage(cmessage: message.getCobject!)) { - menu!.dataSource.append(VoipTexts.bubble_chat_dropDown_copy_text) - } - - menu!.dataSource.append(VoipTexts.bubble_chat_dropDown_forward) - - menu!.dataSource.append(VoipTexts.bubble_chat_dropDown_reply) - - let chatroom = ChatConversationViewModel.sharedModel.chatRoom - if chatroom != nil { - if (chatroom!.nbParticipants > 1) { - menu!.dataSource.append(VoipTexts.bubble_chat_dropDown_infos) - } - - let isOneToOneChat = ChatConversationViewModel.sharedModel.chatRoom!.hasCapability(mask: Int(LinphoneChatRoomCapabilitiesOneToOne.rawValue)) - if (!message.isOutgoing && FastAddressBook.getContactWith(message.fromAddress?.getCobject) == nil - && !isOneToOneChat && !ConfigManager.instance().lpConfigBoolForKey(key: "read_only_native_address_book")) { - menu!.dataSource.append(VoipTexts.bubble_chat_dropDown_add_to_contact) - } - - menu!.dataSource.append(VoipTexts.bubble_chat_dropDown_delete) - } - } - - func resendMessage(message: ChatMessage){ - if ((linphone_core_is_network_reachable(LinphoneManager.getLc()) == 0)) { - PhoneMainView.instance().present(LinphoneUtils.networkErrorView("send a message"), animated: true) - return; - }else{ - message.send() - } - } - - func copyMessage(message: ChatMessage){ - UIPasteboard.general.string = message.utf8Text - } - - func forwardMessage(message: ChatMessage){ - let view: ChatConversationViewSwift = self.VIEW(ChatConversationViewSwift.compositeViewDescription()) - view.pendingForwardMessage = message.getCobject - let viewtoGo: ChatsListView = self.VIEW(ChatsListView.compositeViewDescription()) - PhoneMainView.instance().changeCurrentView(viewtoGo.compositeViewDescription()) - } - - func replyMessage(message: ChatMessage){ - let view: ChatConversationViewSwift = self.VIEW(ChatConversationViewSwift.compositeViewDescription()) - if (view.contentMessageView.messageView.messageText.textColor == UIColor.lightGray && view.contentMessageView.stackView.arrangedSubviews[3].isHidden && view.contentMessageView.stackView.arrangedSubviews[4].isHidden){ - view.contentMessageView.messageView.messageText.becomeFirstResponder() - } - view.initiateReplyView(forMessage: message.getCobject) - } - - func infoMessage(event: EventLog){ - let view: ChatConversationImdnView = self.VIEW(ChatConversationImdnView.compositeViewDescription()) - view.event = event.getCobject - PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) - } - - func addToContacts(message: ChatMessage) { - let addr = message.fromAddress - addr?.clean() - if let lAddress = addr?.asStringUriOnly() { - var normSip = String(utf8String: lAddress) - normSip = normSip?.hasPrefix("sip:") ?? false ? (normSip as NSString?)?.substring(from: 4) : normSip - normSip = normSip?.hasPrefix("sips:") ?? false ? (normSip as NSString?)?.substring(from: 5) : normSip - ContactSelection.setAddAddress(normSip) - ContactSelection.setSelectionMode(ContactSelectionModeEdit) - ContactSelection.enableSipFilter(false) - PhoneMainView.instance().changeCurrentView(ContactsListView.compositeViewDescription()) - } - } - - func deleteMessage(message: EventLog){ - let messageChat = message.chatMessage - if messageChat != nil { - if ChatConversationTableViewModel.sharedModel.editModeOn.value! { - let indexDeletedMessage = ChatConversationTableViewModel.sharedModel.getIndexMessage(message: messageChat!) - ChatConversationTableViewModel.sharedModel.messageListSelected.value!.remove(at: indexDeletedMessage) - ChatConversationTableViewModel.sharedModel.messageSelected.value! -= 1 - } - let chatRoom = ChatConversationViewModel.sharedModel.chatRoom - if chatRoom != nil { - chatRoom!.deleteMessage(message: messageChat!) - } - } else { - message.deleteFromDatabase() - } - collectionView.reloadData() - } - - func getPreviewItem(filePath: String) -> NSURL{ - let url = NSURL(fileURLWithPath: filePath) - - return url - } - - func numberOfPreviewItems(in controller: QLPreviewController) -> Int { - return previewItems.count - } - - func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem { - return (previewItems[index] as QLPreviewItem?)! - } - - func previewControllerDidDismiss(_ controller: QLPreviewController) { - collectionView.scrollToItem(at: IndexPath(item: afterPreviewIndex, section: 0), at: .centeredVertically, animated: false) - afterPreviewIndex = -1 - } - - func onImageClick(chatMessage: ChatMessage, index: Int) { - - let state = chatMessage.state - if (state.rawValue == LinphoneChatMessageStateNotDelivered.rawValue) { - Log.i("Messsage not delivered") - } else { - if (VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) || ConfigManager.instance().lpConfigBoolForKey(key: "use_in_app_file_viewer_for_non_encrypted_files", section: "app")){ - - var viewer: MediaViewer = VIEW(MediaViewer.compositeViewDescription()) - - var image = UIImage() - if chatMessage.contents.filter({$0.isFile}).first!.type == "image" { - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - var plainFile = chatMessage.contents.filter({$0.isFile}).first!.exportPlainFile() - - image = UIImage(contentsOfFile: plainFile)! - - ChatConversationViewModel.sharedModel.removeTmpFile(filePath: plainFile) - plainFile = "" - - }else { - image = UIImage(contentsOfFile: chatMessage.contents.filter({$0.isFile}).first!.filePath!)! - } - } - - viewer.imageViewer = image - viewer.imageNameViewer = (chatMessage.contents.filter({$0.isFile}).first!.name!.isEmpty ? "" : chatMessage.contents.filter({$0.isFile}).first!.name)! - - viewer.imagePathViewer = chatMessage.contents.filter({$0.isFile}).first!.exportPlainFile() - viewer.contentType = chatMessage.contents.filter({$0.isFile}).first!.type - PhoneMainView.instance().changeCurrentView(viewer.compositeViewDescription()) - - } else { - let previewController = QLPreviewController() - self.previewItems = [] - - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - var plainFile = chatMessage.contents.filter({$0.isFile}).first?.exportPlainFile() - - self.previewItems.append(self.getPreviewItem(filePath: plainFile!)) - - ChatConversationViewModel.sharedModel.removeTmpFile(filePath: plainFile) - plainFile = "" - }else if chatMessage.contents.filter({$0.isFile}).first?.filePath != nil { - self.previewItems.append(self.getPreviewItem(filePath: (chatMessage.contents.filter({$0.isFile}).first?.filePath)!)) - } - - afterPreviewIndex = index - - previewController.currentPreviewItemIndex = 0 - previewController.dataSource = self - previewController.delegate = self - previewController.reloadData() - PhoneMainView.instance().mainViewController.present(previewController, animated: true, completion: nil) - } - } - } - - func onGridClick(indexMessage: Int, index: Int) { - let chatMessage = ChatConversationTableViewModel.sharedModel.getMessage(index: indexMessage)?.chatMessage - let state = chatMessage!.state - if (state.rawValue == LinphoneChatMessageStateNotDelivered.rawValue) { - Log.i("Messsage not delivered") - } else { - if (VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) || ConfigManager.instance().lpConfigBoolForKey(key: "use_in_app_file_viewer_for_non_encrypted_files", section: "app")){ - - var text = "" - var filePathString = VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) ? chatMessage!.contents.filter({$0.isFile})[index].exportPlainFile() : chatMessage!.contents.filter({$0.isFile})[index].filePath - if let urlEncoded = filePathString!.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed){ - if !urlEncoded.isEmpty { - if let urlFile = URL(string: "file://" + urlEncoded){ - do { - text = try String(contentsOf: urlFile, encoding: .utf8) - let viewer: TextViewer = VIEW(TextViewer.compositeViewDescription()) - - if chatMessage != nil { - - viewer.textViewer = text - viewer.textNameViewer = (chatMessage!.contents.filter({$0.isFile})[index].name!.isEmpty ? "" : chatMessage!.contents.filter({$0.isFile})[index].name)! - PhoneMainView.instance().changeCurrentView(viewer.compositeViewDescription()) - } - - } catch { - var extensionFile = "" - if chatMessage!.contents.filter({$0.isFile})[index].name != nil { - extensionFile = chatMessage!.contents.filter({$0.isFile})[index].name!.lowercased().components(separatedBy: ".").last ?? "" - } - - if text == "" && (chatMessage!.contents.filter({$0.isFile})[index].type == "image" || chatMessage!.contents.filter({$0.isFile})[index].type == "video" || chatMessage!.contents.filter({$0.isFile})[index].name!.lowercased().components(separatedBy: ".").last == "pdf" || (["mkv", "avi", "mov", "mp4"].contains(extensionFile))){ - let viewer: MediaViewer = VIEW(MediaViewer.compositeViewDescription()) - - var image = UIImage() - if chatMessage != nil { - if chatMessage!.contents.filter({$0.isFile})[index].type == "image" { - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - var plainFile = chatMessage!.contents.filter({$0.isFile})[index].exportPlainFile() - - image = UIImage(contentsOfFile: plainFile)! - - ChatConversationViewModel.sharedModel.removeTmpFile(filePath: plainFile) - plainFile = "" - - }else { - image = UIImage(contentsOfFile: chatMessage!.contents.filter({$0.isFile})[index].filePath!)! - } - } - - viewer.imageViewer = image - viewer.imageNameViewer = (chatMessage!.contents.filter({$0.isFile})[index].name!.isEmpty ? "" : chatMessage!.contents.filter({$0.isFile})[index].name)! - viewer.imagePathViewer = chatMessage!.contents.filter({$0.isFile})[index].exportPlainFile() - viewer.contentType = chatMessage!.contents.filter({$0.isFile})[index].type - PhoneMainView.instance().changeCurrentView(viewer.compositeViewDescription()) - } - } else { - let exportView = UIAlertController( - title: VoipTexts.chat_message_cant_open_file_in_app_dialog_title, - message: VoipTexts.chat_message_cant_open_file_in_app_dialog_message, - preferredStyle: .alert) - - let cancelAction = UIAlertAction( - title: VoipTexts.cancel, - style: .default, - handler: { action in - }) - - let exportAction = UIAlertAction( - title: VoipTexts.chat_message_cant_open_file_in_app_dialog_export_button, - style: .destructive, - handler: { action in - let previewController = QLPreviewController() - self.previewItems = [] - - self.previewItems.append(self.getPreviewItem(filePath: filePathString!)) - - - self.afterPreviewIndex = indexMessage - - previewController.dataSource = self - previewController.currentPreviewItemIndex = index - previewController.delegate = self - PhoneMainView.instance().mainViewController.present(previewController, animated: true, completion: nil) - }) - - exportView.addAction(cancelAction) - exportView.addAction(exportAction) - PhoneMainView.instance()!.present(exportView, animated: true) - } - } - } - } - } - /* - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - ChatConversationViewModel.sharedModel.removeTmpFile(filePath: filePathString) - filePathString = "" - } - */ - } else { - let previewController = QLPreviewController() - self.previewItems = [] - chatMessage?.contents.forEach({ content in - if(content.isFile && !content.isVoiceRecording){ - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - var plainFile = content.exportPlainFile() - - self.previewItems.append(self.getPreviewItem(filePath: plainFile)) - - ChatConversationViewModel.sharedModel.removeTmpFile(filePath: plainFile) - plainFile = "" - - }else { - self.previewItems.append(self.getPreviewItem(filePath: (content.filePath!))) - } - } - }) - - afterPreviewIndex = indexMessage - - previewController.dataSource = self - previewController.currentPreviewItemIndex = index - previewController.delegate = self - PhoneMainView.instance().mainViewController.present(previewController, animated: true, completion: nil) - } - } - } -} diff --git a/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift b/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift deleted file mode 100644 index c38d01475..000000000 --- a/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift +++ /dev/null @@ -1,1643 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import UIKit -import Foundation -import linphonesw -import DropDown -import PhotosUI -import AVFoundation -import EmojiPicker -import IQKeyboardManager - -class ChatConversationViewSwift: BackActionsNavigationView, PHPickerViewControllerDelegate, UIDocumentPickerDelegate, UICompositeViewDelegate, UICollectionViewDataSource, UICollectionViewDelegate, UIImagePickerControllerDelegate, EmojiPickerDelegate, CoreDelegate & UINavigationControllerDelegate{ // Replaces ChatConversationView - - static let compositeDescription = UICompositeViewDescription(ChatConversationViewSwift.self, statusBar: StatusBarView.self, tabBar: nil, sideMenu: SideMenuView.self, fullscreen: false, isLeftFragment: false,fragmentWith: nil) - - static func compositeViewDescription() -> UICompositeViewDescription! { return compositeDescription } - - func compositeViewDescription() -> UICompositeViewDescription! { return type(of: self).compositeDescription } - - - @objc var linphoneChatRoom: OpaquePointer? = nil - @objc var tableControllerSwift = ChatConversationTableViewSwift() - @objc var pendingForwardMessage : OpaquePointer? = nil - @objc var sharingMedia : Bool = false - @objc var markAsRead : Bool = false - - var activeAlertController = CustomAlertController() - let refreshControl = UIRefreshControl() - let loadingView = UIView() - let loading = RotatingSpinner(color: VoipTheme.primary_color) - let loadingText = StyledLabel(VoipTheme.chat_conversation_operation_in_progress_wait) - - var friend: Friend? = nil - var friendDelegate: FriendDelegate? = nil - - let field = UITextField() - - var collectionViewMedia: UICollectionView = { - let top_bar_height = 66.0 - let width = UIScreen.main.bounds.width * 0.9 - let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() - layout.itemSize = CGSize(width: top_bar_height*2-8, height: top_bar_height*2-8) - - layout.sectionInset = UIEdgeInsets(top: 4, left: 4, bottom: 4, right: 4) - layout.scrollDirection = .horizontal - layout.minimumLineSpacing = 4 - layout.minimumInteritemSpacing = 20 - - let collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: top_bar_height*2), collectionViewLayout: layout) - collectionView.translatesAutoresizingMaskIntoConstraints = false - collectionView.backgroundColor = .clear - return collectionView - }() - - var collectionViewReply: UICollectionView = { - let collection_view_reply_height = 66.0 - let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() - layout.itemSize = CGSize(width: collection_view_reply_height, height: collection_view_reply_height) - - layout.sectionInset = UIEdgeInsets(top: 4, left: 4, bottom: 4, right: 4) - layout.scrollDirection = .horizontal - layout.minimumLineSpacing = 4 - layout.minimumInteritemSpacing = 20 - - let collectionViewReply = UICollectionView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width - 60, height: collection_view_reply_height), collectionViewLayout: layout) - collectionViewReply.translatesAutoresizingMaskIntoConstraints = false - collectionViewReply.backgroundColor = .clear - return collectionViewReply - }() - - let menu: DropDown = { - let menu = DropDown() - menu.dataSource = [""] - var images = [ - "contact_add_default.png", - "contacts_all_default.png", - "menu_voip_meeting_schedule", - "menu_security_default.png", - "ephemeral_messages_default.png", - "menu_notifications_off.png", - "menu_notifications_on.png", - "delete_default.png", - "chat_group_informations.png" - ] - menu.cellNib = UINib(nibName: "DropDownCell", bundle: nil) - menu.customCellConfiguration = { index, title, cell in - guard let cell = cell as? MyCell else { - return - } - if(index < images.count){ - switch menu.dataSource[index] { - case VoipTexts.dropdown_menu_chat_conversation_add_to_contact: - cell.myImageView.image = UIImage(named: images[0]) - case VoipTexts.dropdown_menu_chat_conversation_go_to_contact: - cell.myImageView.image = UIImage(named: images[1]) - case VoipTexts.conference_schedule_start: - cell.myImageView.image = UIImage(named: images[2]) - case VoipTexts.dropdown_menu_chat_conversation_conversation_device: - cell.myImageView.image = UIImage(named: images[3]) - case VoipTexts.dropdown_menu_chat_conversation_ephemeral_messages: - cell.myImageView.image = UIImage(named: images[4]) - case VoipTexts.dropdown_menu_chat_conversation_mute_notifications: - cell.myImageView.image = UIImage(named: images[5]) - case VoipTexts.dropdown_menu_chat_conversation_unmute_notifications: - cell.myImageView.image = UIImage(named: images[6]) - case VoipTexts.dropdown_menu_chat_conversation_delete_messages: - cell.myImageView.image = UIImage(named: images[7]) - default: - cell.myImageView.image = UIImage(named: images[8]) - } - } - } - return menu - }() - - override func viewDidLoad() { - super.viewDidLoad( - backAction: { - self.goBackChatListView() - }, - action1: { - self.onCallClick(cChatRoom: ChatConversationViewModel.sharedModel.chatRoom?.getCobject) - }, - action2: { - self.tapChooseMenuItem(self.action2Button) - }, - action3: { - self.alertActionGoToDevicesList() - }, - action4: { - (LinphoneManager.instance().lpConfigInt(forKey: "debugenable_preference") == 1) ? self.showAddressAndIdentityPopup() : self.tapChooseMenuItem(self.action2Button) - }, - title: ChatConversationViewModel.sharedModel.address ?? "Error", - participants: ChatConversationViewModel.sharedModel.participants ?? "Error" - ) - setupViews() - markAsRead = true - - IQKeyboardManager.shared().disabledDistanceHandlingClasses.add(BackActionsNavigationView.self) - - //PhoneMainView.instance()!.mainViewController.view.makeSecure(field: field) - /* - NotificationCenter.default.addObserver(forName: UIApplication.userDidTakeScreenshotNotification, object: nil, queue: OperationQueue.main) { notification in - if (ConfigManager.instance().lpConfigBoolForKey(key: "screenshot_preference") == false && self.floatingButton.isHidden == false) { - let popupView = UIAlertController(title: VoipTexts.screenshot_restrictions, message: nil, preferredStyle: .alert) - - let defaultAction = UIAlertAction( - title: NSLocalizedString("Ok", comment: ""), - style: .default) - popupView.addAction(defaultAction) - self.present(popupView, animated: true, completion:{ - popupView.view.superview?.isUserInteractionEnabled = true - popupView.view.superview?.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.dismissOnTapOutsideOrCancel))) - }) - } - } - */ - - contentMessageView.floatingButton.addTarget(self, action: #selector(self.alertActionGoToDevicesList), for: .touchUpInside) - - ChatConversationViewModel.sharedModel.isComposing.observe { compose in - /* - if((compose! > 0 && self.contentMessageView.isComposingView.isHidden)||(compose! == 0 && !self.contentMessageView.isComposingView.isHidden)){ - print("on_chat_room_is_composing_received isComposing \(compose)") - self.setComposingVisible(compose!, withDelay: 0.3) - } - */ - self.setComposingVisible(compose!, withDelay: 0.3) - } - - ChatConversationViewModel.sharedModel.messageReceived.observe { message in - self.tableControllerSwift.refreshData(isOutgoing: false) - } - - ChatConversationViewModel.sharedModel.stateChanged.observe { state in - self.configureMessageField() - self.action1BisButton.isEnabled = !ChatConversationViewModel.sharedModel.chatRoom!.isReadOnly - self.initDataSource(groupeChat: !ChatConversationViewModel.sharedModel.isOneToOneChat, secureLevel: ChatConversationViewModel.sharedModel.secureLevel != nil, cChatRoom: (state?.getCobject)!) - } - - ChatConversationViewModel.sharedModel.secureLevelChanged.observe { secure in - self.updateParticipantLabel() - self.tableControllerSwift.refreshData(isOutgoing: false) - self.contentMessageView.changeSecureLevel(secureLevel: ChatConversationViewModel.sharedModel.secureLevel != nil, imageBadge: ChatConversationViewModel.sharedModel.secureLevel) - } - - ChatConversationViewModel.sharedModel.subjectChanged.observe { subject in - if let subjectVM = ChatConversationViewModel.sharedModel.subject { - self.titleGroupLabel.text = subjectVM - self.titleLabel.text = subjectVM - self.tableControllerSwift.refreshData(isOutgoing: false) - } - } - - ChatConversationViewModel.sharedModel.eventLog.observe { event in - if (event?.chatMessage != nil || event?.chatMessage?.isOutgoing != nil) { - self.tableControllerSwift.refreshData(isOutgoing: (event?.chatMessage!.isOutgoing)!) - }else{ - self.tableControllerSwift.refreshData(isOutgoing: false) - } - } - - ChatConversationViewModel.sharedModel.indexPathVM.observe { index in - self.collectionViewMedia.reloadData() - if(ChatConversationViewModel.sharedModel.mediaCollectionView.count > 0){ - self.contentMessageView.messageView.sendButton.isEnabled = true - } - self.loadingView.isHidden = true - self.contentMessageView.messageView.isLoading = false - self.loading.stopRotation() - - self.contentMessageView.messageView.sendButton.isEnabled = true - self.contentMessageView.messageView.pictureButton.isEnabled = true - } - - ChatConversationViewModel.sharedModel.shareFileName.observe { name in - self.contentMessageView.messageView.messageText.text = ChatConversationViewModel.sharedModel.shareFileMessage - self.confirmShare(ChatConversationViewModel.sharedModel.nsDataRead(), url: nil, fileName: name) - } - - ChatConversationViewModel.sharedModel.shareFileURL.observe { url in - self.contentMessageView.messageView.messageText.text = ChatConversationViewModel.sharedModel.shareFileMessage - self.confirmShare(ChatConversationViewModel.sharedModel.nsDataRead(), url: url, fileName: nil) - } - - ChatConversationTableViewModel.sharedModel.messageSelected.observe { result in - if ChatConversationTableViewModel.sharedModel.messageSelected.value! > 0 { - self.action1SelectAllButton.isHidden = true - self.action1DeselectAllButton.isHidden = false - self.action2Delete.isEnabled = true - }else{ - self.action1SelectAllButton.isHidden = false - self.action1DeselectAllButton.isHidden = true - self.action2Delete.isEnabled = false - } - } - - let notificationCenter = NotificationCenter.default - notificationCenter.addObserver(self, selector: #selector(appMovedToForeground), name: UIApplication.willEnterForegroundNotification, object: nil) - } - - @objc func appMovedToForeground() { - if (tableControllerSwift.menu != nil && !tableControllerSwift.menu!.isHidden) { - tableControllerSwift.menu!.hide() - } - if(PhoneMainView.instance().currentView == ChatConversationViewSwift.compositeViewDescription()){ - let lc: Core = Core.getSwiftObject(cObject: LinphoneManager.getLc()) - if(lc.globalState.rawValue == LinphoneGlobalOn.rawValue){ - do { - let peerAddress = try Factory.Instance.createAddress(addr: (ChatConversationViewModel.sharedModel.chatRoom?.peerAddress?.asStringUriOnly())!) - let localAddress = try Factory.Instance.createAddress(addr: (ChatConversationViewModel.sharedModel.chatRoom?.localAddress?.asStringUriOnly())!) - if (peerAddress.isValid! && (localAddress.isValid != nil)) { - ChatConversationViewModel.sharedModel.chatRoom = lc.searchChatRoom(params: nil, localAddr: localAddress, remoteAddr: peerAddress, participants: nil) - if (ChatConversationViewModel.sharedModel.chatRoom != nil) { - ChatConversationViewModel.sharedModel.createChatConversation() - PhoneMainView.instance().currentRoom = ChatConversationViewModel.sharedModel.chatRoom?.getCobject - tableControllerSwift.refreshDataAfterForeground() - } - } - }catch{ - - } - } - } - } - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - IQKeyboardManager.shared().isEnabled = true - IQKeyboardManager.shared().isEnableAutoToolbar = false - ChatConversationViewModel.sharedModel.createChatConversation() - - topBar.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get() - self.contentMessageView.contentView.addSubview(tableControllerSwift.view) - - // Setup Autolayout constraints - tableControllerSwift.view.translatesAutoresizingMaskIntoConstraints = false - tableControllerSwift.view.bottomAnchor.constraint(equalTo: self.contentMessageView.contentView.bottomAnchor, constant: 0).isActive = true - tableControllerSwift.view.leftAnchor.constraint(equalTo: self.contentMessageView.contentView.leftAnchor, constant: 0).isActive = true - tableControllerSwift.view.topAnchor.constraint(equalTo: self.contentMessageView.contentView.topAnchor, constant: 0).isActive = true - tableControllerSwift.view.rightAnchor.constraint(equalTo: self.contentMessageView.contentView.rightAnchor, constant: 0).isActive = true - - ChatConversationTableViewModel.sharedModel.chatRoom = ChatConversationViewModel.sharedModel.chatRoom - - contentMessageView.messageView.sendButton.onClickAction = onSendClick - contentMessageView.messageView.pictureButton.onClickAction = alertAction - contentMessageView.messageView.voiceRecordButton.onClickAction = onVrStart - contentMessageView.messageView.emojisButton.addTarget(self,action:#selector(openEmojiPickerModule), - for:.touchUpInside) - contentMessageView.recordingDeleteButton.onClickAction = cancelVoiceRecording - contentMessageView.recordingPlayButton.onClickAction = onvrPlayPauseStop - contentMessageView.recordingStopButton.onClickAction = onvrPlayPauseStop - - if !ChatConversationViewModel.sharedModel.chatRoom!.isReadOnly { - contentMessageView.messageView.ephemeralIndicator.isHidden = !ChatConversationViewModel.sharedModel.chatRoom!.ephemeralEnabled - } - - handlePendingTransferIfAny() - configureMessageField() - ChatConversationViewModel.sharedModel.shareFile() - - field.isUserInteractionEnabled = false - - /* - let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first - if keyWindow != nil { - if ConfigManager.instance().lpConfigBoolForKey(key: "screenshot_preference") == false && floatingButton.isHidden == false { - PhoneMainView.instance()!.mainViewController.view.changeSecure(field: field, isSecure: true) - }else{ - PhoneMainView.instance()!.mainViewController.view.changeSecure(field: field, isSecure: false) - } - } - */ - } - - override func viewWillDisappear(_ animated: Bool) { - if friendDelegate != nil { - friend?.removeDelegate(delegate: friendDelegate!) - } - AvatarBridge.removeAllObserver() - - /* - let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first - if keyWindow != nil { - PhoneMainView.instance()!.mainViewController.view.changeSecure(field: field, isSecure: false) - } - */ - - field.isUserInteractionEnabled = true - - IQKeyboardManager.shared().isEnabled = false - } - - override func viewDidDisappear(_ animated: Bool) { - resetView() - } - - @objc func resetView(){ - ChatConversationViewModel.sharedModel.resetViewModel() - linphoneChatRoom = nil - editModeOff() - if(self.contentMessageView.isComposingView.isHidden == false){ - self.contentMessageView.isComposingView.isHidden = true - } - if(self.contentMessageView.mediaSelector.isHidden == false){ - self.contentMessageView.mediaSelector.isHidden = true - } - if(self.contentMessageView.replyBubble.isHidden == false){ - self.contentMessageView.replyBubble.isHidden = true - } - - cancelVoiceRecording() - - ChatConversationViewModel.sharedModel.mediaCollectionView = [] - ChatConversationViewModel.sharedModel.replyCollectionView.removeAll() - self.contentMessageView.messageView.fileContext = false - ChatConversationViewModel.sharedModel.imageT = [] - self.collectionViewMedia.reloadData() - self.collectionViewReply.reloadData() - if contentMessageView.messageView.messageText.textColor == UIColor.lightGray || self.contentMessageView.messageView.messageText.text.isEmpty{ - self.contentMessageView.messageView.sendButton.isEnabled = false - } else { - self.contentMessageView.messageView.sendButton.isEnabled = true - } - self.contentMessageView.messageView.pictureButton.isEnabled = true - - contentMessageView.isComposingTextView.text = "" - } - - func goBackChatListView() { - sharingMedia = false - PhoneMainView.instance().pop(toView: ChatsListView.compositeViewDescription()) - } - - func tapChooseMenuItem(_ sender: UIButton) { - menu.anchorView = sender - menu.bottomOffset = CGPoint(x: -UIScreen.main.bounds.width * 0.6, y: sender.frame.size.height) - menu.show() - menu.selectionAction = { [weak self] (index: Int, item: String) in - guard let _ = self else { return } - switch item { - case VoipTexts.dropdown_menu_chat_conversation_add_to_contact: - self!.addOrGoToContact() - case VoipTexts.dropdown_menu_chat_conversation_go_to_contact: - self!.addOrGoToContact() - case VoipTexts.conference_schedule_start: - self!.conferenceSchedule() - case VoipTexts.dropdown_menu_chat_conversation_group_infos: - self!.displayGroupInfo() - case VoipTexts.dropdown_menu_chat_conversation_conversation_device: - self!.goToDevicesList() - case VoipTexts.dropdown_menu_chat_conversation_ephemeral_messages: - self!.goToEphemeralSettings() - case VoipTexts.dropdown_menu_chat_conversation_mute_notifications: - self!.mute_unmute_notifications() - self?.menu.dataSource[index] = VoipTexts.dropdown_menu_chat_conversation_unmute_notifications - case VoipTexts.dropdown_menu_chat_conversation_unmute_notifications: - self!.mute_unmute_notifications() - self?.menu.dataSource[index] = VoipTexts.dropdown_menu_chat_conversation_mute_notifications - case VoipTexts.dropdown_menu_chat_conversation_delete_messages: - self!.onEditionChangeClick() - default: - self!.showAddressAndIdentityPopup() - } - self!.menu.clearSelection() - } - } - - func goToDevicesList() { - let view: DevicesListView = self.VIEW(DevicesListView.compositeViewDescription()) - view.room = ChatConversationViewModel.sharedModel.chatRoom?.getCobject - PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) - } - - func addOrGoToContact() { - let firstParticipant = ChatConversationViewModel.sharedModel.chatRoom?.participants.first - let addr = (firstParticipant != nil) ? linphone_participant_get_address(firstParticipant?.getCobject) : linphone_chat_room_get_peer_address(ChatConversationViewModel.sharedModel.chatRoom?.getCobject) - - if let contact = FastAddressBook.getContactWith(addr) { - let view: ContactDetailsView = self.VIEW(ContactDetailsView.compositeViewDescription()) - ContactSelection.setSelectionMode(ContactSelectionModeNone) - MagicSearchSingleton.instance().currentFilter = "" - view.contact = contact - PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) - } else { - if let lAddress = linphone_address_as_string_uri_only(addr) { - var normSip = String(utf8String: lAddress) - normSip = normSip?.hasPrefix("sip:") ?? false ? (normSip as NSString?)?.substring(from: 4) : normSip - normSip = normSip?.hasPrefix("sips:") ?? false ? (normSip as NSString?)?.substring(from: 5) : normSip - ContactSelection.setAddAddress(normSip) - ContactSelection.setSelectionMode(ContactSelectionModeEdit) - ContactSelection.enableSipFilter(false) - PhoneMainView.instance().changeCurrentView(ContactsListView.compositeViewDescription()) - } - } - } - - func displayGroupInfo() { - let contactsArray: NSMutableArray = [] - let contactsArrayCopy: NSMutableArray = [] - let admins: NSMutableArray = [] - let adminsCopy: NSMutableArray = [] - let participants = ChatConversationViewModel.sharedModel.chatRoom?.participants - participants?.forEach{ participant in - let curi = linphone_address_as_string_uri_only(linphone_participant_get_address(participant.getCobject)) - let uri = String(utf8String: curi!) - contactsArray.add(uri!) - contactsArrayCopy.add(uri!) - if (linphone_participant_is_admin(participant.getCobject) != 0) { - admins.add(uri!) - adminsCopy.add(uri!) - } - } - - let view: ChatConversationInfoView = self.VIEW(ChatConversationInfoView.compositeViewDescription()) - view.create = false - view.contacts = contactsArray - view.oldContacts = contactsArrayCopy - view.admins = admins - view.oldAdmins = adminsCopy - view.oldSubject = String(utf8String: linphone_chat_room_get_subject(ChatConversationViewModel.sharedModel.chatRoom?.getCobject)) ?? LINPHONE_DUMMY_SUBJECT - view.room = ChatConversationViewModel.sharedModel.chatRoom?.getCobject - - let localAddress = linphone_address_as_string(linphone_chat_room_get_local_address(ChatConversationViewModel.sharedModel.chatRoom?.getCobject)) - let peerAddress = linphone_address_as_string(linphone_chat_room_get_peer_address(ChatConversationViewModel.sharedModel.chatRoom?.getCobject)) - view.peerAddress = UnsafePointer(peerAddress) - view.localAddress = UnsafePointer(localAddress) - PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) - } - - func goToEphemeralSettings(){ - let view: EphemeralSettingsView = self.VIEW(EphemeralSettingsView.compositeViewDescription()) - view.room = ChatConversationViewModel.sharedModel.chatRoom?.getCobject - PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) - } - - func conferenceSchedule(){ - ConferenceViewModelBridge.scheduleFromGroupChat(cChatRoom: (ChatConversationViewModel.sharedModel.chatRoom?.getCobject)!) - PhoneMainView.instance().pop(toView: ConferenceSchedulingView.compositeViewDescription()) - } - - func mute_unmute_notifications(){ - LinphoneManager.setChatroomPushEnabled(ChatConversationViewModel.sharedModel.chatRoom?.getCobject, withPushEnabled: !LinphoneManager.getChatroomPushEnabled(ChatConversationViewModel.sharedModel.chatRoom?.getCobject)) - } - - func onEditionChangeClick() { - editModeOn() - } - - func showAddressAndIdentityPopup() { - - let localAddress = String(utf8String: linphone_address_as_string(linphone_chat_room_get_local_address(ChatConversationViewModel.sharedModel.chatRoom?.getCobject))) - let peerAddress = String(utf8String: linphone_address_as_string(linphone_chat_room_get_peer_address(ChatConversationViewModel.sharedModel.chatRoom?.getCobject))) - - var infoMsg: String? = nil - if (peerAddress != nil && localAddress != nil) { - infoMsg = "Chat room id:\n\(peerAddress ?? "nil")\nLocal account:\n\(localAddress ?? "nil")" - } - - let popupView = UIAlertController(title: NSLocalizedString("Chatroom debug infos", comment: ""), message: infoMsg, preferredStyle: .alert) - - let defaultAction = UIAlertAction( - title: NSLocalizedString("Copy to clipboard", comment: ""), - style: .default, - handler: { action in - let pasteboard = UIPasteboard.general - pasteboard.string = infoMsg - }) - popupView.addAction(defaultAction) - present(popupView, animated: true, completion:{ - popupView.view.superview?.isUserInteractionEnabled = true - popupView.view.superview?.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.dismissOnTapOutsideOrCancel))) - }) - - } - - func initDataSource(groupeChat: Bool, secureLevel: Bool, cChatRoom: OpaquePointer) { - menu.dataSource.removeAll() - let defaultAccount = Core.getSwiftObject(cObject: LinphoneManager.getLc()).defaultAccount - if(groupeChat){ - if !ChatConversationViewModel.sharedModel.chatRoom!.isReadOnly && (defaultAccount != nil) && (defaultAccount!.params!.audioVideoConferenceFactoryAddress != nil) { - menu.dataSource.append(VoipTexts.conference_schedule_start) - } - menu.dataSource.append(VoipTexts.dropdown_menu_chat_conversation_group_infos) - }else{ - var contact: Contact? = nil - let firstParticipant = ChatConversationViewModel.sharedModel.chatRoom?.participants.first - let addr = (firstParticipant != nil) ? linphone_participant_get_address(firstParticipant?.getCobject) : linphone_chat_room_get_peer_address(cChatRoom) - - contact = FastAddressBook.getContactWith(addr) - - if (contact == nil && !ConfigManager.instance().lpConfigBoolForKey(key: "read_only_native_address_book")) { - menu.dataSource.append(VoipTexts.dropdown_menu_chat_conversation_add_to_contact) - } else if (contact != nil) { - menu.dataSource.append(VoipTexts.dropdown_menu_chat_conversation_go_to_contact) - } - } - if(secureLevel){ - menu.dataSource.append(VoipTexts.dropdown_menu_chat_conversation_conversation_device) - if !ChatConversationViewModel.sharedModel.chatRoom!.isReadOnly { - menu.dataSource.append(VoipTexts.dropdown_menu_chat_conversation_ephemeral_messages) - } - } - if(LinphoneManager.getChatroomPushEnabled(ChatConversationViewModel.sharedModel.chatRoom?.getCobject)){ - menu.dataSource.append(VoipTexts.dropdown_menu_chat_conversation_mute_notifications) - }else{ - menu.dataSource.append(VoipTexts.dropdown_menu_chat_conversation_unmute_notifications) - } - menu.dataSource.append(VoipTexts.dropdown_menu_chat_conversation_delete_messages) - - if !ChatConversationViewModel.sharedModel.chatRoom!.isReadOnly { - contentMessageView.messageView.ephemeralIndicator.isHidden = !ChatConversationViewModel.sharedModel.chatRoom!.ephemeralEnabled - } - } - - @objc func initChatRoom(cChatRoom:OpaquePointer) { - ChatConversationViewModel.sharedModel.chatRoom = ChatRoom.getSwiftObject(cObject: cChatRoom) - linphoneChatRoom = cChatRoom - PhoneMainView.instance().currentRoom = cChatRoom - ChatConversationViewModel.sharedModel.address = ChatConversationViewModel.sharedModel.chatRoom?.peerAddress?.asString() - - var changeIcon = false - let isOneToOneChat = ChatConversationViewModel.sharedModel.chatRoom!.hasCapability(mask: Int(LinphoneChatRoomCapabilitiesOneToOne.rawValue)) - - if (isOneToOneChat) { - - let firstParticipant = ChatConversationViewModel.sharedModel.chatRoom?.participants.first - let addr = (firstParticipant != nil) ? linphone_participant_get_address(firstParticipant?.getCobject) : linphone_chat_room_get_peer_address(cChatRoom); - ChatConversationViewModel.sharedModel.address = FastAddressBook.displayName(for: addr) ?? "unknow" - changeIcon = false - updateParticipantLabel() - - } else { - ChatConversationViewModel.sharedModel.address = ChatConversationViewModel.sharedModel.chatRoom?.subject - changeIcon = true - updateParticipantLabel() - - } - - changeTitle(titleString: ChatConversationViewModel.sharedModel.address ?? "Error") - - if !ChatConversationViewModel.sharedModel.chatRoom!.isReadOnly{ - changeCallIcon(groupChat: changeIcon) - action1BisButton.isEnabled = true - }else{ - action1Button.isHidden = true - action1BisButton.isHidden = false - action1BisButton.isEnabled = false - } - let secureLevel = FastAddressBook.image(for: linphone_chat_room_get_security_level(cChatRoom)) - contentMessageView.changeSecureLevel(secureLevel: secureLevel != nil, imageBadge: secureLevel) - initDataSource(groupeChat: !isOneToOneChat, secureLevel: secureLevel != nil, cChatRoom: cChatRoom) - } - - func updateParticipantLabel(){ - let participants = ChatConversationViewModel.sharedModel.chatRoom?.participants - participantsGroupLabel.text = "" - if participants!.count > 1 { - participants?.forEach{ participant in - if participantsGroupLabel.text != "" { - participantsGroupLabel.text = participantsGroupLabel.text! + ", " - } - participantsGroupLabel.text = participantsGroupLabel.text! + FastAddressBook.displayName(for: linphone_participant_get_address(participant.getCobject)) - } - titleParticipants.isHidden = false - }else if participants?.first?.address?.contact() != nil { - let participantAddress = participants?.first?.address - participantsGroupLabel.text = participantAddress?.asStringUriOnly() - - - let participantFriend = participants?.first?.address?.contact()?.friend - friend = Friend.getSwiftObject(cObject: participantFriend!) - - var presenceModel : PresenceModel? - var hasPresence : Bool? = false - - if friend?.address?.asStringUriOnly() != nil { - presenceModel = friend!.presenceModel - hasPresence = presenceModel != nil && presenceModel!.basicStatus == PresenceBasicStatus.Open - } - - if (hasPresence! && presenceModel?.consolidatedPresence == ConsolidatedPresence.Online) { - participantsGroupLabel.text = VoipTexts.chat_room_presence_online; - } else if (hasPresence! && presenceModel?.consolidatedPresence == ConsolidatedPresence.Busy){ - - let timeInterval = TimeInterval(presenceModel!.latestActivityTimestamp) - let myNSDate = Date(timeIntervalSince1970: timeInterval) - - if timeInterval == -1 { - participantsGroupLabel.text = VoipTexts.chat_room_presence_away; - } else if Calendar.current.isDateInToday(myNSDate) { - let dateFormatter = DateFormatter() - dateFormatter.dateFormat = "HH:mm" - let dateString = dateFormatter.string(from: myNSDate) - participantsGroupLabel.text = VoipTexts.chat_room_presence_last_seen_online_today + dateString; - } else if Calendar.current.isDateInYesterday(myNSDate) { - let dateFormatter = DateFormatter() - dateFormatter.dateFormat = "HH:mm" - let dateString = dateFormatter.string(from: myNSDate) - participantsGroupLabel.text = VoipTexts.chat_room_presence_last_seen_online_yesterday + dateString; - } else { - let dateFormatter = DateFormatter() - dateFormatter.dateStyle = .short - let dateString = dateFormatter.string(from: myNSDate) - participantsGroupLabel.text = VoipTexts.chat_room_presence_last_seen_online + dateString; - } - } - - friendDelegate = FriendDelegateStub( - onPresenceReceived: { (linphoneFriend: Friend) -> Void in - self.friend?.removeDelegate(delegate: self.friendDelegate!) - self.updateParticipantLabel() - } - ) - friend?.addDelegate(delegate: friendDelegate!) - - titleParticipants.isHidden = false - }else{ - titleParticipants.isHidden = true - } - } - - func onCallClick(cChatRoom: OpaquePointer?) { - let firstParticipant = ChatConversationViewModel.sharedModel.chatRoom?.participants.first - let addr = (firstParticipant != nil) ? linphone_participant_get_address(firstParticipant?.getCobject) : linphone_chat_room_get_peer_address(cChatRoom); - - let isOneToOneChat = ChatConversationViewModel.sharedModel.chatRoom!.hasCapability(mask: Int(LinphoneChatRoomCapabilitiesOneToOne.rawValue)) - - AudioPlayer.initSharedPlayer() - - if (!isOneToOneChat) { - alertActionConferenceCall(cChatRoom: cChatRoom) - } else { - LinphoneManager.instance().call(addr) - } - } - - func alertActionConferenceCall(cChatRoom: OpaquePointer?) { - - let alertController = CustomAlertController(title: VoipTexts.conference_start_group_call_dialog_message, message: nil, preferredStyle: .alert) - - alertController.setBackgroundColor(color: .darkGray) - alertController.setTitle(font: nil, color: .white) - alertController.setTint(color: .white) - alertController.setMaxWidth(alert: alertController) - - alertController.addButtonsAlertController(alertController: alertController, buttonsViewHeightV: 60, buttonsAlertHeightV: 40) - - activeAlertController = alertController - - self.present(alertController, animated: true, completion:{ - alertController.view.superview?.isUserInteractionEnabled = true - alertController.view.superview?.subviews[0].addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.dismissOnTapOutsideOrCancel))) - }) - - - alertController.ok_button_alert.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.onTapOkStartGroupCall))) - - } - - @objc func alertActionGoToDevicesList() { - - let notAskAgain = ConfigManager.instance().lpConfigBoolForKey(key: "confirmation_dialog_before_sas_call_not_ask_again"); - if(!notAskAgain){ - let alertController = CustomAlertController(title: VoipTexts.alert_dialog_secure_badge_button_chat_conversation_title, message: nil, preferredStyle: .alert) - - alertController.setBackgroundColor(color: .darkGray) - alertController.setTitle(font: nil, color: .white) - alertController.setTint(color: .white) - alertController.setMaxWidth(alert: alertController) - - alertController.addButtonsAlertController(alertController: alertController, buttonsViewHeightV: 60, checkboxViewHeightV: 50, buttonsAlertHeightV: 40) - - activeAlertController = alertController - - self.present(alertController, animated: true, completion:{ - alertController.view.superview?.isUserInteractionEnabled = true - alertController.view.superview?.subviews[0].addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.dismissOnTapOutsideOrCancel))) - }) - - alertController.ok_button_alert.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.onTapOkGoToDevicesList))) - }else{ - let view: DevicesListView = self.VIEW(DevicesListView.compositeViewDescription()) - view.room = ChatConversationViewModel.sharedModel.chatRoom?.getCobject - PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) - } - - } - - @objc func onTapOkStartGroupCall(){ - self.dismiss(animated: true, completion: nil) - ConferenceViewModelBridge.startGroupCall(cChatRoom: (ChatConversationViewModel.sharedModel.chatRoom?.getCobject)!) - } - - @objc func onTapOkGoToDevicesList() { - self.dismiss(animated: true, completion: nil) - if(activeAlertController.isChecked){ - ConfigManager.instance().lpConfigSetBool(value: activeAlertController.isChecked, key: "confirmation_dialog_before_sas_call_not_ask_again") - } - let view: DevicesListView = self.VIEW(DevicesListView.compositeViewDescription()) - view.room = ChatConversationViewModel.sharedModel.chatRoom?.getCobject - PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) - } - - @objc func dismissOnTapOutsideOrCancel(){ - self.dismiss(animated: true, completion: nil) - } - - override func editModeOn(){ - super.editModeOn() - ChatConversationTableViewModel.sharedModel.changeEditMode(editMode: true) - } - - override func editModeOff(){ - super.editModeOff() - ChatConversationTableViewModel.sharedModel.messageListSelected.value?.removeAll() - ChatConversationTableViewModel.sharedModel.changeEditMode(editMode: false) - } - - override func selectDeselectAll(){ - super.selectDeselectAll() - if(action1SelectAllButton.isHidden){ - ChatConversationTableViewModel.sharedModel.selectAllMessages() - }else{ - ChatConversationTableViewModel.sharedModel.unSelectAllMessages() - } - } - - override func deleteSelected(){ - super.deleteSelected() - onDeleteClick() - } - - func onDeleteClick() { - let msg = NSLocalizedString("Do you want to delete the selected messages?", comment: "") - UIConfirmationDialog.show( - withMessage: msg, - cancelMessage: nil, - confirmMessage: nil, - onCancelClick: { [self] in - //onEditionChangeClick() - }, - onConfirmationClick: { - ChatConversationTableViewModel.sharedModel.deleteMessagesSelected() - self.editModeOff() - } - ) - } - - - - func sendMessageInMessageField(rootMessage: ChatMessage?) { - if ChatConversationViewModel.sharedModel.sendMessage(message: contentMessageView.messageView.messageText.textColor != UIColor.lightGray ? contentMessageView.messageView.messageText.text.trimmingCharacters(in: .whitespacesAndNewlines) : "", withExterlBodyUrl: nil, rootMessage: rootMessage) { - if !contentMessageView.messageView.messageText.isFirstResponder{ - contentMessageView.messageView.messageText.textColor = UIColor.lightGray - contentMessageView.messageView.messageText.text = "Message" - } else { - contentMessageView.messageView.messageText.text = "" - } - contentMessageView.messageView.emojisButton.isHidden = true - contentMessageView.messageView.isComposing = false - } - setSendButtonState() - } - - func onSendClick() { - let rootMessage = !contentMessageView.replyBubble.isHidden ? linphone_chat_room_create_reply_message(ChatConversationViewModel.sharedModel.chatRoom?.getCobject, ChatConversationViewModel.sharedModel.replyMessage) : linphone_chat_room_create_empty_message(ChatConversationViewModel.sharedModel.chatRoom?.getCobject) - - if ChatConversationViewModel.sharedModel.isVoiceRecording { - stopVoiceRecording() - } - - if ChatConversationViewModel.sharedModel.isPendingVoiceRecord && (ChatConversationViewModel.sharedModel.voiceRecorder != nil) && (linphone_recorder_get_file(ChatConversationViewModel.sharedModel.voiceRecorder?.getCobject) != nil) { - let voiceContent = linphone_recorder_create_content(ChatConversationViewModel.sharedModel.voiceRecorder?.getCobject) - ChatConversationViewModel.sharedModel.isPendingVoiceRecord = false - cancelVoiceRecording() - let conference = ChatConversationViewModel.sharedModel.chatRoom!.hasCapability(mask: Int(LinphoneChatRoomCapabilitiesConference.rawValue)) - if (linphone_chat_room_get_capabilities(ChatConversationViewModel.sharedModel.chatRoom?.getCobject) != 0) && conference { - linphone_chat_message_add_content(rootMessage, voiceContent) - }else{ - if contentMessageView.messageView.messageText.textColor != UIColor.lightGray { - let rootMessageText = !contentMessageView.replyBubble.isHidden ? linphone_chat_room_create_reply_message(ChatConversationViewModel.sharedModel.chatRoom?.getCobject, ChatConversationViewModel.sharedModel.replyMessage) : linphone_chat_room_create_empty_message(ChatConversationViewModel.sharedModel.chatRoom?.getCobject) - let result = ChatMessage.getSwiftObject(cObject: rootMessageText!) - sendMessageInMessageField(rootMessage: result) - - linphone_chat_message_add_content(rootMessage, voiceContent) - }else{ - linphone_chat_message_add_content(rootMessage, voiceContent) - } - } - } - if ChatConversationViewModel.sharedModel.fileContext.count > 0 { - let conference = ChatConversationViewModel.sharedModel.chatRoom!.hasCapability(mask: Int(LinphoneChatRoomCapabilitiesConference.rawValue)) - if (linphone_chat_room_get_capabilities(ChatConversationViewModel.sharedModel.chatRoom?.getCobject) != 0) && conference { - let result = ChatMessage.getSwiftObject(cObject: rootMessage!) - let _ = startMultiFilesUpload(result) - } else { - for i in 0..<(ChatConversationViewModel.sharedModel.fileContext.count) { - startUploadData(ChatConversationViewModel.sharedModel.fileContext[i], withType: FileType.init(ChatConversationViewModel.sharedModel.mediaURLCollection[i].pathExtension)?.getGroupTypeFromFile(), withName: ChatConversationViewModel.sharedModel.mediaURLCollection[i].lastPathComponent, andMessage: nil, rootMessage: nil) - } - if contentMessageView.messageView.messageText.textColor != UIColor.lightGray { - let result = ChatMessage.getSwiftObject(cObject: rootMessage!) - sendMessageInMessageField(rootMessage: result) - } - } - - ChatConversationViewModel.sharedModel.fileContext = [] - contentMessageView.messageView.fileContext = false - ChatConversationViewModel.sharedModel.mediaCollectionView = [] - ChatConversationViewModel.sharedModel.mediaURLCollection = [] - if(self.contentMessageView.mediaSelector.isHidden == false){ - self.contentMessageView.mediaSelector.isHidden = true - } - if(self.contentMessageView.replyBubble.isHidden == false){ - self.contentMessageView.replyBubble.isHidden = true - } - return - } - if(self.contentMessageView.mediaSelector.isHidden == false){ - self.contentMessageView.mediaSelector.isHidden = true - } - if(self.contentMessageView.replyBubble.isHidden == false){ - self.contentMessageView.replyBubble.isHidden = true - } - let result = ChatMessage.getSwiftObject(cObject: rootMessage!) - sendMessageInMessageField(rootMessage: result) - } - - func startMultiFilesUpload(_ rootMessage: ChatMessage?) -> Bool { - let fileTransfer = FileTransferDelegate() - if contentMessageView.messageView.messageText.textColor != UIColor.lightGray { - fileTransfer.text = contentMessageView.messageView.messageText.text - } else { - fileTransfer.text = "" - } - fileTransfer.uploadFileContent(forSwift: ChatConversationViewModel.sharedModel.fileContext, urlList: ChatConversationViewModel.sharedModel.mediaURLCollection, for: ChatConversationViewModel.sharedModel.chatRoom?.getCobject, rootMessage: rootMessage?.getCobject) - if fileTransfer.text.isEmpty && !contentMessageView.messageView.messageText.isFirstResponder{ - contentMessageView.messageView.messageText.textColor = UIColor.lightGray - contentMessageView.messageView.messageText.text = "Message" - contentMessageView.messageView.emojisButton.isHidden = true - } else { - contentMessageView.messageView.messageText.text = "" - contentMessageView.messageView.emojisButton.isHidden = true - } - contentMessageView.messageView.sendButton.isEnabled = false - - tableControllerSwift.refreshData(isOutgoing: true) - return true - } - - @objc class func writeFileInImagesDirectory(_ data: Data?, name: String?) { - let filePath = URL(fileURLWithPath: LinphoneManager.imagesDirectory()).appendingPathComponent(name ?? "").path - if name != nil || (name == "") { - Log.i("try to write file in \(filePath)") - } - FileManager.default.createFile( - atPath: filePath, - contents: data, - attributes: nil) - } - - func startUploadData(_ data: Data?, withType type: String?, withName name: String?, andMessage message: String?, rootMessage: ChatMessage?){ - ChatConversationViewModel.sharedModel.startUploadData(data, withType: type, withName: name, andMessage: message, rootMessage: rootMessage) - tableControllerSwift.refreshData(isOutgoing: true) - } - - func setComposingVisible(_ visible: Int, withDelay delay: CGFloat) { - print("setComposingVisiblesetComposingVisible \(ChatConversationViewModel.sharedModel.chatRoom!.composingAddresses.count)") - if visible > 0 { - let addresses = ChatConversationViewModel.sharedModel.chatRoom!.composingAddresses - var composingAddresses : String? = "" - if addresses.count == 1 { - - composingAddresses = FastAddressBook.displayName(for: addresses.first?.getCobject) - contentMessageView.isComposingTextView.text = String.localizedStringWithFormat(NSLocalizedString("%@ is writing...", comment: ""), composingAddresses!) - } else { - addresses.forEach({ addressItem in - if composingAddresses != "" { - composingAddresses = composingAddresses! + ", " - } - composingAddresses = composingAddresses! + FastAddressBook.displayName(for: addressItem.getCobject) - }) - contentMessageView.isComposingTextView.text = String.localizedStringWithFormat(NSLocalizedString("%@ are writing...", comment: ""), composingAddresses!) - } - } - if visible == 0 { - UIView.animate(withDuration: 0.3, animations: { - self.contentMessageView.isComposingView.isHidden = true - }) - } else { - UIView.animate(withDuration: 0.3, animations: { - self.contentMessageView.isComposingView.isHidden = false - }) - } - } - - func selectionMedia() { - UIView.animate(withDuration: 0.3, animations: { - self.contentMessageView.mediaSelector.isHidden = !self.contentMessageView.mediaSelector.isHidden - }) - } - - func setRecordingVisible(hidden : Bool) { - UIView.animate(withDuration: 0.3, animations: { - self.contentMessageView.recordingView.isHidden = hidden - }) - } - - func initReplyView(_ visible: Bool, message: OpaquePointer?) { - if visible { - let addresses = ChatMessage.getSwiftObject(cObject: message!).fromAddress - let composingAddresses : String? = FastAddressBook.displayName(for: addresses?.getCobject) - contentMessageView.replyLabelTextView.text = String.localizedStringWithFormat(NSLocalizedString("%@", comment: ""), composingAddresses!) - - let isIcal = ICSBubbleView.isConferenceInvitationMessage(cmessage: message!) - let content : String? = (isIcal ? ICSBubbleView.getSubjectFromContent(cmessage: message!) : ChatMessage.getSwiftObject(cObject: message!).utf8Text) - - contentMessageView.replyContentTextView.text = content - contentMessageView.replyContentForMeetingTextView.text = content - contentMessageView.backgroundReplyColor.backgroundColor = (linphone_chat_message_is_outgoing(message) != 0) ? UIColor("A").withAlphaComponent(0.2) : UIColor("D").withAlphaComponent(0.2) - - contentMessageView.replyDeleteButton.isHidden = false - contentMessageView.replyDeleteButton.onClickAction = { - self.contentMessageView.replyDeleteButton.isHidden = true - self.initReplyView(false, message: nil) - ChatConversationViewModel.sharedModel.replyURLCollection.removeAll() - ChatConversationViewModel.sharedModel.replyCollectionView.removeAll() - self.collectionViewReply.reloadData() - } - - let contentList = linphone_chat_message_get_contents(message) - - if(isIcal){ - contentMessageView.replyMeetingSchedule.image = UIImage(named: "voip_meeting_schedule") - contentMessageView.replyMeetingSchedule.isHidden = false - contentMessageView.replyContentForMeetingTextView.isHidden = false - contentMessageView.replyContentTextView.isHidden = true - contentMessageView.mediaSelectorReply.isHidden = true - contentMessageView.replyContentTextSpacing.isHidden = true - }else{ - - if(bctbx_list_size(contentList) >= 1 && content == nil){ - contentMessageView.mediaSelectorReply.isHidden = false - contentMessageView.replyContentTextSpacing.isHidden = true - ChatMessage.getSwiftObject(cObject: message!).contents.forEach({ content in - if(content.isFile){ - let indexPath = IndexPath(row: ChatConversationViewModel.sharedModel.replyCollectionView.count, section: 0) - - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - var plainFile = content.exportPlainFile() - - ChatConversationViewModel.sharedModel.replyURLCollection.append(URL(string: plainFile.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)!) - ChatConversationViewModel.sharedModel.replyCollectionView.append(ChatConversationViewModel.sharedModel.getImageFrom(content.getCobject, filePath: plainFile, forReplyBubble: true)!) - - ChatConversationViewModel.sharedModel.removeTmpFile(filePath: plainFile) - plainFile = "" - - }else{ - ChatConversationViewModel.sharedModel.replyURLCollection.append(URL(string: content.filePath!.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)!) - ChatConversationViewModel.sharedModel.replyCollectionView.append(ChatConversationViewModel.sharedModel.getImageFrom(content.getCobject, filePath: content.filePath, forReplyBubble: true)!) - } - - collectionViewReply.reloadData() - }else if(content.isText){ - contentMessageView.replyContentTextSpacing.isHidden = false - } - }) - - }else{ - contentMessageView.mediaSelectorReply.isHidden = true - } - contentMessageView.replyMeetingSchedule.isHidden = true - contentMessageView.replyContentForMeetingTextView.isHidden = true - contentMessageView.replyContentTextView.isHidden = false - - } - - } - UIView.animate(withDuration: 0.3, animations: { - self.contentMessageView.replyBubble.isHidden = !self.contentMessageView.replyBubble.isHidden - }) - } - - @objc class func getKeyFromFileType(_ fileType: String?, fileName name: String?) -> String? { - if fileType == "video" { - return "localvideo" - } else if (fileType == "image") || name?.hasSuffix("JPG") ?? false || name?.hasSuffix("PNG") ?? false || name?.hasSuffix("jpg") ?? false || name?.hasSuffix("png") ?? false { - return "localimage" - } - return "localfile" - } - - @objc class func writeMediaToGalleryFromName(_ name: String?, fileType: String?) { - ChatConversationViewModel.sharedModel.writeMediaToGalleryFromName(name, fileType: fileType) - } - - class func showFileDownloadError() { - let errView = UIAlertController( - title: NSLocalizedString("File download error", comment: ""), - message: NSLocalizedString( - """ - Error while downloading the file.\n\ - The file is probably encrypted.\n\ - Please retry to download this file after activating LIME. - """, - comment: ""), - preferredStyle: .alert) - - let defaultAction = UIAlertAction( - title: "OK", - style: .default, - handler: { action in - }) - - errView.addAction(defaultAction) - PhoneMainView.instance()!.present(errView, animated: true) - } - - - func alertAction() { - - let alertController = UIAlertController(title: VoipTexts.image_picker_view_alert_action_title, message: nil, preferredStyle: .actionSheet) - - let alert_action_camera = UIAlertAction(title: VoipTexts.image_picker_view_alert_action_camera, style: .default, handler: { (action) -> Void in - self.imageCamera() - }) - let alert_action_photo_library = UIAlertAction(title: VoipTexts.image_picker_view_alert_action_photo_library, style: .default, handler: { (action) -> Void in - self.pickPhotos() - }) - let alert_action_document = UIAlertAction(title: VoipTexts.image_picker_view_alert_action_document, style: .default, handler: { (action) -> Void in - self.openDocumentPicker() - }) - - let cancel = UIAlertAction(title: VoipTexts.cancel, style: .cancel) { (action) -> Void in - } - - - alertController.addAction(cancel) - alertController.addAction(alert_action_camera) - alertController.addAction(alert_action_photo_library) - alertController.addAction(alert_action_document) - - alertController.popoverPresentationController?.sourceView = PhoneMainView.instance().mainViewController.statusBarView - PhoneMainView.instance().mainViewController.present(alertController, animated: true) - } - - func imageCamera(){ - let imagePicker = UIImagePickerController() - imagePicker.sourceType = .camera - imagePicker.mediaTypes = ["public.image", "public.movie"] - imagePicker.modalPresentationStyle = .overFullScreen - imagePicker.delegate = self - PhoneMainView.instance().mainViewController.present(imagePicker, animated: true) - - } - - func pickPhotos() - { - if #available(iOS 14.0, *) { - var config = PHPickerConfiguration() - config.selectionLimit = 0 - let pickerViewController = PHPickerViewController(configuration: config) - pickerViewController.delegate = self - PhoneMainView.instance().mainViewController.present(pickerViewController, animated: true) - } else { - let imagePicker = UIImagePickerController() - imagePicker.sourceType = .photoLibrary - imagePicker.mediaTypes = ["public.image", "public.movie"] - imagePicker.delegate = self - PhoneMainView.instance().mainViewController.present(imagePicker, animated: true) - } - } - - func openDocumentPicker() { - let documentPicker = UIDocumentPickerViewController(documentTypes: ["public.jpeg","com.compuserve.gif","public.url","public.movie","com.apple.mapkit.map-item","com.adobe.pdf","public.png","public.image", "public.data", "public.text"], in: .import) - documentPicker.delegate = self - documentPicker.modalPresentationStyle = .overFullScreen - documentPicker.allowsMultipleSelection = true - PhoneMainView.instance().mainViewController.present(documentPicker, animated: true) - } - - func setupViews() { - contentMessageView.mediaSelector.addSubview(collectionViewMedia) - collectionViewMedia.dataSource = self - collectionViewMedia.delegate = self - collectionViewMedia.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell") - - - loadingView.backgroundColor = UIColor(red: 0.77, green: 0.77, blue: 0.77, alpha: 0.80) - contentMessageView.mediaSelector.addSubview(loadingView) - loadingView.matchParentEdges().done() - - loadingText.text = VoipTexts.operation_in_progress_wait - loadingView.addSubview(loading) - loadingView.addSubview(loadingText) - loadingText.alignParentLeft(withMargin: 10).alignParentRight(withMargin: 10).alignParentBottom(withMargin: 30).alignVerticalCenterWith(loadingView).done() - loading.square(Int(top_bar_height)).alignVerticalCenterWith(loadingView).alignParentTop(withMargin: 20).done() - - contentMessageView.mediaSelectorReply.addSubview(collectionViewReply) - collectionViewReply.dataSource = self - collectionViewReply.delegate = self - collectionViewReply.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "cellReply") - } - - func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - if(collectionView == collectionViewMedia){ - return ChatConversationViewModel.sharedModel.mediaCollectionView.count - } - return ChatConversationViewModel.sharedModel.replyCollectionView.count - } - - @objc(collectionView:cellForItemAtIndexPath:) func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { - if(collectionView == collectionViewMedia){ - let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) - let viewCell: UIView = UIView(frame: cell.contentView.frame) - cell.addSubview(viewCell) - - let deleteButton = CallControlButton(width: 22, height: 22, buttonTheme:VoipTheme.nav_color_button("reply_cancel")) - - deleteButton.onClickAction = { - ChatConversationViewModel.sharedModel.mediaCollectionView.remove(at: indexPath.row) - ChatConversationViewModel.sharedModel.mediaURLCollection.remove(at: indexPath.row) - ChatConversationViewModel.sharedModel.fileContext.remove(at: indexPath.row) - ChatConversationViewModel.sharedModel.urlFile.remove(at: indexPath.row) - ChatConversationViewModel.sharedModel.imageT.remove(at: indexPath.row) - ChatConversationViewModel.sharedModel.data.remove(at: indexPath.row) - if(ChatConversationViewModel.sharedModel.mediaCollectionView.count == 0){ - self.contentMessageView.messageView.fileContext = false - self.selectionMedia() - self.setSendButtonState() - } - self.collectionViewMedia.reloadData() - } - - let imageCell = ChatConversationViewModel.sharedModel.mediaCollectionView[indexPath.row] - var myImageView = UIImageView() - - if(FileType.init(ChatConversationViewModel.sharedModel.mediaURLCollection[indexPath.row].pathExtension)?.getGroupTypeFromFile() == FileType.file_picture_default.rawValue || FileType.init(ChatConversationViewModel.sharedModel.mediaURLCollection[indexPath.row].pathExtension)?.getGroupTypeFromFile() == FileType.file_video_default.rawValue){ - myImageView = UIImageView(image: imageCell) - }else{ - let fileNameText = ChatConversationViewModel.sharedModel.mediaURLCollection[indexPath.row].lastPathComponent - let fileName = SwiftUtil.textToImage(drawText:fileNameText, inImage:imageCell, forReplyBubble:true) - myImageView = UIImageView(image: fileName) - } - - myImageView.size(w: (viewCell.frame.width * 0.9)-2, h: (viewCell.frame.height * 0.9)-2).done() - viewCell.addSubview(myImageView) - myImageView.alignParentBottom(withMargin: 4).alignParentLeft(withMargin: 4).done() - - if(FileType.init(ChatConversationViewModel.sharedModel.mediaURLCollection[indexPath.row].pathExtension)?.getGroupTypeFromFile() == FileType.file_video_default.rawValue){ - var imagePlay = UIImage() - if #available(iOS 13.0, *) { - imagePlay = (UIImage(named: "vr_play")!.withTintColor(.white)) - } else { - imagePlay = UIImage(named: "vr_play")! - } - let myImagePlayView = UIImageView(image: imagePlay) - viewCell.addSubview(myImagePlayView) - myImagePlayView.size(w: viewCell.frame.width/4, h: viewCell.frame.height/4).done() - myImagePlayView.alignHorizontalCenterWith(viewCell).alignVerticalCenterWith(viewCell).done() - } - myImageView.contentMode = .scaleAspectFill - myImageView.clipsToBounds = true - - viewCell.addSubview(deleteButton) - deleteButton.alignParentRight().done() - - return cell - }else{ - let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellReply", for: indexPath) - let viewCell: UIView = UIView(frame: cell.contentView.frame) - cell.addSubview(viewCell) - - let imageCell = ChatConversationViewModel.sharedModel.replyCollectionView[indexPath.row] - var myImageView = UIImageView() - - if(FileType.init(ChatConversationViewModel.sharedModel.replyURLCollection[indexPath.row].pathExtension)?.getGroupTypeFromFile() == FileType.file_picture_default.rawValue || FileType.init(ChatConversationViewModel.sharedModel.replyURLCollection[indexPath.row].pathExtension)?.getGroupTypeFromFile() == FileType.file_video_default.rawValue){ - myImageView = UIImageView(image: imageCell) - }else{ - let fileNameText = ChatConversationViewModel.sharedModel.replyURLCollection[indexPath.row].lastPathComponent - let fileName = SwiftUtil.textToImage(drawText:fileNameText, inImage:imageCell, forReplyBubble:true) - myImageView = UIImageView(image: fileName) - } - - myImageView.size(w: (viewCell.frame.width), h: (viewCell.frame.height)).done() - viewCell.addSubview(myImageView) - - if(FileType.init(ChatConversationViewModel.sharedModel.replyURLCollection[indexPath.row].pathExtension)?.getGroupTypeFromFile() == FileType.file_video_default.rawValue){ - var imagePlay = UIImage() - if #available(iOS 13.0, *) { - imagePlay = (UIImage(named: "vr_play")!.withTintColor(.white)) - } else { - imagePlay = UIImage(named: "vr_play")! - } - let myImagePlayView = UIImageView(image: imagePlay) - viewCell.addSubview(myImagePlayView) - myImagePlayView.size(w: viewCell.frame.width/4, h: viewCell.frame.height/4).done() - myImagePlayView.alignHorizontalCenterWith(viewCell).alignVerticalCenterWith(viewCell).done() - } - myImageView.contentMode = .scaleAspectFill - myImageView.clipsToBounds = true - - return cell - } - } - - @available(iOS 14.0, *) - func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) { - initListMedia(sequenceCount: results.count) - - - picker.dismiss(animated: true, completion: nil) - let itemProviders = results.map(\.itemProvider) - for item in itemProviders { - if item.hasItemConformingToTypeIdentifier(UTType.image.identifier) { - ChatConversationViewModel.sharedModel.progress.append(item.loadFileRepresentation(forTypeIdentifier: UTType.image.identifier) { urlFile, error in - if(ChatConversationViewModel.sharedModel.workItem!.isCancelled){ - return - } else { - ChatConversationViewModel.sharedModel.createCollectionViewItem(urlFile: urlFile, type: "public.image") - } - }) - }else if item.hasItemConformingToTypeIdentifier(UTType.movie.identifier) { - ChatConversationViewModel.sharedModel.progress.append(item.loadFileRepresentation(forTypeIdentifier: UTType.movie.identifier) { urlFile, error in - if(ChatConversationViewModel.sharedModel.workItem!.isCancelled){ - return - } else { - ChatConversationViewModel.sharedModel.createCollectionViewItem(urlFile: urlFile, type: "public.movie") - } - }) - } - } - } - - func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { - picker.dismiss(animated: true, completion: nil) - } - - func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { - initListMedia(sequenceCount: 1) - let mediaType = info[UIImagePickerController.InfoKey.mediaType] as! String - switch mediaType { - case "public.image": - let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage - let date = Date() - let df = DateFormatter() - df.dateFormat = "yyyy-MM-dd-HHmmss" - let dateString = df.string(from: date) - - let fileUrl = URL(string: dateString + ".jpeg") - - let data = image.jpegData(compressionQuality: 1) - - ChatConversationViewModel.sharedModel.data.append(data) - if let image = UIImage(data: data!) { - ChatConversationViewModel.sharedModel.imageT.append(image) - }else{ - ChatConversationViewModel.sharedModel.imageT.append(UIImage(named: "chat_error")) - } - - ChatConversationViewModel.sharedModel.urlFile.append(fileUrl) - DispatchQueue.main.async(execute: ChatConversationViewModel.sharedModel.workItem!) - case "public.movie": - let videoUrl = info[UIImagePickerController.InfoKey.mediaURL] as! URL - - ChatConversationViewModel.sharedModel.createCollectionViewItem(urlFile: videoUrl, type: "public.movie") - default: - Log.i("Mismatched type: \(mediaType)") - } - picker.dismiss(animated: true, completion: nil) - } - - public func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) { - controller.dismiss(animated: true) - } - - - public func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) { - initListMedia(sequenceCount: urls.count) - - if(controller.documentPickerMode == .import){ - urls.forEach { url in - let imageExtension = ["png", "jpg", "jpeg", "bmp", "heic"] - let videoExtension = ["mkv", "avi", "mov", "mp4"] - if(imageExtension.contains(url.pathExtension.lowercased())){ - ChatConversationViewModel.sharedModel.createCollectionViewItem(urlFile: url, type: "public.image") - }else if(videoExtension.contains(url.pathExtension.lowercased())){ - ChatConversationViewModel.sharedModel.createCollectionViewItem(urlFile: url, type: "public.movie") - }else{ - ChatConversationViewModel.sharedModel.createCollectionViewItem(urlFile: url, type: "public.data") - } - } - } - - controller.dismiss(animated: true) - } - - public func initListMedia(sequenceCount : Int){ - if(ChatConversationViewModel.sharedModel.mediaCollectionView.count == 0 && sequenceCount >= 1){ - self.selectionMedia() - self.contentMessageView.messageView.sendButton.isEnabled = !contentMessageView.messageView.isLoading - self.contentMessageView.messageView.fileContext = true - ChatConversationViewModel.sharedModel.urlFile = [] - ChatConversationViewModel.sharedModel.imageT = [] - ChatConversationViewModel.sharedModel.data = [] - } - if(ChatConversationViewModel.sharedModel.mediaCollectionView.count > 0){ - self.contentMessageView.messageView.sendButton.isEnabled = !contentMessageView.messageView.isLoading - } - - if(sequenceCount >= 1){ - loadingView.isHidden = false - contentMessageView.messageView.isLoading = true - loading.startRotation() - - self.contentMessageView.messageView.sendButton.isEnabled = false - self.contentMessageView.messageView.pictureButton.isEnabled = false - - ChatConversationViewModel.sharedModel.mediaCount = ChatConversationViewModel.sharedModel.mediaCollectionView.count - ChatConversationViewModel.sharedModel.newMediaCount = sequenceCount - } - } - - func handlePendingTransferIfAny() { - if (pendingForwardMessage != nil) { - let message = pendingForwardMessage - pendingForwardMessage = nil - let d = UIConfirmationDialog.show( - withMessage: NSLocalizedString("Transfer this message to this conversation ?", comment: ""), - cancelMessage: nil, - confirmMessage: NSLocalizedString("TRANSFER", comment: ""), - onCancelClick: { - }, - onConfirmationClick: { - linphone_chat_message_send(linphone_chat_room_create_forward_message(ChatConversationViewModel.sharedModel.chatRoom?.getCobject, message)) - - }) - d?.forwardImage.isHidden = false - d?.setSpecialColor() - } - } - - func confirmShare(_ data: Data?, url: String?, fileName: String?) { - let sheet = DTActionSheet(title: NSLocalizedString("Select or create a conversation to share the file(s)", comment: "")) - DispatchQueue.main.async(execute: { [self] in - sheet!.addButton( - withTitle: NSLocalizedString("Send to this conversation", comment: "")) { [self] in - do{ - if contentMessageView.messageView.messageText.textColor != UIColor.lightGray { - try sendMessageInMessageField(rootMessage: ChatConversationViewModel.sharedModel.chatRoom?.createEmptyMessage()) - } - if let sUrl = url { - _ = try ChatConversationViewModel.sharedModel.sendMessage(message: sUrl, withExterlBodyUrl: nil, rootMessage: ChatConversationViewModel.sharedModel.chatRoom?.createEmptyMessage()) - } else { - try startFileUpload(data, withName: fileName, rootMessage: ChatConversationViewModel.sharedModel.chatRoom?.createEmptyMessage()) - } - }catch{ - Log.e(error.localizedDescription) - } - } - - sheet!.addCancelButton(withTitle: NSLocalizedString("Cancel", comment: ""), block: nil) - sheet!.show(in: PhoneMainView.instance().view) - }) - } - - func startFileUpload(_ data: Data?, withName name: String?, rootMessage: ChatMessage?){ - ChatConversationViewModel.sharedModel.startFileUpload(data, withName: name, rootMessage: rootMessage) - tableControllerSwift.refreshData(isOutgoing: true) - } - - @objc class func getFileUrl(_ name: String?) -> URL? { - let filePath = LinphoneManager.validFilePath(name) - return URL(fileURLWithPath: filePath!) - } - - @objc func initiateReplyView(forMessage: OpaquePointer?) { - if(contentMessageView.replyBubble.isHidden == false){ - contentMessageView.replyBubble.isHidden = true - } - ChatConversationViewModel.sharedModel.replyURLCollection.removeAll() - ChatConversationViewModel.sharedModel.replyCollectionView.removeAll() - self.collectionViewReply.reloadData() - ChatConversationViewModel.sharedModel.replyMessage = forMessage - initReplyView(true, message: forMessage) - } - - @objc class func isBasicChatRoom(_ room: OpaquePointer?) -> Bool { - if room == nil { - return true - } - - let charRoomBasic = ChatRoom.getSwiftObject(cObject: room!) - let isBasic = charRoomBasic.hasCapability(mask: Int(LinphoneChatRoomCapabilitiesBasic.rawValue)) - return isBasic - } - - func onVrStart() { - self.contentMessageView.recordingWaveImageMask.isHidden = false - contentMessageView.recordingWaveView.progress = 0.0 - contentMessageView.recordingWaveView.setProgress(contentMessageView.recordingWaveView.progress, animated: false) - self.contentMessageView.messageView.sendButton.isEnabled = true - if ChatConversationViewModel.sharedModel.isVoiceRecording { - stopVoiceRecording() - } else { - startVoiceRecording() - } - } - - @objc private func openEmojiPickerModule(sender: UIButton) { - contentMessageView.messageView.messageText.resignFirstResponder() - let viewController = EmojiPickerViewController() - viewController.delegate = self - viewController.sourceView = sender - viewController.isDismissedAfterChoosing = false - present(viewController, animated: true, completion: nil) - } - - func didGetEmoji(emoji: String) { - if contentMessageView.messageView.messageText.textColor != UIColor.lightGray { - contentMessageView.messageView.messageText.text = contentMessageView.messageView.messageText.text + emoji - } else { - contentMessageView.messageView.messageText.textColor = VoipTheme.backgroundBlackWhite.get() - contentMessageView.messageView.messageText.text = emoji - } - - } - - func startVoiceRecording() { - ChatConversationViewModel.sharedModel.startVoiceRecording() - setRecordingVisible(hidden: false) - contentMessageView.messageView.voiceRecordButton.isSelected = true - contentMessageView.recordingStopButton.isHidden = false - contentMessageView.recordingPlayButton.isHidden = true - self.contentMessageView.recordingWaveImageMask.transform = CGAffineTransform.identity - contentMessageView.recordingDurationTextView.isHidden = false - contentMessageView.recordingDurationTextView.text = ChatConversationViewModel.sharedModel.formattedDuration(Int(linphone_recorder_get_duration(ChatConversationViewModel.sharedModel.voiceRecorder?.getCobject))) - ChatConversationViewModel.sharedModel.vrRecordTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in - self.voiceRecordTimerUpdate() - } - } - - func voiceRecordTimerUpdate() { - let recorderDuration = linphone_recorder_get_duration(ChatConversationViewModel.sharedModel.voiceRecorder?.getCobject) - if recorderDuration > LinphoneManager.instance().lpConfigInt(forKey: "voice_recording_max_duration", withDefault: 59999) { - Log.i("[Chat Message Sending] Max duration for voice recording exceeded, stopping. (max = \(LinphoneManager.instance().lpConfigInt(forKey: "voice_recording_max_duration", withDefault: 59999))") - stopVoiceRecording() - } else { - contentMessageView.recordingDurationTextView.text = ChatConversationViewModel.sharedModel.formattedDuration(Int(linphone_recorder_get_duration(ChatConversationViewModel.sharedModel.voiceRecorder?.getCobject))) - - UIView.animate(withDuration: 10.0, delay: 0.0, options: [.repeat], animations: { - self.contentMessageView.recordingWaveImageMask.transform = CGAffineTransform(translationX: 98, y: 0).scaledBy(x: 0.01, y: 1) - }) - - } - } - - func stopVoiceRecording() { - ChatConversationViewModel.sharedModel.stopVoiceRecording() - if (ChatConversationViewModel.sharedModel.voiceRecorder != nil) && linphone_recorder_get_state(ChatConversationViewModel.sharedModel.voiceRecorder?.getCobject) == LinphoneRecorderRunning { - contentMessageView.recordingDurationTextView.text = ChatConversationViewModel.sharedModel.formattedDuration(Int(linphone_recorder_get_duration(ChatConversationViewModel.sharedModel.voiceRecorder?.getCobject))) - } - if LinphoneManager.instance().lpConfigBool(forKey: "voice_recording_send_right_away", withDefault: false) { - onSendClick() - } - contentMessageView.recordingStopButton.isHidden = true - contentMessageView.recordingPlayButton.isHidden = false - - contentMessageView.messageView.voiceRecordButton.isSelected = false - contentMessageView.recordingWaveImageMask.layer.removeAllAnimations() - - setSendButtonState() - - } - - func cancelVoiceRecording() { - setRecordingVisible(hidden: true) - contentMessageView.recordingStopButton.isHidden = false - contentMessageView.recordingPlayButton.isHidden = true - contentMessageView.recordingWaveImageMask.layer.removeAllAnimations() - contentMessageView.messageView.voiceRecordButton.isSelected = false - - ChatConversationViewModel.sharedModel.cancelVoiceRecordingVM() - - stopVoiceRecordPlayer() - setSendButtonState() - } - - func setSendButtonState() { - self.contentMessageView.messageView.sendButton.isEnabled = ((ChatConversationViewModel.sharedModel.isPendingVoiceRecord && linphone_recorder_get_duration(ChatConversationViewModel.sharedModel.voiceRecorder?.getCobject) > 0) || (contentMessageView.messageView.messageText.textColor != UIColor.lightGray && self.contentMessageView.messageView.messageText.text.count > 0) || ChatConversationViewModel.sharedModel.fileContext.count > 0) - } - - func onvrPlayPauseStop() { - if ChatConversationViewModel.sharedModel.isVoiceRecording { - stopVoiceRecording() - } else { - if ChatConversationViewModel.sharedModel.isPlayingVoiceRecording { - stopVoiceRecordPlayer() - } else { - playRecordedMessage() - } - } - } - - func playRecordedMessage() { - self.contentMessageView.recordingWaveImageMask.isHidden = true - self.contentMessageView.recordingPlayButton.isHidden = true - self.contentMessageView.recordingStopButton.isHidden = false - - ChatConversationViewModel.sharedModel.initSharedPlayer() - AudioPlayer.sharedModel.fileChanged.value = ChatConversationViewModel.sharedModel.voiceRecorder?.file - ChatConversationViewModel.sharedModel.startSharedPlayer(ChatConversationViewModel.sharedModel.voiceRecorder?.file) - - contentMessageView.recordingWaveView.progress = 0.0 - ChatConversationViewModel.sharedModel.isPlayingVoiceRecording = true - - AudioPlayer.sharedModel.fileChanged.observe { file in - if (file != ChatConversationViewModel.sharedModel.voiceRecorder?.file && ChatConversationViewModel.sharedModel.isPlayingVoiceRecording) { - self.stopVoiceRecordPlayer() - } - } - - contentMessageView.recordingWaveView.progress = 1.0 - UIView.animate(withDuration: TimeInterval(Double(AudioPlayer.getSharedPlayer()!.duration) / 1000.00), delay: 0.0, options: .curveLinear, animations: { - self.contentMessageView.recordingWaveView.layoutIfNeeded() - }, completion: { (finished: Bool) in - if (ChatConversationViewModel.sharedModel.isPlayingVoiceRecording) { - self.stopVoiceRecordPlayer() - } - }) - } - - func stopVoiceRecordPlayer() { - // Commented because this seemed to be what caused the breaking of the voice recording view - /* - contentMessageView.recordingView.subviews.forEach({ view in - view.removeFromSuperview() - })*/ - resetRecordingProgressBar() - self.contentMessageView.recordingWaveView.progress = 0.0 - self.contentMessageView.recordingWaveView.setProgress(self.contentMessageView.recordingWaveView.progress, animated: false) - ChatConversationViewModel.sharedModel.stopSharedPlayer() - self.contentMessageView.recordingWaveImageMask.isHidden = false - self.contentMessageView.recordingPlayButton.isHidden = false - self.contentMessageView.recordingStopButton.isHidden = true - ChatConversationViewModel.sharedModel.isPlayingVoiceRecording = false - } - - func configureMessageField() { - let isOneToOneChat = ChatConversationViewModel.sharedModel.chatRoom!.hasCapability(mask: Int(LinphoneChatRoomCapabilitiesOneToOne.rawValue)) - if isOneToOneChat { - contentMessageView.messageView.isHidden = false - if ChatConversationViewModel.sharedModel.chatRoom!.isReadOnly { - ChatConversationViewModel.sharedModel.chatRoom!.addParticipant(addr: (ChatConversationViewModel.sharedModel.chatRoom?.me?.address)!) - } - } else { - contentMessageView.messageView.isHidden = ChatConversationViewModel.sharedModel.chatRoom!.isReadOnly - } - } - - @objc class func markAsRead(_ chatRoom: OpaquePointer?) { - if ChatConversationViewModel.sharedModel.chatRoom == nil { - return - } - let chatRoomSwift = ChatRoom.getSwiftObject(cObject: chatRoom!) - chatRoomSwift.markAsRead() - PhoneMainView.instance().updateApplicationBadgeNumber() - } -} - -extension UIView { - func makeSecure(field: UITextField) { - DispatchQueue.main.async { - field.isSecureTextEntry = false - self.addSubview(field) - field.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true - field.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true - self.layer.superlayer?.addSublayer(field.layer) - field.layer.sublayers?.first?.addSublayer(self.layer) - } - } - - func changeSecure(field: UITextField, isSecure: Bool){ - field.isSecureTextEntry = isSecure - } -} diff --git a/Classes/Swift/Chat/Views/CircularProgressBarView.swift b/Classes/Swift/Chat/Views/CircularProgressBarView.swift deleted file mode 100644 index 129a7f72e..000000000 --- a/Classes/Swift/Chat/Views/CircularProgressBarView.swift +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import UIKit - -class CircularProgressBarView: UIView { - - private var circleLayer = CAShapeLayer() - private var progressLayer = CAShapeLayer() - - private var startPoint = CGFloat(-Double.pi / 2) - private var endPoint = CGFloat(3 * Double.pi / 2) - - override init(frame: CGRect) { - super.init(frame: frame) - createCircularPath() - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - func createCircularPath() { - let circularPath = UIBezierPath(arcCenter: CGPoint(x: 69, y: 69), radius: 20, startAngle: startPoint, endAngle: endPoint, clockwise: true) - circleLayer.path = circularPath.cgPath - circleLayer.fillColor = UIColor.clear.cgColor - circleLayer.lineCap = .round - circleLayer.lineWidth = 10.0 - circleLayer.strokeEnd = 1.0 - circleLayer.strokeColor = VoipTheme.backgroundWhiteBlack.get().cgColor - layer.addSublayer(circleLayer) - progressLayer.path = circularPath.cgPath - progressLayer.fillColor = VoipTheme.backgroundWhiteBlack.get().cgColor - progressLayer.lineCap = .round - progressLayer.lineWidth = 5.0 - progressLayer.strokeEnd = 0 - progressLayer.strokeColor = VoipTheme.primary_color.cgColor - layer.addSublayer(progressLayer) - } - - func progressAnimation(fromValue: Float, toValue: Float) { - let circularProgressAnimation = CABasicAnimation(keyPath: "strokeEnd") - circularProgressAnimation.duration = 0 - circularProgressAnimation.fromValue = fromValue - circularProgressAnimation.toValue = toValue - circularProgressAnimation.fillMode = .forwards - circularProgressAnimation.isRemovedOnCompletion = false - progressLayer.add(circularProgressAnimation, forKey: "progressAnim") - } -} diff --git a/Classes/Swift/Chat/Views/DownloadMessageCell.swift b/Classes/Swift/Chat/Views/DownloadMessageCell.swift deleted file mode 100644 index b574215c2..000000000 --- a/Classes/Swift/Chat/Views/DownloadMessageCell.swift +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import linphonesw - -class DownloadMessageCell: UIView { - let downloadStackView = UIStackView() - let downloadView = UIView() - var downloadImageView = UIImageView(image: UIImage(named: "file_default")) - let downloadNameLabel = StyledLabel(VoipTheme.chat_conversation_download_button) - let downloadButtonLabel = StyledLabel(VoipTheme.chat_conversation_download_button) - var circularProgressBarView = CircularProgressBarView() - let circularProgressBarLabel = StyledLabel(VoipTheme.chat_conversation_download_progress_text) - let downloadSpacing = UIView() - - var content: Content? = nil - var fromValue : Float = 0.0 - - override init(frame: CGRect) { - super.init(frame: frame) - downloadStackView.axis = .vertical - downloadStackView.distribution = .fill - downloadStackView.alignment = .center - - addSubview(downloadStackView) - downloadStackView.addArrangedSubview(downloadView) - downloadView.addSubview(downloadImageView) - downloadStackView.addArrangedSubview(downloadNameLabel) - downloadStackView.addArrangedSubview(downloadButtonLabel) - downloadStackView.addArrangedSubview(downloadSpacing) - - downloadStackView.backgroundColor = VoipTheme.backgroundWhiteBlack.get() - - downloadStackView.size(w: 138, h: 138).done() - downloadView.size(w: 138, h: 80).done() - downloadNameLabel.size(w: 130, h: 22).done() - downloadButtonLabel.size(w: 130, h: 22).done() - downloadSpacing.size(w: 138, h: 14).done() - downloadImageView.center = CGPoint(x: 69, y: 40) - - addSubview(circularProgressBarView) - circularProgressBarView.isHidden = true - circularProgressBarLabel.text = "0%" - circularProgressBarLabel.size(w: 30, h: 30).done() - circularProgressBarView.addSubview(circularProgressBarLabel) - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - func setFileType(fileName: String) { - let extensionFile = fileName.lowercased().components(separatedBy: ".").last - - if extensionFile == "pdf" { - downloadImageView.image = UIImage(named: "file_pdf_default") - } else if ["png", "jpg", "jpeg", "bmp", "heic"].contains(extensionFile ?? "") { - downloadImageView.image = UIImage(named: "file_picture_default") - } else if ["mkv", "avi", "mov", "mp4"].contains(extensionFile ?? "") { - downloadImageView.image = UIImage(named: "file_video_default") - downloadImageView.frame = CGRect(x: 0, y: 0, width: 50, height: 40) - downloadImageView.center = CGPoint(x: 69, y: 40) - } else if ["wav", "au", "m4a"].contains(extensionFile ?? "") { - downloadImageView.image = UIImage(named: "file_audio_default") - } else { - downloadImageView.image = UIImage(named: "file_default") - } - } - - func setUpCircularProgressBarView(toValue: Float) { - - circularProgressBarLabel.text = "\(Int(toValue*100))%" - circularProgressBarLabel.center = CGPoint(x: 69, y: 69) - - - circularProgressBarView.progressAnimation(fromValue: fromValue, toValue: toValue) - fromValue = toValue - } -} diff --git a/Classes/Swift/Chat/Views/DropDownCell.swift b/Classes/Swift/Chat/Views/DropDownCell.swift deleted file mode 100644 index 535313f78..000000000 --- a/Classes/Swift/Chat/Views/DropDownCell.swift +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import UIKit -import DropDown - -class MyCell: DropDownCell { - - @IBOutlet var myImageView: UIImageView! - @IBOutlet var myEmojisView: UIView! - @IBOutlet var myEmojiButton1: UIButton! - @IBOutlet var myEmojiButton2: UIButton! - @IBOutlet var myEmojiButton3: UIButton! - @IBOutlet var myEmojiButton4: UIButton! - @IBOutlet var myEmojiButton5: UIButton! - - override func awakeFromNib() { - super.awakeFromNib() - myImageView.contentMode = .scaleAspectFit - myEmojisView.isHidden = true - } - - override func setSelected(_ selected: Bool, animated: Bool) { - super.setSelected(selected, animated: animated) - - // Configure the view for the selected state - } - -} diff --git a/Classes/Swift/Chat/Views/DropDownCell.xib b/Classes/Swift/Chat/Views/DropDownCell.xib deleted file mode 100644 index f8b5681c1..000000000 --- a/Classes/Swift/Chat/Views/DropDownCell.xib +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Classes/Swift/Chat/Views/Fragments/ReactionCell.swift b/Classes/Swift/Chat/Views/Fragments/ReactionCell.swift deleted file mode 100644 index b24c3b23e..000000000 --- a/Classes/Swift/Chat/Views/Fragments/ReactionCell.swift +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import SnapKit -import linphonesw - -class ReactionCell: UITableViewCell { - - // Layout Constants - static let cell_height = 50.0 - let avatar_left_margin = 15.0 - let texts_left_margin = 15.0 - let avatar_size = 35.0 - - let avatar = Avatar(color:VoipTheme.primaryTextColor, textStyle: VoipTheme.call_generated_avatar_small) - let displayName = StyledLabel(VoipTheme.conference_participant_name_font) - let displayEmoji = StyledLabel(VoipTheme.conference_participant_name_font) - - - var owningParticpantsListView : ParticipantsListView? = nil - - var reactionData: ChatMessageReaction? = nil { - didSet { - if let data = reactionData { - avatar.fillFromAddress(address: data.fromAddress!) - displayName.text = data.fromAddress!.addressBookEnhancedDisplayName() - displayEmoji.text = data.body - } - } - } - - override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { - super.init(style: style, reuseIdentifier: reuseIdentifier) - contentView.height(ReactionCell.cell_height).matchParentSideBorders().done() - - addSubview(avatar) - avatar.size(w: avatar_size, h: avatar_size).centerY().alignParentLeft(withMargin: avatar_left_margin).done() - - // Name Address - - let nameAddress = UIStackView() - nameAddress.addArrangedSubview(displayName) - nameAddress.axis = .vertical - addSubview(nameAddress) - nameAddress.toRightOf(avatar,withLeftMargin:texts_left_margin).centerY().done() - - - addSubview(displayEmoji) - displayEmoji.alignParentRight(withMargin: avatar_left_margin*2).centerY().done() - - contentView.backgroundColor = .clear - backgroundColor = .clear - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} diff --git a/Classes/Swift/Chat/Views/Fragments/SheetViewController.swift b/Classes/Swift/Chat/Views/Fragments/SheetViewController.swift deleted file mode 100644 index 4d9e625f4..000000000 --- a/Classes/Swift/Chat/Views/Fragments/SheetViewController.swift +++ /dev/null @@ -1,394 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import UIKit -import Foundation -import linphonesw - -final class SheetViewController: UIViewController { - - private let collectionHeader = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout.init()) - private let collectionPage = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout.init()) - private let collectionHeaderIdentifier = "COLLECTION_HEADER_IDENTIFIER" - private let collectionPageIdentifier = "COLLECTION_PAGE_IDENTIFIER" - private var items = [UIViewController]() - private var titles = [String]() - private var colorHeaderActive = UIColor.blue - private var colorHeaderInActive = UIColor.gray - private var colorHeaderBackground = UIColor.white - private var currentPosition = 0 - private var tabStyle = SlidingTabStyle.fixed - private let heightHeader = 40 - var chatMessage : ChatMessage - var chatMessageDelegate: ChatMessageDelegate? = nil - - /// Put your custom argument labels here, not inside the `required init?` - init(chatMessageInit: ChatMessage) { - self.chatMessage = chatMessageInit - super.init(nibName: nil, bundle: nil) - } - - /// This is in case the View Controller is loaded from the Storyboard - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func viewDidDisappear(_ animated: Bool) { - super.viewDidDisappear(animated) - if chatMessageDelegate != nil { - chatMessage.removeDelegate(delegate: chatMessageDelegate!) - } - } - - override func viewDidLoad() { - super.viewDidLoad() - setupUI() - addMessageDelegate() - } - - func reloadUI() { - items.removeAll() - titles.removeAll() - setupUI() - } - - func addMessageDelegate(){ - chatMessageDelegate = ChatMessageDelegateStub( - onNewMessageReaction: { (message: ChatMessage, messageReaction: ChatMessageReaction) -> Void in - self.reloadUI() - }, - onReactionRemoved: { (message: ChatMessage, address: Address) -> Void in - self.reloadUI() - } - ) - chatMessage.addDelegate(delegate: chatMessageDelegate!) - } - - private func setupUI(){ - // view - view.backgroundColor = VoipTheme.voipBackgroundBWColor.get() - - navigationController?.navigationBar.barTintColor = .orange - navigationController?.navigationBar.isTranslucent = false - navigationController?.navigationBar.shadowImage = UIImage() - navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white] - navigationController?.navigationBar.barStyle = .black - - if chatMessage.reactions.count <= 1 { - addItem(item: SimpleItemViewController(chatMessageReactionsListInit: chatMessage.reactions), title: "\(chatMessage.reactions.count) REACTION") - } else { - addItem(item: SimpleItemViewController(chatMessageReactionsListInit: chatMessage.reactions), title: "\(chatMessage.reactions.count) REACTIONS") - } - - let reaction1Count = chatMessage.reactions.filter({$0.body == "❤️"}).count - let reaction2Count = chatMessage.reactions.filter({$0.body == "👍"}).count - let reaction3Count = chatMessage.reactions.filter({$0.body == "😂"}).count - let reaction4Count = chatMessage.reactions.filter({$0.body == "😮"}).count - let reaction5Count = chatMessage.reactions.filter({$0.body == "😢"}).count - - if reaction1Count > 0 { - addItem(item: SimpleItemViewController(chatMessageReactionsListInit: chatMessage.reactions.filter({$0.body == "❤️"})), title: "❤️ \(reaction1Count)") - } - if reaction2Count > 0 { - addItem(item: SimpleItemViewController(chatMessageReactionsListInit: chatMessage.reactions.filter({$0.body == "👍"})), title: "👍 \(reaction2Count)") - } - if reaction3Count > 0 { - addItem(item: SimpleItemViewController(chatMessageReactionsListInit: chatMessage.reactions.filter({$0.body == "😂"})), title: "😂 \(reaction3Count)") - } - if reaction4Count > 0 { - addItem(item: SimpleItemViewController(chatMessageReactionsListInit: chatMessage.reactions.filter({$0.body == "😮"})), title: "😮 \(reaction4Count)") - } - if reaction5Count > 0 { - addItem(item: SimpleItemViewController(chatMessageReactionsListInit: chatMessage.reactions.filter({$0.body == "😢"})), title: "😢 \(reaction5Count)") - } - - setHeaderActiveColor(color: .orange) // default blue - setStyle(style: .fixed) // default fixed - build() - } - - func addItem(item: UIViewController, title: String){ - items.append(item) - titles.append(title) - } - - func setHeaderBackgroundColor(color: UIColor){ - colorHeaderBackground = color - } - - func setHeaderActiveColor(color: UIColor){ - colorHeaderActive = color - } - - func setHeaderInActiveColor(color: UIColor){ - colorHeaderInActive = color - } - - func setCurrentPosition(position: Int){ - currentPosition = position - let path = IndexPath(item: currentPosition, section: 0) - - DispatchQueue.main.async { - if self.tabStyle == .flexible { - self.collectionHeader.scrollToItem(at: path, at: .centeredHorizontally, animated: true) - } - - self.collectionHeader.reloadData() - } - - DispatchQueue.main.async { - self.collectionPage.isPagingEnabled = false - self.collectionPage.scrollToItem( - at: path, - at: .centeredHorizontally, - animated: true - ) - self.collectionPage.isPagingEnabled = true - } - } - - func setStyle(style: SlidingTabStyle){ - tabStyle = style - } - - func build(){ - // view - view.addSubview(collectionHeader) - view.addSubview(collectionPage) - - // collectionHeader - collectionHeader.translatesAutoresizingMaskIntoConstraints = false - collectionHeader.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20).isActive = true - collectionHeader.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true - collectionHeader.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true - collectionHeader.heightAnchor.constraint(equalToConstant: CGFloat(heightHeader)).isActive = true - (collectionHeader.collectionViewLayout as? UICollectionViewFlowLayout)?.scrollDirection = .horizontal - collectionHeader.showsHorizontalScrollIndicator = false - collectionHeader.backgroundColor = VoipTheme.voipBackgroundBWColor.get() - collectionHeader.register(HeaderCell.self, forCellWithReuseIdentifier: collectionHeaderIdentifier) - collectionHeader.delegate = self - collectionHeader.dataSource = self - collectionHeader.reloadData() - - // collectionPage - collectionPage.translatesAutoresizingMaskIntoConstraints = false - collectionPage.topAnchor.constraint(equalTo: collectionHeader.bottomAnchor).isActive = true - collectionPage.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true - collectionPage.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true - collectionPage.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true - collectionPage.backgroundColor = VoipTheme.voipBackgroundBWColor.get() - collectionPage.showsHorizontalScrollIndicator = false - (collectionPage.collectionViewLayout as? UICollectionViewFlowLayout)?.scrollDirection = .horizontal - collectionPage.isPagingEnabled = true - collectionPage.register(UICollectionViewCell.self, forCellWithReuseIdentifier: collectionPageIdentifier) - collectionPage.delegate = self - collectionPage.dataSource = self - collectionPage.reloadData() - } - - private class HeaderCell: UICollectionViewCell { - - private let label = UILabel() - private let indicator = UIView() - - var text: String! { - didSet { - label.text = text - if label.text!.contains("REACTIONS") { - label.font = UIFont.boldSystemFont(ofSize: 8) - } else { - label.font = UIFont.boldSystemFont(ofSize: 14) - } - } - } - - override init(frame: CGRect) { - super.init(frame: frame) - setupUI() - } - - required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - func select(didSelect: Bool, activeColor: UIColor, inActiveColor: UIColor){ - indicator.backgroundColor = activeColor - - if didSelect { - label.textColor = activeColor - indicator.isHidden = false - }else{ - label.textColor = inActiveColor - indicator.isHidden = true - } - } - - private func setupUI(){ - // view - self.addSubview(label) - self.addSubview(indicator) - - // label - label.translatesAutoresizingMaskIntoConstraints = false - label.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true - label.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true - label.font = UIFont.boldSystemFont(ofSize: 14) - - // indicator - indicator.translatesAutoresizingMaskIntoConstraints = false - indicator.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true - indicator.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true - indicator.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true - indicator.heightAnchor.constraint(equalToConstant: 2).isActive = true - } - - } - -} - -extension SheetViewController: UICollectionViewDelegate{ - func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - setCurrentPosition(position: indexPath.row) - } - - func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { - if scrollView == collectionPage{ - let currentIndex = Int(self.collectionPage.contentOffset.x / collectionPage.frame.size.width) - setCurrentPosition(position: currentIndex) - } - } -} - -extension SheetViewController: UICollectionViewDataSource{ - func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - if collectionView == collectionHeader { - return titles.count - } - - return items.count - } - - func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { - if collectionView == collectionHeader { - let cell = collectionView.dequeueReusableCell(withReuseIdentifier: collectionHeaderIdentifier, for: indexPath) as! HeaderCell - cell.text = titles[indexPath.row] - - var didSelect = false - - if currentPosition == indexPath.row { - didSelect = true - } - - cell.select(didSelect: didSelect, activeColor: colorHeaderActive, inActiveColor: colorHeaderInActive) - - return cell - } - - let cell = collectionView.dequeueReusableCell(withReuseIdentifier: collectionPageIdentifier, for: indexPath) - let vc = items[indexPath.row] - - cell.addSubview(vc.view) - - vc.view.translatesAutoresizingMaskIntoConstraints = false - vc.view.topAnchor.constraint(equalTo: cell.topAnchor, constant: 28).isActive = true - vc.view.leadingAnchor.constraint(equalTo: cell.leadingAnchor).isActive = true - vc.view.trailingAnchor.constraint(equalTo: cell.trailingAnchor).isActive = true - vc.view.bottomAnchor.constraint(equalTo: cell.bottomAnchor).isActive = true - - return cell - } -} - -extension SheetViewController: UICollectionViewDelegateFlowLayout{ - func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { - if collectionView == collectionHeader { - if tabStyle == .fixed { - let spacer = CGFloat(titles.count) - return CGSize(width: view.frame.width / spacer, height: CGFloat(heightHeader)) - }else{ - return CGSize(width: view.frame.width * 20 / 100, height: CGFloat(heightHeader)) - } - } - - return CGSize(width: view.frame.width, height: view.frame.height) - } - - func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { - if collectionView == collectionHeader { - return 0 - } - - return 0 - } -} - -enum SlidingTabStyle: String { - case fixed - case flexible -} - -class SimpleItemViewController: UIViewController, UITableViewDataSource { - - let reactionsListTableView = UITableView() - var chatMessageReactionsList : [ChatMessageReaction] = [] - - init(chatMessageReactionsListInit: [ChatMessageReaction]) { - self.chatMessageReactionsList = chatMessageReactionsListInit - super.init(nibName: nil, bundle: nil) - } - - /// This is in case the View Controller is loaded from the Storyboard - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - - override func viewDidLoad() { - super.viewDidLoad() - setupUI() - } - - private func setupUI(){ - // view - view.backgroundColor = VoipTheme.voipBackgroundBWColor.get() - - // ParticipantsList - view.addSubview(reactionsListTableView) - reactionsListTableView.alignParentTop(withMargin: 10).alignParentBottom().alignParentLeft().alignParentRight().done() - reactionsListTableView.dataSource = self - reactionsListTableView.register(ReactionCell.self, forCellReuseIdentifier: "ReactionCell") - reactionsListTableView.allowsSelection = false - if #available(iOS 15.0, *) { - reactionsListTableView.allowsFocus = false - } - reactionsListTableView.separatorStyle = .singleLine - reactionsListTableView.separatorColor = .white - } - - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return chatMessageReactionsList.count - } - - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell:ReactionCell = tableView.dequeueReusableCell(withIdentifier: "ReactionCell") as! ReactionCell - cell.selectionStyle = .none - cell.reactionData = chatMessageReactionsList[indexPath.row] - return cell - } -} diff --git a/Classes/Swift/Chat/Views/MessageView.swift b/Classes/Swift/Chat/Views/MessageView.swift deleted file mode 100644 index ae0106d87..000000000 --- a/Classes/Swift/Chat/Views/MessageView.swift +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import linphonesw - - -class MessageView: UIView, UITextViewDelegate { - - let side_buttons_margin = 10 - - var action1 : (() -> Void)? = nil - var action2 : (() -> Void)? = nil - var action3 : (() -> Void)? = nil - - let pictureButton = CallControlButton(buttonTheme:VoipTheme.nav_button("new_chat_attachment_default")) - let voiceRecordButton = CallControlButton(buttonTheme:VoipTheme.nav_button("new_vr_off")) - let sendButton = CallControlButton(buttonTheme:VoipTheme.nav_button("new_chat_send_default")) - let emojisButton = CallControlButton(buttonTheme:VoipTheme.nav_button("emoji")) - let messageTextView = UIView() - let messageWithEmojiView = UIStackView() - let messageText = UITextView() - let ephemeralIndicator = UIImageView(image: UIImage(named: "ephemeral_messages_color_A.png")) - var fileContext = false - var isComposing = false - var isLoading = false - var lastNumLines = 0.0 - - override init(frame: CGRect) { - super.init(frame: frame) - setupView() - } - - required init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - setupView() - } - - private func setupView() { - backgroundColor = VoipTheme.voipToolbarBackgroundColor.get() - - addSubview(pictureButton) - pictureButton.alignParentLeft(withMargin: side_buttons_margin).matchParentHeight().done() - - addSubview(voiceRecordButton) - voiceRecordButton.toRightOf(pictureButton, withLeftMargin: -8).matchParentHeight().done() - voiceRecordButton.onClickAction = action3 - - addSubview(ephemeralIndicator) - ephemeralIndicator.alignParentRight(withMargin: 4).alignParentTop(withMargin: 4).size(w: 9, h: 10).done() - ephemeralIndicator.isHidden = true - - addSubview(sendButton) - sendButton.alignParentRight(withMargin: side_buttons_margin).matchParentHeight().done() - sendButton.isEnabled = false - sendButton.onClickAction = action2 - - addSubview(messageTextView) - messageTextView.toRightOf(voiceRecordButton, withLeftMargin: -8).toLeftOf(sendButton, withRightMargin: -8).matchParentHeight().done() - - messageTextView.addSubview(messageWithEmojiView) - messageWithEmojiView.matchParentDimmensions(insetedByDx: 10).done() - messageWithEmojiView.backgroundColor = VoipTheme.backgroundWhiteBlack.get() - - messageWithEmojiView.addArrangedSubview(messageText) - messageText.matchParentHeight().alignParentLeft().alignParentRight(withMargin: 40).done() - messageText.font = UIFont.systemFont(ofSize: 18) - messageText.delegate = self - messageText.textColor = UIColor.lightGray - messageText.text = "Message" - messageText.inputAccessoryView = UIView() - messageWithEmojiView.addArrangedSubview(emojisButton) - emojisButton.alignParentRight().matchParentHeight().done() - - emojisButton.isHidden = true - - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - self.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get() - self.messageWithEmojiView.backgroundColor = VoipTheme.backgroundWhiteBlack.get() - if self.messageText.textColor != UIColor.lightGray { - self.messageText.textColor = VoipTheme.backgroundBlackWhite.get() - } - } - } - - func textViewDidChangeSelection(_ textView: UITextView) { - if messageText.textColor != UIColor.lightGray { - let chatRoom = ChatRoom.getSwiftObject(cObject: PhoneMainView.instance().currentRoom) - if ((messageText.text.isEmpty && !fileContext) || isLoading) { - sendButton.isEnabled = false - NotificationCenter.default.post(name: Notification.Name("LinphoneResetTextViewSize"), object: self) - lastNumLines = 0 - } else { - if (messageText.text.trimmingCharacters(in: .whitespacesAndNewlines).unicodeScalars.first?.properties.isEmojiPresentation == true){ - var onlyEmojis = true - messageText.text.trimmingCharacters(in: .whitespacesAndNewlines).unicodeScalars.forEach { emoji in - if !emoji.properties.isEmojiPresentation && !emoji.properties.isWhitespace{ - onlyEmojis = false - } - } - } - if !isComposing { - chatRoom.compose() - let timer = Timer.scheduledTimer(withTimeInterval: 10.0, repeats: false) { timer in - self.isComposing = false - } - } - } - isComposing = true - - sendButton.isEnabled = true - - let numLines = (messageText.contentSize.height / messageText.font!.lineHeight) - if(Int(numLines) != Int(lastNumLines)){ - NotificationCenter.default.post(name: Notification.Name("LinphoneTextViewSize"), object: self) - } - lastNumLines = numLines - } - } - - func textViewDidBeginEditing(_ textView: UITextView) { - if messageText.textColor == UIColor.lightGray { - messageText.text = nil - messageText.textColor = VoipTheme.backgroundBlackWhite.get() - } - } - - func textViewDidEndEditing(_ textView: UITextView) { - if messageText.text.isEmpty { - messageText.textColor = UIColor.lightGray - messageText.text = "Message" - } - } -} - - -extension UIView { - func setWidth(_ w:CGFloat, animateTime:TimeInterval?=nil) { - if let c = self.constraints.first(where: { $0.firstAttribute == .width && $0.relation == .equal }) { - c.constant = CGFloat(w) - - if let animateTime = animateTime { - UIView.animate(withDuration: animateTime, animations:{ - self.layoutIfNeeded() - }) - } - else { - self.layoutIfNeeded() - } - } - } -} diff --git a/Classes/Swift/Chat/Views/MultilineMessageCell.swift b/Classes/Swift/Chat/Views/MultilineMessageCell.swift deleted file mode 100644 index 0d9c5af06..000000000 --- a/Classes/Swift/Chat/Views/MultilineMessageCell.swift +++ /dev/null @@ -1,2477 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import UIKit -import Foundation -import linphonesw -import SwipeCellKit - -class MultilineMessageCell: SwipeCollectionViewCell, UICollectionViewDataSource, UICollectionViewDelegate { - static let reuseId = "MultilineMessageCellReuseId" - - var label: UILabel = UILabel(frame: .zero) - var eventMessageView: UIView = UIView(frame: .zero) - var preContentViewBubble: UIView = UIView(frame: .zero) - var contentViewBubble: UIView = UIView(frame: .zero) - var contentMediaViewBubble: UIView = UIView(frame: .zero) - var contentBubble: UIView = UIView(frame: .zero) - var bubble: UIView = UIView(frame: .zero) - var bubbleReaction: UIView = UIView(frame: .zero) - var imageUser = UIImageView() - var contactDateLabel = StyledLabel(VoipTheme.chat_conversation_forward_label) - var chatRead = UIImageView(image: UIImage(named: "chat_delivered.png")) - - var labelInset = UIEdgeInsets(top: 10, left: 10, bottom: -10, right: -10) - - var constraintEventMesssage : [NSLayoutConstraint] = [] - var constraintEventMesssageLabel : [NSLayoutConstraint] = [] - var constraintBubble : [NSLayoutConstraint] = [] - var constraintLeadingBubble : NSLayoutConstraint? = nil - var constraintTrailingBubble : NSLayoutConstraint? = nil - var constraintDateLeadingBubble : NSLayoutConstraint? = nil - var constraintDateTrailingBubble : NSLayoutConstraint? = nil - var constraintDateBubble : NSLayoutConstraint? = nil - var constraintDateBubbleHidden : NSLayoutConstraint? = nil - var preContentViewBubbleConstraints : [NSLayoutConstraint] = [] - var preContentViewBubbleConstraintsHidden : [NSLayoutConstraint] = [] - var contentViewBubbleConstraints : [NSLayoutConstraint] = [] - var contentMediaViewBubbleConstraints : [NSLayoutConstraint] = [] - var forwardConstraints : [NSLayoutConstraint] = [] - var replyConstraints : [NSLayoutConstraint] = [] - var labelConstraints: [NSLayoutConstraint] = [] - var labelTopConstraints: [NSLayoutConstraint] = [] - var labelHiddenConstraints: [NSLayoutConstraint] = [] - var imagesGridConstraints : [NSLayoutConstraint] = [] - var imagesGridConstraintsWithRecording : [NSLayoutConstraint] = [] - var imageConstraints: [NSLayoutConstraint] = [] - var videoConstraints: [NSLayoutConstraint] = [] - var playButtonConstraints: [NSLayoutConstraint] = [] - var progressBarVideoConstraints: [NSLayoutConstraint] = [] - var progressBarImageConstraints: [NSLayoutConstraint] = [] - var recordingConstraints: [NSLayoutConstraint] = [] - var recordingConstraintsWithMediaGrid: [NSLayoutConstraint] = [] - var recordingWaveConstraints: [NSLayoutConstraint] = [] - var recordingWaveConstraintsWithMediaGrid: [NSLayoutConstraint] = [] - var meetingConstraints: [NSLayoutConstraint] = [] - var constraintGridWithTextLeading : NSLayoutConstraint? = nil - var constraintGridWithTextTrailing : NSLayoutConstraint? = nil - - var eventMessageLineView: UIView = UIView(frame: .zero) - var eventMessageLabelView: UIView = UIView(frame: .zero) - var eventMessageLabel = StyledLabel(VoipTheme.chat_conversation_forward_label) - - var forwardView = UIView() - var forwardIcon = UIImageView(image: UIImage(named: "menu_forward_default")) - var forwardLabel = StyledLabel(VoipTheme.chat_conversation_black_text) - - var replyView = UIView() - var replyIcon = UIImageView(image: UIImage(named: "menu_reply_default")) - var replyLabel = StyledLabel(VoipTheme.chat_conversation_black_text) - var replyContent = UIView() - var replyColorContent = UIView() - var replyLabelContent = StyledLabel(VoipTheme.chat_conversation_forward_label) - var stackViewReply = UIStackView() - var replyLabelTextView = StyledLabel(VoipTheme.chat_conversation_reply_label) - var replyLabelContentTextSpacing = UIView() - var replyContentTextView = StyledLabel(VoipTheme.chat_conversation_reply_content) - var replyContentTextSpacing = UIView() - var replyContentForMeetingTextView = StyledLabel(VoipTheme.chat_conversation_reply_content) - var replyContentForMeetingSpacing = UIView() - var replyMeetingSchedule = UIImageView() - var mediaSelectorReply = UIView() - - var collectionViewReply: UICollectionView = { - let collection_view_reply_height = 60.0 - let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() - layout.itemSize = CGSize(width: collection_view_reply_height, height: collection_view_reply_height) - - layout.scrollDirection = .horizontal - layout.minimumLineSpacing = 4 - layout.minimumInteritemSpacing = 4 - - let collectionViewReply = UICollectionView(frame: .zero, collectionViewLayout: layout) - collectionViewReply.translatesAutoresizingMaskIntoConstraints = false - collectionViewReply.backgroundColor = .clear - return collectionViewReply - }() - var collectionViewImagesGrid: DynamicHeightCollectionView = { - let collection_view_reply_height = 138.0 - let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() - layout.itemSize = CGSize(width: collection_view_reply_height, height: collection_view_reply_height) - layout.scrollDirection = .vertical - layout.minimumLineSpacing = 4 - layout.minimumInteritemSpacing = 4 - - let collectionViewImagesGrid = DynamicHeightCollectionView(frame: .zero, collectionViewLayout: layout) - collectionViewImagesGrid.translatesAutoresizingMaskIntoConstraints = false - collectionViewImagesGrid.backgroundColor = .clear - return collectionViewImagesGrid - }() - - var replyCollectionView : [UIImage] = [] - var replyContentCollection : [Content] = [] - - var imagesGridCollectionView : [UIImage?] = [] - var downloadContentCollection: [DownloadMessageCell?] = [] - var uploadContentCollection: [UploadMessageCell?] = [] - - var imageViewBubble = UIImageView(image: UIImage(named: "chat_error")) - var imageVideoViewBubble = UIImageView(image: UIImage(named: "file_video_default")) - var imagePlayViewBubble = UIImageView(image: UIImage(named: "vr_play")) - - var meetingView = UIView() - - var recordingView = UIView() - - var ephemeralIcon = UIImageView(image: UIImage(named: "ephemeral_messages_color_A.png")) - var ephemeralTimerLabel = StyledLabel(VoipTheme.chat_conversation_ephemeral_timer) - var ephemeralTimer : Timer? = nil - - - var isPlayingVoiceRecording = false - - var eventMessage: EventLog? - var chatMessage: ChatMessage? - var chatMessageDelegate: ChatMessageDelegate? = nil - - var indexTransferProgress: Int = -1 - var indexUploadTransferProgress: Int = -1 - - var selfIndexMessage: Int = -1 - - var deleteItemCheckBox = StyledCheckBox() - - var matches : [NSTextCheckingResult] = [] - - var circularProgressBarVideoView = CircularProgressBarView() - var circularProgressBarImageView = CircularProgressBarView() - var circularProgressBarVideoLabel = StyledLabel(VoipTheme.chat_conversation_download_progress_text) - var circularProgressBarImageLabel = StyledLabel(VoipTheme.chat_conversation_download_progress_text) - var fromValue : Float = 0.0 - - var messageWithRecording = false - - var stackViewReactions = UIStackView() - var stackViewReactionsItem1 = UILabel() - var stackViewReactionsItem2 = UILabel() - var stackViewReactionsItem3 = UILabel() - var stackViewReactionsItem4 = UILabel() - var stackViewReactionsItem5 = UILabel() - let newStackViewReactionsItem = UILabel() - var stackViewReactionsCounter = UILabel() - - override init(frame: CGRect) { - super.init(frame: frame) - initCell() - } - - func initCell(){ - //CheckBox for select item to delete - contentView.addSubview(deleteItemCheckBox) - deleteItemCheckBox.isHidden = true - - //Event Message - contentView.addSubview(eventMessageView) - constraintEventMesssage = [ - eventMessageView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0), - eventMessageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 0), - eventMessageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 0), - eventMessageView.trailingAnchor.constraint(equalTo: deleteItemCheckBox.leadingAnchor, constant: 0) - ] - eventMessageView.height(40).done() - - eventMessageView.addSubview(eventMessageLineView) - eventMessageLineView.height(1).alignParentLeft().alignParentRight().matchCenterYOf(view: eventMessageView).done() - - eventMessageView.addSubview(eventMessageLabelView) - eventMessageLabelView.translatesAutoresizingMaskIntoConstraints = false - eventMessageLabelView.backgroundColor = VoipTheme.backgroundWhiteBlack.get() - - eventMessageLabelView.addSubview(eventMessageLabel) - eventMessageLabel.text = "" - eventMessageLabel.height(40).matchCenterYOf(view: eventMessageView).matchCenterXOf(view: eventMessageView).done() - constraintEventMesssageLabel = [ - eventMessageLabel.topAnchor.constraint(equalTo: eventMessageLabelView.topAnchor, constant: 0), - eventMessageLabel.bottomAnchor.constraint(equalTo: eventMessageLabelView.bottomAnchor, constant: 0), - eventMessageLabel.leadingAnchor.constraint(equalTo: eventMessageLabelView.leadingAnchor, constant: 6), - eventMessageLabel.trailingAnchor.constraint(equalTo: eventMessageLabelView.trailingAnchor, constant: -6) - ] - - eventMessageView.isHidden = true - - //Message - contentView.addSubview(contactDateLabel) - - constraintDateBubble = contactDateLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 4) - constraintDateBubbleHidden = contactDateLabel.topAnchor.constraint(equalTo: contentView.topAnchor) - constraintDateLeadingBubble = contactDateLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 40) - constraintDateTrailingBubble = contactDateLabel.trailingAnchor.constraint(equalTo: deleteItemCheckBox.leadingAnchor, constant: -22) - constraintDateBubble!.isActive = true - contactDateLabel.isHidden = true - - contentView.addSubview(contentBubble) - contentBubble.translatesAutoresizingMaskIntoConstraints = false - constraintBubble = [ - contentBubble.topAnchor.constraint(equalTo: contactDateLabel.bottomAnchor, constant: 0), - contentBubble.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 0) - ] - constraintLeadingBubble = contentBubble.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 40) - constraintTrailingBubble = contentBubble.trailingAnchor.constraint(equalTo: deleteItemCheckBox.leadingAnchor, constant: -22) - - NSLayoutConstraint.activate(constraintBubble) - constraintLeadingBubble!.isActive = true - - contentBubble.addSubview(imageUser) - imageUser.topAnchor.constraint(equalTo: contactDateLabel.bottomAnchor).isActive = true - imageUser.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 6).isActive = true - imageUser.layer.cornerRadius = 15.0 - imageUser.size(w: 30, h: 30).done() - - contentBubble.addSubview(bubble) - bubble.translatesAutoresizingMaskIntoConstraints = false - bubble.topAnchor.constraint(equalTo: contactDateLabel.bottomAnchor).isActive = true - bubble.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true - bubble.leadingAnchor.constraint(equalTo: contentBubble.leadingAnchor).isActive = true - bubble.trailingAnchor.constraint(equalTo: contentBubble.trailingAnchor).isActive = true - bubble.layer.cornerRadius = 10.0 - - contentView.addSubview(bubbleReaction) - bubbleReaction.translatesAutoresizingMaskIntoConstraints = false - bubbleReaction.topAnchor.constraint(equalTo: bubble.bottomAnchor, constant: -10).isActive = true - bubbleReaction.layer.cornerRadius = 8.0 - bubbleReaction.layer.borderWidth = 0.5 - bubbleReaction.layer.borderColor = VoipTheme.backgroundWhiteBlack.get().cgColor - bubbleReaction.isHidden = true - - bubbleReaction.addSubview(stackViewReactions) - stackViewReactions.axis = .horizontal - stackViewReactions.distribution = .fill - stackViewReactions.alignment = .center - stackViewReactions.height(16).done() - - stackViewReactions.topAnchor.constraint(equalTo: bubbleReaction.topAnchor, constant: 4).isActive = true - stackViewReactions.bottomAnchor.constraint(equalTo: bubbleReaction.bottomAnchor, constant: -4).isActive = true - stackViewReactions.leadingAnchor.constraint(equalTo: bubbleReaction.leadingAnchor, constant: 4).isActive = true - stackViewReactions.trailingAnchor.constraint(equalTo: bubbleReaction.trailingAnchor, constant: -4).isActive = true - - stackViewReactionsItem1.text = "❤️" - stackViewReactionsItem1.font = UIFont.systemFont(ofSize: 12.0) - stackViewReactionsItem1.isHidden = true - stackViewReactionsItem2.text = "👍" - stackViewReactionsItem2.font = UIFont.systemFont(ofSize: 12.0) - stackViewReactionsItem2.isHidden = true - stackViewReactionsItem3.text = "😂" - stackViewReactionsItem3.font = UIFont.systemFont(ofSize: 12.0) - stackViewReactionsItem3.isHidden = true - stackViewReactionsItem4.text = "😮" - stackViewReactionsItem4.font = UIFont.systemFont(ofSize: 12.0) - stackViewReactionsItem4.isHidden = true - stackViewReactionsItem5.text = "😢" - stackViewReactionsItem5.font = UIFont.systemFont(ofSize: 12.0) - stackViewReactionsItem5.isHidden = true - newStackViewReactionsItem.text = "" - newStackViewReactionsItem.font = UIFont.systemFont(ofSize: 12.0) - newStackViewReactionsItem.isHidden = true - stackViewReactionsCounter.text = "0" - stackViewReactionsCounter.font = UIFont.systemFont(ofSize: 12.0) - stackViewReactionsCounter.textColor = .black - stackViewReactionsCounter.isHidden = true - - stackViewReactions.addArrangedSubview(stackViewReactionsItem1) - stackViewReactions.addArrangedSubview(stackViewReactionsItem2) - stackViewReactions.addArrangedSubview(stackViewReactionsItem3) - stackViewReactions.addArrangedSubview(stackViewReactionsItem4) - stackViewReactions.addArrangedSubview(stackViewReactionsItem5) - stackViewReactions.addArrangedSubview(newStackViewReactionsItem) - stackViewReactions.addArrangedSubview(stackViewReactionsCounter) - - contentBubble.addSubview(chatRead) - chatRead.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -2).isActive = true - chatRead.trailingAnchor.constraint(equalTo: deleteItemCheckBox.leadingAnchor, constant: -8).isActive = true - chatRead.size(w: 10, h: 10).done() - chatRead.isHidden = true - - //PreContentViewBubble - bubble.addSubview(preContentViewBubble) - preContentViewBubble.translatesAutoresizingMaskIntoConstraints = false - preContentViewBubbleConstraints = [ - preContentViewBubble.topAnchor.constraint(equalTo: contentBubble.topAnchor), - preContentViewBubble.leadingAnchor.constraint(equalTo: contentBubble.leadingAnchor, constant: 0), - preContentViewBubble.trailingAnchor.constraint(equalTo: contentBubble.trailingAnchor, constant: -16), - ] - preContentViewBubbleConstraintsHidden = [ - preContentViewBubble.topAnchor.constraint(equalTo: contentBubble.topAnchor), - preContentViewBubble.heightAnchor.constraint(equalToConstant: 0) - ] - - //Forward - preContentViewBubble.addSubview(forwardView) - forwardView.size(w: 90, h: 10).done() - - forwardView.addSubview(forwardIcon) - forwardIcon.size(w: 10, h: 10).done() - - forwardView.addSubview(forwardLabel) - forwardLabel.text = VoipTexts.bubble_chat_transferred - forwardLabel.size(w: 90, h: 10).done() - forwardConstraints = [ - forwardView.topAnchor.constraint(equalTo: preContentViewBubble.topAnchor, constant: 0), - forwardView.bottomAnchor.constraint(equalTo: preContentViewBubble.bottomAnchor, constant: 0), - forwardView.leadingAnchor.constraint(equalTo: preContentViewBubble.leadingAnchor, constant: 0), - - forwardIcon.topAnchor.constraint(equalTo: preContentViewBubble.topAnchor, constant: 6), - forwardIcon.leadingAnchor.constraint(equalTo: preContentViewBubble.leadingAnchor, constant: 6), - - forwardLabel.topAnchor.constraint(equalTo: preContentViewBubble.topAnchor, constant: 6), - forwardLabel.leadingAnchor.constraint(equalTo: preContentViewBubble.leadingAnchor, constant: 20) - ] - forwardView.isHidden = true - - //Reply - preContentViewBubble.addSubview(replyView) - replyView.size(w: 90, h: 10).done() - - replyView.addSubview(replyIcon) - replyIcon.size(w: 10, h: 10).done() - - replyView.addSubview(replyLabel) - replyLabel.text = VoipTexts.bubble_chat_reply - replyLabel.size(w: 90, h: 10).done() - - preContentViewBubble.addSubview(replyContent) - replyContent.minWidth(200).done() - replyContent.layer.cornerRadius = 5 - replyContent.clipsToBounds = true - replyContent.translatesAutoresizingMaskIntoConstraints = false - - replyContent.addSubview(replyColorContent) - replyColorContent.width(10).done() - replyColorContent.layer.cornerRadius = 5 - replyColorContent.clipsToBounds = true - replyColorContent.layer.maskedCorners = [.layerMinXMinYCorner, .layerMinXMaxYCorner] - - initReplyView() - - replyConstraints = [ - replyView.topAnchor.constraint(equalTo: preContentViewBubble.topAnchor, constant: 0), - replyView.leadingAnchor.constraint(equalTo: preContentViewBubble.leadingAnchor, constant: 0), - - replyIcon.topAnchor.constraint(equalTo: preContentViewBubble.topAnchor, constant: 6), - replyIcon.leadingAnchor.constraint(equalTo: preContentViewBubble.leadingAnchor, constant: 6), - - replyLabel.topAnchor.constraint(equalTo: preContentViewBubble.topAnchor, constant: 6), - replyLabel.leadingAnchor.constraint(equalTo: preContentViewBubble.leadingAnchor, constant: 20), - - replyContent.topAnchor.constraint(equalTo: preContentViewBubble.topAnchor, constant: 20), - replyContent.leadingAnchor.constraint(equalTo: preContentViewBubble.leadingAnchor, constant: 8), - replyContent.trailingAnchor.constraint(equalTo: preContentViewBubble.trailingAnchor, constant: 8), - replyContent.bottomAnchor.constraint(equalTo: preContentViewBubble.bottomAnchor, constant: 0), - - replyColorContent.topAnchor.constraint(equalTo: replyContent.topAnchor), - replyColorContent.bottomAnchor.constraint(equalTo: replyContent.bottomAnchor), - - stackViewReply.topAnchor.constraint(equalTo: replyContent.topAnchor, constant: 4), - stackViewReply.bottomAnchor.constraint(equalTo: replyContent.bottomAnchor, constant: -4), - stackViewReply.leadingAnchor.constraint(equalTo: replyContent.leadingAnchor, constant: 14), - stackViewReply.trailingAnchor.constraint(equalTo: replyContent.trailingAnchor, constant: 14), - stackViewReply.widthAnchor.constraint(equalTo: replyContent.widthAnchor), - - replyContentTextView.leadingAnchor.constraint(equalTo: stackViewReply.leadingAnchor, constant: 0), - replyContentTextView.trailingAnchor.constraint(equalTo: stackViewReply.trailingAnchor, constant: -20), - - mediaSelectorReply.leadingAnchor.constraint(equalTo: stackViewReply.leadingAnchor, constant: 0), - mediaSelectorReply.trailingAnchor.constraint(equalTo: stackViewReply.trailingAnchor, constant: -20), - - collectionViewReply.topAnchor.constraint(equalTo: mediaSelectorReply.topAnchor), - collectionViewReply.bottomAnchor.constraint(equalTo: mediaSelectorReply.bottomAnchor), - collectionViewReply.leadingAnchor.constraint(equalTo: mediaSelectorReply.leadingAnchor), - collectionViewReply.trailingAnchor.constraint(equalTo: mediaSelectorReply.trailingAnchor), - ] - - replyView.isHidden = true - - //ContentViewBubble - bubble.addSubview(contentViewBubble) - contentViewBubble.translatesAutoresizingMaskIntoConstraints = false - contentViewBubbleConstraints = [ - contentViewBubble.topAnchor.constraint(equalTo: preContentViewBubble.bottomAnchor), - contentViewBubble.bottomAnchor.constraint(equalTo: contentView.bottomAnchor), - contentViewBubble.leadingAnchor.constraint(equalTo: contentBubble.leadingAnchor), - contentViewBubble.trailingAnchor.constraint(equalTo: contentBubble.trailingAnchor) - ] - NSLayoutConstraint.activate(contentViewBubbleConstraints) - - //Content Media View - contentViewBubble.addSubview(contentMediaViewBubble) - contentMediaViewBubble.translatesAutoresizingMaskIntoConstraints = false - contentMediaViewBubbleConstraints = [ - contentMediaViewBubble.topAnchor.constraint(equalTo: contentViewBubble.topAnchor), - contentMediaViewBubble.leadingAnchor.constraint(equalTo: contentViewBubble.leadingAnchor), - contentMediaViewBubble.trailingAnchor.constraint(equalTo: contentViewBubble.trailingAnchor) - ] - NSLayoutConstraint.activate(contentMediaViewBubbleConstraints) - - //Images Grid - contentMediaViewBubble.addSubview(collectionViewImagesGrid) - collectionViewImagesGrid.translatesAutoresizingMaskIntoConstraints = false - imagesGridConstraints = [ - collectionViewImagesGrid.topAnchor.constraint(equalTo: contentMediaViewBubble.topAnchor, constant: labelInset.top), - collectionViewImagesGrid.bottomAnchor.constraint(equalTo: contentMediaViewBubble.bottomAnchor, constant: labelInset.bottom) - ] - - imagesGridConstraintsWithRecording = [ - collectionViewImagesGrid.topAnchor.constraint(equalTo: contentMediaViewBubble.topAnchor, constant: labelInset.top + 50), - collectionViewImagesGrid.bottomAnchor.constraint(equalTo: contentMediaViewBubble.bottomAnchor, constant: labelInset.bottom) - ] - - - constraintGridWithTextLeading = collectionViewImagesGrid.leadingAnchor.constraint(equalTo: contentMediaViewBubble.leadingAnchor, constant: labelInset.left) - constraintGridWithTextTrailing = collectionViewImagesGrid.trailingAnchor.constraint(equalTo: contentMediaViewBubble.trailingAnchor, constant: labelInset.right) - constraintGridWithTextLeading!.isActive = true - constraintGridWithTextTrailing!.isActive = true - - collectionViewImagesGrid.dataSource = self - collectionViewImagesGrid.delegate = self - collectionViewImagesGrid.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "cellImagesGridMessage") - collectionViewImagesGrid.width(280).done() - collectionViewImagesGrid.isHidden = true - - //Image - contentMediaViewBubble.addSubview(imageViewBubble) - imageViewBubble.translatesAutoresizingMaskIntoConstraints = false - imageConstraints = [ - imageViewBubble.topAnchor.constraint(equalTo: contentMediaViewBubble.topAnchor, constant: labelInset.top), - imageViewBubble.bottomAnchor.constraint(equalTo: contentMediaViewBubble.bottomAnchor, constant: labelInset.bottom), - imageViewBubble.leadingAnchor.constraint(equalTo: contentMediaViewBubble.leadingAnchor, constant: labelInset.left), - imageViewBubble.trailingAnchor.constraint(equalTo: contentMediaViewBubble.trailingAnchor, constant: labelInset.right), - ] - - imageViewBubble.contentMode = .scaleAspectFit - - imageViewBubble.addSubview(circularProgressBarImageView) - progressBarImageConstraints = [ - circularProgressBarImageView.centerXAnchor.constraint(equalTo: imageViewBubble.centerXAnchor), - circularProgressBarImageView.centerYAnchor.constraint(equalTo: imageViewBubble.centerYAnchor) - ] - - circularProgressBarImageView.size(w: 138, h: 138).done() - circularProgressBarImageLabel.size(w: 30, h: 30).done() - circularProgressBarImageLabel.text = "0%" - circularProgressBarImageView.addSubview(circularProgressBarImageLabel) - circularProgressBarImageView.isHidden = true - - imageViewBubble.isHidden = true - - //Video - contentMediaViewBubble.addSubview(imageVideoViewBubble) - imageVideoViewBubble.translatesAutoresizingMaskIntoConstraints = false - videoConstraints = [ - imageVideoViewBubble.topAnchor.constraint(equalTo: contentMediaViewBubble.topAnchor, constant: labelInset.top), - imageVideoViewBubble.bottomAnchor.constraint(equalTo: contentMediaViewBubble.bottomAnchor, constant: labelInset.bottom), - imageVideoViewBubble.leadingAnchor.constraint(equalTo: contentMediaViewBubble.leadingAnchor, constant: labelInset.left), - imageVideoViewBubble.trailingAnchor.constraint(equalTo: contentMediaViewBubble.trailingAnchor, constant: labelInset.right) - ] - - imageVideoViewBubble.contentMode = .scaleAspectFit - - if #available(iOS 13.0, *) { - imagePlayViewBubble.image = (UIImage(named: "vr_play")!.withTintColor(.white)) - } - - imageVideoViewBubble.addSubview(imagePlayViewBubble) - playButtonConstraints = [ - imagePlayViewBubble.centerXAnchor.constraint(equalTo: imageVideoViewBubble.centerXAnchor), - imagePlayViewBubble.centerYAnchor.constraint(equalTo: imageVideoViewBubble.centerYAnchor) - ] - imagePlayViewBubble.size(w: 40, h: 40).done() - - imageVideoViewBubble.addSubview(circularProgressBarVideoView) - progressBarVideoConstraints = [ - circularProgressBarVideoView.centerXAnchor.constraint(equalTo: imageVideoViewBubble.centerXAnchor), - circularProgressBarVideoView.centerYAnchor.constraint(equalTo: imageVideoViewBubble.centerYAnchor) - ] - - circularProgressBarVideoView.size(w: 138, h: 138).done() - circularProgressBarVideoLabel.size(w: 30, h: 30).done() - circularProgressBarVideoLabel.text = "0%" - circularProgressBarVideoView.addSubview(circularProgressBarVideoLabel) - circularProgressBarVideoView.isHidden = true - - imageVideoViewBubble.isHidden = true - - //RecordingPlayer - contentMediaViewBubble.addSubview(recordingView) - recordingView.translatesAutoresizingMaskIntoConstraints = false - recordingConstraints = [ - recordingView.topAnchor.constraint(equalTo: contentMediaViewBubble.topAnchor, constant: labelInset.top), - recordingView.bottomAnchor.constraint(equalTo: contentMediaViewBubble.bottomAnchor, constant: labelInset.bottom), - recordingView.leadingAnchor.constraint(equalTo: contentMediaViewBubble.leadingAnchor, constant: labelInset.left), - recordingView.trailingAnchor.constraint(equalTo: contentMediaViewBubble.trailingAnchor, constant: labelInset.right) - ] - - recordingConstraintsWithMediaGrid = [ - recordingView.topAnchor.constraint(equalTo: contentMediaViewBubble.topAnchor, constant: labelInset.top), - recordingView.leadingAnchor.constraint(equalTo: contentMediaViewBubble.leadingAnchor, constant: labelInset.left), - recordingView.trailingAnchor.constraint(equalTo: contentMediaViewBubble.trailingAnchor, constant: labelInset.right) - ] - - recordingView.height(50.0).width(280).done() - recordingView.isHidden = true - - //Text - label.numberOfLines = 0 - label.lineBreakMode = .byWordWrapping - label.textColor = .black - - contentViewBubble.addSubview(label) - label.translatesAutoresizingMaskIntoConstraints = false - labelConstraints = [ - label.topAnchor.constraint(equalTo: contentMediaViewBubble.bottomAnchor, constant: labelInset.top), - label.bottomAnchor.constraint(equalTo: contentViewBubble.bottomAnchor, constant: labelInset.bottom), - label.leadingAnchor.constraint(equalTo: contentViewBubble.leadingAnchor, constant: labelInset.left), - label.trailingAnchor.constraint(equalTo: contentViewBubble.trailingAnchor, constant: labelInset.right) - ] - - labelTopConstraints = [ - label.topAnchor.constraint(equalTo: contentMediaViewBubble.bottomAnchor), - label.bottomAnchor.constraint(equalTo: contentViewBubble.bottomAnchor, constant: labelInset.bottom), - label.leadingAnchor.constraint(equalTo: contentViewBubble.leadingAnchor, constant: labelInset.left), - label.trailingAnchor.constraint(equalTo: contentViewBubble.trailingAnchor, constant: labelInset.right) - ] - - labelHiddenConstraints = [ - label.topAnchor.constraint(equalTo: contentMediaViewBubble.bottomAnchor), - label.bottomAnchor.constraint(equalTo: contentViewBubble.bottomAnchor) - ] - - NSLayoutConstraint.activate(labelConstraints) - - //Meeting - contentViewBubble.addSubview(meetingView) - meetingView.translatesAutoresizingMaskIntoConstraints = false - meetingConstraints = [ - meetingView.topAnchor.constraint(equalTo: contentViewBubble.topAnchor, constant: labelInset.top), - meetingView.bottomAnchor.constraint(equalTo: contentViewBubble.bottomAnchor, constant: labelInset.bottom), - meetingView.leadingAnchor.constraint(equalTo: contentViewBubble.leadingAnchor, constant: labelInset.left), - meetingView.trailingAnchor.constraint(equalTo: contentViewBubble.trailingAnchor, constant: labelInset.right) - ] - meetingView.isHidden = true - - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - self.replyContent.backgroundColor = VoipTheme.backgroundWhiteBlack.get() - } - - //Ephemeral - contentViewBubble.addSubview(ephemeralTimerLabel) - ephemeralTimerLabel.bottomAnchor.constraint(equalTo: contentViewBubble.bottomAnchor, constant: -2).isActive = true - ephemeralTimerLabel.trailingAnchor.constraint(equalTo: contentViewBubble.trailingAnchor, constant: -14).isActive = true - ephemeralTimerLabel.text = "00:00" - ephemeralTimerLabel.height(10).done() - ephemeralTimerLabel.isHidden = true - - contentViewBubble.addSubview(ephemeralIcon) - ephemeralIcon.bottomAnchor.constraint(equalTo: contentViewBubble.bottomAnchor, constant: -3).isActive = true - ephemeralIcon.trailingAnchor.constraint(equalTo: contentViewBubble.trailingAnchor, constant: -6).isActive = true - ephemeralIcon.size(w: 7, h: 8).done() - ephemeralIcon.isHidden = true - } - - func initPlayerAudio(message: ChatMessage){ - let recordingPlayButton = CallControlButton(width: 40, height: 40, buttonTheme:VoipTheme.nav_color_button("vr_play")) - let recordingStopButton = CallControlButton(width: 40, height: 40, buttonTheme:VoipTheme.nav_color_button("vr_stop")) - let recordingWaveView = UIProgressView() - let recordingDurationTextView = StyledLabel(VoipTheme.chat_conversation_recording_duration) - let recordingWaveImage = UIImageView(image: UIImage(named: "vr_wave.png")) - - recordingView.addSubview(recordingWaveView) - recordingWaveView.translatesAutoresizingMaskIntoConstraints = false - recordingWaveConstraints = [ - recordingWaveView.topAnchor.constraint(equalTo: contentMediaViewBubble.topAnchor, constant: labelInset.top), - recordingWaveView.bottomAnchor.constraint(equalTo: contentMediaViewBubble.bottomAnchor, constant: labelInset.bottom), - recordingWaveView.leadingAnchor.constraint(equalTo: contentMediaViewBubble.leadingAnchor, constant: labelInset.left), - recordingWaveView.trailingAnchor.constraint(equalTo: contentMediaViewBubble.trailingAnchor, constant: labelInset.right), - recordingWaveImage.centerYAnchor.constraint(equalTo: recordingWaveView.centerYAnchor) - ] - - recordingWaveConstraintsWithMediaGrid = [ - recordingWaveView.topAnchor.constraint(equalTo: recordingView.topAnchor, constant: 0), - recordingWaveView.bottomAnchor.constraint(equalTo: recordingView.bottomAnchor, constant: -10), - recordingWaveView.leadingAnchor.constraint(equalTo: contentMediaViewBubble.leadingAnchor, constant: labelInset.left), - recordingWaveView.trailingAnchor.constraint(equalTo: contentMediaViewBubble.trailingAnchor, constant: labelInset.right), - recordingWaveImage.centerYAnchor.constraint(equalTo: recordingWaveView.centerYAnchor) - ] - - recordingWaveView.progressViewStyle = .bar - recordingWaveView.layer.cornerRadius = 5 - recordingWaveView.clipsToBounds = true - - recordingWaveView.addSubview(recordingPlayButton) - recordingPlayButton.alignParentLeft(withMargin: 10).matchParentHeight().done() - - recordingWaveView.addSubview(recordingStopButton) - recordingStopButton.alignParentLeft(withMargin: 10).matchParentHeight().done() - recordingStopButton.isHidden = true - - recordingWaveView.addSubview(recordingWaveImage) - recordingWaveImage.alignParentLeft(withMargin: 60).alignParentRight(withMargin: 60).height(26).done() - - recordingWaveView.addSubview(recordingDurationTextView) - recordingDurationTextView.alignParentRight(withMargin: 10).matchParentHeight().done() - - let img = message.isOutgoing ? UIImage.withColor(UIColor("A")) : UIImage.withColor(UIColor("D")) - recordingWaveView.progressImage = img - - var filePathRecording = message.contents.first?.filePath - - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - filePathRecording = message.contents.first?.exportPlainFile() - } - - recordingDurationTextView.text = recordingDuration(filePathRecording) - - recordingPlayButton.onClickAction = { - self.playRecordedMessage(voiceRecorder: filePathRecording, recordingPlayButton: recordingPlayButton, recordingStopButton: recordingStopButton, recordingWaveView: recordingWaveView, message: message) - } - recordingStopButton.onClickAction = { - self.stopVoiceRecordPlayer(recordingPlayButton: recordingPlayButton, recordingStopButton: recordingStopButton, recordingWaveView: recordingWaveView, message: message) - } - - if (recordingView.isHidden == false && imagesGridCollectionView.count > 0){ - collectionViewImagesGrid.isHidden = false - NSLayoutConstraint.activate(recordingConstraintsWithMediaGrid) - NSLayoutConstraint.activate(recordingWaveConstraintsWithMediaGrid) - } else { - NSLayoutConstraint.activate(recordingConstraints) - NSLayoutConstraint.activate(recordingWaveConstraints) - } - - recordingView.isHidden = false - } - - func initReplyView(){ - //Reply - Contents - - stackViewReply.axis = .vertical; - stackViewReply.distribution = .fill; - stackViewReply.alignment = .leading; - stackViewReply.maxWidth((UIScreen.main.bounds.size.width*3/4)).done() - - replyContent.addSubview(stackViewReply) - replyContent.backgroundColor = VoipTheme.backgroundWhiteBlack.get() - stackViewReply.translatesAutoresizingMaskIntoConstraints = false - - stackViewReply.addArrangedSubview(replyLabelTextView) - replyLabelTextView.height(24).done() - - stackViewReply.addArrangedSubview(replyLabelContentTextSpacing) - replyLabelContentTextSpacing.height(6).wrapContentY().done() - - stackViewReply.addArrangedSubview(replyMeetingSchedule) - replyMeetingSchedule.size(w: 100, h: 40).wrapContentY().done() - replyMeetingSchedule.contentMode = .scaleAspectFit - replyMeetingSchedule.isHidden = true - - stackViewReply.addArrangedSubview(replyContentForMeetingSpacing) - replyContentForMeetingSpacing.height(4).done() - replyMeetingSchedule.isHidden = true - - stackViewReply.addArrangedSubview(replyContentForMeetingTextView) - replyContentForMeetingTextView.width(100).wrapContentY().done() - replyContentForMeetingTextView.textAlignment = .center - replyContentForMeetingTextView.numberOfLines = 5 - replyContentForMeetingTextView.isHidden = true - - stackViewReply.addArrangedSubview(replyContentTextView) - replyContentTextView.wrapContentY().done() - replyContentTextView.numberOfLines = 5 - - stackViewReply.addArrangedSubview(replyContentTextSpacing) - replyContentTextSpacing.height(6).wrapContentY().done() - replyContentTextSpacing.isHidden = true - - stackViewReply.addArrangedSubview(mediaSelectorReply) - mediaSelectorReply.height(60).done() - mediaSelectorReply.isHidden = true - mediaSelectorReply.translatesAutoresizingMaskIntoConstraints = false - - mediaSelectorReply.addSubview(collectionViewReply) - collectionViewReply.dataSource = self - collectionViewReply.delegate = self - collectionViewReply.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "cellReplyMessage") - } - - required init?(coder aDecoder: NSCoder) { - fatalError("Storyboards are quicker, easier, more seductive. Not stronger then Code.") - } - - override func prepareForReuse() { - super.prepareForReuse() - - deleteItemCheckBox.removeFromSuperview() - eventMessageView.removeFromSuperview() - contactDateLabel.removeFromSuperview() - contentBubble.removeFromSuperview() - - if chatMessageDelegate != nil { - chatMessage?.removeDelegate(delegate: chatMessageDelegate!) - } - - label = UILabel(frame: .zero) - eventMessageView = UIView(frame: .zero) - preContentViewBubble = UIView(frame: .zero) - contentViewBubble = UIView(frame: .zero) - contentMediaViewBubble = UIView(frame: .zero) - contentBubble = UIView(frame: .zero) - bubble = UIView(frame: .zero) - imageUser = UIImageView() - contactDateLabel = StyledLabel(VoipTheme.chat_conversation_forward_label) - chatRead = UIImageView(image: UIImage(named: "chat_delivered.png")) - labelInset = UIEdgeInsets(top: 10, left: 10, bottom: -10, right: -10) - constraintEventMesssage = [] - constraintEventMesssageLabel = [] - constraintBubble = [] - constraintLeadingBubble = nil - constraintTrailingBubble = nil - constraintDateLeadingBubble = nil - constraintDateTrailingBubble = nil - constraintDateBubble = nil - constraintDateBubbleHidden = nil - preContentViewBubbleConstraints = [] - preContentViewBubbleConstraintsHidden = [] - contentViewBubbleConstraints = [] - contentMediaViewBubbleConstraints = [] - forwardConstraints = [] - replyConstraints = [] - labelConstraints = [] - labelTopConstraints = [] - labelHiddenConstraints = [] - imagesGridConstraints = [] - imagesGridConstraintsWithRecording = [] - imageConstraints = [] - videoConstraints = [] - playButtonConstraints = [] - progressBarVideoConstraints = [] - progressBarImageConstraints = [] - recordingConstraints = [] - recordingConstraintsWithMediaGrid = [] - recordingWaveConstraints = [] - recordingWaveConstraintsWithMediaGrid = [] - meetingConstraints = [] - constraintGridWithTextLeading = nil - constraintGridWithTextTrailing = nil - eventMessageLineView = UIView(frame: .zero) - eventMessageLabelView = UIView(frame: .zero) - eventMessageLabel = StyledLabel(VoipTheme.chat_conversation_forward_label) - forwardView = UIView() - forwardIcon = UIImageView(image: UIImage(named: "menu_forward_default")) - replyView = UIView() - replyIcon = UIImageView(image: UIImage(named: "menu_reply_default")) - replyContent = UIView() - replyColorContent = UIView() - replyLabelContent = StyledLabel(VoipTheme.chat_conversation_forward_label) - stackViewReply = UIStackView() - replyLabelTextView = StyledLabel(VoipTheme.chat_conversation_reply_label) - replyLabelContentTextSpacing = UIView() - replyContentTextView = StyledLabel(VoipTheme.chat_conversation_reply_content) - replyContentTextSpacing = UIView() - replyContentForMeetingTextView = StyledLabel(VoipTheme.chat_conversation_reply_content) - replyContentForMeetingSpacing = UIView() - replyMeetingSchedule = UIImageView() - mediaSelectorReply = UIView() - replyCollectionView = [] - replyContentCollection = [] - imagesGridCollectionView = [] - downloadContentCollection = [] - uploadContentCollection = [] - imageViewBubble = UIImageView(image: UIImage(named: "chat_error")) - imageVideoViewBubble = UIImageView(image: UIImage(named: "file_video_default")) - imagePlayViewBubble = UIImageView(image: UIImage(named: "vr_play")) - meetingView = UIView() - recordingView = UIView() - ephemeralIcon = UIImageView(image: UIImage(named: "ephemeral_messages_color_A.png")) - ephemeralTimerLabel = StyledLabel(VoipTheme.chat_conversation_ephemeral_timer) - ephemeralTimer = nil - isPlayingVoiceRecording = false - chatMessage = nil - chatMessageDelegate = nil - indexTransferProgress = -1 - indexUploadTransferProgress = -1 - selfIndexMessage = -1 - deleteItemCheckBox = StyledCheckBox() - matches = [] - circularProgressBarVideoView = CircularProgressBarView() - circularProgressBarImageView = CircularProgressBarView() - circularProgressBarVideoLabel = StyledLabel(VoipTheme.chat_conversation_download_progress_text) - circularProgressBarImageLabel = StyledLabel(VoipTheme.chat_conversation_download_progress_text) - fromValue = 0.0 - - collectionViewReply = { - let collection_view_reply_height = 60.0 - let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() - layout.itemSize = CGSize(width: collection_view_reply_height, height: collection_view_reply_height) - - layout.scrollDirection = .horizontal - layout.minimumLineSpacing = 4 - layout.minimumInteritemSpacing = 4 - - let collectionViewReply = UICollectionView(frame: .zero, collectionViewLayout: layout) - collectionViewReply.translatesAutoresizingMaskIntoConstraints = false - collectionViewReply.backgroundColor = .clear - return collectionViewReply - }() - collectionViewImagesGrid = { - let collection_view_reply_height = 138.0 - let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() - layout.itemSize = CGSize(width: collection_view_reply_height, height: collection_view_reply_height) - layout.scrollDirection = .vertical - layout.minimumLineSpacing = 4 - layout.minimumInteritemSpacing = 4 - - let collectionViewImagesGrid = DynamicHeightCollectionView(frame: .zero, collectionViewLayout: layout) - collectionViewImagesGrid.translatesAutoresizingMaskIntoConstraints = false - collectionViewImagesGrid.backgroundColor = .clear - return collectionViewImagesGrid - }() - messageWithRecording = false - initCell() - } - - func configure(event: EventLog, selfIndexPathConfigure: IndexPath, editMode: Bool, selected: Bool) { - selfIndexMessage = selfIndexPathConfigure.row - eventMessage = event - chatMessage = event.chatMessage - addMessageDelegate() - imagesGridCollectionView.removeAll() - imageUser.isHidden = true - deleteItemCheckBox.isHidden = true - - if event.chatMessage != nil { - contentBubble.isHidden = false - eventMessageView.isHidden = true - NSLayoutConstraint.activate(constraintBubble) - NSLayoutConstraint.deactivate(constraintEventMesssage) - NSLayoutConstraint.deactivate(constraintEventMesssageLabel) - if !event.chatMessage!.isOutgoing { - if editMode { - constraintLeadingBubble?.isActive = false - constraintTrailingBubble?.isActive = true - }else{ - constraintLeadingBubble?.isActive = true - constraintTrailingBubble?.isActive = false - } - - if isFirstIndexInTableView(indexPath: selfIndexPathConfigure, chat: event.chatMessage!) { - imageUser.isHidden = false - if event.chatMessage?.fromAddress?.contact() != nil { - imageUser.image = FastAddressBook.image(for: event.chatMessage?.fromAddress?.contact()) - }else if event.chatMessage?.fromAddress != nil { - imageUser.image = FastAddressBook.image(for: event.chatMessage?.fromAddress?.getCobject) - } - contactDateLabel.text = contactDateForChat(message: event.chatMessage!) - contactDateLabel.isHidden = false - if editMode { - constraintDateTrailingBubble?.isActive = true - contactDateLabel.textAlignment = .right - }else{ - constraintDateLeadingBubble?.isActive = true - } - contactDateLabel.size(w: 200, h: 20).done() - }else{ - constraintDateBubble?.isActive = false - constraintDateBubbleHidden?.isActive = true - imageUser.isHidden = true - contactDateLabel.size(w: 200, h: 0).done() - } - - bubble.backgroundColor = VoipTheme.gray_light_color//.withAlphaComponent(0.2) - }else{ - constraintLeadingBubble?.isActive = false - constraintTrailingBubble?.isActive = true - - imageUser.isHidden = true - if isFirstIndexInTableView(indexPath: selfIndexPathConfigure, chat: event.chatMessage!) { - contactDateLabel.text = LinphoneUtils.time(toString: event.chatMessage!.time, with: LinphoneDateChatBubble) - contactDateLabel.isHidden = false - contactDateLabel.textAlignment = .right - constraintDateTrailingBubble?.isActive = true - contactDateLabel.size(w: 200, h: 20).done() - }else{ - constraintDateBubble?.isActive = false - constraintDateBubbleHidden?.isActive = true - contactDateLabel.size(w: 200, h: 0).done() - } - - bubble.backgroundColor = VoipTheme.primary_light_color//.withAlphaComponent(0.2) - displayImdnStatus(message: event.chatMessage!, state: event.chatMessage!.state) - } - - if event.chatMessage!.isEphemeral { - ephemeralTimerLabel.isHidden = false - ephemeralIcon.isHidden = false - contentViewBubble.minWidth(44).done() - updateEphemeralTimes() - }else{ - ephemeralTimerLabel.isHidden = true - ephemeralIcon.isHidden = true - } - - if event.chatMessage!.isForward { - NSLayoutConstraint.activate(preContentViewBubbleConstraints) - NSLayoutConstraint.activate(forwardConstraints) - NSLayoutConstraint.deactivate(replyConstraints) - contentViewBubble.minWidth(90).done() - forwardView.isHidden = false - replyView.isHidden = true - }else if event.chatMessage!.isReply{ - NSLayoutConstraint.activate(preContentViewBubbleConstraints) - NSLayoutConstraint.deactivate(forwardConstraints) - NSLayoutConstraint.activate(replyConstraints) - contentViewBubble.minWidth(216).done() - forwardView.isHidden = true - replyView.isHidden = false - - if(event.chatMessage!.replyMessage != nil){ - replyColorContent.backgroundColor = event.chatMessage!.replyMessage!.isOutgoing ? UIColor("A") : UIColor("D") - - let isIcal = ICSBubbleView.isConferenceInvitationMessage(cmessage: (event.chatMessage!.replyMessage?.getCobject)!) - let content : String? = (isIcal ? ICSBubbleView.getSubjectFromContent(cmessage: (event.chatMessage!.replyMessage?.getCobject)!) : ChatMessage.getSwiftObject(cObject: (event.chatMessage!.replyMessage?.getCobject)!).utf8Text) - let contentList = linphone_chat_message_get_contents(event.chatMessage!.replyMessage?.getCobject) - let fromAddress = FastAddressBook.displayName(for: event.chatMessage!.replyMessage!.fromAddress?.getCobject) - replyLabelTextView.text = String.localizedStringWithFormat(NSLocalizedString("%@", comment: ""), fromAddress!) - - replyContentTextView.text = content - replyContentForMeetingTextView.text = content - if(isIcal){ - replyMeetingSchedule.image = UIImage(named: "voip_meeting_schedule") - replyMeetingSchedule.isHidden = false - replyContentForMeetingTextView.isHidden = false - replyContentForMeetingSpacing.isHidden = false - replyContentTextView.isHidden = true - mediaSelectorReply.isHidden = true - replyContentTextSpacing.isHidden = true - }else{ - if(bctbx_list_size(contentList) >= 1){ - if bctbx_list_size(contentList) == 1 && content != nil { - mediaSelectorReply.isHidden = true - } else { - mediaSelectorReply.isHidden = false - } - - replyContentTextSpacing.isHidden = true - ChatMessage.getSwiftObject(cObject: (event.chatMessage!.replyMessage?.getCobject)!).contents.forEach({ content in - if(content.isFile){ - replyContentCollection.append(content) - replyCollectionView.append(getImageFrom(content, forReplyBubble: false)!) - collectionViewReply.reloadData() - }else if(content.isText){ - replyContentTextSpacing.isHidden = false - } - }) - - }else{ - mediaSelectorReply.isHidden = true - } - replyMeetingSchedule.isHidden = true - replyContentForMeetingTextView.isHidden = true - replyContentForMeetingSpacing.isHidden = true - replyContentTextView.isHidden = false - - } - replyContentTextView.text = event.chatMessage!.replyMessage!.contents.first?.utf8Text - }else{ - replyLabelTextView.isHidden = true - replyContentTextSpacing.isHidden = false - replyContentTextView.text = VoipTexts.bubble_chat_reply_message_does_not_exist + " " - } - }else{ - NSLayoutConstraint.activate(preContentViewBubbleConstraintsHidden) - NSLayoutConstraint.deactivate(forwardConstraints) - NSLayoutConstraint.deactivate(replyConstraints) - contentViewBubble.minWidth(0).done() - forwardView.isHidden = true - replyView.isHidden = true - } - let isIcal = ICSBubbleView.isConferenceInvitationMessage(cmessage: (event.chatMessage!.getCobject)!) - if(isIcal){ - - let icsBubbleView = ICSBubbleView.init() - icsBubbleView.setFromChatMessage(cmessage: event.chatMessage!.getCobject!) - - meetingView.addSubview(icsBubbleView) - icsBubbleView.size(w: 280, h: 200).done() - - icsBubbleView.translatesAutoresizingMaskIntoConstraints = false - let icsConstraints = [ - icsBubbleView.topAnchor.constraint(equalTo: meetingView.topAnchor), - icsBubbleView.bottomAnchor.constraint(equalTo: meetingView.bottomAnchor), - icsBubbleView.leadingAnchor.constraint(equalTo: meetingView.leadingAnchor), - icsBubbleView.trailingAnchor.constraint(equalTo: meetingView.trailingAnchor) - ] - NSLayoutConstraint.activate(icsConstraints) - - - NSLayoutConstraint.deactivate(labelConstraints) - NSLayoutConstraint.deactivate(labelTopConstraints) - NSLayoutConstraint.activate(labelHiddenConstraints) - NSLayoutConstraint.deactivate(imageConstraints) - NSLayoutConstraint.deactivate(videoConstraints) - NSLayoutConstraint.deactivate(playButtonConstraints) - NSLayoutConstraint.deactivate(progressBarVideoConstraints) - NSLayoutConstraint.deactivate(progressBarImageConstraints) - NSLayoutConstraint.deactivate(recordingConstraints) - NSLayoutConstraint.deactivate(recordingConstraintsWithMediaGrid) - NSLayoutConstraint.deactivate(recordingWaveConstraints) - NSLayoutConstraint.deactivate(recordingWaveConstraintsWithMediaGrid) - NSLayoutConstraint.activate(meetingConstraints) - label.isHidden = false - imageViewBubble.isHidden = true - imageVideoViewBubble.isHidden = true - recordingView.isHidden = true - - imageViewBubble.image = nil - imageVideoViewBubble.image = nil - - meetingView.isHidden = false - - }else { - NSLayoutConstraint.deactivate(labelConstraints) - NSLayoutConstraint.deactivate(labelTopConstraints) - NSLayoutConstraint.activate(labelHiddenConstraints) - NSLayoutConstraint.deactivate(imagesGridConstraints) - NSLayoutConstraint.deactivate(imagesGridConstraintsWithRecording) - NSLayoutConstraint.deactivate(imageConstraints) - NSLayoutConstraint.deactivate(videoConstraints) - NSLayoutConstraint.deactivate(playButtonConstraints) - NSLayoutConstraint.deactivate(progressBarVideoConstraints) - NSLayoutConstraint.deactivate(progressBarImageConstraints) - NSLayoutConstraint.deactivate(recordingConstraints) - NSLayoutConstraint.deactivate(recordingConstraintsWithMediaGrid) - NSLayoutConstraint.deactivate(recordingWaveConstraints) - NSLayoutConstraint.deactivate(recordingWaveConstraintsWithMediaGrid) - NSLayoutConstraint.deactivate(meetingConstraints) - constraintGridWithTextLeading!.isActive = false - constraintGridWithTextTrailing!.isActive = false - label.isHidden = true - collectionViewImagesGrid.isHidden = true - imageViewBubble.isHidden = true - imageVideoViewBubble.isHidden = true - recordingView.isHidden = true - - imageViewBubble.image = nil - imageVideoViewBubble.image = nil - - meetingView.isHidden = true - - event.chatMessage!.contents.forEach { content in - if (content.isFileTransfer && content.name != "" && !content.isVoiceRecording && (!chatMessage!.isOutgoing || (chatMessage!.isOutgoing && chatMessage!.isFileTransferInProgress == false))) { - imagesGridCollectionView.append(getImageFrom(content, forReplyBubble: false)!) - //lalala - collectionViewImagesGrid.reloadData() - - collectionViewImagesGrid.isHidden = false - NSLayoutConstraint.activate(imagesGridConstraints) - constraintGridWithTextLeading!.isActive = true - constraintGridWithTextTrailing!.isActive = true - imageViewBubble.image = nil - NSLayoutConstraint.deactivate(imageConstraints) - imageViewBubble.isHidden = true - } - - if (event.chatMessage?.isOutgoing == true && content.isFileTransfer && event.chatMessage?.isFileTransferInProgress == true && !content.isVoiceRecording) { - var filePath = "" - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - filePath = content.exportPlainFile() - }else if content.filePath != nil { - filePath = content.filePath! - } - let name = content.name - if filePath == "" { - filePath = LinphoneManager.validFilePath(name) - } - - let extensionFile = filePath.lowercased().components(separatedBy: ".").last - if (["png", "jpg", "jpeg", "bmp", "heic"].contains(extensionFile ?? "")){ - if imagesGridCollectionView.count > 1 { - imagesGridCollectionView.append(getImageFrom(content, forReplyBubble: false)!) - collectionViewImagesGrid.reloadData() - - collectionViewImagesGrid.isHidden = false - NSLayoutConstraint.activate(imagesGridConstraints) - constraintGridWithTextLeading!.isActive = true - constraintGridWithTextTrailing!.isActive = true - imageViewBubble.image = nil - NSLayoutConstraint.deactivate(imageConstraints) - imageViewBubble.isHidden = true - - }else{ - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - var plainFile = content.exportPlainFile() - if let imageMessage = UIImage(named: plainFile){ - self.imageViewBubble.image = self.resizeImage(image: imageMessage, targetSize: CGSize(width: UIScreen.main.bounds.size.width*3/4, height: 300.0)) - } - - ChatConversationViewModel.sharedModel.removeTmpFile(filePath: plainFile) - plainFile = "" - }else if content.filePath != nil { - if let imageMessage = UIImage(named: content.filePath!){ - self.imageViewBubble.image = self.resizeImage(image: imageMessage, targetSize: CGSize(width: UIScreen.main.bounds.size.width*3/4, height: 300.0)) - } - } - - imagesGridCollectionView.append(getImageFrom(content, forReplyBubble: false)!) - collectionViewImagesGrid.reloadData() - } - } else if (["mkv", "avi", "mov", "mp4"].contains(extensionFile ?? "")){ - if imagesGridCollectionView.count > 1 { - imagesGridCollectionView.append(getImageFrom(content, forReplyBubble: false)!) - collectionViewImagesGrid.reloadData() - - collectionViewImagesGrid.isHidden = false - NSLayoutConstraint.activate(imagesGridConstraints) - constraintGridWithTextLeading!.isActive = true - constraintGridWithTextTrailing!.isActive = true - imageVideoViewBubble.image = nil - NSLayoutConstraint.deactivate(imageConstraints) - imageVideoViewBubble.isHidden = true - - }else{ - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - var plainFile = content.exportPlainFile() - if let imageMessage = createThumbnailOfVideoFromFileURL(videoURL: plainFile){ - imageVideoViewBubble.image = resizeImage(image: imageMessage, targetSize: CGSize(width: UIScreen.main.bounds.size.width*3/4, height: 300.0)) - } - - ChatConversationViewModel.sharedModel.removeTmpFile(filePath: plainFile) - plainFile = "" - }else{ - if let imageMessage = createThumbnailOfVideoFromFileURL(videoURL: content.filePath!){ - imageVideoViewBubble.image = resizeImage(image: imageMessage, targetSize: CGSize(width: UIScreen.main.bounds.size.width*3/4, height: 300.0)) - } - } - imagesGridCollectionView.append(getImageFrom(content, forReplyBubble: false)!) - collectionViewImagesGrid.reloadData() - } - - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - ChatConversationViewModel.sharedModel.removeTmpFile(filePath: filePath) - filePath = "" - } - } else { - imagesGridCollectionView.append(getImageFrom(content, forReplyBubble: false)!) - //lalala - - collectionViewImagesGrid.reloadData() - - collectionViewImagesGrid.isHidden = false - NSLayoutConstraint.activate(imagesGridConstraints) - constraintGridWithTextLeading!.isActive = true - constraintGridWithTextTrailing!.isActive = true - imageViewBubble.image = nil - NSLayoutConstraint.deactivate(imageConstraints) - imageViewBubble.isHidden = true - } - } - - if content.type == "text" && !content.isFile{ - if event.chatMessage!.contents.count > 1 { - NSLayoutConstraint.deactivate(labelConstraints) - NSLayoutConstraint.activate(labelTopConstraints) - }else{ - NSLayoutConstraint.activate(labelConstraints) - NSLayoutConstraint.deactivate(labelTopConstraints) - } - - label.font = label.font.withSize(17) - - if (content.utf8Text!.trimmingCharacters(in: .whitespacesAndNewlines).unicodeScalars.first?.properties.isEmojiPresentation == true){ - var onlyEmojis = true - content.utf8Text!.trimmingCharacters(in: .whitespacesAndNewlines).unicodeScalars.forEach { emoji in - if !emoji.properties.isEmojiPresentation && !emoji.properties.isWhitespace{ - onlyEmojis = false - } - } - if onlyEmojis { - label.font = label.font.withSize(51) - } - } - - checkIfIsLinkOrPhoneNumber(content: content.utf8Text!) - - NSLayoutConstraint.deactivate(labelHiddenConstraints) - label.isHidden = false - }else if content.type == "image"{ - if imagesGridCollectionView.count > 1 { - if(content.isFile){ - imagesGridCollectionView.append(getImageFrom(content, forReplyBubble: false)!) - collectionViewImagesGrid.reloadData() - } - - collectionViewImagesGrid.isHidden = false - NSLayoutConstraint.activate(imagesGridConstraints) - constraintGridWithTextLeading!.isActive = true - constraintGridWithTextTrailing!.isActive = true - imageViewBubble.image = nil - NSLayoutConstraint.deactivate(imageConstraints) - imageViewBubble.isHidden = true - - }else{ - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - var plainFile = content.exportPlainFile() - if let imageMessage = UIImage(named: plainFile){ - self.imageViewBubble.image = self.resizeImage(image: imageMessage, targetSize: CGSize(width: UIScreen.main.bounds.size.width*3/4, height: 300.0)) - } - - ChatConversationViewModel.sharedModel.removeTmpFile(filePath: plainFile) - plainFile = "" - }else if content.filePath != nil { - if let imageMessage = UIImage(named: content.filePath!){ - self.imageViewBubble.image = self.resizeImage(image: imageMessage, targetSize: CGSize(width: UIScreen.main.bounds.size.width*3/4, height: 300.0)) - } - } else { - if let imageMessage = UIImage(named: "file_default"){ - self.imageViewBubble.image = self.resizeImage(image: imageMessage, targetSize: CGSize(width: UIScreen.main.bounds.size.width*3/4, height: 300.0)) - } - } - - if(content.isFile){ - imagesGridCollectionView.append(getImageFrom(content, forReplyBubble: false)!) - //lalalaNON - collectionViewImagesGrid.reloadData() - } - } - - }else if content.type == "video"{ - if imagesGridCollectionView.count > 1 { - if(content.isFile){ - imagesGridCollectionView.append(getImageFrom(content, forReplyBubble: false)!) - collectionViewImagesGrid.reloadData() - } - - collectionViewImagesGrid.isHidden = false - NSLayoutConstraint.activate(imagesGridConstraints) - constraintGridWithTextLeading!.isActive = true - constraintGridWithTextTrailing!.isActive = true - imageVideoViewBubble.image = nil - NSLayoutConstraint.deactivate(imageConstraints) - imageVideoViewBubble.isHidden = true - - }else{ - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - var plainFile = content.exportPlainFile() - if let imageMessage = createThumbnailOfVideoFromFileURL(videoURL: plainFile){ - imageVideoViewBubble.image = resizeImage(image: imageMessage, targetSize: CGSize(width: UIScreen.main.bounds.size.width*3/4, height: 300.0)) - } - - ChatConversationViewModel.sharedModel.removeTmpFile(filePath: plainFile) - plainFile = "" - }else{ - if let imageMessage = createThumbnailOfVideoFromFileURL(videoURL: content.filePath!){ - imageVideoViewBubble.image = resizeImage(image: imageMessage, targetSize: CGSize(width: UIScreen.main.bounds.size.width*3/4, height: 300.0)) - } - } - - if(content.isFile){ - imagesGridCollectionView.append(getImageFrom(content, forReplyBubble: false)!) - collectionViewImagesGrid.reloadData() - } - } - - }else if content.isVoiceRecording { - recordingView.subviews.forEach({ view in - view.removeFromSuperview() - }) - initPlayerAudio(message: event.chatMessage!) - if imagesGridCollectionView.count == 0 { - messageWithRecording = true - } - }else{ - if(content.isFile && !content.isText){ - var filePath = "" - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - filePath = content.exportPlainFile() - }else { - filePath = content.filePath! - } - let name = content.name - if filePath == "" { - filePath = LinphoneManager.validFilePath(name) - } - - let extensionFile = filePath.lowercased().components(separatedBy: ".").last - if (["png", "jpg", "jpeg", "bmp", "heic"].contains(extensionFile ?? "")){ - if imagesGridCollectionView.count > 1 { - imagesGridCollectionView.append(getImageFrom(content, forReplyBubble: false)!) - collectionViewImagesGrid.reloadData() - - collectionViewImagesGrid.isHidden = false - NSLayoutConstraint.activate(imagesGridConstraints) - constraintGridWithTextLeading!.isActive = true - constraintGridWithTextTrailing!.isActive = true - imageViewBubble.image = nil - NSLayoutConstraint.deactivate(imageConstraints) - imageViewBubble.isHidden = true - - }else{ - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - var plainFile = content.exportPlainFile() - if let imageMessage = UIImage(named: plainFile){ - self.imageViewBubble.image = self.resizeImage(image: imageMessage, targetSize: CGSize(width: UIScreen.main.bounds.size.width*3/4, height: 300.0)) - } - - ChatConversationViewModel.sharedModel.removeTmpFile(filePath: plainFile) - plainFile = "" - }else{ - if let imageMessage = UIImage(named: content.filePath!){ - self.imageViewBubble.image = self.resizeImage(image: imageMessage, targetSize: CGSize(width: UIScreen.main.bounds.size.width*3/4, height: 300.0)) - } - } - - imagesGridCollectionView.append(getImageFrom(content, forReplyBubble: false)!) - collectionViewImagesGrid.reloadData() - } - } else if (["mkv", "avi", "mov", "mp4"].contains(extensionFile ?? "")){ - if imagesGridCollectionView.count > 1 { - imagesGridCollectionView.append(getImageFrom(content, forReplyBubble: false)!) - collectionViewImagesGrid.reloadData() - - collectionViewImagesGrid.isHidden = false - NSLayoutConstraint.activate(imagesGridConstraints) - constraintGridWithTextLeading!.isActive = true - constraintGridWithTextTrailing!.isActive = true - imageVideoViewBubble.image = nil - NSLayoutConstraint.deactivate(imageConstraints) - imageVideoViewBubble.isHidden = true - - }else{ - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - var plainFile = content.exportPlainFile() - if let imageMessage = createThumbnailOfVideoFromFileURL(videoURL: plainFile){ - imageVideoViewBubble.image = resizeImage(image: imageMessage, targetSize: CGSize(width: UIScreen.main.bounds.size.width*3/4, height: 300.0)) - } - - ChatConversationViewModel.sharedModel.removeTmpFile(filePath: plainFile) - plainFile = "" - }else{ - if let imageMessage = createThumbnailOfVideoFromFileURL(videoURL: content.filePath!){ - imageVideoViewBubble.image = resizeImage(image: imageMessage, targetSize: CGSize(width: UIScreen.main.bounds.size.width*3/4, height: 300.0)) - } - } - imagesGridCollectionView.append(getImageFrom(content, forReplyBubble: false)!) - collectionViewImagesGrid.reloadData() - } - - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - ChatConversationViewModel.sharedModel.removeTmpFile(filePath: filePath) - filePath = "" - } - } else { - imagesGridCollectionView.append(getImageFrom(content, forReplyBubble: false)!) - collectionViewImagesGrid.reloadData() - - collectionViewImagesGrid.isHidden = false - NSLayoutConstraint.activate(imagesGridConstraints) - constraintGridWithTextLeading!.isActive = true - constraintGridWithTextTrailing!.isActive = true - imageViewBubble.image = nil - NSLayoutConstraint.deactivate(imageConstraints) - imageViewBubble.isHidden = true - } - } else { - if content.filePath == "" && content.isFileTransfer == false { - imagesGridCollectionView.append(SwiftUtil.textToImage(drawText: "Error", inImage: UIImage(named: "file_default")!, forReplyBubble: true)) - collectionViewImagesGrid.reloadData() - - collectionViewImagesGrid.isHidden = false - NSLayoutConstraint.activate(imagesGridConstraints) - constraintGridWithTextLeading!.isActive = true - constraintGridWithTextTrailing!.isActive = true - imageViewBubble.image = nil - NSLayoutConstraint.deactivate(imageConstraints) - imageViewBubble.isHidden = true - } else { - var filePathString = VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) ? content.exportPlainFile() : content.filePath - if filePathString != nil { - if let urlEncoded = filePathString!.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed){ - if !urlEncoded.isEmpty { - if let urlFile = URL(string: "file://" + urlEncoded){ - do { - let text = try String(contentsOf: urlFile, encoding: .utf8) - imagesGridCollectionView.append(SwiftUtil.textToImage(drawText: "Error", inImage: UIImage(named: "file_default")!, forReplyBubble: true)) - collectionViewImagesGrid.reloadData() - - collectionViewImagesGrid.isHidden = false - NSLayoutConstraint.activate(imagesGridConstraints) - constraintGridWithTextLeading!.isActive = true - constraintGridWithTextTrailing!.isActive = true - imageViewBubble.image = nil - NSLayoutConstraint.deactivate(imageConstraints) - imageViewBubble.isHidden = true - } catch {} - } - } - } - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - ChatConversationViewModel.sharedModel.removeTmpFile(filePath: filePathString) - filePathString = "" - } - } - } - } - } - } - if imagesGridCollectionView.count > 0 { - self.collectionViewImagesGrid.layoutIfNeeded() - } - - if imagesGridCollectionView.count == 1 && recordingView.isHidden == true { - if label.isHidden { - collectionViewImagesGrid.width(138).done() - } else { - collectionViewImagesGrid.width(138).done() - if event.chatMessage?.isOutgoing == true { - constraintGridWithTextLeading!.isActive = false - } else { - constraintGridWithTextTrailing!.isActive = false - } - label.minWidth(138).done() - } - } - - if imagesGridCollectionView.count == 2 { - collectionViewImagesGrid.isHidden = false - NSLayoutConstraint.activate(imagesGridConstraints) - constraintGridWithTextLeading!.isActive = true - constraintGridWithTextTrailing!.isActive = true - imageVideoViewBubble.image = nil - NSLayoutConstraint.deactivate(imageConstraints) - imageVideoViewBubble.isHidden = true - } - - if (imageViewBubble.image != nil && imagesGridCollectionView.count <= 1){ - NSLayoutConstraint.activate(imageConstraints) - imageViewBubble.isHidden = false - } - - if (imageVideoViewBubble.image != nil && imagesGridCollectionView.count <= 1){ - NSLayoutConstraint.activate(videoConstraints) - NSLayoutConstraint.activate(playButtonConstraints) - imageVideoViewBubble.isHidden = false - } - - if (recordingView.isHidden == false && imagesGridCollectionView.count > 0){ - collectionViewImagesGrid.isHidden = false - NSLayoutConstraint.deactivate(imagesGridConstraints) - NSLayoutConstraint.activate(imagesGridConstraintsWithRecording) - constraintGridWithTextLeading!.isActive = true - constraintGridWithTextTrailing!.isActive = true - NSLayoutConstraint.deactivate(recordingConstraints) - NSLayoutConstraint.activate(recordingConstraintsWithMediaGrid) - NSLayoutConstraint.deactivate(recordingWaveConstraints) - NSLayoutConstraint.activate(recordingWaveConstraintsWithMediaGrid) - imageViewBubble.image = nil - imageVideoViewBubble.image = nil - NSLayoutConstraint.deactivate(imageConstraints) - imageVideoViewBubble.isHidden = true - } - } - - if event.chatMessage!.reactions.count > 0 { - bubbleReaction.isHidden = false - bubbleReaction.backgroundColor = bubble.backgroundColor - if event.chatMessage?.isOutgoing == true { - bubbleReaction.trailingAnchor.constraint(equalTo: bubble.trailingAnchor, constant: -6).isActive = true - } else { - - bubbleReaction.leadingAnchor.constraint(equalTo: bubble.leadingAnchor, constant: 6).isActive = true - } - - bubble.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -14).isActive = true - - contentViewBubble.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -14).isActive = true - - chatRead.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -16).isActive = true - - event.chatMessage!.reactions.forEach { chatMessageReaction in - switch chatMessageReaction.body { - case "❤️": - if stackViewReactionsItem1.isHidden == false { - stackViewReactionsCounter.text = String(event.chatMessage!.reactions.count) - stackViewReactionsCounter.isHidden = false - } else { - stackViewReactionsItem1.isHidden = false - } - case "👍": - if stackViewReactionsItem2.isHidden == false { - stackViewReactionsCounter.text = String(event.chatMessage!.reactions.count) - stackViewReactionsCounter.isHidden = false - } else { - stackViewReactionsItem2.isHidden = false - } - case "😂": - if stackViewReactionsItem3.isHidden == false { - stackViewReactionsCounter.text = String(event.chatMessage!.reactions.count) - stackViewReactionsCounter.isHidden = false - } else { - stackViewReactionsItem3.isHidden = false - } - case "😮": - if stackViewReactionsItem4.isHidden == false { - stackViewReactionsCounter.text = String(event.chatMessage!.reactions.count) - stackViewReactionsCounter.isHidden = false - } else { - stackViewReactionsItem4.isHidden = false - } - case "😢": - if stackViewReactionsItem5.isHidden == false { - stackViewReactionsCounter.text = String(event.chatMessage!.reactions.count) - stackViewReactionsCounter.isHidden = false - } else { - stackViewReactionsItem5.isHidden = false - } - default: - if newStackViewReactionsItem.isHidden == false { - stackViewReactionsCounter.text = String(event.chatMessage!.reactions.count) - stackViewReactionsCounter.isHidden = false - } else { - newStackViewReactionsItem.text = chatMessageReaction.body - newStackViewReactionsItem.isHidden = false - } - } - } - - let tap = UITapGestureRecognizer(target: self, action: #selector(self.showMyViewControllerInACustomizedSheet(_:))) - bubbleReaction.addGestureRecognizer(tap) - } - }else{ - contentBubble.isHidden = true - NSLayoutConstraint.deactivate(constraintBubble) - constraintLeadingBubble?.isActive = false - constraintTrailingBubble?.isActive = false - imageUser.isHidden = true - - eventMessageView.isHidden = false - NSLayoutConstraint.activate(constraintEventMesssage) - NSLayoutConstraint.activate(constraintEventMesssageLabel) - - eventMessageLabel.text = setEvent(event: event) - - if (eventMessageLabel.text == VoipTexts.bubble_chat_event_message_left_group || eventMessageLabel.text!.hasPrefix(VoipTexts.bubble_chat_event_message_max_participant) || eventMessageLabel.text!.hasPrefix(VoipTexts.bubble_chat_event_message_lime_changed) || eventMessageLabel.text!.hasPrefix(VoipTexts.bubble_chat_event_message_attack_detected)) { - eventMessageLineView.backgroundColor = .red - eventMessageLabel.textColor = .red - } else { - eventMessageLineView.backgroundColor = UIColor("D").withAlphaComponent(0.6) - eventMessageLabel.textColor = UIColor("D").withAlphaComponent(0.6) - } - } - - if (editMode) { - - deleteItemCheckBox.isHidden = false - deleteItemCheckBox.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -18).isActive = true - deleteItemCheckBox.isSelected = selected - if (event.chatMessage != nil){ - deleteItemCheckBox.matchCenterYOf(view: contentBubble).done() - }else{ - deleteItemCheckBox.matchCenterYOf(view: contentView).done() - } - imageUser.isHidden = true - contentView.onClick { - if ChatConversationTableViewModel.sharedModel.editModeOn.value! { - self.deleteItemCheckBox.isSelected = !self.deleteItemCheckBox.isSelected - ChatConversationTableViewModel.sharedModel.messageListSelected.value![self.selfIndexMessage] = self.deleteItemCheckBox.isSelected - - if ChatConversationTableViewModel.sharedModel.messageListSelected.value![self.selfIndexMessage] == true { - ChatConversationTableViewModel.sharedModel.messageSelected.value! += 1 - }else{ - ChatConversationTableViewModel.sharedModel.messageSelected.value! -= 1 - } - } - } - deleteItemCheckBox.onClick { - if ChatConversationTableViewModel.sharedModel.editModeOn.value! { - self.deleteItemCheckBox.isSelected = !self.deleteItemCheckBox.isSelected - ChatConversationTableViewModel.sharedModel.messageListSelected.value![self.selfIndexMessage] = self.deleteItemCheckBox.isSelected - - if ChatConversationTableViewModel.sharedModel.messageListSelected.value![self.selfIndexMessage] == true { - ChatConversationTableViewModel.sharedModel.messageSelected.value! += 1 - }else{ - ChatConversationTableViewModel.sharedModel.messageSelected.value! -= 1 - } - } - } - }else{ - deleteItemCheckBox.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: 0).isActive = true - deleteItemCheckBox.isHidden = true - deleteItemCheckBox.width(0).done() - } - } - - @objc func showMyViewControllerInACustomizedSheet(_ sender: UITapGestureRecognizer? = nil) { - if #available(iOS 15.0, *) { - let sheetViewController = SheetViewController(chatMessageInit: chatMessage!) - if let sheetController = sheetViewController.sheetPresentationController { - sheetController.detents = [.medium()] - sheetController.prefersGrabberVisible = true - } - PhoneMainView.instance()!.present(sheetViewController, animated: true, completion: nil) - } - } - - func checkIfIsLinkOrPhoneNumber(content: String){ - let input = content - - let detector = try! NSDataDetector(types: NSTextCheckingResult.CheckingType.phoneNumber.rawValue | NSTextCheckingResult.CheckingType.link.rawValue) - - let regex = try! NSRegularExpression(pattern: "sips:(\\S+)") - - let matchesSips = detector.matches(in: input, options: [], range: NSRange(location: 0, length: input.utf16.count)) - matches = regex.matches(in: input, options: [], range: NSRange(location: 0, length: input.utf16.count)) - - for matcheSips in matchesSips { - matches.append(matcheSips) - } - - let paragraphStyle = NSMutableParagraphStyle() - paragraphStyle.lineSpacing = 1 - - let attributedString = NSMutableAttributedString.init(string: content, attributes: [ - NSAttributedString.Key.font: label.font as Any - ]) - - for match in matches { - let linkRange = match.range - let linkAttributes = [NSAttributedString.Key.foregroundColor: UIColor.blue, NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue] as [NSAttributedString.Key : Any] - attributedString.setAttributes(linkAttributes, range: linkRange) - } - - if matches.count > 0 { - label.isUserInteractionEnabled = true - let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTapOnLabel(_:))) - label.addGestureRecognizer(tap) - } - - label.attributedText = attributedString - } - - @objc func handleTapOnLabel(_ sender: UITapGestureRecognizer) { - matches.forEach { match in - if sender.didTapAttributedTextInLabel(label: label, inRange: match.range) { - - let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}" - let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx) - - if let url = match.url { - - if url.absoluteString.hasPrefix("sip:") || url.absoluteString.hasPrefix("sips:"){ - let view: DialerView = self.VIEW(DialerView.compositeViewDescription()) - CallManager.instance().nextCallIsTransfer = true - PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) - view.addressField.text = url.absoluteString - }else if emailTest.evaluate(with: url.absoluteString){ - if let urlWithMailTo = URL(string: "mailto:\(url.absoluteString)") { - if #available(iOS 10.0, *) { - UIApplication.shared.open(urlWithMailTo, options: [:], completionHandler: nil) - } else { - UIApplication.shared.openURL(urlWithMailTo) - } - } - }else{ - if #available(iOS 10.0, *) { - UIApplication.shared.open(url, options: [:], completionHandler: nil) - } else { - UIApplication.shared.openURL(url) - } - } - }else if let phoneNumber = match.phoneNumber { - let view: DialerView = self.VIEW(DialerView.compositeViewDescription()) - CallManager.instance().nextCallIsTransfer = true - PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) - view.addressField.text = phoneNumber - }else if let sips = label.attributedText { - let view: DialerView = self.VIEW(DialerView.compositeViewDescription()) - CallManager.instance().nextCallIsTransfer = true - PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) - view.addressField.text = (sips.string as NSString).substring(with: match.range) - } - } - } - } - - func addMessageDelegate(){ - chatMessageDelegate = ChatMessageDelegateStub( - onMsgStateChanged: { (message: ChatMessage, state: ChatMessage.State) -> Void in - self.displayImdnStatus(message: message, state: state) - }, - onNewMessageReaction: { (message: ChatMessage, messageReaction: ChatMessageReaction) -> Void in - ChatConversationTableViewModel.sharedModel.reloadCollectionViewCell() - }, - onReactionRemoved: { (message: ChatMessage, address: Address) -> Void in - ChatConversationTableViewModel.sharedModel.reloadCollectionViewCell() - }, - onFileTransferProgressIndication: { (message: ChatMessage, content: Content, offset: Int, total: Int) -> Void in - self.file_transfer_progress_indication_recv(message: message, content: content, offset: offset, total: total) - }, - onParticipantImdnStateChanged: { (message: ChatMessage, state: ParticipantImdnState) -> Void in - //self.displayImdnStatus(message: message, state: state) - } - ) - chatMessage?.addDelegate(delegate: chatMessageDelegate!) - } - - override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes { - label.preferredMaxLayoutWidth = (UIScreen.main.bounds.size.width*3/4) - layoutAttributes.bounds.size.height = systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height - - let cellsPerRow = 1 - let minimumInterItemSpacing = 1.0 - if window != nil { - let marginsAndInsets = window!.safeAreaInsets.left + window!.safeAreaInsets.right + minimumInterItemSpacing * CGFloat(cellsPerRow - 1) - layoutAttributes.bounds.size.width = ((window!.bounds.size.width - marginsAndInsets) / CGFloat(cellsPerRow)).rounded(.down) - } else { - layoutAttributes.bounds.size.width = (UIScreen.main.bounds.size.width / CGFloat(cellsPerRow)).rounded(.down) - } - return layoutAttributes - } - - func createThumbnailOfVideoFromFileURL(videoURL: String) -> UIImage? { - if let urlEncoded = videoURL.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed){ - if !urlEncoded.isEmpty { - if let urlVideo = URL(string: "file://" + urlEncoded){ - do { - let asset = AVAsset(url: urlVideo) - let assetImgGenerate = AVAssetImageGenerator(asset: asset) - assetImgGenerate.appliesPreferredTrackTransform = true - let img = try assetImgGenerate.copyCGImage(at: CMTimeMake(value: 1, timescale: 10), actualTime: nil) - let thumbnail = UIImage(cgImage: img) - return thumbnail - } catch _{ - return nil - } - } else { - return nil - } - } else { - return nil - } - } else { - return nil - } - } - - func resizeImage(image: UIImage, targetSize: CGSize) -> UIImage { - let size = image.size - - let widthRatio = targetSize.width / size.width - let heightRatio = targetSize.height / size.height - - // Figure out what our orientation is, and use that to form the rectangle - var newSize: CGSize - if(widthRatio > heightRatio) { - newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio) - } else { - newSize = CGSize(width: size.width * widthRatio, height: size.height * widthRatio) - } - - // This is the rect that we've calculated out and this is what is actually used below - let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height) - - // Actually do the resizing to the rect using the ImageContext stuff - UIGraphicsBeginImageContextWithOptions(newSize, true, 2.0) - image.draw(in: rect) - let newImage = UIGraphicsGetImageFromCurrentImageContext() - UIGraphicsEndImageContext() - - return newImage! - } - - //Audio - func playRecordedMessage(voiceRecorder: String?, recordingPlayButton: CallControlButton, recordingStopButton: CallControlButton, recordingWaveView: UIProgressView, message: ChatMessage) { - AudioPlayer.initSharedPlayer() - AudioPlayer.sharedModel.fileChanged.value = voiceRecorder - recordingPlayButton.isHidden = true - recordingStopButton.isHidden = false - - AudioPlayer.startSharedPlayer(voiceRecorder) - isPlayingVoiceRecording = true - - AudioPlayer.sharedModel.fileChanged.observe { file in - if (file != voiceRecorder && self.isPlayingVoiceRecording) { - self.stopVoiceRecordPlayer(recordingPlayButton: recordingPlayButton, recordingStopButton: recordingStopButton, recordingWaveView: recordingWaveView, message: message) - } - } - - recordingWaveView.progress = 1.0 - UIView.animate(withDuration: TimeInterval(Double(AudioPlayer.getSharedPlayer()!.duration) / 1000.00), delay: 0.0, options: .curveLinear, animations: { - recordingWaveView.layoutIfNeeded() - }, completion: { (finished: Bool) in - if (self.isPlayingVoiceRecording) { - self.stopVoiceRecordPlayer(recordingPlayButton: recordingPlayButton, recordingStopButton: recordingStopButton, recordingWaveView: recordingWaveView, message: message) - } - }) - } - - func recordingDuration(_ _voiceRecordingFile: String?) -> String? { - let core = Core.getSwiftObject(cObject: LinphoneManager.getLc()) - var result = "" - do{ - let linphonePlayer = try core.createLocalPlayer(soundCardName: nil, videoDisplayName: nil, windowId: nil) - if _voiceRecordingFile != nil { - try linphonePlayer.open(filename: _voiceRecordingFile!) - } - result = formattedDuration(linphonePlayer.duration) ?? "" - linphonePlayer.close() - }catch{ - Log.e(error.localizedDescription) - } - return result - } - - func formattedDuration(_ valueMs: Int) -> String? { - return String(format: "%02ld:%02ld", valueMs / 60000, (valueMs % 60000) / 1000) - } - - func stopVoiceRecordPlayer(recordingPlayButton: CallControlButton, recordingStopButton: CallControlButton, recordingWaveView: UIProgressView, message: ChatMessage) { - recordingView.subviews.forEach({ view in - view.removeFromSuperview() - }) - if(!recordingView.isHidden){ - initPlayerAudio(message: message) - } - recordingWaveView.progress = 0.0 - recordingWaveView.setProgress(recordingWaveView.progress, animated: false) - AudioPlayer.stopSharedPlayer() - recordingPlayButton.isHidden = false - recordingStopButton.isHidden = true - isPlayingVoiceRecording = false - } - - func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - if(collectionView == collectionViewReply){ - return replyCollectionView.count - }else{ - return imagesGridCollectionView.count - } - } - - @objc(collectionView:cellForItemAtIndexPath:) func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { - if(collectionView == collectionViewReply){ - let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellReplyMessage", for: indexPath) - let viewCell: UIView = UIView(frame: cell.contentView.frame) - cell.addSubview(viewCell) - let imageCell = replyCollectionView[indexPath.row] - var myImageView = UIImageView() - - if(replyContentCollection[indexPath.row].type == "image" || replyContentCollection[indexPath.row].type == "video"){ - myImageView = UIImageView(image: imageCell) - }else{ - let fileNameText = replyContentCollection[indexPath.row].name - let fileName = SwiftUtil.textToImage(drawText:fileNameText!, inImage:imageCell, forReplyBubble:true) - myImageView = UIImageView(image: fileName) - } - - myImageView.size(w: (viewCell.frame.width), h: (viewCell.frame.height)).done() - viewCell.addSubview(myImageView) - - if(replyContentCollection[indexPath.row].type == "video"){ - var imagePlay = UIImage() - if #available(iOS 13.0, *) { - imagePlay = (UIImage(named: "vr_play")!.withTintColor(.white)) - } else { - imagePlay = UIImage(named: "vr_play")! - } - let myImagePlayView = UIImageView(image: imagePlay) - viewCell.addSubview(myImagePlayView) - myImagePlayView.size(w: viewCell.frame.width/4, h: viewCell.frame.height/4).done() - myImagePlayView.alignHorizontalCenterWith(viewCell).alignVerticalCenterWith(viewCell).done() - } - myImageView.contentMode = .scaleAspectFill - myImageView.clipsToBounds = true - - return cell - }else{ - let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellImagesGridMessage", for: indexPath) - let indexPathWithoutNil = indexPath.row - let indexPathWithoutNilWithRecording = indexPathWithoutNil + (messageWithRecording ? 1 : 0) - - if (chatMessage != nil && imagesGridCollectionView.count > indexPathWithoutNil && chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer}).count > indexPathWithoutNilWithRecording){ - if ((indexPathWithoutNil <= imagesGridCollectionView.count - 1) && (imagesGridCollectionView[indexPathWithoutNil] != nil) && (chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording].isFile == true || chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording].isFileTransfer == true)) { - let viewCell: UIView = UIView(frame: cell.contentView.frame) - cell.addSubview(viewCell) - if (chatMessage!.isOutgoing == false && (chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording].filePath == "" || chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording].isFileTransfer == true)) { - let downloadView = DownloadMessageCell() - downloadContentCollection.append(downloadView) - downloadView.content = chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording] - downloadView.size(w: 138, h: 138).done() - viewCell.addSubview(downloadView) - - if chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording].name != nil { - downloadView.downloadNameLabel.text = chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording].name!.replacingOccurrences(of: ((chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording].name!.dropFirst(6).dropLast(8))), with: "...") - downloadView.setFileType(fileName: (chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording].name)!) - } else { - downloadView.downloadNameLabel.text = "" - } - - let underlineAttribute = [NSAttributedString.Key.underlineStyle: NSUnderlineStyle.thick.rawValue] - let underlineAttributedString = NSAttributedString(string: "\(VoipTexts.bubble_chat_download_file) (\(String(format: "%.1f", Float(((chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording].fileSize))) / 1000000)) Mo)", attributes: underlineAttribute) - downloadView.downloadButtonLabel.attributedText = underlineAttributedString - downloadView.downloadButtonLabel.onClick { - if (self.chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording].name) != nil { - self.chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording].filePath = LinphoneManager.imagesDirectory() + (((self.chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording].name)!)) - let _ = self.chatMessage!.downloadContent(content: (self.chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording])) - } - } - downloadView.downloadButtonLabel.isUserInteractionEnabled = true - - if((linphone_core_get_max_size_for_auto_download_incoming_files(LinphoneManager.getLc()) > -1 && self.chatMessage!.isFileTransferInProgress) || self.chatMessage!.isOutgoing){ - downloadView.downloadButtonLabel.isHidden = true - } - } else if imagesGridCollectionView[indexPathWithoutNil] != nil { - downloadContentCollection.append(nil) - - let myImageView = UIImageView() - - - myImageView.image = getImageFrom(chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording], forReplyBubble: false) - - myImageView.size(w: (viewCell.frame.width), h: (viewCell.frame.height)).done() - viewCell.addSubview(myImageView) - - myImageView.contentMode = .scaleAspectFill - myImageView.clipsToBounds = true - - if (chatMessage!.isOutgoing == true && (chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording].filePath == "" || chatMessage!.isFileTransferInProgress == true)){ - let uploadView = UploadMessageCell() - uploadContentCollection.append(uploadView) - uploadView.content = chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording] - uploadView.size(w: 138, h: 138).done() - - if(chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording].type == "video"){ - var imagePlay = UIImage() - if #available(iOS 13.0, *) { - imagePlay = (UIImage(named: "vr_play")!.withTintColor(.white)) - } else { - imagePlay = UIImage(named: "vr_play")! - } - let myImagePlayView = UIImageView(image: imagePlay) - viewCell.addSubview(myImagePlayView) - myImagePlayView.size(w: viewCell.frame.width/4, h: viewCell.frame.height/4).done() - myImagePlayView.alignHorizontalCenterWith(viewCell).alignVerticalCenterWith(viewCell).done() - } - - viewCell.addSubview(uploadView) - - } - } - if(imagesGridCollectionView[indexPathWithoutNil] != nil){ - var extensionFile = "" - if chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording].filePath != nil { - extensionFile = chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording].filePath!.lowercased().components(separatedBy: ".").last ?? "" - } - if(chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording].type == "video" || (["mkv", "avi", "mov", "mp4"].contains(extensionFile))){ - var imagePlay = UIImage() - if #available(iOS 13.0, *) { - imagePlay = (UIImage(named: "vr_play")!.withTintColor(.white)) - } else { - imagePlay = UIImage(named: "vr_play")! - } - let myImagePlayView = UIImageView(image: imagePlay) - viewCell.addSubview(myImagePlayView) - myImagePlayView.size(w: viewCell.frame.width/4, h: viewCell.frame.height/4).done() - myImagePlayView.alignHorizontalCenterWith(viewCell).alignVerticalCenterWith(viewCell).done() - } - - if chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording].filePath != nil && chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexPathWithoutNilWithRecording].filePath != "" { - viewCell.onClick { - if !self.chatMessage!.isFileTransferInProgress { - ChatConversationTableViewModel.sharedModel.onGridClick(indexMessage: self.selfIndexMessage, index: indexPathWithoutNil) - } - } - } - } - } - } - return cell - } - } - - func getImageFrom(_ content: Content?, forReplyBubble: Bool) -> UIImage? { - var filePath = "" - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - filePath = content!.exportPlainFile() - } else if content?.filePath != nil { - filePath = content!.filePath! - } - let type = content?.type - let name = content?.name - if filePath == "" { - filePath = LinphoneManager.validFilePath(name) - } - - var image: UIImage? = nil - if type == "video" { - image = createThumbnailOfVideoFromFileURL(videoURL: filePath) - } else if type == "image" { - image = UIImage(named: filePath) - } else { - let extensionFile = filePath.lowercased().components(separatedBy: ".").last - if (["png", "jpg", "jpeg", "bmp", "heic"].contains(extensionFile ?? "")){ - image = UIImage(named: filePath) - } else if (["mkv", "avi", "mov", "mp4"].contains(extensionFile ?? "")){ - image = createThumbnailOfVideoFromFileURL(videoURL: filePath) - } - } - - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - ChatConversationViewModel.sharedModel.removeTmpFile(filePath: filePath) - filePath = "" - } - - if let img = image { - return img - } else { - if (name == ""){ - return getImageFromFileName(filePath, forReplyBubble: forReplyBubble) - } else { - return getImageFromFileName(name, forReplyBubble: forReplyBubble) - } - } - } - - func getImageFromFileName(_ fileName: String?, forReplyBubble forReplyBubbble: Bool) -> UIImage? { - let extensionFile = fileName?.lowercased().components(separatedBy: ".").last - var image: UIImage? - var text = fileName - if fileName?.contains("voice-recording") ?? false { - image = UIImage(named: "file_voice_default") - text = recordingDuration(LinphoneManager.validFilePath(fileName)) - } else { - if extensionFile == "pdf" { - image = UIImage(named: "file_pdf_default") - } else if ["png", "jpg", "jpeg", "bmp", "heic"].contains(extensionFile ?? "") { - image = UIImage(named: "file_picture_default") - } else if ["mkv", "avi", "mov", "mp4"].contains(extensionFile ?? "") { - image = UIImage(named: "file_video_default") - } else if ["wav", "au", "m4a"].contains(extensionFile ?? "") { - image = UIImage(named: "file_audio_default") - } else { - image = UIImage(named: "file_default") - } - } - - return SwiftUtil.textToImage(drawText: text ?? "", inImage: (image ?? UIImage(named: "file_default"))!, forReplyBubble: forReplyBubbble) - } - - func setEvent(event: EventLog) -> String { - var subject = "" - var participant = "" - switch (event.type.rawValue) { - case Int(LinphoneEventLogTypeConferenceSubjectChanged.rawValue): - subject = event.subject! - return VoipTexts.bubble_chat_event_message_new_subject + subject - case Int(LinphoneEventLogTypeConferenceParticipantAdded.rawValue): - participant = (event.participantAddress!.displayName != nil && event.participantAddress!.displayName != "" ? event.participantAddress!.displayName : event.participantAddress!.username)! - return participant + VoipTexts.bubble_chat_event_message_has_joined - case Int(LinphoneEventLogTypeConferenceParticipantRemoved.rawValue): - participant = (event.participantAddress!.displayName != nil && event.participantAddress!.displayName != "" ? event.participantAddress!.displayName : event.participantAddress!.username)! - return participant + VoipTexts.bubble_chat_event_message_has_left - case Int(LinphoneEventLogTypeConferenceParticipantSetAdmin.rawValue): - participant = (event.participantAddress!.displayName != nil && event.participantAddress!.displayName != nil && event.participantAddress!.displayName != "" ? event.participantAddress!.displayName : event.participantAddress!.username)! - return participant + VoipTexts.bubble_chat_event_message_now_admin - case Int(LinphoneEventLogTypeConferenceParticipantUnsetAdmin.rawValue): - participant = (event.participantAddress!.displayName != "" && event.participantAddress!.displayName != nil ? event.participantAddress!.displayName : event.participantAddress!.username)! - return participant + VoipTexts.bubble_chat_event_message_no_longer_admin - case Int(LinphoneEventLogTypeConferenceTerminated.rawValue): - return VoipTexts.bubble_chat_event_message_left_group - case Int(LinphoneEventLogTypeConferenceCreated.rawValue): - return VoipTexts.bubble_chat_event_message_joined_group - case Int(LinphoneEventLogTypeConferenceSecurityEvent.rawValue): - let type = event.securityEventType - let participant = event.securityEventFaultyDeviceAddress!.displayName != nil && event.securityEventFaultyDeviceAddress!.displayName != "" ? event.securityEventFaultyDeviceAddress!.displayName : event.securityEventFaultyDeviceAddress!.username - switch (type.rawValue) { - case Int(LinphoneSecurityEventTypeSecurityLevelDowngraded.rawValue): - if (participant != nil && participant!.isEmpty){ - return VoipTexts.bubble_chat_event_message_security_level_decreased - }else{ - return VoipTexts.bubble_chat_event_message_security_level_decreased_because + participant! - } - case Int(LinphoneSecurityEventTypeParticipantMaxDeviceCountExceeded.rawValue): - if (participant != nil && participant!.isEmpty){ - return VoipTexts.bubble_chat_event_message_max_participant - }else{ - return VoipTexts.bubble_chat_event_message_max_participant_by + participant! - } - case Int(LinphoneSecurityEventTypeEncryptionIdentityKeyChanged.rawValue): - if (participant != nil && participant!.isEmpty){ - return VoipTexts.bubble_chat_event_message_lime_changed - }else{ - return VoipTexts.bubble_chat_event_message_lime_changed_for + participant! - } - case Int(LinphoneSecurityEventTypeManInTheMiddleDetected.rawValue): - if (participant != nil && participant!.isEmpty){ - return VoipTexts.bubble_chat_event_message_attack_detected - }else{ - return VoipTexts.bubble_chat_event_message_attack_detected_for + participant! - } - default: - return "" - } - case Int(LinphoneEventLogTypeConferenceEphemeralMessageDisabled.rawValue): - return VoipTexts.bubble_chat_event_message_disabled_ephemeral - case Int(LinphoneEventLogTypeConferenceEphemeralMessageEnabled.rawValue): - return VoipTexts.bubble_chat_event_message_enabled_ephemeral - case Int(LinphoneEventLogTypeConferenceEphemeralMessageLifetimeChanged.rawValue): - return VoipTexts.bubble_chat_event_message_expiry_ephemeral + formatEphemeralExpiration(duration: event.ephemeralMessageLifetime) - default: - return "" - } - } - - func formatEphemeralExpiration(duration: CLong) -> String{ - switch (duration) { - case 0: - return VoipTexts.bubble_chat_event_message_ephemeral_disable - case 60: - return VoipTexts.bubble_chat_event_message_ephemeral_one_minute - case 3600: - return VoipTexts.bubble_chat_event_message_ephemeral_one_hour - case 86400: - return VoipTexts.bubble_chat_event_message_ephemeral_one_day - case 259200: - return VoipTexts.bubble_chat_event_message_ephemeral_three_days - case 604800: - return VoipTexts.bubble_chat_event_message_ephemeral_one_week - default: - return VoipTexts.bubble_chat_event_message_ephemeral_unexpected_duration - } - } - - func file_transfer_progress_indication_recv(message: ChatMessage, content: Content, offset: Int, total: Int) { - let p = Float(offset) / Float(total) - if ((imagesGridCollectionView.count) > 0 && !content.isVoiceRecording){ - if !message.isOutgoing { - if (indexTransferProgress == -1) { - for indexItem in 0...(imagesGridCollectionView.count) - 1 { - if chatMessage != nil && chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexItem].name == content.name { - indexTransferProgress = indexItem - (messageWithRecording ? 1 : 0) - break - } - } - - if (indexTransferProgress > -1 && downloadContentCollection[indexTransferProgress] != nil) { - downloadContentCollection[indexTransferProgress]!.downloadButtonLabel.isHidden = true - downloadContentCollection[indexTransferProgress]!.circularProgressBarView.isHidden = false - } - } - DispatchQueue.main.async(execute: { [self] in - if (indexTransferProgress > -1 && offset == total) { - downloadContentCollection[indexTransferProgress] = nil - imagesGridCollectionView[indexTransferProgress] = getImageFrom(content, forReplyBubble: false)! - - - if (imagesGridCollectionView.count <= 1){ - if content.type == "video" { - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - var plainFile = content.exportPlainFile() - if let imageMessage = createThumbnailOfVideoFromFileURL(videoURL: plainFile){ - imageVideoViewBubble.image = resizeImage(image: imageMessage, targetSize: CGSize(width: UIScreen.main.bounds.size.width*3/4, height: 300.0)) - if (imageVideoViewBubble.image != nil && imagesGridCollectionView.count <= 1){ - ChatConversationTableViewModel.sharedModel.reloadCollectionViewCell() - } - } - - ChatConversationViewModel.sharedModel.removeTmpFile(filePath: plainFile) - plainFile = "" - }else{ - if let imageMessage = createThumbnailOfVideoFromFileURL(videoURL: content.filePath!){ - imageVideoViewBubble.image = resizeImage(image: imageMessage, targetSize: CGSize(width: UIScreen.main.bounds.size.width*3/4, height: 300.0)) - if (imageVideoViewBubble.image != nil && imagesGridCollectionView.count <= 1){ - ChatConversationTableViewModel.sharedModel.reloadCollectionViewCell() - } - } - } - } else if content.type == "image" { - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - var plainFile = content.exportPlainFile() - if let imageMessage = UIImage(named: plainFile){ - imageViewBubble.image = resizeImage(image: imageMessage, targetSize: CGSize(width: UIScreen.main.bounds.size.width*3/4, height: 300.0)) - if (imageViewBubble.image != nil && imagesGridCollectionView.count <= 1){ - ChatConversationTableViewModel.sharedModel.reloadCollectionViewCell() - } - } - - ChatConversationViewModel.sharedModel.removeTmpFile(filePath: plainFile) - plainFile = "" - }else{ - if let imageMessage = UIImage(named: content.filePath!){ - imageViewBubble.image = resizeImage(image: imageMessage, targetSize: CGSize(width: UIScreen.main.bounds.size.width*3/4, height: 300.0)) - if (imageViewBubble.image != nil && imagesGridCollectionView.count <= 1){ - ChatConversationTableViewModel.sharedModel.reloadCollectionViewCell() - } - } - } - } else { - ChatConversationTableViewModel.sharedModel.reloadCollectionViewCell() - indexTransferProgress = -1 - } - }else{ - ChatConversationTableViewModel.sharedModel.reloadCollectionViewCell() - indexTransferProgress = -1 - } - - if !VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) && ConfigManager.instance().lpConfigBoolForKey(key: "auto_write_to_gallery_preference") { - ChatConversationViewModel.sharedModel.writeMediaToGalleryFromName(content.name, fileType: content.type) - } - - } else { - if (indexTransferProgress > -1 && downloadContentCollection[indexTransferProgress] != nil && indexTransferProgress > -1) { - downloadContentCollection[indexTransferProgress]!.setUpCircularProgressBarView(toValue: p) - } - if (indexTransferProgress == -1 && imagesGridCollectionView.count == 1 && messageWithRecording){ - indexTransferProgress = 0 - downloadContentCollection[indexTransferProgress]!.circularProgressBarView.isHidden = false - downloadContentCollection[indexTransferProgress]!.setUpCircularProgressBarView(toValue: p) - } - } - }) - } else { - if((imagesGridCollectionView.count) > 0){ - if (indexUploadTransferProgress == -1) { - for indexItem in 0...(imagesGridCollectionView.count) - 1 { - if chatMessage != nil && chatMessage!.contents.filter({$0.isFile || $0.isFileTransfer})[indexItem].filePath == content.filePath { - indexUploadTransferProgress = indexItem - (messageWithRecording ? 1 : 0) - break - } - } - } - DispatchQueue.main.async(execute: { [self] in - - if uploadContentCollection.indices.contains(indexUploadTransferProgress){ - if (offset == total) { - if(indexUploadTransferProgress >= 0){ - uploadContentCollection[indexUploadTransferProgress]!.circularProgressBarView.isHidden = true - } - if indexUploadTransferProgress + 1 < (imagesGridCollectionView.count) + (messageWithRecording ? 1 : 0) && chatMessage != nil && chatMessage!.contents.count > 1 { - indexUploadTransferProgress += 1 - }else{ - ChatConversationTableViewModel.sharedModel.reloadCollectionViewCell() - indexUploadTransferProgress = -1 - } - } else { - if((imagesGridCollectionView.count) > 0 && indexUploadTransferProgress > -1){ - uploadContentCollection[indexUploadTransferProgress]!.circularProgressBarView.isHidden = false - uploadContentCollection[indexUploadTransferProgress]!.setUpCircularProgressBarView(toValue: p) - } - if (indexUploadTransferProgress == -1 && imagesGridCollectionView.count == 1 && messageWithRecording){ - indexUploadTransferProgress = 0 - uploadContentCollection[indexUploadTransferProgress]!.circularProgressBarView.isHidden = false - uploadContentCollection[indexUploadTransferProgress]!.setUpCircularProgressBarView(toValue: p) - } - } - } - }) - } - if((imagesGridCollectionView.count) == 1){ - var filePath = "" - if VFSUtil.vfsEnabled(groupName: kLinphoneMsgNotificationAppGroupId) { - filePath = content.exportPlainFile() - }else { - filePath = content.filePath! - } - - let extensionFile = filePath.lowercased().components(separatedBy: ".").last - if (offset == total) { - if (["png", "jpg", "jpeg", "bmp", "heic"].contains(extensionFile ?? "")){ - NSLayoutConstraint.deactivate(progressBarImageConstraints) - circularProgressBarImageView.isHidden = true - } else{ - NSLayoutConstraint.deactivate(progressBarVideoConstraints) - circularProgressBarVideoView.isHidden = true - } - - } else { - if (["png", "jpg", "jpeg", "bmp", "heic"].contains(extensionFile ?? "")){ - NSLayoutConstraint.activate(progressBarImageConstraints) - circularProgressBarImageView.isHidden = false - circularProgressBarImageLabel.text = "\(Int(p*100))%" - circularProgressBarImageLabel.center = CGPoint(x: 69, y: 69) - circularProgressBarImageView.progressAnimation(fromValue: fromValue, toValue: p) - } else{ - NSLayoutConstraint.activate(progressBarVideoConstraints) - circularProgressBarVideoView.isHidden = false - circularProgressBarVideoLabel.text = "\(Int(p*100))%" - circularProgressBarVideoLabel.center = CGPoint(x: 69, y: 69) - circularProgressBarVideoView.progressAnimation(fromValue: fromValue, toValue: p) - } - - fromValue = p - } - } - } - } - } - - func displayImdnStatus(message: ChatMessage, state: ChatMessage.State) { - if message.isOutgoing { - if (state == ChatMessage.State.DeliveredToUser) { - chatRead.image = UIImage(named: "chat_delivered.png") - chatRead.isHidden = false - } else if (state == ChatMessage.State.Displayed) { - chatRead.image = UIImage(named: "chat_read.png") - chatRead.isHidden = false - } else if (state == ChatMessage.State.NotDelivered || state == ChatMessage.State.FileTransferError) { - chatRead.image = UIImage(named: "chat_error") - chatRead.isHidden = false - } else { - chatRead.isHidden = true - } - } - } - - func contactDateForChat(message: ChatMessage) -> String { - let address: Address? = message.fromAddress != nil ? message.fromAddress : message.chatRoom?.peerAddress - return LinphoneUtils.time(toString: message.time, with: LinphoneDateChatBubble) + " - " + FastAddressBook.displayName(for: address?.getCobject) - } - - func isFirstIndexInTableView(indexPath: IndexPath, chat: ChatMessage) -> Bool{ - let MAX_AGGLOMERATED_TIME=300 - var previousEvent : EventLog? = nil - let indexOfPreviousEvent = indexPath.row + 1 - previousEvent = ChatConversationTableViewModel.sharedModel.getMessage(index: indexPath.row+1) - if (indexOfPreviousEvent > -1 && indexOfPreviousEvent < ChatConversationTableViewModel.sharedModel.getNBMessages()) { - if (previousEvent?.type != nil && (previousEvent?.type.rawValue)! != LinphoneEventLogTypeConferenceChatMessage.rawValue) { - return true - } - } - if (previousEvent == nil){ - return true - } - - let previousChat = previousEvent?.chatMessage - - if previousChat != nil { - if (previousChat?.fromAddress!.equal(address2: chat.fromAddress!) == false) { - return true; - } - // the maximum interval between 2 agglomerated chats at 5mn - if (chat.time - previousChat!.time > MAX_AGGLOMERATED_TIME) { - return true; - } - } - - return false; - } - - func updateEphemeralTimes() { - let f = DateComponentsFormatter() - f.unitsStyle = .positional - f.zeroFormattingBehavior = [.pad] - - if ((chatMessage != nil) && chatMessage!.isEphemeral) { - let duration = self.chatMessage?.ephemeralExpireTime == 0 ? self.chatMessage?.ephemeralLifetime : self.chatMessage!.ephemeralExpireTime - Int(Date().timeIntervalSince1970) - if(duration! > 86400){ - f.allowedUnits = [.day] - }else if(duration! > 3600){ - f.allowedUnits = [.hour] - }else{ - f.allowedUnits = [.minute, .second] - } - - let textDuration = f.string(for: DateComponents(second: duration))?.capitalized ?? "" - self.ephemeralTimerLabel.text = textDuration - self.ephemeralTimerLabel.isHidden = false - self.ephemeralIcon.isHidden = false - ephemeralTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in - var duration = 0 - if self.chatMessage != nil && self.chatMessage?.ephemeralLifetime != nil { - duration = self.chatMessage?.ephemeralExpireTime == 0 ? self.chatMessage!.ephemeralLifetime : self.chatMessage!.ephemeralExpireTime - Int(Date().timeIntervalSince1970) - if(duration > 86400){ - f.allowedUnits = [.day] - }else if(duration > 3600){ - f.allowedUnits = [.hour] - }else{ - f.allowedUnits = [.minute, .second] - } - } else { - duration = 0 - } - - let textDuration = f.string(for: DateComponents(second: duration))?.capitalized ?? "" - self.ephemeralTimerLabel.text = textDuration - self.ephemeralTimerLabel.isHidden = false - self.ephemeralIcon.isHidden = false - if(duration <= 0){ - if self.ephemeralTimer != nil { - self.ephemeralTimer!.invalidate() - } - ChatConversationTableViewModel.sharedModel.reloadCollectionViewCell() - } - } - } - } -} - -class DynamicHeightCollectionView: UICollectionView { - override func layoutSubviews() { - super.layoutSubviews() - if !__CGSizeEqualToSize(bounds.size, self.intrinsicContentSize) { - self.invalidateIntrinsicContentSize() - } - } - - override var intrinsicContentSize: CGSize { - return contentSize - } -} - -extension UITapGestureRecognizer { - - func didTapAttributedTextInLabel(label: UILabel, inRange targetRange: NSRange) -> Bool { - // Create instances of NSLayoutManager, NSTextContainer and NSTextStorage - let layoutManager = NSLayoutManager() - let textContainer = NSTextContainer(size: CGSize.zero) - let textStorage = NSTextStorage(attributedString: label.attributedText!) - - // Configure layoutManager and textStorage - layoutManager.addTextContainer(textContainer) - textStorage.addLayoutManager(layoutManager) - - // Configure textContainer - textContainer.lineFragmentPadding = 0.0 - textContainer.lineBreakMode = label.lineBreakMode - textContainer.maximumNumberOfLines = label.numberOfLines - let labelSize = label.bounds.size - textContainer.size = labelSize - - // Find the tapped character location and compare it to the specified range - let locationOfTouchInLabel = self.location(in: label) - let textBoundingBox = layoutManager.usedRect(for: textContainer) - let textContainerOffset = CGPoint( - x: (labelSize.width - textBoundingBox.size.width) * 0.5 - textBoundingBox.origin.x, - y: (labelSize.height - textBoundingBox.size.height) * 0.5 - textBoundingBox.origin.y - ) - let locationOfTouchInTextContainer = CGPoint( - x: locationOfTouchInLabel.x - textContainerOffset.x, - y: locationOfTouchInLabel.y - textContainerOffset.y - ) - let indexOfCharacter = layoutManager.characterIndex(for: locationOfTouchInTextContainer, in: textContainer, fractionOfDistanceBetweenInsertionPoints: nil) - - return NSLocationInRange(indexOfCharacter, targetRange) - } - -} diff --git a/Classes/Swift/Chat/Views/UploadMessageCell.swift b/Classes/Swift/Chat/Views/UploadMessageCell.swift deleted file mode 100644 index 99f856449..000000000 --- a/Classes/Swift/Chat/Views/UploadMessageCell.swift +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import linphonesw - -class UploadMessageCell: UIView { - var circularProgressBarView = CircularProgressBarView() - let circularProgressBarLabel = StyledLabel(VoipTheme.chat_conversation_download_progress_text) - - var content: Content? = nil - var fromValue : Float = 0.0 - - override init(frame: CGRect) { - super.init(frame: frame) - self.layer.zPosition = 10 - addSubview(circularProgressBarView) - circularProgressBarView.isHidden = true - circularProgressBarLabel.text = "0%" - circularProgressBarLabel.size(w: 30, h: 30).done() - circularProgressBarView.addSubview(circularProgressBarLabel) - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - func setUpCircularProgressBarView(toValue: Float) { - - circularProgressBarLabel.text = "\(Int(toValue*100))%" - circularProgressBarLabel.center = CGPoint(x: 69, y: 69) - - - circularProgressBarView.progressAnimation(fromValue: fromValue, toValue: toValue) - fromValue = toValue - } -} diff --git a/Classes/Swift/Conference/Data/Duration.swift b/Classes/Swift/Conference/Data/Duration.swift deleted file mode 100644 index 46e7954ef..000000000 --- a/Classes/Swift/Conference/Data/Duration.swift +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2010-2021 Belledonne Communications SARL. - * - * This file is part of linphone-android - * (see https://www.linphone.org). - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import Foundation - -struct Duration : Comparable { - static func < (lhs: Duration, rhs: Duration) -> Bool { - return lhs.value < rhs.value - } - - let value: Int - let display: String -} diff --git a/Classes/Swift/Conference/Data/Mode.swift b/Classes/Swift/Conference/Data/Mode.swift deleted file mode 100644 index bdfbe71cb..000000000 --- a/Classes/Swift/Conference/Data/Mode.swift +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2010-2021 Belledonne Communications SARL. - * - * This file is part of linphone-android - * (see https://www.linphone.org). - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import Foundation - -struct Mode : Comparable { - static func < (lhs: Mode, rhs: Mode) -> Bool { - return lhs.value < rhs.value - } - - let value: Int - let display: String -} diff --git a/Classes/Swift/Conference/Data/ScheduledConferenceData.swift b/Classes/Swift/Conference/Data/ScheduledConferenceData.swift deleted file mode 100644 index 9ee0d07ac..000000000 --- a/Classes/Swift/Conference/Data/ScheduledConferenceData.swift +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (c) 2010-2021 Belledonne Communications SARL. - * - * This file is part of linphone-android - * (see https://www.linphone.org). - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import linphonesw - - -class ScheduledConferenceData { - - let conferenceInfo: ConferenceInfo - let expanded = MutableLiveData() - let address = MutableLiveData() - let subject = MutableLiveData() - let description = MutableLiveData() - let time = MutableLiveData() - let date = MutableLiveData() - let duration = MutableLiveData() - let organizer = MutableLiveData() - let participantsShort = MutableLiveData() - let participantsExpanded = MutableLiveData() - let participantsGuestExpanded = MutableLiveData() - let rawDate : Date - let isConferenceCancelled = MutableLiveData(false) - let canEdit = MutableLiveData(false) - let isFinished : Bool - let selectedForDeletion = MutableLiveData(false) - private var conferenceSchedulerDelegate : ConferenceSchedulerDelegateStub? = nil - private var conferenceScheduler : ConferenceScheduler? = nil - - var isBroadcast = false - - init (conferenceInfo: ConferenceInfo, isFinished: Bool = false) { - self.conferenceInfo = conferenceInfo - self.isFinished = isFinished - expanded.value = false - - address.value = conferenceInfo.uri?.asStringUriOnly() - subject.value = conferenceInfo.subject - description.value = conferenceInfo.description - - time.value = TimestampUtils.timeToString(unixTimestamp: Double(conferenceInfo.dateTime)) - date.value = TimestampUtils.toString(unixTimestamp:Double(conferenceInfo.dateTime), onlyDate:true, shortDate:false) - rawDate = Date(timeIntervalSince1970:TimeInterval(conferenceInfo.dateTime)) - - let durationFormatter = DateComponentsFormatter() - durationFormatter.unitsStyle = .abbreviated - duration.value = conferenceInfo.duration > 0 ? durationFormatter.string(from: TimeInterval(conferenceInfo.duration*60)) : nil - - organizer.value = conferenceInfo.organizer?.addressBookEnhancedDisplayName() - - computeParticipantsLists() - - isConferenceCancelled.value = conferenceInfo.state == .Cancelled - - if let organizerAddress = conferenceInfo.organizer { - let localAccount = Core.get().accountList.filter { account in - account.params?.identityAddress != nil && organizerAddress.weakEqual(address2: account.params!.identityAddress!) - }.first - canEdit.value = localAccount != nil - } else { - canEdit.value = false - Log.e("[Scheduled Conference] No organizer SIP URI found for: \(conferenceInfo.uri?.asStringUriOnly())") - } - } - - func destroy() { - } - - func toggleExpand() { - expanded.value = expanded.value == false - } - - private func computeParticipantsLists() { - participantsShort.value = conferenceInfo.participants.map {(participant) in - String(describing: participant.addressBookEnhancedDisplayName()) - }.joined(separator: ", ") - - if (participantsShort.value?.count == 0) { - participantsShort.value = " " - } - - isBroadcast = conferenceInfo.participantInfos.filter({$0.role == .Speaker}).count != 0 && conferenceInfo.participantInfos.filter({$0.role == .Listener}).count != 0 - - if isBroadcast { - participantsExpanded.value = conferenceInfo.participantInfos.filter({$0.role == .Speaker}).map {(participant) in - String(describing: participant.address!.addressBookEnhancedDisplayName())+" ("+String(describing: participant.address!.asStringUriOnly())+")" - }.joined(separator: "\n") - } else { - participantsExpanded.value = conferenceInfo.participantInfos.map {(participant) in - String(describing: participant.address!.addressBookEnhancedDisplayName())+" ("+String(describing: participant.address!.asStringUriOnly())+")" - }.joined(separator: "\n") - } - - participantsGuestExpanded.value = conferenceInfo.participantInfos.filter({$0.role == .Listener}).map {(participant) in - String(describing: participant.address!.addressBookEnhancedDisplayName())+" ("+String(describing: participant.address!.asStringUriOnly())+")" - }.joined(separator: "\n") - } - - func gotoAssociatedChat() { - - } - - func deleteConference() { - conferenceSchedulerDelegate = ConferenceSchedulerDelegateStub( - onStateChanged: { scheduler, state in - Log.i("[Conference Deletion] Conference scheduler state is \(state)") - if (state == .Ready) { - if let chatRoomParams = ConferenceSchedulingViewModel.shared.getConferenceInvitationsChatRoomParams() { - scheduler.sendInvitations(chatRoomParams: chatRoomParams) // Send cancel ICS - Log.e("[Conference Deletion] sent cancel ICS.") - } - } - }) - - if (conferenceInfo.state != .Cancelled && canEdit.value == true) { - Log.i("[Scheduled Conferences] Cancelling conference \(conferenceInfo.subject)") - self.conferenceScheduler = try? Core.get().createConferenceScheduler() - if (self.conferenceScheduler != nil) { - self.conferenceScheduler?.addDelegate(delegate: conferenceSchedulerDelegate!) - self.conferenceScheduler?.cancelConference(conferenceInfo: conferenceInfo) - } - } else { - Core.get().deleteConferenceInformation(conferenceInfo: conferenceInfo) - } - } -} diff --git a/Classes/Swift/Conference/Data/TimeZoneData.swift b/Classes/Swift/Conference/Data/TimeZoneData.swift deleted file mode 100644 index 0cbd3a0ae..000000000 --- a/Classes/Swift/Conference/Data/TimeZoneData.swift +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2010-2021 Belledonne Communications SARL. - * - * This file is part of linphone-android - * (see https://www.linphone.org). - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import linphonesw - - -struct TimeZoneData : Comparable { - let timeZone: TimeZone - - static func == (lhs: TimeZoneData, rhs: TimeZoneData) -> Bool { - return lhs.timeZone.identifier == rhs.timeZone.identifier - } - - static func < (lhs: TimeZoneData, rhs: TimeZoneData) -> Bool { - return lhs.timeZone.secondsFromGMT() < rhs.timeZone.secondsFromGMT() - - } - - func descWithOffset() -> String { - return "\(timeZone.identifier) - GMT\(timeZone.offsetInHours())" - } -} - -extension TimeZone { - - func offsetFromUTC() -> String - { - let localTimeZoneFormatter = DateFormatter() - localTimeZoneFormatter.timeZone = self - localTimeZoneFormatter.dateFormat = "Z" - return localTimeZoneFormatter.string(from: Date()) - } - - func offsetInHours() -> String - { - - let hours = secondsFromGMT()/3600 - let minutes = abs(secondsFromGMT()/60) % 60 - let tz_hr = String(format: "%+.2d:%.2d", hours, minutes) // "+hh:mm" - return tz_hr - } -} diff --git a/Classes/Swift/Conference/ViewModels/ConferenceSchedulingViewModel.swift b/Classes/Swift/Conference/ViewModels/ConferenceSchedulingViewModel.swift deleted file mode 100644 index 7b0782a88..000000000 --- a/Classes/Swift/Conference/ViewModels/ConferenceSchedulingViewModel.swift +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Copyright (c) 2010-2021 Belledonne Communications SARL. - * - * This file is part of linphone-android - * (see https://www.linphone.org). - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * aDouble with this program. If not, see . - */ - - -import Foundation -import linphonesw - -class ConferenceSchedulingViewModel { - - var core : Core { get { Core.get() } } - static let shared = ConferenceSchedulingViewModel() - - let subject = MutableLiveData() - let description = MutableLiveData() - - let mode = MutableLiveData() - static let modeList: [Mode] = computeModeList() - - let scheduleForLater = MutableLiveData() - let scheduledDate = MutableLiveData() - let scheduledTime = MutableLiveData() - - var scheduledTimeZone = MutableLiveData() - static let timeZones: [TimeZoneData] = computeTimeZonesList() - - var scheduledDuration = MutableLiveData() - static let durationList: [Duration] = computeDurationList() - - let isEncrypted = MutableLiveData() - - let sendInviteViaChat = MutableLiveData() - let sendInviteViaEmail = MutableLiveData() - - let address = MutableLiveData
() - - let conferenceCreationInProgress = MutableLiveData() - - let conferenceCreationCompletedEvent: MutableLiveData> = MutableLiveData() - let onErrorEvent = MutableLiveData() - - let continueEnabled: MutableLiveData = MutableLiveData() - - let selectedParticipants = MutableLiveData<[ParticipantInfo]>([]) - - private var conferenceScheduler: ConferenceScheduler? = nil - - - private var hour: Int = 0 - private var minutes: Int = 0 - - private var chatRoomDelegate : ChatRoomDelegate? = nil - private var conferenceSchedulerDelegate : ConferenceSchedulerDelegateStub? = nil - - var existingConfInfo:MutableLiveData = MutableLiveData() - - init () { - - conferenceSchedulerDelegate = ConferenceSchedulerDelegateStub( - onStateChanged: { scheduler, state in - Log.i("[Conference Creation] Conference scheduler state is \(state)") - if (state == .Ready) { - Log.i("[Conference Creation] Conference info created, address will be \(scheduler.info?.uri?.asStringUriOnly())") - guard let conferenceAddress = scheduler.info?.uri else { - Log.e("[Conference Creation] conference address is null") - return - } - self.address.value = conferenceAddress - - if (self.scheduleForLater.value == true && self.sendInviteViaChat.value == true) { - // Send conference info even when conf is not scheduled for later - // as the conference server doesn't invite participants automatically - if let chatRoomParams = self.getConferenceInvitationsChatRoomParams() { - scheduler.sendInvitations(chatRoomParams: chatRoomParams) - } - } else { - self.conferenceCreationInProgress.value = false - self.conferenceCreationCompletedEvent.value = Pair(conferenceAddress.asStringUriOnly(),self.conferenceScheduler?.info?.subject) - } - } - }, onInvitationsSent: { conferenceScheduler, failedInvitations in - Log.i("[Conference Creation] Conference information successfully sent to all participants") - self.conferenceCreationInProgress.value = false - - if (failedInvitations.count > 0) { - failedInvitations.forEach { address in - Log.e("[Conference Creation] Conference information wasn't sent to participant \(address.asStringUriOnly())") - self.onErrorEvent.value = VoipTexts.conference_schedule_info_not_sent_to_participant+" (\(address.username))" - } - } - - guard let conferenceAddress = conferenceScheduler.info?.uri else { - Log.e("[Conference Creation] conference address is null") - return - } - self.conferenceCreationCompletedEvent.value = Pair(conferenceAddress.asStringUriOnly(),self.conferenceScheduler?.info?.subject) - } - ) - - chatRoomDelegate = ChatRoomDelegateStub( - onStateChanged : { (room: ChatRoom, state: ChatRoom.State) -> Void in - if (state == ChatRoom.State.Created) { - Log.i("[Conference Creation] Chat room created") - room.removeDelegate(delegate: self.chatRoomDelegate!) - } else if (state == ChatRoom.State.CreationFailed) { - Log.e("[Conference Creation] Group chat room creation has failed !") - room.removeDelegate(delegate: self.chatRoomDelegate!) - } - } - ) - - reset() - - subject.observe { _ in - self.continueEnabled.value = self.allMandatoryFieldsFilled() - } - scheduleForLater.observe { _ in - self.continueEnabled.value = self.allMandatoryFieldsFilled() - } - scheduledDate.observe { _ in - self.continueEnabled.value = self.allMandatoryFieldsFilled() - } - scheduledTime.observe { _ in - self.continueEnabled.value = self.allMandatoryFieldsFilled() - } - - - } - - func isEndToEndEncryptedChatAvailable() -> Bool { - let core = Core.get() - return core.limeX3DhEnabled && - ((core.limeX3DhServerUrl != nil && core.limeX3DhServerUrl!.count > 0) || core.defaultAccount?.params?.limeServerUrl != nil) && - core.defaultAccount?.params?.conferenceFactoryUri != nil - } - - func reset() { - - subject.value = "" - scheduleForLater.value = false - isEncrypted.value = false - sendInviteViaChat.value = true - sendInviteViaEmail.value = false - scheduledDate.value = nil - scheduledTime.value = nil - - mode.value = ConferenceSchedulingViewModel.modeList.indices.filter { - ConferenceSchedulingViewModel.modeList[$0].value == 0 - }.first - - scheduledTimeZone.value = ConferenceSchedulingViewModel.timeZones.indices.filter { - ConferenceSchedulingViewModel.timeZones[$0].timeZone.identifier == NSTimeZone.default.identifier - }.first - - scheduledDuration.value = ConferenceSchedulingViewModel.durationList.indices.filter { - ConferenceSchedulingViewModel.durationList[$0].value == 60 - }.first - continueEnabled.value = false - selectedParticipants.value = [] - existingConfInfo.value = nil - description.value = "" - } - - func destroy() { - conferenceScheduler?.removeDelegate(delegate: conferenceSchedulerDelegate!) - } - - - func gotoChatRoom() { - - } - - func createConference() { - - if (selectedParticipants.value?.count == 0) { - Log.e("[Conference Creation] Couldn't create conference without any participant!") - return - } - - do { - conferenceCreationInProgress.value = true - guard let localAccount = core.defaultAccount, let localAddress = localAccount.params?.identityAddress else { - Log.e("[Conference Creation] Couldn't get local address from default account!") - return - } - - conferenceScheduler = try? Core.get().createConferenceScheduler() - conferenceScheduler?.addDelegate(delegate: conferenceSchedulerDelegate!) - - guard let conferenceInfo = existingConfInfo.value != nil ? existingConfInfo.value??.clone() : try Factory.Instance.createConferenceInfo() else { - Log.e("[Conference Creation/Update] Failed, unable to get conf info.") - return - } - conferenceInfo.organizer = localAddress - subject.value.map { conferenceInfo.subject = $0} - description.value.map { conferenceInfo.description = $0} - conferenceInfo.participantInfos = selectedParticipants.value! - if (scheduleForLater.value == true) { - let timestamp = getConferenceStartTimestamp() - conferenceInfo.dateTime = time_t(timestamp) - scheduledDuration.value.map { conferenceInfo.duration = UInt(ConferenceSchedulingViewModel.durationList[$0].value) } - } - conferenceScheduler?.account = localAccount - conferenceScheduler?.info = conferenceInfo // Will trigger the conference creation automatically - existingConfInfo.value = conferenceInfo - - } catch { - Log.e("[Conference Creation] Failed \(error)") - } - } - - private func allMandatoryFieldsFilled() -> Bool { - return subject.value != nil && subject.value!.count > 0 && (scheduleForLater.value != true || (scheduledDate.value != nil && scheduledTime.value != nil) ); - } - - - private func getConferenceStartTimestamp() -> Double { - let days = Int32(scheduledDate.value!.timeIntervalSince1970)/86400 - let time = Int32(scheduledTime.value!.timeIntervalSince1970)%86400 - - return scheduleForLater.value == true ? TimeInterval(days * 86400 + time) + Double(ConferenceSchedulingViewModel.timeZones[scheduledTimeZone.value!].timeZone.secondsFromGMT()-TimeZone.current.secondsFromGMT()) - : Date().timeIntervalSince1970 - } - - - private static func computeTimeZonesList() -> [TimeZoneData] { - return TimeZone.knownTimeZoneIdentifiers.map { - (ident) in TimeZoneData(timeZone:TimeZone(identifier:ident)!) - }.sorted() - } - - private static func computeModeList() -> [Mode] { - return [Mode(value: 0, display: "Meeting"), Mode(value: 1, display: "Broadcast")] - } - - private static func computeDurationList() -> [Duration] { - return [Duration(value: 30, display: "30min"), Duration(value: 60, display: "1h"), Duration(value: 120, display: "2h")] - } - - func getConferenceInvitationsChatRoomParams() -> ChatRoomParams? { - if let chatRoomParams = try?self.core.createDefaultChatRoomParams() { - chatRoomParams.encryptionEnabled = self.isEndToEndEncryptedChatAvailable() - chatRoomParams.groupEnabled = false - chatRoomParams.backend = chatRoomParams.encryptionEnabled ? .FlexisipChat : .Basic - chatRoomParams.subject = self.subject.value! - return chatRoomParams - } - return nil - } - - func getMode() -> Int { - if mode.value != nil { - return mode.value! - } else { - return 0 - } - } - -} diff --git a/Classes/Swift/Conference/ViewModels/ConferenceWaitingRoomViewModel.swift b/Classes/Swift/Conference/ViewModels/ConferenceWaitingRoomViewModel.swift deleted file mode 100644 index 22aef7205..000000000 --- a/Classes/Swift/Conference/ViewModels/ConferenceWaitingRoomViewModel.swift +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2010-2021 Belledonne Communications SARL. - * - * This file is part of linphone-android - * (see https://www.linphone.org). - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * aDouble with this program. If not, see . - */ - - -import Foundation -import linphonesw - -class ConferenceWaitingRoomViewModel: ControlsViewModel { - - - static let sharedModel = ConferenceWaitingRoomViewModel() - - - let joinLayout = MutableLiveData() - let joinInProgress = MutableLiveData(false) - let showLayoutPicker = MutableLiveData() - - - override init() { - super.init() - self.reset() - } - - func reset() { - joinLayout.value = Core.get().defaultConferenceLayout == .Grid ? .Grid : .ActiveSpeaker - joinInProgress.value = false - isMicrophoneMuted.value = !micAuthorized() - isMuteMicrophoneEnabled.value = true - isSpeakerSelected.value = true - isVideoEnabled.value = false - isVideoAvailable.value = core.videoCaptureEnabled && Core.get().config?.getBool(section: "app", key: "disable_video_feature", defaultValue: false) == false - showLayoutPicker.value = false - } - - override func toggleMuteMicrophone() { - if (!micAuthorized()) { - AVAudioSession.sharedInstance().requestRecordPermission { granted in - if granted { - self.isMicrophoneMuted.value = self.isMicrophoneMuted.value != true - } - } - } - self.isMicrophoneMuted.value = self.isMicrophoneMuted.value != true - } - - override func toggleSpeaker() { - isSpeakerSelected.value = isSpeakerSelected.value != true - } - - override func toggleVideo() { - isVideoEnabled.value = isVideoEnabled.value != true - } - - override func updateUI() { - - } - -} diff --git a/Classes/Swift/Conference/ViewModels/ScheduledConferencesViewModel.swift b/Classes/Swift/Conference/ViewModels/ScheduledConferencesViewModel.swift deleted file mode 100644 index c77fec120..000000000 --- a/Classes/Swift/Conference/ViewModels/ScheduledConferencesViewModel.swift +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2010-2021 Belledonne Communications SARL. - * - * This file is part of linphone-android - * (see https://www.linphone.org). - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import Foundation -import linphonesw - - -class ScheduledConferencesViewModel { - - var core : Core { get { Core.get() } } - static let shared = ScheduledConferencesViewModel() - - var conferences : MutableLiveData<[ScheduledConferenceData]> = MutableLiveData([]) - var daySplitted : [Date : [ScheduledConferenceData]] = [:] - var coreDelegate: CoreDelegateStub? - var showTerminated = MutableLiveData(false) - let editionEnabled = MutableLiveData(false) - let conferenceScheduler = try? Core.get().createConferenceScheduler() - - - init () { - - coreDelegate = CoreDelegateStub( - onConferenceInfoReceived: { (core, conferenceInfo) in - Log.i("[Scheduled Conferences] New conference info received") - self.conferences.value!.append(ScheduledConferenceData(conferenceInfo: conferenceInfo,isFinished: false)) - self.conferences.notifyValue() - } - - ) - computeConferenceInfoList() - } - - func computeConferenceInfoList() { - conferences.value!.removeAll() - let now = Date().timeIntervalSince1970 // Linphone uses time_t in seconds - - if (showTerminated.value == true) { - core.conferenceInformationList.filter{$0.duration != 0 && (TimeInterval($0.dateTime) + TimeInterval($0.duration) < now)}.forEach { conferenceInfo in - conferences.value!.append(ScheduledConferenceData(conferenceInfo: conferenceInfo,isFinished: true)) - } - } else { - let twoHoursAgo = now - 7200 // Show all conferences from 2 hour ago and forward - core.getConferenceInformationListAfterTime(time: time_t(twoHoursAgo)).filter{$0.duration != 0}.forEach { conferenceInfo in - conferences.value!.append(ScheduledConferenceData(conferenceInfo: conferenceInfo,isFinished: false)) - } - } - - - - daySplitted = [:] - conferences.value!.forEach { (conferenceInfo) in - let startDateDay = dateAtBeginningOfDay(for: conferenceInfo.rawDate) - if (daySplitted[startDateDay] == nil) { - daySplitted[startDateDay] = [] - } - daySplitted[startDateDay]!.append(conferenceInfo) - } - } - - - func dateAtBeginningOfDay(for inputDate: Date) -> Date { - var calendar = Calendar.current - let timeZone = NSTimeZone.system as NSTimeZone - calendar.timeZone = timeZone as TimeZone - return calendar.date(from: calendar.dateComponents([.year, .month, .day], from: inputDate))! - } - - -} diff --git a/Classes/Swift/Conference/Views/ConferenceHistoryDetailsView.swift b/Classes/Swift/Conference/Views/ConferenceHistoryDetailsView.swift deleted file mode 100644 index d4fb9bd90..000000000 --- a/Classes/Swift/Conference/Views/ConferenceHistoryDetailsView.swift +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import linphonesw - -@objc class ConferenceHistoryDetailsView: BackNextNavigationView, UICompositeViewDelegate, UITableViewDataSource { - - - let participantsListTableView = UITableView() - let organizerTableView = UITableView() - - let conectionsListTableView = UITableView() - let participantsLabel = StyledLabel(VoipTheme.conference_scheduling_font, " "+VoipTexts.conference_schedule_participants_list) - let organiserLabel = StyledLabel(VoipTheme.conference_scheduling_font, " "+VoipTexts.conference_schedule_organizer) - - let datePicker = StyledDatePicker(pickerMode: .date, readOnly:true) - let timePicker = StyledDatePicker(pickerMode: .time, readOnly:true) - - var conferenceData : ScheduledConferenceData? { - didSet { - if let data = conferenceData { - super.titleLabel.text = data.subject.value! - self.participantsListTableView.reloadData() - self.participantsListTableView.removeConstraints().done() - self.participantsListTableView.matchParentSideBorders().alignUnder(view: participantsLabel,withMargin: self.form_margin).done() - self.participantsListTableView.height(Double(data.conferenceInfo.participants.count) * VoipParticipantCell.cell_height).alignParentBottom().done() - datePicker.liveValue = MutableLiveData(conferenceData!.rawDate) - timePicker.liveValue = MutableLiveData(conferenceData!.rawDate) - } - } - } - - - static let compositeDescription = UICompositeViewDescription(ConferenceHistoryDetailsView.self, statusBar: StatusBarView.self, tabBar: TabBarView.classForCoder(), sideMenu: SideMenuView.self, fullscreen: false, isLeftFragment: false,fragmentWith: HistoryListView.classForCoder()) - static func compositeViewDescription() -> UICompositeViewDescription! { return compositeDescription } - func compositeViewDescription() -> UICompositeViewDescription! { return type(of: self).compositeDescription } - - override func viewDidLoad() { - - super.viewDidLoad( - backAction: { - PhoneMainView.instance().popView(self.compositeViewDescription()) - },nextAction: { - }, - nextActionEnableCondition: MutableLiveData(false), - title:"") - super.nextButton.isHidden = true - - super.backButton.isHidden = UIDevice.ipad() - - let schedulingStack = UIStackView() - schedulingStack.axis = .vertical - contentView.addSubview(schedulingStack) - schedulingStack.alignParentTop(withMargin: 2*form_margin).matchParentSideBorders(insetedByDx: form_margin).done() - - let scheduleForm = UIView() - schedulingStack.addArrangedSubview(scheduleForm) - scheduleForm.matchParentSideBorders().done() - - // Left column (Date) - let leftColumn = UIView() - scheduleForm.addSubview(leftColumn) - leftColumn.matchParentWidthDividedBy(2.2).alignParentLeft(withMargin: form_margin).alignParentTop(withMargin: form_margin).done() - - let dateLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_date) - leftColumn.addSubview(dateLabel) - dateLabel.alignParentLeft().alignParentTop(withMargin: form_margin).done() - - leftColumn.addSubview(datePicker) - datePicker.alignParentLeft().alignUnder(view: dateLabel,withMargin: form_margin).matchParentSideBorders().done() - - leftColumn.wrapContentY().done() - - // Right column (Time) - let rightColumn = UIView() - scheduleForm.addSubview(rightColumn) - rightColumn.matchParentWidthDividedBy(2.2).alignParentRight(withMargin: form_margin).alignParentTop().done() - - let timeLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_time) - rightColumn.addSubview(timeLabel) - timeLabel.alignParentLeft().alignParentTop(withMargin: form_margin).done() - - rightColumn.addSubview(timePicker) - timePicker.alignParentLeft().alignUnder(view: timeLabel,withMargin: form_margin).matchParentSideBorders().done() - - rightColumn.wrapContentY().done() - scheduleForm.wrapContentY().done() - - // Organiser - - contentView.addSubview(organiserLabel) - organiserLabel.matchParentSideBorders().height(form_input_height).alignUnder(view: schedulingStack,withMargin: form_margin*2).done() - organiserLabel.textAlignment = .left - - contentView.addSubview(organizerTableView) - organizerTableView.isScrollEnabled = false - organizerTableView.dataSource = self - organizerTableView.register(VoipParticipantCell.self, forCellReuseIdentifier: "VoipParticipantCellSSchedule") - organizerTableView.allowsSelection = false - if #available(iOS 15.0, *) { - organizerTableView.allowsFocus = false - } - organizerTableView.separatorStyle = .singleLine - organizerTableView.tag = 1; - organizerTableView.matchParentSideBorders().height(VoipParticipantCell.cell_height).alignUnder(view: organiserLabel,withMargin: form_margin).done() - - // Participants - contentView.addSubview(participantsLabel) - participantsLabel.matchParentSideBorders().height(form_input_height).alignUnder(view: organizerTableView,withMargin: form_margin).done() - participantsLabel.textAlignment = .left - - contentView.addSubview(participantsListTableView) - participantsListTableView.isScrollEnabled = false - participantsListTableView.dataSource = self - participantsListTableView.register(VoipParticipantCell.self, forCellReuseIdentifier: "VoipParticipantCellSSchedule") - participantsListTableView.allowsSelection = false - if #available(iOS 15.0, *) { - participantsListTableView.allowsFocus = false - } - participantsListTableView.separatorStyle = .singleLine - - // Goto chat - v2 - /* - let chatButton = FormButton(title: VoipTexts.conference_go_to_chat.uppercased(), backgroundStateColors: VoipTheme.primary_colors_background) - contentView.addSubview(chatButton) - chatButton.onClick { - //let chatRoom = ChatRoom() - //PhoneMainView.instance().go(to: chatRoom?.getCobject) - } - - chatButton.centerX().alignParentBottom(withMargin: 3*self.form_margin).alignUnder(view: participantsListTableView,withMargin: 3*self.form_margin).done() - */ - - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - self.organiserLabel.backgroundColor = VoipTheme.voipFormBackgroundColor.get() - self.organizerTableView.separatorColor = VoipTheme.separatorColor.get() - self.participantsLabel.backgroundColor = VoipTheme.voipFormBackgroundColor.get() - self.participantsListTableView.separatorColor = VoipTheme.separatorColor.get() - self.view.backgroundColor = VoipTheme.voipBackgroundBWColor.get() - } - - } - - - // Objc - bridge, as can't access easily to the view model. - @objc func setCallLog(callLog:OpaquePointer) { - let log = CallLog.getSwiftObject(cObject: callLog) - if let conferenceInfo = log.conferenceInfo { - self.conferenceData = ScheduledConferenceData(conferenceInfo: conferenceInfo) - } - } - - - // TableView datasource delegate - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - guard let data = conferenceData else { - return 0 - } - return tableView.tag == 1 ? 1 : data.conferenceInfo.participants.count - } - - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell:VoipParticipantCell = tableView.dequeueReusableCell(withIdentifier: "VoipParticipantCellSSchedule") as! VoipParticipantCell - guard let data = conferenceData else { - return cell - } - cell.selectionStyle = .none - cell.scheduleConfParticipantAddress = tableView.tag == 1 ? data.conferenceInfo.participants.filter {$0.weakEqual(address2: data.conferenceInfo.organizer!)}.first : data.conferenceInfo.participants[indexPath.row] - cell.limeBadge.isHidden = true - cell.addButton.isHidden = true - return cell - } - - -} diff --git a/Classes/Swift/Conference/Views/ConferenceSchedulingSummaryView.swift b/Classes/Swift/Conference/Views/ConferenceSchedulingSummaryView.swift deleted file mode 100644 index f2d04539d..000000000 --- a/Classes/Swift/Conference/Views/ConferenceSchedulingSummaryView.swift +++ /dev/null @@ -1,517 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import linphonesw -import SVProgressHUD - -@objc class ConferenceSchedulingSummaryView: BackNextNavigationView, UICompositeViewDelegate, UITableViewDataSource { - - let CONFERENCE_CREATION_TIME_OUT_SEC = 15.0 - - let viaChatLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_send_invite_chat_summary) - let speakersLabel = StyledLabel(VoipTheme.conference_scheduling_font, " "+VoipTexts.conference_schedule_speakers_list) - let participantsLabel = StyledLabel(VoipTheme.conference_scheduling_font, " "+VoipTexts.conference_schedule_participants_list) - let speakersListTableView = UITableView() - let participantsListTableView = UITableView() - - let datePicker = StyledDatePicker(liveValue: ConferenceSchedulingViewModel.shared.scheduledDate,pickerMode: .date, readOnly:true) - let timeZoneValue = StyledValuePicker(liveIndex: ConferenceSchedulingViewModel.shared.scheduledTimeZone,options: ConferenceSchedulingViewModel.timeZones.map({ (tzd: TimeZoneData) -> String in tzd.descWithOffset()}), readOnly:true) - let durationValue = StyledValuePicker(liveIndex: ConferenceSchedulingViewModel.shared.scheduledDuration,options: ConferenceSchedulingViewModel.durationList.map({ (duration: Duration) -> String in duration.display}), readOnly:true) - let timePicker = StyledDatePicker(liveValue: ConferenceSchedulingViewModel.shared.scheduledTime,pickerMode: .time, readOnly:true) - let descriptionLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_description_hint) - let descriptionInput = StyledTextView(VoipTheme.conference_scheduling_font, placeHolder:VoipTexts.conference_schedule_description_hint,liveValue: ConferenceSchedulingViewModel.shared.description, readOnly:true) - let createButton = FormButton(backgroundStateColors: VoipTheme.primary_colors_background) - let leftColumn = UIView() - let rightColumn = UIView() - let scheduleForm = UIView() - - static let compositeDescription = UICompositeViewDescription(ConferenceSchedulingSummaryView.self, statusBar: StatusBarView.self, tabBar: nil, sideMenu: SideMenuView.self, fullscreen: false, isLeftFragment: false,fragmentWith: nil) - static func compositeViewDescription() -> UICompositeViewDescription! { return compositeDescription } - func compositeViewDescription() -> UICompositeViewDescription! { return type(of: self).compositeDescription } - - override func viewDidLoad() { - - super.viewDidLoad( - backAction: { - self.goBackParticipantsListSelection() - },nextAction: { - }, - nextActionEnableCondition: ConferenceSchedulingViewModel.shared.continueEnabled, - title: ConferenceSchedulingViewModel.shared.getMode() == 0 ? VoipTexts.conference_schedule_summary : VoipTexts.conference_schedule_broadcast_summary) - super.nextButton.isHidden = true - - let subjectLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_subject_title) - contentView.addSubview(subjectLabel) - subjectLabel.alignParentLeft(withMargin: form_margin).alignParentTop().done() - - let encryptedIcon = UIImageView(image: UIImage(named: "security_2_indicator")) - encryptedIcon.contentMode = .scaleAspectFit - contentView.addSubview(encryptedIcon) - encryptedIcon.height(form_input_height).alignParentTop().alignParentTop().alignParentRight(withMargin: form_margin).alignHorizontalCenterWith(subjectLabel).done() - ConferenceSchedulingViewModel.shared.isEncrypted.readCurrentAndObserve { (encrypt) in - encryptedIcon.isHidden = encrypt != true - } - - - let subjectInput = StyledTextView(VoipTheme.conference_scheduling_font, placeHolder:VoipTexts.conference_schedule_subject_hint, liveValue: ConferenceSchedulingViewModel.shared.subject, readOnly:true) - contentView.addSubview(subjectInput) - subjectInput.alignUnder(view: subjectLabel,withMargin: form_margin).matchParentSideBorders(insetedByDx: form_margin).height(form_input_height).done() - - - let schedulingStack = UIStackView() - schedulingStack.axis = .vertical - contentView.addSubview(schedulingStack) - schedulingStack.alignUnder(view: subjectInput,withMargin: 3*form_margin).matchParentSideBorders(insetedByDx: form_margin).done() - - - schedulingStack.addArrangedSubview(scheduleForm) - ConferenceSchedulingViewModel.shared.scheduleForLater.readCurrentAndObserve { (forLater) in self.scheduleForm.isHidden = forLater != true } - - // Left column (Date & Time) - scheduleForm.addSubview(leftColumn) - leftColumn.matchParentWidthDividedBy(2.2).alignParentLeft().alignParentTop(withMargin: form_margin).done() - - let dateLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_date) - leftColumn.addSubview(dateLabel) - dateLabel.alignParentLeft().alignParentTop(withMargin: form_margin).done() - - leftColumn.addSubview(datePicker) - datePicker.alignParentLeft().alignUnder(view: dateLabel,withMargin: form_margin).matchParentSideBorders().done() - - let timeLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_time) - leftColumn.addSubview(timeLabel) - timeLabel.alignParentLeft().alignUnder(view: datePicker,withMargin: form_margin).done() - - leftColumn.addSubview(timePicker) - timePicker.alignParentLeft().alignUnder(view: timeLabel,withMargin: form_margin).matchParentSideBorders().done() - - leftColumn.wrapContentY().done() - - - // Right column (Duration & Timezone) - scheduleForm.addSubview(rightColumn) - rightColumn.matchParentWidthDividedBy(2.2).alignParentRight().alignParentTop().done() - - let durationLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_duration) - rightColumn.addSubview(durationLabel) - durationLabel.alignParentLeft().alignParentTop(withMargin: form_margin).done() - - rightColumn.addSubview(durationValue) - durationValue.alignParentLeft().alignUnder(view: durationLabel,withMargin: form_margin).matchParentSideBorders().done() - - let timeZoneLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_timezone) - rightColumn.addSubview(timeZoneLabel) - timeZoneLabel.alignParentLeft().alignUnder(view: durationValue,withMargin: form_margin).done() - - rightColumn.addSubview(timeZoneValue) - timeZoneValue.alignParentLeft().alignUnder(view: timeZoneLabel,withMargin: form_margin).matchParentSideBorders().done() - - rightColumn.wrapContentY().done() - - // Description - scheduleForm.addSubview(descriptionLabel) - descriptionInput.textContainer.maximumNumberOfLines = 5 - descriptionInput.textContainer.lineBreakMode = .byWordWrapping - scheduleForm.addSubview(descriptionInput) - - // Sending method - contentView.addSubview(viaChatLabel) - viaChatLabel.matchParentSideBorders(insetedByDx: form_margin).alignUnder(view: schedulingStack,withMargin: 2*form_margin).done() - viaChatLabel.numberOfLines = 2 - ConferenceSchedulingViewModel.shared.sendInviteViaChat.readCurrentAndObserve { (sendChat) in - self.viaChatLabel.isHidden = sendChat != true || ConferenceSchedulingViewModel.shared.scheduleForLater.value != true - } - - // Speaker - contentView.addSubview(speakersLabel) - speakersLabel.matchParentSideBorders().height(form_input_height).alignUnder(view: viaChatLabel,withMargin: form_margin).done() - speakersLabel.textAlignment = .left - - - contentView.addSubview(speakersListTableView) - speakersListTableView.isScrollEnabled = false - speakersListTableView.dataSource = self - speakersListTableView.register(VoipSpeakerCell.self, forCellReuseIdentifier: "VoipSpeakerCellSSchedule") - speakersListTableView.allowsSelection = false - if #available(iOS 15.0, *) { - speakersListTableView.allowsFocus = false - } - speakersListTableView.separatorStyle = .singleLine - speakersListTableView.backgroundColor = .clear - - // Participants - contentView.addSubview(participantsLabel) - participantsLabel.matchParentSideBorders().height(form_input_height).alignUnder(view: speakersListTableView,withMargin: form_margin).done() - participantsLabel.textAlignment = .left - - - contentView.addSubview(participantsListTableView) - participantsListTableView.isScrollEnabled = false - participantsListTableView.dataSource = self - participantsListTableView.register(VoipParticipantCell.self, forCellReuseIdentifier: "VoipParticipantCellSSchedule") - participantsListTableView.allowsSelection = false - if #available(iOS 15.0, *) { - participantsListTableView.allowsFocus = false - } - participantsListTableView.separatorStyle = .singleLine - participantsListTableView.backgroundColor = .clear - - - self.createButton.isEnabled = ConferenceSchedulingViewModel.shared.getMode() == 0 ? true : (ConferenceSchedulingViewModel.shared.selectedParticipants.value!.filter({$0.role == .Speaker}).count > 0 && ConferenceSchedulingViewModel.shared.selectedParticipants.value!.filter({$0.role == .Listener}).count > 0) - - ConferenceSchedulingViewModel.shared.selectedParticipants.readCurrentAndObserve { (participants) in - self.speakersListTableView.reloadData() - self.speakersListTableView.removeConstraints().done() - self.speakersListTableView.matchParentSideBorders().alignUnder(view: self.speakersLabel,withMargin: self.form_margin).done() - if ConferenceSchedulingViewModel.shared.getMode() != 0 { - self.speakersListTableView.height((participants!.filter({$0.role == .Speaker}).count > 0 ? Double(participants!.filter({$0.role == .Speaker}).count) : 0.5) * VoipParticipantCell.cell_height).done() - } else { - self.speakersListTableView.height(0).done() - } - if participants!.count == 0 { - let emptyLabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: self.view.bounds.size.height)) - emptyLabel.text = VoipTexts.conference_schedule_speakers_list_empty - emptyLabel.textAlignment = NSTextAlignment.center - self.speakersListTableView.backgroundView = emptyLabel - self.speakersListTableView.separatorStyle = UITableViewCell.SeparatorStyle.none - self.speakersListTableView.backgroundView?.isHidden = false - } else { - self.speakersListTableView.backgroundView?.isHidden = true - } - - self.participantsListTableView.reloadData() - self.participantsListTableView.removeConstraints().done() - self.participantsListTableView.matchParentSideBorders().alignUnder(view: self.participantsLabel,withMargin: self.form_margin).done() - if ConferenceSchedulingViewModel.shared.getMode() != 0 { - self.participantsListTableView.height((participants!.filter({$0.role == .Listener}).count > 0 ? Double(participants!.filter({$0.role == .Listener}).count) : 0.5) * VoipParticipantCell.cell_height).done() - } else { - self.participantsListTableView.height(Double(participants!.filter({$0.role == .Speaker}).count) * VoipParticipantCell.cell_height).done() - } - - if ConferenceSchedulingViewModel.shared.getMode() != 0 && ConferenceSchedulingViewModel.shared.selectedParticipants.value?.filter({$0.role == .Listener}).count == 0 { - self.participantsListTableView.reloadData() - self.participantsListTableView.removeConstraints().done() - self.participantsListTableView.matchParentSideBorders().alignUnder(view: self.participantsLabel,withMargin: self.form_margin).done() - self.participantsListTableView.height(0.5 * VoipParticipantCell.cell_height).done() - let emptyLabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: self.view.bounds.size.height)) - emptyLabel.text = VoipTexts.conference_schedule_participants_list_empty - emptyLabel.textAlignment = NSTextAlignment.center - self.participantsListTableView.backgroundView = emptyLabel - self.participantsListTableView.separatorStyle = UITableViewCell.SeparatorStyle.none - } else { - self.participantsListTableView.backgroundView?.isHidden = true - } - } - - // Create / Schedule - contentView.addSubview(createButton) - createButton.centerX().alignParentBottom(withMargin: 3*self.form_margin).alignUnder(view: participantsListTableView,withMargin: 3*self.form_margin).width(0).done() - ConferenceSchedulingViewModel.shared.scheduleForLater.readCurrentAndObserve { _ in - self.createButton.title = ConferenceSchedulingViewModel.shared.scheduleForLater.value == true ? ConferenceSchedulingViewModel.shared.existingConfInfo.value != nil ? VoipTexts.conference_schedule_edit.uppercased() : VoipTexts.conference_schedule_start.uppercased() : VoipTexts.conference_group_call_create.uppercased() - self.createButton.addSidePadding() - } - ConferenceSchedulingViewModel.shared.existingConfInfo.readCurrentAndObserve { _ in - self.createButton.title = ConferenceSchedulingViewModel.shared.scheduleForLater.value == true ? ConferenceSchedulingViewModel.shared.existingConfInfo.value != nil ? VoipTexts.conference_schedule_edit.uppercased() : VoipTexts.conference_schedule_start.uppercased() : VoipTexts.conference_group_call_create.uppercased() - self.createButton.addSidePadding() - } - - ConferenceSchedulingViewModel.shared.conferenceCreationInProgress.observe { progress in - if (progress == true) { - SVProgressHUD.show() - } else { - SVProgressHUD.dismiss() - } - } - - var enableCreationTimeOut = false - - ConferenceSchedulingViewModel.shared.conferenceCreationCompletedEvent.observe { pair in - enableCreationTimeOut = false - if (ConferenceSchedulingViewModel.shared.scheduleForLater.value == true) { - PhoneMainView.instance().pop(toView:ScheduledConferencesView.compositeDescription) - VoipDialog.toast(message: VoipTexts.conference_schedule_info_created) - - } - } - ConferenceSchedulingViewModel.shared.onErrorEvent.observe { error in - VoipDialog.init(message: error!).show() - } - createButton.onClick { - enableCreationTimeOut = true - ConferenceSchedulingViewModel.shared.createConference() - DispatchQueue.main.asyncAfter(deadline: .now() + self.CONFERENCE_CREATION_TIME_OUT_SEC) { - if (enableCreationTimeOut) { - enableCreationTimeOut = false - ConferenceSchedulingViewModel.shared.conferenceCreationInProgress.value = false - ConferenceSchedulingViewModel.shared.onErrorEvent.value = VoipTexts.call_error_server_timeout - } - } - } - ConferenceSchedulingViewModel.shared.scheduleForLater.readCurrentAndObserve { (later) in - self.createButton.title = ConferenceSchedulingViewModel.shared.scheduleForLater.value == true ? ConferenceSchedulingViewModel.shared.existingConfInfo.value != nil ? VoipTexts.conference_schedule_edit.uppercased() : VoipTexts.conference_schedule_start.uppercased() : VoipTexts.conference_group_call_create.uppercased() - self.viaChatLabel.isHidden = later != true || ConferenceSchedulingViewModel.shared.sendInviteViaChat.value != true - self.viaChatLabel.removeConstraints().matchParentSideBorders(insetedByDx: self.form_margin).alignUnder(view: schedulingStack,withMargin: (self.viaChatLabel.isHidden ? 0 : 1)*self.form_margin).done() - if (self.viaChatLabel.isHidden) { - self.viaChatLabel.height(0).done() - } - - self.createButton.addSidePadding() - } - - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - self.view.backgroundColor = VoipTheme.voipBackgroundBWColor.get() - self.speakersLabel.backgroundColor = VoipTheme.voipFormBackgroundColor.get() - self.speakersListTableView.separatorColor = VoipTheme.separatorColor.get() - self.participantsLabel.backgroundColor = VoipTheme.voipFormBackgroundColor.get() - self.participantsListTableView.separatorColor = VoipTheme.separatorColor.get() - } - - } - - override func viewWillAppear(_ animated: Bool) { - if ConferenceSchedulingViewModel.shared.existingConfInfo.value != nil { - let isBroadcastExisting = ConferenceSchedulingViewModel.shared.existingConfInfo.value??.participantInfos.filter({$0.role == .Speaker}).count != 0 && ConferenceSchedulingViewModel.shared.existingConfInfo.value??.participantInfos.filter({$0.role == .Listener}).count != 0 - ConferenceSchedulingViewModel.shared.mode.value = isBroadcastExisting ? 1 : 0 - } - - titleLabel.text = ConferenceSchedulingViewModel.shared.getMode() == 0 ? VoipTexts.conference_schedule_summary : VoipTexts.conference_schedule_broadcast_summary - - datePicker.liveValue = ConferenceSchedulingViewModel.shared.scheduledDate - timeZoneValue.setIndex(index: ConferenceSchedulingViewModel.shared.scheduledTimeZone.value!) - durationValue.setIndex(index: ConferenceSchedulingViewModel.shared.scheduledDuration.value!) - timePicker.liveValue = ConferenceSchedulingViewModel.shared.scheduledTime - - descriptionInput.text = ConferenceSchedulingViewModel.shared.description.value - descriptionLabel.removeConstraints().alignUnder(view: leftColumn,withMargin: form_margin).alignUnder(view: rightColumn,withMargin: form_margin).matchParentSideBorders().done() - descriptionInput.removeConstraints().alignUnder(view: descriptionLabel,withMargin: form_margin).matchParentSideBorders().height(description_height).alignParentBottom(withMargin: form_margin*2).done() - if (ConferenceSchedulingViewModel.shared.description.value == nil || ConferenceSchedulingViewModel.shared.description.value!.count == 0) { - descriptionLabel.height(0).done() - descriptionInput.height(0).done() - } - // Wrap form - scheduleForm.removeConstraints().matchParentSideBorders().wrapContentY().done() - - createButton.addSidePadding() - - speakersLabel.removeConstraints().matchParentSideBorders().height(form_input_height).alignUnder(view: viaChatLabel,withMargin: form_margin).done() - - speakersListTableView.removeConstraints().done() - speakersListTableView.matchParentSideBorders().alignUnder(view: self.speakersLabel,withMargin: self.form_margin).done() - speakersListTableView.height(Double((ConferenceSchedulingViewModel.shared.selectedParticipants.value?.filter({$0.role == .Speaker}).count)!) * VoipParticipantCell.cell_height).done() - - if ConferenceSchedulingViewModel.shared.selectedParticipants.value?.filter({$0.role == .Speaker}).count == 0 { - self.speakersListTableView.reloadData() - self.speakersListTableView.removeConstraints().done() - self.speakersListTableView.matchParentSideBorders().alignUnder(view: self.speakersLabel,withMargin: self.form_margin).done() - self.speakersListTableView.height(0.5 * VoipParticipantCell.cell_height).done() - let emptyLabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: self.view.bounds.size.height)) - emptyLabel.text = VoipTexts.conference_schedule_speakers_list_empty - emptyLabel.textAlignment = NSTextAlignment.center - self.speakersListTableView.backgroundView = emptyLabel - self.speakersListTableView.separatorStyle = UITableViewCell.SeparatorStyle.none - } - - if ConferenceSchedulingViewModel.shared.getMode() != 0 && ConferenceSchedulingViewModel.shared.selectedParticipants.value?.filter({$0.role == .Listener}).count == 0 { - self.participantsListTableView.reloadData() - self.participantsListTableView.removeConstraints().done() - self.participantsListTableView.matchParentSideBorders().alignUnder(view: self.participantsLabel,withMargin: self.form_margin).done() - self.participantsListTableView.height(0.5 * VoipParticipantCell.cell_height).done() - let emptyLabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: self.view.bounds.size.height)) - emptyLabel.text = VoipTexts.conference_schedule_participants_list_empty - emptyLabel.textAlignment = NSTextAlignment.center - self.participantsListTableView.backgroundView = emptyLabel - self.participantsListTableView.separatorStyle = UITableViewCell.SeparatorStyle.none - } - - if ConferenceSchedulingViewModel.shared.getMode() == 0 { - speakersLabel.isHidden = true - speakersListTableView.isHidden = true - speakersLabel.height(0).done() - speakersListTableView.height(0).done() - } else { - speakersLabel.isHidden = false - speakersListTableView.isHidden = false - } - - super.viewWillAppear(animated) - } - - override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - reloadLists() - } - - - - func goBackParticipantsListSelection() { - let view: ChatConversationCreateView = VIEW(ChatConversationCreateView.compositeViewDescription()) - view.unfragmentCompositeDescription() - - let addresses = ConferenceSchedulingViewModel.shared.selectedParticipants.value!.map { (participant) in String(participant.address!.asStringUriOnly()) } - view.tableController.contactsGroup = (addresses as NSArray).mutableCopy() as? NSMutableArray - view.tableController.notFirstTime = true - view.isForEditing = false - view.isForVoipConference = true - PhoneMainView.instance().pop(toView: view.compositeViewDescription()) - } - - // Objc - bridge, as can't access easily to the view model. - @objc func setParticipants(addresses:[String]) { - ConferenceSchedulingViewModel.shared.selectedParticipants.value = [] - return addresses.forEach { (address) in - do { - let createAddress = try Factory.Instance.createAddress(addr: address) - if let address = try?Factory.Instance.createParticipantInfo(address: createAddress) { - ConferenceSchedulingViewModel.shared.selectedParticipants.value?.append(address) - address.role = ConferenceSchedulingViewModel.shared.getMode() != 0 ? .Listener : .Speaker - } - } catch { - Log.e("[goBackParticipantsListSelection] unable to create ParticipantInfo \(error)") - } - - } - } - - // TableView datasource delegate - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - if(tableView == speakersListTableView){ - guard let speakers = ConferenceSchedulingViewModel.shared.selectedParticipants.value?.filter({$0.role == .Speaker}) else { - return 0 - } - return speakers.count - } else { - if ConferenceSchedulingViewModel.shared.getMode() != 0 { - guard let participants = ConferenceSchedulingViewModel.shared.selectedParticipants.value?.filter({$0.role == .Listener}) else { - return 0 - } - return participants.count - } else { - guard let participants = ConferenceSchedulingViewModel.shared.selectedParticipants.value?.filter({$0.role == .Speaker}) else { - return 0 - } - return participants.count - } - } - } - - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - if(tableView == speakersListTableView){ - let cell:VoipSpeakerCell = tableView.dequeueReusableCell(withIdentifier: "VoipSpeakerCellSSchedule") as! VoipSpeakerCell - guard let speaker = ConferenceSchedulingViewModel.shared.selectedParticipants.value?.filter({$0.role == .Speaker})[indexPath.row] else { - return cell - } - cell.selectionStyle = .none - cell.scheduleConfSpeakerAddress = speaker.address - cell.limeBadge.isHidden = ConferenceSchedulingViewModel.shared.isEncrypted.value != true - - cell.deleteButton.addTarget(self, action: #selector(deleteButtonPressed), for: .touchUpInside) - cell.deleteButton.tag = indexPath.row - - return cell - } else { - let cell:VoipParticipantCell = tableView.dequeueReusableCell(withIdentifier: "VoipParticipantCellSSchedule") as! VoipParticipantCell - if ConferenceSchedulingViewModel.shared.getMode() != 0 { - guard let participant = ConferenceSchedulingViewModel.shared.selectedParticipants.value?.filter({$0.role == .Listener})[indexPath.row] else { - return cell - } - cell.scheduleConfParticipantAddress = participant.address - } else { - guard let speaker = ConferenceSchedulingViewModel.shared.selectedParticipants.value?.filter({$0.role == .Speaker})[indexPath.row] else { - return cell - } - cell.scheduleConfParticipantAddress = speaker.address - } - cell.selectionStyle = .none - cell.limeBadge.isHidden = ConferenceSchedulingViewModel.shared.isEncrypted.value != true - - if ConferenceSchedulingViewModel.shared.getMode() == 0 { - cell.addButton.isHidden = true - } else { - cell.addButton.isHidden = false - cell.addButton.addTarget(self, action: #selector(addButtonPressed), for: .touchUpInside) - cell.addButton.tag = indexPath.row - } - return cell - } - } - - @objc func addButtonPressed(sender:UIButton!) { - if(ConferenceSchedulingViewModel.shared.selectedParticipants.value?.filter({$0.role == .Listener})[sender.tag] != nil) { - ConferenceSchedulingViewModel.shared.selectedParticipants.value?.filter({$0.role == .Listener})[sender.tag].role = .Speaker - } - reloadLists() - } - - @objc func deleteButtonPressed(sender:UIButton!) { - if(ConferenceSchedulingViewModel.shared.selectedParticipants.value?.filter({$0.role == .Speaker})[sender.tag] != nil) { - ConferenceSchedulingViewModel.shared.selectedParticipants.value?.filter({$0.role == .Speaker})[sender.tag].role = .Listener - } - reloadLists() - } - - func reloadLists(){ - let participants = ConferenceSchedulingViewModel.shared.selectedParticipants.value - - self.speakersListTableView.reloadData() - self.speakersListTableView.removeConstraints().done() - self.speakersListTableView.matchParentSideBorders().alignUnder(view: self.speakersLabel,withMargin: self.form_margin).done() - if ConferenceSchedulingViewModel.shared.getMode() != 0 { - self.speakersListTableView.height((participants!.filter({$0.role == .Speaker}).count > 0 ? Double(participants!.filter({$0.role == .Speaker}).count) : 0.5) * VoipParticipantCell.cell_height).done() - } else { - self.speakersListTableView.height(0).done() - } - if participants!.filter({$0.role == .Speaker}).count == 0 { - let emptyLabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: self.view.bounds.size.height)) - emptyLabel.text = VoipTexts.conference_schedule_speakers_list_empty - emptyLabel.textAlignment = NSTextAlignment.center - self.speakersListTableView.backgroundView = emptyLabel - self.speakersListTableView.separatorStyle = UITableViewCell.SeparatorStyle.none - self.speakersListTableView.backgroundView?.isHidden = false - } else { - self.speakersListTableView.backgroundView?.isHidden = true - } - - self.participantsListTableView.reloadData() - self.participantsListTableView.removeConstraints().done() - self.participantsListTableView.matchParentSideBorders().alignUnder(view: participantsLabel,withMargin: self.form_margin).done() - if ConferenceSchedulingViewModel.shared.getMode() != 0 { - self.participantsListTableView.height(Double(participants!.filter({$0.role == .Listener}).count) * VoipParticipantCell.cell_height).done() - } else { - self.participantsListTableView.height(Double(participants!.filter({$0.role == .Speaker}).count) * VoipParticipantCell.cell_height).done() - } - - if ConferenceSchedulingViewModel.shared.getMode() != 0 && ConferenceSchedulingViewModel.shared.selectedParticipants.value?.filter({$0.role == .Listener}).count == 0 { - self.participantsListTableView.reloadData() - self.participantsListTableView.removeConstraints().done() - self.participantsListTableView.matchParentSideBorders().alignUnder(view: self.participantsLabel,withMargin: self.form_margin).done() - self.participantsListTableView.height(0.5 * VoipParticipantCell.cell_height).done() - let emptyLabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: self.view.bounds.size.height)) - emptyLabel.text = VoipTexts.conference_schedule_participants_list_empty - emptyLabel.textAlignment = NSTextAlignment.center - self.participantsListTableView.backgroundView = emptyLabel - self.participantsListTableView.separatorStyle = UITableViewCell.SeparatorStyle.none - } else { - self.participantsListTableView.backgroundView?.isHidden = true - } - self.createButton.isEnabled = ConferenceSchedulingViewModel.shared.getMode() == 0 ? true : (ConferenceSchedulingViewModel.shared.selectedParticipants.value!.filter({$0.role == .Speaker}).count > 0 && ConferenceSchedulingViewModel.shared.selectedParticipants.value!.filter({$0.role == .Listener}).count > 0) - } -} diff --git a/Classes/Swift/Conference/Views/ConferenceSchedulingView.swift b/Classes/Swift/Conference/Views/ConferenceSchedulingView.swift deleted file mode 100644 index 2248b3b2b..000000000 --- a/Classes/Swift/Conference/Views/ConferenceSchedulingView.swift +++ /dev/null @@ -1,293 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import linphonesw -import IQKeyboardManager - -@objc class ConferenceSchedulingView: BackNextNavigationView, UICompositeViewDelegate { - - - static let compositeDescription = UICompositeViewDescription(ConferenceSchedulingView.self, statusBar: StatusBarView.self, tabBar: nil, sideMenu: SideMenuView.self, fullscreen: false, isLeftFragment: false,fragmentWith: nil) - static func compositeViewDescription() -> UICompositeViewDescription! { return compositeDescription } - func compositeViewDescription() -> UICompositeViewDescription! { return type(of: self).compositeDescription } - - let modeLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_mode) - let modeValue = StyledValuePicker(liveIndex: ConferenceSchedulingViewModel.shared.mode,options: ConferenceSchedulingViewModel.modeList.map({ (mode: Mode) -> String in mode.display})) - let datePicker = StyledDatePicker(liveValue: ConferenceSchedulingViewModel.shared.scheduledDate,pickerMode: .date) - let timeZoneValue = StyledValuePicker(liveIndex: ConferenceSchedulingViewModel.shared.scheduledTimeZone,options: ConferenceSchedulingViewModel.timeZones.map({ (tzd: TimeZoneData) -> String in tzd.descWithOffset()})) - let durationValue = StyledValuePicker(liveIndex: ConferenceSchedulingViewModel.shared.scheduledDuration,options: ConferenceSchedulingViewModel.durationList.map({ (duration: Duration) -> String in duration.display})) - let timePicker = StyledDatePicker(liveValue: ConferenceSchedulingViewModel.shared.scheduledTime,pickerMode: .time) - let descriptionInput = StyledTextView(VoipTheme.conference_scheduling_font, placeHolder:VoipTexts.conference_schedule_description_hint,liveValue: ConferenceSchedulingViewModel.shared.description) - let subjectInput = StyledTextView(VoipTheme.conference_scheduling_font, placeHolder:VoipTexts.conference_schedule_subject_hint, liveValue: ConferenceSchedulingViewModel.shared.subject,maxLines:1) - - let leftColumn = UIView() - let rightColumn = UIView() - - - override func viewDidLoad() { - - super.viewDidLoad( - backAction: { - ConferenceSchedulingViewModel.shared.reset() - PhoneMainView.instance().popView(self.compositeViewDescription()) - },nextAction: { - self.gotoParticipantsListSelection() - }, - nextActionEnableCondition: ConferenceSchedulingViewModel.shared.continueEnabled, - title:VoipTexts.conference_group_call_title) - view.accessibilityIdentifier = "start_group_call_view" - - let subjectLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_subject_title) - subjectLabel.addIndicatorIcon(iconName: "voip_mandatory") - contentView.addSubview(subjectLabel) - subjectLabel.alignParentLeft(withMargin: form_margin).alignParentTop().done() - - contentView.addSubview(subjectInput) - subjectInput.alignUnder(view: subjectLabel,withMargin: form_margin).matchParentSideBorders(insetedByDx: form_margin).height(form_input_height).done() - - let schedulingStack = UIStackView() - schedulingStack.axis = .vertical - contentView.addSubview(schedulingStack) - schedulingStack.alignUnder(view: subjectInput,withMargin: form_margin).matchParentSideBorders(insetedByDx: form_margin).done() - - let scheduleForLater = UIView() - schedulingStack.addArrangedSubview(scheduleForLater) - scheduleForLater.matchParentSideBorders().height(schdule_for_later_height).done() - - let laterSwitch = StyledSwitch(liveValue: ConferenceSchedulingViewModel.shared.scheduleForLater) - scheduleForLater.addSubview(laterSwitch) - laterSwitch.alignParentTop(withMargin: form_margin*2.5).alignParentLeft(withMargin: form_margin).centerY().done() - - let laterLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_later) - laterLabel.numberOfLines = 2 - scheduleForLater.addSubview(laterLabel) - laterLabel.alignParentTop(withMargin: form_margin*2).toRightOf(laterSwitch, withLeftMargin: form_margin*2).alignParentRight(withMargin: form_margin).done() - - let scheduleForm = UIView() - schedulingStack.addArrangedSubview(scheduleForm) - scheduleForm.matchParentSideBorders().done() - - // Mode - scheduleForm.addSubview(modeLabel) - modeLabel.alignParentTop(withMargin: form_margin).matchParentSideBorders(insetedByDx: form_margin).done() - - scheduleForm.addSubview(modeValue) - modeValue.alignUnder(view: modeLabel, withMargin: form_margin).matchParentSideBorders(insetedByDx: form_margin).done() - - // Left column (Date & Time) - scheduleForm.addSubview(leftColumn) - leftColumn.matchParentWidthDividedBy(2.2).alignParentLeft(withMargin: form_margin).alignUnder(view: modeValue, withMargin: form_margin).done() - - let dateLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_date) - dateLabel.addIndicatorIcon(iconName: "voip_mandatory") - leftColumn.addSubview(dateLabel) - dateLabel.alignParentLeft().alignParentTop(withMargin: form_margin).done() - - leftColumn.addSubview(datePicker) - datePicker.alignParentLeft().alignUnder(view: dateLabel,withMargin: form_margin).matchParentSideBorders().done() - - let timeLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_time) - timeLabel.addIndicatorIcon(iconName: "voip_mandatory") - leftColumn.addSubview(timeLabel) - timeLabel.alignParentLeft().alignUnder(view: datePicker,withMargin: form_margin).done() - - leftColumn.addSubview(timePicker) - timePicker.alignParentLeft().alignUnder(view: timeLabel,withMargin: form_margin).matchParentSideBorders().done() - - leftColumn.wrapContentY().done() - - - // Right column (Duration & Timezone) - scheduleForm.addSubview(rightColumn) - rightColumn.matchParentWidthDividedBy(2.2).alignParentRight(withMargin: form_margin).alignUnder(view: modeValue, withMargin: form_margin).done() - - let durationLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_duration) - rightColumn.addSubview(durationLabel) - durationLabel.alignParentLeft().alignParentTop(withMargin: form_margin).done() - - rightColumn.addSubview(durationValue) - durationValue.alignParentLeft().alignUnder(view: durationLabel,withMargin: form_margin).matchParentSideBorders().done() - - let timeZoneLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_timezone) - rightColumn.addSubview(timeZoneLabel) - timeZoneLabel.alignParentLeft().alignUnder(view: durationValue,withMargin: form_margin).done() - - rightColumn.addSubview(timeZoneValue) - timeZoneValue.alignParentLeft().alignUnder(view: timeZoneLabel,withMargin: form_margin).matchParentSideBorders().done() - - rightColumn.wrapContentY().done() - - // Description - let descriptionLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_description_title) - scheduleForm.addSubview(descriptionLabel) - descriptionLabel.alignUnder(view: leftColumn,withMargin: form_margin).alignUnder(view: rightColumn,withMargin: form_margin).matchParentSideBorders(insetedByDx: form_margin).done() - - descriptionInput.textContainer.maximumNumberOfLines = 5 - descriptionInput.textContainer.lineBreakMode = .byWordWrapping - scheduleForm.addSubview(descriptionInput) - descriptionInput.alignUnder(view: descriptionLabel,withMargin: 2*form_margin).matchParentSideBorders(insetedByDx: form_margin).height(description_height).done() - - // Sending methods - - let viaChatView = UIView() - scheduleForm.addSubview(viaChatView) - viaChatView.alignUnder(view: descriptionInput,withMargin: form_margin).matchParentSideBorders(insetedByDx: form_margin).alignParentBottom(withMargin: form_margin*4).done() - - let viaChatSwitch = StyledCheckBox() - viaChatSwitch.liveValue = ConferenceSchedulingViewModel.shared.sendInviteViaChat - viaChatView.addSubview(viaChatSwitch) - viaChatSwitch.alignParentLeft().done() - - let viaChatLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_send_invite_chat) - viaChatView.addSubview(viaChatLabel) - viaChatLabel.toRightOf(viaChatSwitch,withLeftMargin: form_margin).alignHorizontalCenterWith(viaChatSwitch).done() - - viaChatView.wrapContentY().done() - - /* Hidden as in Android 9.6.2022 - - let viaMailSwitch = StyledCheckBox(liveValue: ConferenceSchedulingViewModel.shared.sendInviteViaEmail) - contentView.addSubview(viaMailSwitch) - viaMailSwitch.alignParentLeft(withMargin: form_margin).alignUnder(view: viaChatSwitch,withMargin: 2*form_margin).done() - - let viaMailLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_send_invite_email) - contentView.addSubview(viaMailLabel) - viaMailLabel.toRightOf(viaMailSwitch,withLeftMargin: form_margin).alignUnder(view: viaChatLabel,withMargin: 2*form_margin).alignHorizontalCenterWith(viaMailSwitch).done() - - // Encryption - let encryptLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_encryption) - contentView.addSubview(encryptLabel) - encryptLabel.alignUnder(view: viaMailLabel,withMargin: 4*form_margin).centerX().done() - - let encryptCombo = UIStackView() - contentView.addSubview(encryptCombo) - encryptCombo.alignUnder(view: encryptLabel,withMargin: form_margin).centerX().height(form_input_height).done() - - let unencryptedIcon = UIImageView(image: UIImage(named: "security_toggle_icon_grey")) - unencryptedIcon.contentMode = .scaleAspectFit - encryptCombo.addArrangedSubview(unencryptedIcon) - - let encryptSwitch = StyledSwitch(liveValue: ConferenceSchedulingViewModel.shared.isEncrypted) - encryptCombo.addArrangedSubview(encryptSwitch) - encryptSwitch.centerY().alignParentTop(withMargin: form_margin).done() - - let encryptedIcon = UIImageView(image: UIImage(named: "security_toggle_icon_green")) - encryptedIcon.contentMode = .scaleAspectFit - encryptCombo.addArrangedSubview(encryptedIcon) - - */ - - // Mandatory label - - let mandatoryLabel = StyledLabel(VoipTheme.conference_scheduling_font, VoipTexts.conference_schedule_mandatory_field) - mandatoryLabel.addIndicatorIcon(iconName: "voip_mandatory", trailing: false) - contentView.addSubview(mandatoryLabel) - mandatoryLabel.textAlignment = .center - - let lastView = UIView() - contentView.addSubview(lastView) - lastView.alignUnder(view: mandatoryLabel).alignParentBottom().done() - - // Schedule for later observer - ConferenceSchedulingViewModel.shared.scheduleForLater.readCurrentAndObserve { (forLater) in - self.subjectInput.setPlaceHolder(phText: forLater == true ? VoipTexts.conference_schedule_subject_hint : VoipTexts.conference_group_call_subject_hint) - scheduleForm.isHidden = forLater != true - super.titleLabel.text = forLater == true ? ConferenceSchedulingViewModel.shared.existingConfInfo.value != nil ? VoipTexts.conference_schedule_edit : VoipTexts.conference_schedule_title : VoipTexts.conference_group_call_title - mandatoryLabel.removeConstraints().done() - mandatoryLabel.alignUnder(view: forLater == true ? scheduleForm : scheduleForLater,withMargin: 2*self.form_margin).centerX().matchParentSideBorders().done() - } - ConferenceSchedulingViewModel.shared.existingConfInfo.readCurrentAndObserve { (confInfo) in - super.titleLabel.text = ConferenceSchedulingViewModel.shared.scheduleForLater.value == true ? ConferenceSchedulingViewModel.shared.existingConfInfo.value != nil ? VoipTexts.conference_schedule_edit : VoipTexts.conference_schedule_title : VoipTexts.conference_group_call_title - if ConferenceSchedulingViewModel.shared.existingConfInfo.value != nil { - self.modeLabel.isHidden = true - self.modeValue.isHidden = true - self.modeLabel.height(0).done() - self.modeValue.height(0).done() - } else { - self.modeLabel.isHidden = false - self.modeValue.isHidden = false - self.modeLabel.removeConstraints().alignParentTop(withMargin: self.form_margin).matchParentSideBorders(insetedByDx: self.form_margin).done() - self.modeValue.removeConstraints().alignUnder(view: self.modeLabel, withMargin: self.form_margin).matchParentSideBorders(insetedByDx: self.form_margin).done() - self.modeLabel.height(20).done() - self.modeValue.height(38).done() - } - } - - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - self.view.backgroundColor = VoipTheme.voipBackgroundBWColor.get() - schedulingStack.backgroundColor = VoipTheme.voipFormBackgroundColor.get() - } - - } - - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - modeValue.setIndex(index: ConferenceSchedulingViewModel.shared.mode.value!) - datePicker.liveValue = ConferenceSchedulingViewModel.shared.scheduledDate - timeZoneValue.setIndex(index: ConferenceSchedulingViewModel.shared.scheduledTimeZone.value!) - durationValue.setIndex(index: ConferenceSchedulingViewModel.shared.scheduledDuration.value!) - timePicker.liveValue = ConferenceSchedulingViewModel.shared.scheduledTime - descriptionInput.text = ConferenceSchedulingViewModel.shared.description.value - IQKeyboardManager.shared().isEnabled = true - - - if !ConfigManager.instance().lpConfigBoolForKey(key: "enable_broadcast_conference_feature") { - self.modeLabel.isHidden = true - self.modeValue.isHidden = true - self.modeLabel.height(0).done() - self.modeValue.height(0).done() - } else { - self.modeLabel.isHidden = false - self.modeValue.isHidden = false - self.modeLabel.removeConstraints().alignParentTop(withMargin: self.form_margin).matchParentSideBorders(insetedByDx: self.form_margin).done() - self.modeValue.removeConstraints().alignUnder(view: self.modeLabel, withMargin: self.form_margin).matchParentSideBorders(insetedByDx: self.form_margin).done() - self.modeLabel.height(20).done() - self.modeValue.height(38).done() - } - } - - override func viewWillDisappear(_ animated: Bool) { - IQKeyboardManager.shared().isEnabled = false - super.viewWillDisappear(animated) - } - - - func gotoParticipantsListSelection() { - let view: ChatConversationCreateView = self.VIEW(ChatConversationCreateView.compositeViewDescription()) - view.unfragmentCompositeDescription() - let addresses = ConferenceSchedulingViewModel.shared.selectedParticipants.value!.map { (address) in - address.address != nil ? String(address.address!.asStringUriOnly()) : "" - } - view.tableController.contactsGroup = (addresses as NSArray).mutableCopy() as? NSMutableArray - view.isForEditing = false - view.isForVoipConference = true - view.isForOngoingVoipConference = false - view.tableController.notFirstTime = true - view.isGroupChat = true - PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) - } - - @objc func resetViewModel() { - ConferenceSchedulingViewModel.shared.reset() - } -} diff --git a/Classes/Swift/Conference/Views/ConferenceWaitingRoomView.swift b/Classes/Swift/Conference/Views/ConferenceWaitingRoomView.swift deleted file mode 100644 index 31b2c6a85..000000000 --- a/Classes/Swift/Conference/Views/ConferenceWaitingRoomView.swift +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import linphonesw - - -@objc class ConferenceWaitingRoomView: UIViewController, UICompositeViewDelegate { // Replaces CallView - - // Layout constants - let common_margin = 17.0 - let switch_camera_button_size = 35 - let switch_camera_button_margins = 7.0 - let content_inset = 12.0 - let button_spacing = 15.0 - let center_view_corner_radius = 20.0 - let button_width = 150 - let layout_picker_inset = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8) - - - var audioRoutesView : AudioRoutesView? = nil - let subject = StyledLabel(VoipTheme.conference_preview_subject_font) - let localVideo = UIView() - let switchCamera = UIImageView(image: UIImage(named:"voip_change_camera")?.tinted(with:.white)) - let noVideoLabel = StyledLabel(VoipTheme.conference_waiting_room_no_video_font) - - let buttonsView = UIStackView() - let cancel = FormButton(title: VoipTexts.cancel.uppercased(), backgroundStateColors: VoipTheme.primary_colors_background_gray, bold:false) - let start = FormButton(title: VoipTexts.conference_waiting_room_start_call.uppercased(), backgroundStateColors: VoipTheme.primary_colors_background) - let conferenceJoinSpinner = RotatingSpinner() - - var conferenceUrl : String? = nil - let conferenceSubject = MutableLiveData() - - let controlsView = ControlsView(showVideo: true, controlsViewModel: ConferenceWaitingRoomViewModel.sharedModel) - var layoutPicker : CallControlButton? = nil - let layoutPickerView = ConferenceLayoutPickerView(orientation: UIDevice.current.orientation) - - - static let compositeDescription = UICompositeViewDescription(ConferenceWaitingRoomView.self, statusBar: StatusBarView.self, tabBar: nil, sideMenu: SideMenuView.self, fullscreen: false, isLeftFragment: false,fragmentWith: nil) - static func compositeViewDescription() -> UICompositeViewDescription! { return compositeDescription } - func compositeViewDescription() -> UICompositeViewDescription! { return type(of: self).compositeDescription } - - override func viewDidLoad() { - super.viewDidLoad() - - - view.addSubview(subject) - subject.centerX().alignParentTop(withMargin: common_margin).done() - conferenceSubject.observe { subject in - self.subject.text = subject - } - - // Controls - view.addSubview(controlsView) - controlsView.alignParentBottom(withMargin:SharedLayoutConstants.buttons_bottom_margin).centerX().done() - - // Layoout picker - layoutPicker = CallControlButton(imageInset : layout_picker_inset,buttonTheme: VoipTheme.conf_waiting_room_layout_picker, onClickAction: { - ConferenceWaitingRoomViewModel.sharedModel.showLayoutPicker.value = ConferenceWaitingRoomViewModel.sharedModel.showLayoutPicker.value != true - }) - view.addSubview(layoutPicker!) - layoutPicker!.alignParentBottom(withMargin:SharedLayoutConstants.buttons_bottom_margin).alignParentRight(withMargin:SharedLayoutConstants.buttons_bottom_margin).done() - - ConferenceWaitingRoomViewModel.sharedModel.joinLayout.readCurrentAndObserve { layout in - var icon = "" - switch (layout!) { - case .Grid: icon = "voip_conference_mosaic"; break - case .ActiveSpeaker: icon = "voip_conference_active_speaker"; break - case .AudioOnly: - icon = "voip_conference_audio_only" - ConferenceWaitingRoomViewModel.sharedModel.isVideoEnabled.value = false - break - } - self.layoutPicker?.applyTintedIcons(tintedIcons: [UIButton.State.normal.rawValue : TintableIcon(name: icon ,tintColor: LightDarkColor(.white,.white))]) - } - - ConferenceWaitingRoomViewModel.sharedModel.isVideoEnabled.observe { video in - if (video == true && ConferenceWaitingRoomViewModel.sharedModel.joinLayout.value == .AudioOnly) { - ConferenceWaitingRoomViewModel.sharedModel.joinLayout.value = .ActiveSpeaker - } - } - - view.addSubview(layoutPickerView) - - ConferenceWaitingRoomViewModel.sharedModel.showLayoutPicker.readCurrentAndObserve { show in - self.layoutPicker?.isSelected = show == true - self.layoutPickerView.isHidden = show != true - if (show == true) { - self.view.bringSubviewToFront(self.layoutPickerView) - } - } - - self.view.onClick{ - if (ConferenceWaitingRoomViewModel.sharedModel.showLayoutPicker.value == true) { - ConferenceWaitingRoomViewModel.sharedModel.showLayoutPicker.value = false - } - } - - // Form buttons - buttonsView.axis = .horizontal - buttonsView.spacing = button_spacing - view.addSubview(buttonsView) - buttonsView.alignAbove(view: controlsView,withMargin: SharedLayoutConstants.buttons_bottom_margin).centerX().done() - - start.width(button_width).done() - cancel.width(button_width).done() - - buttonsView.addArrangedSubview(cancel) - buttonsView.addArrangedSubview(start) - - cancel.onClick { - Core.get().calls.forEach { call in - if ([Call.State.OutgoingInit, Call.State.OutgoingRinging, Call.State.OutgoingProgress].contains(call.state)) { - CallManager.instance().terminateCall(call: call.getCobject) - } - } - ConferenceWaitingRoomViewModel.sharedModel.joinInProgress.value = false - PhoneMainView.instance().popView(self.compositeViewDescription()) - } - - start.onClick { - ConferenceWaitingRoomViewModel.sharedModel.joinInProgress.value = true - self.conferenceUrl.map{ CallManager.instance().startCall(addr: $0, isSas: false, isVideo: ConferenceWaitingRoomViewModel.sharedModel.isVideoEnabled.value!, isConference: true) } - } - - ConferenceWaitingRoomViewModel.sharedModel.joinInProgress.readCurrentAndObserve { joining in - self.start.isEnabled = joining != true - //self.localVideo.isHidden = joining == true (UX question as video window goes black by the core, better black or hidden ?) - self.noVideoLabel.isHidden = joining == true - self.layoutPicker?.isHidden = joining == true - if (Core.get().config?.getBool(section: "app", key: "disable_video_feature", defaultValue: false) == true) { - self.layoutPicker!.isHidden = true - } - if (joining == true) { - self.view.addSubview(self.conferenceJoinSpinner) - self.conferenceJoinSpinner.square(AbstractIncomingOutgoingCallView.spinner_size).center().done() - self.conferenceJoinSpinner.startRotation() - self.controlsView.isHidden = true - } else { - self.conferenceJoinSpinner.stopRotation() - self.conferenceJoinSpinner.removeFromSuperview() - self.controlsView.isHidden = false - } - } - - - // localVideo view - localVideo.layer.cornerRadius = center_view_corner_radius - localVideo.clipsToBounds = true - localVideo.contentMode = .scaleAspectFill - localVideo.backgroundColor = .black - self.view.addSubview(localVideo) - localVideo.addSubview(switchCamera) - switchCamera.contentMode = .scaleAspectFit - switchCamera.onClick { - Core.get().videoPreviewEnabled = false - Core.get().toggleCamera() - Core.get().nativePreviewWindow = self.localVideo - Core.get().videoPreviewEnabled = true - } - - self.view.addSubview(noVideoLabel) - noVideoLabel.center().done() - - ConferenceWaitingRoomViewModel.sharedModel.isVideoEnabled.readCurrentAndObserve { videoEnabled in - Core.get().videoPreviewEnabled = videoEnabled == true - self.localVideo.isHidden = videoEnabled != true - self.switchCamera.isHidden = videoEnabled != true - self.noVideoLabel.isHidden = videoEnabled == true - } - - - // Audio Routes - audioRoutesView = AudioRoutesView() - view.addSubview(audioRoutesView!) - audioRoutesView!.alignBottomWith(otherView: controlsView).done() - ConferenceWaitingRoomViewModel.sharedModel.audioRoutesSelected.readCurrentAndObserve { (audioRoutesSelected) in - self.audioRoutesView!.isHidden = audioRoutesSelected != true - } - audioRoutesView!.alignAbove(view:controlsView,withMargin:SharedLayoutConstants.buttons_bottom_margin).centerX().done() - - - layoutRotatableElements() - - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - self.view.backgroundColor = VoipTheme.voipBackgroundColor.get() - } - - } - - func layoutRotatableElements() { - layoutPickerView.removeConstraints().done() - localVideo.removeConstraints().done() - switchCamera.removeConstraints().done() - if ([.landscapeLeft, .landscapeRight].contains( UIDevice.current.orientation)) { - layoutPickerView.alignAbove(view:layoutPicker!,withMargin:button_spacing).alignVerticalCenterWith(layoutPicker!).done() - localVideo.matchParentSideBorders().alignParentBottom().alignParentTop().done() - localVideo.layer.cornerRadius = 0 - switchCamera.alignParentTop(withMargin: switch_camera_button_margins).alignParentRight(withMargin: switch_camera_button_margins + (UIDevice.hasNotch() && UIDevice.current.orientation == .landscapeRight ? 30.0 : 0.0)).square(switch_camera_button_size).done() - } else { - layoutPickerView.alignAbove(view:layoutPicker!,withMargin:button_spacing).alignVerticalCenterWith(layoutPicker!).done() - localVideo.matchParentSideBorders(insetedByDx: content_inset).alignAbove(view:buttonsView,withMargin:SharedLayoutConstants.buttons_bottom_margin).alignUnder(view: subject,withMargin: common_margin).done() - localVideo.layer.cornerRadius = center_view_corner_radius - switchCamera.alignParentTop(withMargin: switch_camera_button_margins).alignParentRight(withMargin: switch_camera_button_margins).square(switch_camera_button_size).done() - } - view.sendSubviewToBack(localVideo) - } - - override func didRotate(from fromInterfaceOrientation: UIInterfaceOrientation) { - super.didRotate(from: fromInterfaceOrientation) - self.layoutRotatableElements() - Core.get().videoPreviewEnabled = ConferenceWaitingRoomViewModel.sharedModel.isVideoEnabled.value == true - } - - override func willRotate(to toInterfaceOrientation: UIInterfaceOrientation, duration: TimeInterval) { - Core.get().videoPreviewEnabled = false - } - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(true) - ConferenceWaitingRoomViewModel.sharedModel.audioRoutesSelected.value = false - ConferenceWaitingRoomViewModel.sharedModel.reset() - Core.get().nativePreviewWindow = localVideo - Core.get().videoPreviewEnabled = ConferenceWaitingRoomViewModel.sharedModel.isVideoEnabled.value == true - } - - override func viewWillDisappear(_ animated: Bool) { - ControlsViewModel.shared.fullScreenMode.value = false - Core.get().nativePreviewWindow = nil - Core.get().videoPreviewEnabled = false - ConferenceWaitingRoomViewModel.sharedModel.joinInProgress.value = false - super.viewWillDisappear(animated) - } - - @objc func setDetails(subject:String, url:String, conferenceInfo:OpaquePointer) { - self.conferenceSubject.value = subject - self.conferenceUrl = url - let confInfo = ConferenceInfo.getSwiftObject(cObject: conferenceInfo) - - var imSpeaker = false - var inList = false - confInfo.participantInfos.forEach { participant in - if participant.address != nil && participant.address!.isMe() && (participant.role == .Speaker || participant.role == .Unknown) { - imSpeaker = true - inList = true - } else if participant.address != nil && participant.address!.isMe() && participant.role == .Listener { - inList = true - } - } - - if imSpeaker || !inList { - self.noVideoLabel.text = VoipTexts.conference_waiting_room_video_disabled - } else { - self.noVideoLabel.text = VoipTexts.conference_you_are_listener - } - - ControlsViewModel.shared.imSpeaker = imSpeaker || !inList - } - -} diff --git a/Classes/Swift/Conference/Views/ICSBubbleView.swift b/Classes/Swift/Conference/Views/ICSBubbleView.swift deleted file mode 100644 index fd9676193..000000000 --- a/Classes/Swift/Conference/Views/ICSBubbleView.swift +++ /dev/null @@ -1,288 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import UIKit -import Foundation -import linphonesw -import EventKit -import EventKitUI - -@objc class ICSBubbleView: UIView, EKEventEditViewDelegate { - - - let corner_radius = 7.0 - let border_width = 2.0 - let rows_spacing = 6.0 - let inner_padding = 8.0 - let forward_reply_title_height = 10.0 - let indicator_y = 3.0 - let share_size = 25 - let join_share_width = 150.0 - - let inviteTitle = StyledLabel(VoipTheme.conference_invite_title_font, VoipTexts.conference_invite_title) - let inviteCancelled = StyledLabel(VoipTheme.conference_cancelled_title_font, VoipTexts.conference_cancel_title) - let inviteUpdated = StyledLabel(VoipTheme.conference_updated_title_font, VoipTexts.conference_update_title) - let inviteBroadcastTitle = StyledLabel(VoipTheme.conference_invite_title_font, VoipTexts.conference_invite_broadcast_title) - let inviteBroadcastCancelled = StyledLabel(VoipTheme.conference_cancelled_title_font, VoipTexts.conference_cancel_broadcast_title) - let inviteBroadcastUpdated = StyledLabel(VoipTheme.conference_updated_title_font, VoipTexts.conference_update_broadcast_title) - - let subject = StyledLabel(VoipTheme.conference_invite_subject_font) - let participants = StyledLabel(VoipTheme.conference_invite_desc_font) - let date = StyledLabel(VoipTheme.conference_invite_desc_font) - let timeDuration = StyledLabel(VoipTheme.conference_invite_desc_font) - let descriptionTitle = StyledLabel(VoipTheme.conference_invite_desc_title_font, VoipTexts.conference_description_title) - let descriptionValue = StyledLabel(VoipTheme.conference_invite_desc_font) - let joinShare = UIStackView() - let join = FormButton(title:VoipTexts.conference_invite_join.uppercased(), backgroundStateColors: VoipTheme.button_green_background) - let share = UIImageView(image:UIImage(named:"voip_export")?.tinted(with: VoipTheme.primaryTextColor.get())) - - var isBroadcast = false - var isMe = false - - var conferenceData: ScheduledConferenceData? = nil { - didSet { - if let data = conferenceData { - isBroadcast = data.conferenceInfo.participantInfos.filter({$0.role == .Speaker}).count != 0 && data.conferenceInfo.participantInfos.filter({$0.role == .Listener}).count != 0 - subject.text = data.subject.value - data.conferenceInfo.participantInfos.forEach { participant in - if participant.address != nil && participant.address!.isMe() { - isMe = true - } - } - - participants.text = VoipTexts.conference_invite_participants_count.replacingOccurrences(of: "%d", with: String(data.conferenceInfo.participants.count + (isMe ? 0 : 1))) - if isBroadcast && participants.text != nil { - var isMeSpeaker = false - data.conferenceInfo.participantInfos.filter({$0.role == .Speaker}).forEach { participant in - if isMe && participant.address != nil && participant.address!.isMe() { - isMeSpeaker = true - } - } - if isMeSpeaker || !isMe { - participants.text! += " (" + VoipTexts.conference_you_are_speaker + ")" - } - } - participants.addIndicatorIcon(iconName: "conference_schedule_participants_default",padding : 0.0, y: -indicator_y, trailing: false) - date.text = TimestampUtils.dateToString(date: data.rawDate) - date.addIndicatorIcon(iconName: "conference_schedule_calendar_default", padding: 0.0, y:-indicator_y, trailing:false) - timeDuration.text = "\(data.time.value)" + (data.duration.value != nil ? " ( \(data.duration.value) )" : "") - timeDuration.addIndicatorIcon(iconName: "conference_schedule_time_default",padding : 0.0, y: -indicator_y, trailing: false) - descriptionTitle.isHidden = data.description.value == nil || data.description.value!.count == 0 - descriptionValue.isHidden = descriptionTitle.isHidden - descriptionValue.text = data.description.value - if isBroadcast { - inviteTitle.isHidden = true - inviteCancelled.isHidden = true - inviteUpdated.isHidden = true - inviteBroadcastTitle.isHidden = [.Cancelled,.Updated].contains(data.conferenceInfo.state) - inviteBroadcastCancelled.isHidden = data.conferenceInfo.state != .Cancelled - inviteBroadcastUpdated.isHidden = data.conferenceInfo.state != .Updated - } else { - inviteTitle.isHidden = [.Cancelled,.Updated].contains(data.conferenceInfo.state) - inviteCancelled.isHidden = data.conferenceInfo.state != .Cancelled - inviteUpdated.isHidden = data.conferenceInfo.state != .Updated - inviteBroadcastTitle.isHidden = true - inviteBroadcastCancelled.isHidden = true - inviteBroadcastUpdated.isHidden = true - } - - join.isEnabled = data.isConferenceCancelled.value != true - } - } - } - - init() { - super.init(frame:.zero) - - layer.cornerRadius = corner_radius - clipsToBounds = true - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - self.backgroundColor = VoipTheme.chatBubbleBGColor.get() - } - - let rows = UIStackView() - rows.axis = .vertical - rows.spacing = rows_spacing - - addSubview(rows) - - rows.addArrangedSubview(inviteTitle) - rows.addArrangedSubview(inviteCancelled) - rows.addArrangedSubview(inviteUpdated) - rows.addArrangedSubview(inviteBroadcastTitle) - rows.addArrangedSubview(inviteBroadcastCancelled) - rows.addArrangedSubview(inviteBroadcastUpdated) - rows.addArrangedSubview(subject) - rows.addArrangedSubview(participants) - rows.addArrangedSubview(date) - rows.addArrangedSubview(timeDuration) - rows.addArrangedSubview(descriptionTitle) - rows.addArrangedSubview(descriptionValue) - - descriptionValue.numberOfLines = 5 - - - addSubview(joinShare) - joinShare.axis = .horizontal - joinShare.spacing = rows_spacing - joinShare.addArrangedSubview(share) - share.square(share_size).done() - joinShare.addArrangedSubview(join) - rows.matchParentSideBorders(insetedByDx: inner_padding).alignParentTop(withMargin: inner_padding).done() - joinShare.alignParentBottom(withMargin: inner_padding).width(join_share_width).alignParentRight(withMargin: inner_padding).done() - - join.onClick { - let view : ConferenceWaitingRoomView = self.VIEW(ConferenceWaitingRoomView.compositeViewDescription()) - view.setDetails(subject: (self.conferenceData?.subject.value)!, url: (self.conferenceData?.address.value)!, conferenceInfo: (self.conferenceData?.conferenceInfo.getCobject)!) - PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) - } - - share.onClick { - let eventStore = EKEventStore() - eventStore.requestAccess( to: EKEntityType.event, completion:{(granted, error) in - DispatchQueue.main.async { - if (granted) && (error == nil) { - let event = EKEvent(eventStore: eventStore) - event.title = self.conferenceData?.subject.value - event.startDate = self.conferenceData?.rawDate - if let duration = self.conferenceData?.conferenceInfo.duration, duration > 0 { - event.endDate = event.startDate.addingTimeInterval(TimeInterval(duration*60)) - } else { - event.endDate = event.startDate.addingTimeInterval(TimeInterval(3600)) - } - event.calendar = eventStore.defaultCalendarForNewEvents - if let description = self.conferenceData?.description.value, description.count > 0 { - event.notes = description + "\n\n" - } - event.notes = (event.notes != nil ? event.notes! : "") + "\(VoipTexts.call_action_participants_list):\n\(self.conferenceData?.participantsExpanded.value)" - if let urlString = self.conferenceData?.conferenceInfo.uri?.asStringUriOnly() { - event.url = URL(string:urlString) - } - let addController = EKEventEditViewController() - addController.event = event - addController.eventStore = eventStore - PhoneMainView.instance().present(addController, animated: false) - addController.editViewDelegate = self; - } else { - VoipDialog.toast(message: VoipTexts.conference_unable_to_share_via_calendar) - } - } - }) - } - } - - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - @objc func setFromChatMessage(cmessage: OpaquePointer) { - let message = ChatMessage.getSwiftObject(cObject: cmessage) - message.contents.forEach { content in - if (content.isIcalendar) { - if let conferenceInfo = try? Factory.Instance.createConferenceInfoFromIcalendarContent(content: content) { - self.conferenceData = ScheduledConferenceData(conferenceInfo: conferenceInfo) - } - } - } - } - @objc static func isConferenceInvitationMessage(cmessage: OpaquePointer) -> Bool { - var isConferenceInvitationMessage = false - let message = ChatMessage.getSwiftObject(cObject: cmessage) - message.contents.forEach { content in - if (content.isIcalendar) { - isConferenceInvitationMessage = true - } - } - return isConferenceInvitationMessage - } - - @objc func setLayoutConstraints(view:UIView) { - matchBordersWith(view: view, insetedByDx: inner_padding).done() - } - - @objc func updateTopLayoutConstraints(view:UIView, replyOrForward: Bool) { - updateTopBorderWith(view: view, inset: inner_padding + (replyOrForward ? forward_reply_title_height : 0.0)).done() - } - - func eventEditViewController(_ controller: EKEventEditViewController, didCompleteWith action: EKEventEditViewAction) { - controller.dismiss(animated: true, completion: nil) - } - - @objc static func getSubjectFromContent(cmessage: OpaquePointer) -> String { - let message = ChatMessage.getSwiftObject(cObject: cmessage) - var subject = "" - message.contents.forEach { content in - if (content.isIcalendar) { - if let conferenceInfo = try? Factory.Instance.createConferenceInfoFromIcalendarContent(content: content) { - subject = conferenceInfo.subject! - } - } - } - return subject - } - - @objc static func getConferenceInfo(cmessage: OpaquePointer) -> OpaquePointer? { - let message = ChatMessage.getSwiftObject(cObject: cmessage) - var result : OpaquePointer? = nil - message.contents.forEach { content in - if (content.isIcalendar) { - if let conferenceInfo = try? Factory.Instance.createConferenceInfoFromIcalendarContent(content: content) { - result = conferenceInfo.getCobject - } - } - } - return result - } - - @objc static func getConferenceSummary(cmessage: OpaquePointer) -> String? { - let message = ChatMessage.getSwiftObject(cObject: cmessage) - var subject:String? = nil - message.contents.forEach { content in - if (content.isIcalendar) { - if let conferenceInfo = try? Factory.Instance.createConferenceInfoFromIcalendarContent(content: content) { - subject = conferenceInfo.state == .New ? VoipTexts.conference_invite_title + conferenceInfo.subject! : - conferenceInfo.state == .Updated ? VoipTexts.conference_update_title + conferenceInfo.subject! : - VoipTexts.conference_cancel_title + conferenceInfo.subject! - } - } - } - return subject - } - - @objc static func getDescriptionHeightFromContent(cmessage: OpaquePointer) -> CGFloat { - let message = ChatMessage.getSwiftObject(cObject: cmessage) - var height = 0.0 - message.contents.forEach { content in - if (content.isIcalendar) { - if let conferenceInfo = try? Factory.Instance.createConferenceInfoFromIcalendarContent(content: content) { - let description = NSString(string: conferenceInfo.description!) - if (description.length > 0) { - let dummyTitle = StyledLabel(VoipTheme.conference_invite_desc_title_font, VoipTexts.conference_description_title) - let dummyLabel = StyledLabel(VoipTheme.conference_invite_desc_font) - let rect = CGSize(width: CGFloat(CONFERENCE_INVITATION_WIDTH-80), height: CGFloat.greatestFiniteMagnitude) - height = dummyTitle.intrinsicContentSize.height + description.boundingRect(with: rect, options: [.usesLineFragmentOrigin, .usesFontLeading], attributes: [NSAttributedString.Key.font: dummyLabel.font!], context: nil).height - } - } - } - } - return height - } - -} diff --git a/Classes/Swift/Conference/Views/ScheduledConferencesCell.swift b/Classes/Swift/Conference/Views/ScheduledConferencesCell.swift deleted file mode 100644 index 7cc4d6af2..000000000 --- a/Classes/Swift/Conference/Views/ScheduledConferencesCell.swift +++ /dev/null @@ -1,304 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import linphonesw - -class ScheduledConferencesCell: UITableViewCell { - - let corner_radius = 7.0 - let border_width = 2.0 - static let button_size = 40 - let delete_checkbox_margin = 5 - - let clockIcon = UIImageView() - let timeDuration = StyledLabel(VoipTheme.conference_invite_desc_font) - let organiser = StyledLabel(VoipTheme.conference_invite_desc_font) - let subject = StyledLabel(VoipTheme.conference_list_subject_font) - let cancelledLabel = StyledLabel(VoipTheme.conference_cancelled_title_font) - let participantsIcon = UIImageView() - let participantsGuestIcon = UIImageView() - let participantsTitle = StyledLabel(VoipTheme.conference_invite_participant_title_font) - let participants = StyledLabel(VoipTheme.conference_invite_desc_font) - let participantsGuestTitle = StyledLabel(VoipTheme.conference_invite_participant_title_font) - let participantsGuest = StyledLabel(VoipTheme.conference_invite_desc_font) - let infoConf = UIButton() - - let descriptionTitle = StyledLabel(VoipTheme.conference_list_address_desc_font, VoipTexts.conference_description_title) - let descriptionValue = StyledLabel(VoipTheme.conference_list_address_desc_font) - var urlTitle = StyledLabel(VoipTheme.conference_list_address_desc_font) - let urlValue = StyledLabel(VoipTheme.conference_scheduling_font) - let copyLink = CallControlButton(width:button_size,height:button_size,buttonTheme: VoipTheme.scheduled_conference_action("voip_copy")) - let joinConf = FormButton(title:VoipTexts.conference_invite_join.uppercased(), backgroundStateColors: VoipTheme.button_green_background) - let deleteConf = CallControlButton(width:button_size,height:button_size,buttonTheme: VoipTheme.scheduled_conference_action("voip_delete")) - let editConf = CallControlButton(width:button_size,height:button_size,buttonTheme: VoipTheme.scheduled_conference_action("voip_edit")) - var owningTableView : UITableView? = nil - let joinEditDelete = UIStackView() - let expandedRows = UIStackView() - let selectionCheckBox = StyledCheckBox() - let myContentView = UIView() - - var isBroadcast = false - - var conferenceData: ScheduledConferenceData? = nil { - didSet { - if let data = conferenceData { - isBroadcast = data.conferenceInfo.participantInfos.filter({$0.role == .Speaker}).count != 0 && data.conferenceInfo.participantInfos.filter({$0.role == .Listener}).count != 0 - timeDuration.text = "\(data.time.value)"+(data.duration.value != nil ? " (\(data.duration.value))" : "") - organiser.text = VoipTexts.conference_schedule_organizer+data.organizer.value! - subject.text = (isBroadcast ? VoipTexts.conference_scheduled_title_broadcast_cell : VoipTexts.conference_scheduled_title_meeting_cell) + data.subject.value! - cancelledLabel.text = data.isConferenceCancelled.value == true ? ( data.canEdit.value == true ? VoipTexts.conference_scheduled_cancelled_by_me: VoipTexts.conference_scheduled_cancelled_by_organizer) : nil - cancelledLabel.isHidden = data.isConferenceCancelled.value != true - descriptionValue.text = data.description.value != nil ? data.description.value! : "" - urlValue.text = data.address.value! - self.joinConf.isHidden = data.isConferenceCancelled.value == true - self.editConf.isHidden = data.canEdit.value != true || data.isConferenceCancelled.value == true - self.urlTitle.isHidden = data.isConferenceCancelled.value == true - self.urlValue.isHidden = data.isConferenceCancelled.value == true - self.copyLink.isHidden = data.isConferenceCancelled.value == true - data.expanded.readCurrentAndObserve { expanded in - self.myContentView.backgroundColor = - data.conferenceInfo.state == .Cancelled ? VoipTheme.voip_conference_cancelled_bg_color : - data.isFinished ? VoipTheme.backgroundColor3.get() : VoipTheme.backgroundColor4.get() - self.myContentView.layer.borderWidth = expanded == true ? 2.0 : 0.0 - self.descriptionTitle.isHidden = expanded != true || self.descriptionValue.text?.count == 0 - self.descriptionValue.isHidden = expanded != true || self.descriptionValue.text?.count == 0 - self.infoConf.isSelected = expanded == true - self.participantsTitle.text = self.isBroadcast ? VoipTexts.conference_scheduled_title_speakers_cell : VoipTexts.conference_scheduled_title_participant_cell - self.participantsGuestTitle.text = VoipTexts.conference_scheduled_title_guests_cell - self.participantsTitle.isHidden = expanded != true - self.participants.text = expanded == true ? data.participantsExpanded.value : data.participantsShort.value - self.participantsGuest.text = data.participantsGuestExpanded.value - self.participants.numberOfLines = expanded == true ? 10 : 2 - self.participantsGuest.numberOfLines = expanded == true ? 10 : 2 - self.expandedRows.isHidden = expanded != true - self.joinEditDelete.isHidden = expanded != true - if let myAddress = Core.get().defaultAccount?.params?.identityAddress { - self.editConf.isHidden = expanded != true || data.conferenceInfo.organizer?.weakEqual(address2: myAddress) != true || data.conferenceInfo.state == .Cancelled - } else { - self.editConf.isHidden = true - } - - if expanded != nil && expanded! { - self.participantsTitle.removeConstraints().alignUnder(view: self.subject,withMargin: 10).toRightOf(self.participantsIcon,withLeftMargin:10).toLeftOf(self.infoConf,withRightMargin: 15).done() - self.participants.removeConstraints().alignUnder(view: self.participantsTitle, withMargin: 4).toRightOf(self.participantsIcon,withLeftMargin:10).toLeftOf(self.infoConf,withRightMargin: 15).done() - - if self.isBroadcast { - self.participantsGuestIcon.removeConstraints().alignUnder(view: self.participants,withMargin: 5).square(25).alignParentLeft(withMargin: 10).done() - self.participantsGuestIcon.isHidden = false - - self.participantsGuestTitle.removeConstraints().alignUnder(view: self.participants,withMargin: 10).toRightOf(self.participantsGuestIcon,withLeftMargin:10).toLeftOf(self.infoConf,withRightMargin: 15).done() - self.participantsGuestTitle.isHidden = false - - self.participantsGuest.removeConstraints().alignUnder(view: self.participantsGuestTitle, withMargin: 4).toRightOf(self.participantsGuestIcon,withLeftMargin:10).toLeftOf(self.infoConf,withRightMargin: 15).done() - self.participantsGuest.isHidden = false - } - } else { - self.participants.removeConstraints().alignUnder(view: self.subject,withMargin: 10).toRightOf(self.participantsIcon,withLeftMargin:10).toLeftOf(self.infoConf,withRightMargin: 15).done() - self.participantsGuestIcon.isHidden = true - self.participantsGuestTitle.isHidden = true - self.participantsGuest.isHidden = true - } - - self.isBroadcast ? self.expandedRows.removeConstraints().alignUnder(view: self.participantsGuest,withMargin: 15).matchParentSideBorders(insetedByDx:10).done() : self.expandedRows.removeConstraints().alignUnder(view: self.participants,withMargin: 15).matchParentSideBorders(insetedByDx:10).done() - - self.urlTitle.text = self.isBroadcast ? VoipTexts.conference_schedule_address_broadcast_title : VoipTexts.conference_schedule_address_title - - self.joinEditDelete.removeConstraints().alignUnder(view: self.expandedRows,withMargin: 10).alignParentRight(withMargin: 10).done() - if (expanded == true) { - self.joinEditDelete.alignParentBottom(withMargin: 10).done() - } else { - self.participants.alignParentBottom(withMargin: 10).done() - } - self.selectionCheckBox.liveValue = data.selectedForDeletion - } - } - } - } - - override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { - super.init(style: style, reuseIdentifier: reuseIdentifier) - - contentView.addSubview(myContentView) - contentView.backgroundColor = .clear - backgroundColor = .clear - myContentView.layer.cornerRadius = corner_radius - myContentView.clipsToBounds = true - myContentView.backgroundColor = VoipTheme.header_background_color - myContentView.layer.borderColor = VoipTheme.primary_color.cgColor - myContentView.matchParentDimmensions(insetedBy: UIEdgeInsets(top: 5,left: 0,bottom: 5,right: 0)).done() - - myContentView.addSubview(clockIcon) - clockIcon.alignParentTop(withMargin: 10).square(20).alignParentLeft(withMargin: 10).done() - - myContentView.addSubview(timeDuration) - timeDuration.alignParentTop(withMargin: 10).toRightOf(clockIcon,withLeftMargin:10).alignHorizontalCenterWith(clockIcon).done() - - myContentView.addSubview(organiser) - organiser.alignParentTop(withMargin: 10).toRightOf(timeDuration, withLeftMargin:10).alignParentRight(withMargin:10).alignHorizontalCenterWith(clockIcon).done() - - - let subjectCancel = UIStackView() - subjectCancel.axis = .vertical - myContentView.addSubview(subjectCancel) - subjectCancel.alignUnder(view: timeDuration,withMargin: 10).matchParentSideBorders(insetedByDx: 10.0).done() - - subjectCancel.addArrangedSubview(cancelledLabel) - subjectCancel.addArrangedSubview(subject) - - myContentView.addSubview(participantsIcon) - participantsIcon.alignUnder(view: subject,withMargin: 5).square(25).alignParentLeft(withMargin: 10).done() - - //infoConf.onClick { - contentView.onClick { - self.conferenceData?.toggleExpand() - self.owningTableView?.reloadData() - } - myContentView.addSubview(infoConf) - infoConf.imageView?.contentMode = .scaleAspectFit - infoConf.alignUnder(view: subject,withMargin: 5).square(25).alignParentRight(withMargin: 10).done() - infoConf.applyTintedIcons(tintedIcons: VoipTheme.conference_info_button) - - myContentView.addSubview(participantsTitle) - participantsTitle.alignUnder(view: subject,withMargin: 10).toRightOf(participantsIcon,withLeftMargin:10).toLeftOf(infoConf,withRightMargin: 15).done() - - myContentView.addSubview(participants) - participants.alignUnder(view: participantsTitle, withMargin: 10).toRightOf(participantsIcon,withLeftMargin:10).toLeftOf(infoConf,withRightMargin: 15).done() - - myContentView.addSubview(participantsGuestIcon) - participantsGuestIcon.alignUnder(view: participants,withMargin: 5).square(25).alignParentLeft(withMargin: 10).done() - participantsGuestIcon.isHidden = true - - myContentView.addSubview(participantsGuestTitle) - participantsGuestTitle.alignUnder(view: participants,withMargin: 10).toRightOf(participantsGuestIcon,withLeftMargin:10).toLeftOf(infoConf,withRightMargin: 15).done() - participantsGuestTitle.isHidden = true - - myContentView.addSubview(participantsGuest) - participantsGuest.alignUnder(view: participantsGuestTitle, withMargin: 10).toRightOf(participantsGuestIcon,withLeftMargin:10).toLeftOf(infoConf,withRightMargin: 15).done() - participantsGuest.isHidden = true - - expandedRows.axis = .vertical - expandedRows.spacing = 10 - myContentView.addSubview(expandedRows) - expandedRows.alignUnder(view: participants,withMargin: 15).matchParentSideBorders(insetedByDx:10).done() - - expandedRows.addArrangedSubview(descriptionTitle) - expandedRows.addArrangedSubview(descriptionValue) - - expandedRows.addArrangedSubview(urlTitle) - let urlAndCopy = UIStackView() - urlAndCopy.addArrangedSubview(urlValue) - urlValue.backgroundColor = .white - self.urlValue.isEnabled = false - urlValue.alignParentLeft().done() - urlAndCopy.addArrangedSubview(copyLink) - copyLink.toRightOf(urlValue,withLeftMargin: 10).done() - expandedRows.addArrangedSubview(urlAndCopy) - copyLink.onClick { - UIPasteboard.general.string = self.conferenceData?.address.value! - self.isBroadcast ? VoipDialog.toast(message: VoipTexts.conference_schedule_address_broadcast_copied_to_clipboard) : VoipDialog.toast(message: VoipTexts.conference_schedule_address_copied_to_clipboard) - } - - joinEditDelete.axis = .horizontal - joinEditDelete.spacing = 10 - joinEditDelete.distribution = .equalSpacing - - myContentView.addSubview(joinEditDelete) - joinEditDelete.alignUnder(view: expandedRows,withMargin: 10).alignParentRight(withMargin: 10).done() - - - joinEditDelete.addArrangedSubview(joinConf) - joinConf.width(150).done() - joinConf.onClick { - let view : ConferenceWaitingRoomView = self.VIEW(ConferenceWaitingRoomView.compositeViewDescription()) - view.setDetails(subject: (self.conferenceData?.subject.value)!, url: (self.conferenceData?.address.value)!, conferenceInfo: (self.conferenceData?.conferenceInfo.getCobject)!) - PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) - } - - joinEditDelete.addArrangedSubview(editConf) - editConf.onClick { - guard let confData = self.conferenceData else { - Log.e("Invalid conference date, unable to edit") - VoipDialog.toast(message: VoipTexts.conference_edit_error) - return - } - ConferenceSchedulingViewModel.shared.reset() - let seconds = confData.conferenceInfo.dateTime % 86400 - ConferenceSchedulingViewModel.shared.scheduledDate.value = Date(timeIntervalSince1970:TimeInterval(confData.conferenceInfo.dateTime - seconds)) - ConferenceSchedulingViewModel.shared.scheduledTime.value = Date(timeIntervalSince1970:TimeInterval(seconds)) - ConferenceSchedulingViewModel.shared.description.value = confData.description.value - ConferenceSchedulingViewModel.shared.subject.value = confData.subject.value - ConferenceSchedulingViewModel.shared.scheduledDuration.value = ConferenceSchedulingViewModel.durationList.firstIndex(where: {$0.value == confData.conferenceInfo.duration}) - ConferenceSchedulingViewModel.shared.scheduleForLater.value = true - ConferenceSchedulingViewModel.shared.selectedParticipants.value = [] - do { - try confData.conferenceInfo.participants.forEach { - ConferenceSchedulingViewModel.shared.selectedParticipants.value?.append(try Factory.Instance.createParticipantInfo(address: $0)) - ConferenceSchedulingViewModel.shared.selectedParticipants.value?.last?.role = .Listener - } - } catch { - Log.e("[ScheduleFromGroupChat] unable to create ParticipantInfo \(error)") - } - ConferenceSchedulingViewModel.shared.existingConfInfo.value = confData.conferenceInfo - // TOODO TimeZone (as Android 14.6.2022) ConferenceSchedulingViewModel.shared.scheduledTimeZone.value = self.conferenceData?.timezone - let view : ConferenceSchedulingView = self.VIEW(ConferenceSchedulingView.compositeViewDescription()) - PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) - } - - joinEditDelete.addArrangedSubview(deleteConf) - deleteConf.onClick { - self.askConfirmationTodeleteEntry() - } - myContentView.addSubview(selectionCheckBox) - selectionCheckBox.alignParentRight(withMargin: delete_checkbox_margin).alignUnder(view:organiser, withMargin: delete_checkbox_margin).done() - ScheduledConferencesViewModel.shared.editionEnabled.readCurrentAndObserve { editing in - self.selectionCheckBox.isHidden = editing != true - } - onLongClick { - ScheduledConferencesViewModel.shared.editionEnabled.value = true - } - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - self.clockIcon.image = UIImage(named: "conference_schedule_time_default")?.tinted(with: VoipTheme.voipDrawableColor.get()) - self.participantsIcon.image = UIImage(named: "conference_schedule_participants_default")?.tinted(with: VoipTheme.voipDrawableColor.get()) - self.participantsGuestIcon.image = UIImage(named: "conference_schedule_participants_default")?.tinted(with: VoipTheme.voipDrawableColor.get()) - } - } - - func askConfirmationTodeleteEntry() { - let delete = ButtonAttributes(text:VoipTexts.conference_info_confirm_removal_delete, action: { - self.deleteEntry() - VoipDialog.toast(message: VoipTexts.conference_info_removed) - }, isDestructive:false) - let cancel = ButtonAttributes(text:VoipTexts.cancel, action: {}, isDestructive:true) - VoipDialog(message:VoipTexts.conference_info_confirm_removal, givenButtons: [cancel,delete]).show() - } - - func deleteEntry() { - self.conferenceData?.deleteConference() - ScheduledConferencesViewModel.shared.computeConferenceInfoList() - self.owningTableView?.reloadData() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - -} diff --git a/Classes/Swift/Conference/Views/ScheduledConferencesView.swift b/Classes/Swift/Conference/Views/ScheduledConferencesView.swift deleted file mode 100644 index 74e8aa20f..000000000 --- a/Classes/Swift/Conference/Views/ScheduledConferencesView.swift +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import linphonesw - -@objc class ScheduledConferencesView: BackNextNavigationView, UICompositeViewDelegate, UITableViewDataSource, UITableViewDelegate { - - let conferenceListView = UITableView() - let noConference = StyledLabel(VoipTheme.empty_list_font,VoipTexts.conference_no_schedule) - let filters = UIStackView() - let selectAllButton = CallControlButton(buttonTheme:VoipTheme.nav_button("deselect_all")) - let separator = UIView() - - static let compositeDescription = UICompositeViewDescription(ScheduledConferencesView.self, statusBar: StatusBarView.self, tabBar: nil, sideMenu: SideMenuView.self, fullscreen: false, isLeftFragment: false,fragmentWith: nil) - static func compositeViewDescription() -> UICompositeViewDescription! { return compositeDescription } - func compositeViewDescription() -> UICompositeViewDescription! { return type(of: self).compositeDescription } - - override func viewDidLoad() { - - super.viewDidLoad( - backAction: { - if (ScheduledConferencesViewModel.shared.editionEnabled.value == true) { - ScheduledConferencesViewModel.shared.editionEnabled.value = false - } else { - PhoneMainView.instance().popView(self.compositeViewDescription()) - } - },nextAction: { - if (ScheduledConferencesViewModel.shared.editionEnabled.value == true) { - self.deleteSelection() - } else { - ConferenceSchedulingViewModel.shared.reset() - PhoneMainView.instance().changeCurrentView(ConferenceSchedulingView.compositeDescription) - } - }, - nextActionEnableCondition: MutableLiveData(), - title:VoipTexts.conference_scheduled) - super.titleLabel.applyStyle(VoipTheme.navigation_header_font) - - // Select all - selectAllButton.setImage(UIImage(named: "deselect_all"), for: .selected) - selectAllButton.setImage(UIImage(named: "select_all_default"), for: .normal) - topBar.addSubview(selectAllButton) - selectAllButton.toLeftOf(nextButton,withRightMargin: CGFloat(side_buttons_margin)).matchParentHeight().done() - - // Filter buttons - let showTerminated = getFilterButton(title: VoipTexts.conference_scheduled_terminated_filter) - showTerminated.onClick { - ScheduledConferencesViewModel.shared.showTerminated.value = true - } - filters.addArrangedSubview(showTerminated) - - let showScheduled = getFilterButton(title: VoipTexts.conference_scheduled_future_filter) - showScheduled.onClick { - ScheduledConferencesViewModel.shared.showTerminated.value = false - - } - filters.addArrangedSubview(showScheduled) - - ScheduledConferencesViewModel.shared.showTerminated.readCurrentAndObserve { it in - showTerminated.isSelected = it == true - showScheduled.isSelected = it != true - self.noConference.text = it != true ? VoipTexts.conference_no_schedule : VoipTexts.conference_no_terminated_schedule - ScheduledConferencesViewModel.shared.computeConferenceInfoList() - self.conferenceListView.reloadData() - self.noConference.isHidden = !ScheduledConferencesViewModel.shared.daySplitted.isEmpty - } - - self.view.addSubview(filters) - filters.spacing = 10 - filters.alignParentLeft(withMargin: 10).alignUnder(view: super.topBar,withMargin: self.form_margin).done() - - self.view.addSubview(separator) - separator.matchParentSideBorders().height(1).alignUnder(view: filters,withMargin: self.form_margin).done() - - // Conference list - - self.view.addSubview(conferenceListView) - conferenceListView.alignUnder(view: filters).done() - conferenceListView.isScrollEnabled = true - conferenceListView.dataSource = self - conferenceListView.delegate = self - conferenceListView.register(ScheduledConferencesCell.self, forCellReuseIdentifier: "ScheduledConferencesCell") - conferenceListView.allowsSelection = false - conferenceListView.rowHeight = UITableView.automaticDimension - if #available(iOS 15.0, *) { - conferenceListView.allowsFocus = false - } - conferenceListView.separatorStyle = .singleLine - conferenceListView.backgroundColor = .clear - - view.addSubview(noConference) - noConference.center().done() - - ScheduledConferencesViewModel.shared.editionEnabled.readCurrentAndObserve { editing in - if (editing == true) { - self.selectAllButton.isSelected = false - self.selectAllButton.isHidden = false - super.nextButton.applyTintedIcons(tintedIcons: VoipTheme.generic_delete_button) - super.backButton.applyTintedIcons(tintedIcons: VoipTheme.generic_cancel) - self.nextButton.isEnabled = ScheduledConferencesViewModel.shared.conferences.value?.filter{$0.selectedForDeletion.value == true}.count ?? 0 > 0 - } else { - self.selectAllButton.isHidden = true - ScheduledConferencesViewModel.shared.conferences.value?.forEach {$0.selectedForDeletion.value = false} - super.nextButton.applyTintedIcons(tintedIcons: VoipTheme.conference_create_button) - super.backButton.applyTintedIcons(tintedIcons: VoipTheme.generic_back) - self.nextButton.isEnabled = true - } - } - - self.selectAllButton.onClick { - let selectIt = !self.selectAllButton.isSelected - ScheduledConferencesViewModel.shared.conferences.value?.forEach {$0.selectedForDeletion.value = selectIt} - } - - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - self.view.backgroundColor = VoipTheme.voipBackgroundBWColor.get() - self.separator.backgroundColor = VoipTheme.separatorColor.get() - self.conferenceListView.separatorColor = .clear - self.conferenceListView.reloadData() - } - } - - func getFilterButton(title:String) -> UIButton { - let filter_button_height = 35.0 - let button = ButtonWithStateBackgrounds(backgroundStateColors: VoipTheme.button_conference_list_filter) - button.setTitle(title, for: .normal) - button.setTitleColor(.black, for: .normal) - button.setTitleColor(VoipTheme.primary_color, for: .selected) - button.height(filter_button_height).done() - button.layer.cornerRadius = filter_button_height / 2 - button.clipsToBounds = true - button.applyTitleStyle(VoipTheme.conf_list_filter_button_font) - button.width(0).done() - button.addSidePadding() - return button - } - - - override func viewWillAppear(_ animated: Bool) { - ScheduledConferencesViewModel.shared.computeConferenceInfoList() - super.viewWillAppear(animated) - self.conferenceListView.reloadData() - self.conferenceListView.removeConstraints().done() - self.conferenceListView.matchParentSideBorders(insetedByDx: 10).alignUnder(view: separator).alignParentBottom().done() - noConference.isHidden = !ScheduledConferencesViewModel.shared.daySplitted.isEmpty - super.nextButton.isEnabled = Core.get().defaultAccount != nil - ScheduledConferencesViewModel.shared.editionEnabled.value = false - } - - // TableView datasource delegate - - func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { - let daysArray = Array(ScheduledConferencesViewModel.shared.daySplitted.keys.sorted().reversed()) - let day = daysArray[section] - return TimestampUtils.dateLongToString(date: day) - } - - func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { - guard let header = view as? UITableViewHeaderFooterView else { return } - header.textLabel?.applyStyle(VoipTheme.conference_invite_title_font) - header.textLabel?.matchParentSideBorders().done() - } - - func numberOfSections(in tableView: UITableView) -> Int { - return ScheduledConferencesViewModel.shared.daySplitted.keys.count - } - - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - let daysArray = Array(ScheduledConferencesViewModel.shared.daySplitted.keys.sorted().reversed()) - let day = daysArray[section] - return ScheduledConferencesViewModel.shared.daySplitted[day]!.count - } - - func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return UITableView.automaticDimension - } - - - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell:ScheduledConferencesCell = tableView.dequeueReusableCell(withIdentifier: "ScheduledConferencesCell") as! ScheduledConferencesCell - let daysArray = Array(ScheduledConferencesViewModel.shared.daySplitted.keys.sorted().reversed()) - let day = daysArray[indexPath.section] - guard let data = ScheduledConferencesViewModel.shared.daySplitted[day]?[indexPath.row] else { - return cell - } - cell.conferenceData = data - cell.owningTableView = tableView - data.selectedForDeletion.readCurrentAndObserve { selected in - let selectedCount = ScheduledConferencesViewModel.shared.conferences.value?.filter{$0.selectedForDeletion.value == true}.count ?? 0 - let totalCount = ScheduledConferencesViewModel.shared.conferences.value?.count ?? 0 - self.nextButton.isEnabled = ScheduledConferencesViewModel.shared.editionEnabled.value == false || selectedCount > 0 - self.selectAllButton.isSelected = selectedCount == totalCount - } - return cell - } - - - - func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { - if editingStyle == .delete { - let cell = tableView.cellForRow(at: indexPath) as! ScheduledConferencesCell - cell.askConfirmationTodeleteEntry() - } - } - - func deleteSelection () { - let selectedCount = ScheduledConferencesViewModel.shared.conferences.value?.filter{$0.selectedForDeletion.value == true}.count ?? 0 - let delete = ButtonAttributes(text:VoipTexts.conference_info_confirm_removal_delete, action: { - ScheduledConferencesViewModel.shared.conferences.value?.forEach { - $0.deleteConference() - } - ScheduledConferencesViewModel.shared.computeConferenceInfoList() - self.conferenceListView.reloadData() - VoipDialog.toast(message: selectedCount == 1 ? VoipTexts.conference_info_removed : VoipTexts.conference_infos_removed) - ScheduledConferencesViewModel.shared.editionEnabled.value = false - }, isDestructive:false) - let cancel = ButtonAttributes(text:VoipTexts.cancel, action: {}, isDestructive:true) - VoipDialog(message:selectedCount == 1 ? VoipTexts.conference_info_confirm_removal : VoipTexts.conference_infos_confirm_removal, givenButtons: [cancel,delete]).show() - - } - -} diff --git a/Classes/Swift/ConfigManager.swift b/Classes/Swift/ConfigManager.swift deleted file mode 100644 index 37443a71a..000000000 --- a/Classes/Swift/ConfigManager.swift +++ /dev/null @@ -1,129 +0,0 @@ -/* -* Copyright (c) 2010-2020 Belledonne Communications SARL. -* -* This file is part of linphone-iphone -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*/ - -import Foundation -import linphonesw - -/* -* ConfigManager is a class that manipulates the configuration of the application. -* There is only one ConfigManager by calling ConfigManager.instance(). -*/ -@objc class ConfigManager: NSObject { - static var theConfigManager: ConfigManager? - var config: Config? - let applicationKey = "app" - - @objc static func instance() -> ConfigManager { - if (theConfigManager == nil) { - theConfigManager = ConfigManager() - } - return theConfigManager! - } - - @objc func setDb(db:OpaquePointer) { - config = Config.getSwiftObject(cObject: db) - } - - //pragma mark - LPConfig Functions - @objc func lpConfigSetString(value:String, key:String, section:String) { - if (!key.isEmpty) { - config?.setString(section: section, key: key, value: value) - } - } - - @objc func lpConfigSetString(value:String, key:String) { - lpConfigSetString(value: value, key: key, section: applicationKey) - } - - @objc func lpConfigStringForKey(key:String, section:String, defaultValue:String) -> String { - if (key.isEmpty) { - return defaultValue - } - return config?.getString(section: section, key: key, defaultString: "") ?? defaultValue - } - - @objc func lpConfigStringForKey(key:String, section:String) -> String { - return lpConfigStringForKey(key: key, section: section, defaultValue: "") - } - - @objc func lpConfigStringForKey(key:String, defaultValue:String) -> String { - return lpConfigStringForKey(key: key, section: applicationKey, defaultValue: defaultValue) - } - - @objc func lpConfigStringForKey(key:String) -> String { - return lpConfigStringForKey(key: key, defaultValue: "") - } - - @objc func lpConfigSetInt(value:Int, key:String, section:String) { - if(!key.isEmpty) { - config?.setInt(section: section, key: key, value: value) - } - } - - @objc func lpConfigSetInt(value:Int, key:String) { - lpConfigSetInt(value: value, key: key, section: applicationKey) - } - - @objc func lpConfigIntForKey(key:String, section:String, defaultValue:Int) -> Int { - if (key.isEmpty) { - return defaultValue - } - return config?.getInt(section: section, key: key, defaultValue: defaultValue) ?? defaultValue - } - - @objc func lpConfigIntForKey(key:String, section:String) -> Int { - return lpConfigIntForKey(key: key, section: section, defaultValue: -1) - } - - @objc func lpConfigIntForKey(key:String, defaultValue:Int) -> Int { - return lpConfigIntForKey(key: key, section: applicationKey, defaultValue: defaultValue) - } - - @objc func lpConfigIntForKey(key:String) -> Int { - return lpConfigIntForKey(key: key, defaultValue: -1) - } - - @objc func lpConfigSetBool(value:Bool, key:String, section:String) { - lpConfigSetInt(value: value ? 1:0, key: key, section: section) - } - - @objc func lpConfigSetBool(value:Bool, key:String) { - lpConfigSetBool(value: value, key: key, section: applicationKey) - } - - @objc func lpConfigBoolForKey(key:String, section:String, defaultValue:Bool) -> Bool { - if (key.isEmpty) { - return defaultValue - } - let val = lpConfigIntForKey(key: key, section: section, defaultValue: -1) - return (val != -1) ? (val == 1) : defaultValue - } - - @objc func lpConfigBoolForKey(key:String, section:String) -> Bool { - return lpConfigBoolForKey(key: key, section: section, defaultValue: false) - } - - @objc func lpConfigBoolForKey(key:String, defaultValue:Bool) -> Bool { - return lpConfigBoolForKey(key: key, section: applicationKey, defaultValue: defaultValue) - } - - @objc func lpConfigBoolForKey(key:String) -> Bool { - return lpConfigBoolForKey(key: key, defaultValue: false) - } -} diff --git a/Classes/Swift/Extensions/IOS/CopyableLabel.swift b/Classes/Swift/Extensions/IOS/CopyableLabel.swift deleted file mode 100644 index 69af91470..000000000 --- a/Classes/Swift/Extensions/IOS/CopyableLabel.swift +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2020-2030 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -class CopyableLabel: UILabel { - - override init(frame: CGRect) { - super.init(frame: frame) - setupTextSelection() - } - required init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - setupTextSelection() - } - - private func setupTextSelection() { - let longPress = UILongPressGestureRecognizer(target: self, action: #selector(didLongPress)) - addGestureRecognizer(longPress) - isUserInteractionEnabled = true - } - - @objc private func didLongPress(_ gesture: UILongPressGestureRecognizer) { - guard let text = text, !text.isEmpty else { return } - becomeFirstResponder() - - let menu = UIMenuController.shared - menu.menuItems = [UIMenuItem(title: "Copy", action: #selector(copyToPasteboard))] - - if !menu.isMenuVisible { - menu.setTargetRect(textRect(forBounds: bounds, limitedToNumberOfLines: numberOfLines).insetBy(dx: 5, dy: 5), in: self) - menu.setMenuVisible(true, animated: true) - } - } - - @objc private func copyToPasteboard(_ sender: Any?) { - UIPasteboard.general.string = text - } -} diff --git a/Classes/Swift/Extensions/IOS/OptionalExtensions.swift b/Classes/Swift/Extensions/IOS/OptionalExtensions.swift deleted file mode 100644 index 345b367d7..000000000 --- a/Classes/Swift/Extensions/IOS/OptionalExtensions.swift +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -extension Optional { - var orNil: Any { - switch self { - case .none: - return "|⭕️" - case let .some(value): - return value - } - } -} - -extension Optional: CustomStringConvertible { - - public var description: String { - switch self { - case .some(let wrappedValue): - return "\(wrappedValue)" - default: - return "|⭕️" - } - } -} - diff --git a/Classes/Swift/Extensions/IOS/SnapkitBridge.swift b/Classes/Swift/Extensions/IOS/SnapkitBridge.swift deleted file mode 100644 index 1fd174b67..000000000 --- a/Classes/Swift/Extensions/IOS/SnapkitBridge.swift +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import UIKit -import Photos -import linphonesw - - -@objc class SnapkitBridge: NSObject { - @objc static func matchParentDimensions(view:UIView) { - view.matchParentDimmensions().done() - } - - @objc static func matchParentDimensions(view:UIView,leftInset:CGFloat) { - view.matchParentDimmensions(insetedBy: UIEdgeInsets(top: 0, left: leftInset, bottom: 0, right: 0)).done() - } - - @objc static func matchParentDimensions(view:UIView,topInset:CGFloat) { - view.matchParentDimmensions(insetedBy: UIEdgeInsets(top: topInset, left: 0, bottom: 0, right: 0)).done() - } - - @objc static func height(view:UIView,heiht:Int) { - view.height(heiht).done() - } - @objc static func square(view:UIView,size:Int) { - view.square(size).done() - } - - @objc static func alignParentLeft(view:UIView) { - view.alignParentLeft().done() - } - - @objc static func centerY(view:UIView) { - view.centerY().done() - } - -} - diff --git a/Classes/Swift/Extensions/IOS/UIApplication+Extension.swift b/Classes/Swift/Extensions/IOS/UIApplication+Extension.swift deleted file mode 100644 index 50f5e9353..000000000 --- a/Classes/Swift/Extensions/IOS/UIApplication+Extension.swift +++ /dev/null @@ -1,39 +0,0 @@ -/* -* Copyright (c) 2010-2020 Belledonne Communications SARL. -* -* This file is part of linhome -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*/ - - - -import Foundation -import UIKit - - -extension UIApplication { - - class func getTopMostViewController() -> UIViewController? { - let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first - if var topController = keyWindow?.rootViewController { - while let presentedViewController = topController.presentedViewController { - topController = presentedViewController - } - return topController - } else { - return nil - } - } -} diff --git a/Classes/Swift/Extensions/IOS/UIButtonExtensions.swift b/Classes/Swift/Extensions/IOS/UIButtonExtensions.swift deleted file mode 100644 index abcb0da99..000000000 --- a/Classes/Swift/Extensions/IOS/UIButtonExtensions.swift +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import SnapKit -import UIKit - -extension UIButton { - func addSidePadding(p:CGFloat = 10) { // Requires a width to be set prior to this ! SnapKit does not support updateOrCreate. - if let w = titleLabel?.textWidth { - updateWidth(w+2*p).done() - } - } - - func applyTintedIcons(tintedIcons: [UInt: TintableIcon]) { - tintedIcons.keys.forEach { (stateRawValue) in - let tintedIcon = tintedIcons[stateRawValue]! - UIImage(named:tintedIcon.name).map { - setImage($0.tinted(with: tintedIcon.tintColor?.get()),for: UIButton.State(rawValue: stateRawValue)) - } - } - } - -} diff --git a/Classes/Swift/Extensions/IOS/UIColorExtensions.swift b/Classes/Swift/Extensions/IOS/UIColorExtensions.swift deleted file mode 100644 index 2d50661a2..000000000 --- a/Classes/Swift/Extensions/IOS/UIColorExtensions.swift +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -extension UIColor { - public convenience init(hex: String) { - let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted) - var int = UInt64() - Scanner(string: hex).scanHexInt64(&int) - let a, r, g, b: UInt64 - switch hex.count { - case 3: // RGB (12-bit) - (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17) - case 6: // RGB (24-bit) - (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF) - case 8: // ARGB (32-bit) - (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF) - default: - (a, r, g, b) = (255, 0, 0, 0) - } - self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(a) / 255) - } -} diff --git a/Classes/Swift/Extensions/IOS/UIDeviceExtensions.swift b/Classes/Swift/Extensions/IOS/UIDeviceExtensions.swift deleted file mode 100644 index ba7a5245a..000000000 --- a/Classes/Swift/Extensions/IOS/UIDeviceExtensions.swift +++ /dev/null @@ -1,80 +0,0 @@ -/* -* Copyright (c) 2010-2020 Belledonne Communications SARL. -* -* This file is part of linhome -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*/ - - - -import Foundation -import UIKit -import AVFoundation -import linphonesw - -extension UIDevice { - static func ipad() -> Bool { - return UIDevice.current.userInterfaceIdiom == .pad - } - static func vibrate() { - if (!ipad() || Core.get().config?.getBool(section: "app", key: "disable_chat_feature", defaultValue: false) == false) { - AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) - } - } - static func is5SorSEGen1() -> Bool { - return UIScreen.main.nativeBounds.height == 1136 - } - - static func hasNotch() -> Bool { - if (UserDefaults.standard.bool(forKey: "hasNotch")) { - return true - } - guard #available(iOS 11.0, *), let topPadding = UIApplication.shared.keyWindow?.safeAreaInsets.top, topPadding > 24 else { - return false - } - UserDefaults.standard.setValue(true, forKey: "hasNotch") - return true - } - - static func notchHeight() -> CGFloat { - guard #available(iOS 11.0, *), let topPadding = UIApplication.shared.keyWindow?.safeAreaInsets.top, let sidePadding = UIApplication.shared.keyWindow?.safeAreaInsets.left else { - return 0 - } - return [.landscapeRight,.landscapeLeft].contains(UIDevice.current.orientation) ? sidePadding : topPadding - } - - static func switchedDisplayMode() -> Bool { - let displayMode = UserDefaults.standard.string(forKey: "displayMode") - if #available(iOS 13.0, *) { - if UITraitCollection.current.userInterfaceStyle == .light { - UserDefaults.standard.set("light", forKey: "displayMode") - } else { - UserDefaults.standard.set("dark", forKey: "displayMode") - } - } - return displayMode != nil && displayMode != UserDefaults.standard.string(forKey: "displayMode") - } - -} - -@objc class UIDeviceBridge : NSObject { - static let displayModeSwitched = MutableLiveData() - @objc static func switchedDisplayMode() -> Bool { - return UIDevice.switchedDisplayMode() - } - @objc static func notifyDisplayModeSwitch() { - displayModeSwitched.notifyValue() - } -} diff --git a/Classes/Swift/Extensions/IOS/UIImageExtensions.swift b/Classes/Swift/Extensions/IOS/UIImageExtensions.swift deleted file mode 100644 index a409d782a..000000000 --- a/Classes/Swift/Extensions/IOS/UIImageExtensions.swift +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation - -extension UIImage { - func tinted(with color: UIColor?) -> UIImage? { - if (color == nil) { - return self - } - defer { UIGraphicsEndImageContext() } - UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale) - color!.set() - self.withRenderingMode(.alwaysTemplate).draw(in: CGRect(origin: .zero, size: self.size)) - return UIGraphicsGetImageFromCurrentImageContext() - } - - func withInsets(insets: UIEdgeInsets) -> UIImage? { - UIGraphicsBeginImageContextWithOptions( - CGSize(width: self.size.width + insets.left + insets.right, - height: self.size.height + insets.top + insets.bottom), false, self.scale) - let _ = UIGraphicsGetCurrentContext() - let origin = CGPoint(x: insets.left, y: insets.top) - self.draw(at: origin) - let imageWithInsets = UIGraphicsGetImageFromCurrentImageContext() - UIGraphicsEndImageContext() - return imageWithInsets - } - - func withPadding(padding: CGFloat) -> UIImage? { - let insets = UIEdgeInsets(top: padding, left: padding, bottom: padding, right: padding) - return withInsets(insets: insets) - } -} diff --git a/Classes/Swift/Extensions/IOS/UIImageViewExtensions.swift b/Classes/Swift/Extensions/IOS/UIImageViewExtensions.swift deleted file mode 100644 index 1ef56dd60..000000000 --- a/Classes/Swift/Extensions/IOS/UIImageViewExtensions.swift +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation - -extension UIImageView { - func tint(_ color:UIColor) { - self.image = self.image?.withRenderingMode(.alwaysTemplate) - tintColor = color - } -} diff --git a/Classes/Swift/Extensions/IOS/UILabelExtensions.swift b/Classes/Swift/Extensions/IOS/UILabelExtensions.swift deleted file mode 100644 index f3ab2bafe..000000000 --- a/Classes/Swift/Extensions/IOS/UILabelExtensions.swift +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import SnapKit -import UIKit - -extension UILabel { - var textWidth: CGFloat? { - guard let myText = self.text else { return nil } - guard let myFont = self.font else { return nil } - let rect = CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude) - let labelSize = myText.boundingRect(with: rect, options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: myFont], context: nil) - return ceil(labelSize.width) - } - - func addSidePadding(p:CGFloat = 5.0) { - if let w = textWidth { - width(w+2*p).done() - } - } -} diff --git a/Classes/Swift/Extensions/IOS/UIVIewControllerExtensions.swift b/Classes/Swift/Extensions/IOS/UIVIewControllerExtensions.swift deleted file mode 100644 index 8c27c7dec..000000000 --- a/Classes/Swift/Extensions/IOS/UIVIewControllerExtensions.swift +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import SnapKit -import UIKit - -extension UIViewController { - func VIEW( _ desc: UICompositeViewDescription) -> T{ - return PhoneMainView.instance().mainViewController.getCachedController(desc.name) as! T - } - -} diff --git a/Classes/Swift/Extensions/IOS/UIVIewExtensions.swift b/Classes/Swift/Extensions/IOS/UIVIewExtensions.swift deleted file mode 100644 index c05b9c7e6..000000000 --- a/Classes/Swift/Extensions/IOS/UIVIewExtensions.swift +++ /dev/null @@ -1,548 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import SnapKit -import UIKit - -extension UIView { - - // Few constraints wrapper to abstract SnapKit functions - - func removeConstraints() -> UIView { - snp.removeConstraints() - return self - } - - - func square(_ size:Int) -> UIView { - snp.makeConstraints { (make) in - make.width.equalTo(size) - make.height.equalTo(size) - } - return self - } - - func squareMax(_ size:Int) -> UIView { - snp.makeConstraints { (make) in - make.height.lessThanOrEqualTo(size).priority(.high) - make.width.equalTo(snp.height).priority(.high) - } - return self - } - - - func makeHeightMatchWidth() -> UIView { - snp.makeConstraints { (make) in - make.height.equalTo(snp.width) - } - return self - } - - func makeWidthMatchHeight() -> UIView { - snp.makeConstraints { (make) in - make.width.equalTo(snp.height) - } - return self - } - - func size(w:CGFloat,h:CGFloat) -> UIView { - snp.makeConstraints { (make) in - make.width.equalTo(w) - make.height.equalTo(h) - } - return self - } - - func updateSize(w:CGFloat,h:CGFloat) -> UIView { - snp.updateConstraints { (make) in - make.width.equalTo(w) - make.height.equalTo(h) - } - return self - } - - func height(_ h:CGFloat) -> UIView { - snp.makeConstraints { (make) in - make.height.equalTo(h) - } - return self - } - - func height(_ h:Int) -> UIView { - return height(CGFloat(h)) - } - - func width(_ h:CGFloat) -> UIView { - snp.makeConstraints { (make) in - make.width.equalTo(h) - } - return self - } - - func updateWidth(_ h:CGFloat) -> UIView { - snp.updateConstraints { (make) in - make.width.equalTo(h) - } - return self - } - - func width(_ h:Int) -> UIView { - return width(CGFloat(h)) - } - - func maxHeight(_ h:CGFloat) -> UIView { - snp.makeConstraints { (make) in - make.height.lessThanOrEqualTo(h) - } - return self - } - - func maxWidth(_ h:CGFloat) -> UIView { - snp.makeConstraints { (make) in - make.width.lessThanOrEqualTo(h) - } - return self - } - - func minWidth(_ h:CGFloat) -> UIView { - snp.makeConstraints { (make) in - make.width.greaterThanOrEqualTo(h) - } - return self - } - - - func matchParentSideBorders(insetedByDx:CGFloat = 0) -> UIView { - snp.makeConstraints { (make) in - make.left.equalToSuperview().offset(insetedByDx) - make.right.equalToSuperview().offset(-insetedByDx) - } - return self - } - - func matchBordersOf(view:UIView) -> UIView { - snp.makeConstraints { (make) in - make.left.right.equalTo(view) - } - return self - } - - func matchParentDimmensions() -> UIView { - snp.makeConstraints { (make) in - make.left.right.top.bottom.equalToSuperview() - } - return self - } - - func matchParentDimmensions(insetedByDx:CGFloat) -> UIView { - snp.makeConstraints { (make) in - make.left.top.equalToSuperview().offset(insetedByDx) - make.right.bottom.equalToSuperview().offset(-insetedByDx) - } - return self - } - - func matchParentDimmensions(insetedBy:UIEdgeInsets) -> UIView { - snp.makeConstraints { (make) in - make.left.equalToSuperview().offset(insetedBy.left) - make.top.equalToSuperview().offset(insetedBy.top) - make.right.equalToSuperview().offset(-insetedBy.right) - make.bottom.equalToSuperview().offset(-insetedBy.bottom) - } - return self - } - - func matchBordersWith(view:UIView, insetedByDx:CGFloat = 0) -> UIView { - snp.makeConstraints { (make) in - make.left.top.equalTo(view).offset(insetedByDx) - make.right.bottom.equalTo(view).offset(-insetedByDx) - } - return self - } - - func updateTopBorderWith(view:UIView, inset:CGFloat = 0) -> UIView { - snp.updateConstraints { (make) in - make.top.equalTo(view).offset(inset) - } - return self - } - - func matchParentEdges() -> UIView { - snp.makeConstraints { (make) in - make.edges.equalToSuperview() - } - return self - } - - func matchDimentionsOf(view:UIView) -> UIView { - snp.makeConstraints { (make) in - make.left.right.top.bottom.equalTo(view) - } - return self - } - - func matchParentHeight() -> UIView { - snp.makeConstraints { (make) in - make.top.bottom.equalToSuperview() - } - return self - } - - func addRightMargin(margin:CGFloat) -> UIView { - snp.makeConstraints { (make) in - make.rightMargin.equalTo(margin) - } - return self - } - - func matchParentHeightDividedBy(_ divider : CGFloat) -> UIView { - snp.makeConstraints { (make) in - make.height.equalToSuperview().dividedBy(divider) - } - return self - } - - func matchParentWidthDividedBy(_ divider : CGFloat) -> UIView { - snp.makeConstraints { (make) in - make.width.equalToSuperview().dividedBy(divider) - } - return self - } - - func center() -> UIView { - snp.makeConstraints { (make) in - make.center.equalToSuperview() - } - return self - } - - func alignParentTop(withMargin:CGFloat = 0.0) -> UIView { - snp.makeConstraints { (make) in - make.top.equalToSuperview().offset(withMargin) - } - return self - } - - func alignParentTop(withMargin:Int ) -> UIView { - return alignParentTop(withMargin:CGFloat(withMargin)) - } - - - func alignUnder(view:UIView, withMargin:CGFloat = 0.0) -> UIView { - snp.makeConstraints { (make) in - make.top.equalTo(view.snp.bottom).offset(withMargin) - } - return self - } - func alignUnder(view:UIView, withMargin:Int) -> UIView { - return alignUnder(view: view,withMargin:CGFloat(withMargin)) - } - - func matchRightOf(view:UIView, withMargin:CGFloat = 0) -> UIView { - snp.makeConstraints { (make) in - make.right.equalTo(view).offset(withMargin) - } - return self - } - - func updateAlignUnder(view:UIView, withMargin:CGFloat = 0.0) -> UIView { - snp.updateConstraints { (make) in - make.top.equalTo(view.snp.bottom).offset(withMargin) - } - return self - } - - func alignParentBottom(withMargin:CGFloat = 0.0) -> UIView { - snp.makeConstraints { (make) in - make.bottom.equalToSuperview().offset(-withMargin) - } - return self - } - - func updateAlignParentBottom(withMargin:CGFloat = 0.0) -> UIView { - snp.updateConstraints { (make) in - make.bottom.equalToSuperview().offset(-withMargin) - } - return self - } - - func alignParentBottom(withMargin:Int) -> UIView { - return alignParentBottom(withMargin:CGFloat(withMargin)) - } - - func updateAlignParentBottom(withMargin:Int) -> UIView { - return updateAlignParentBottom(withMargin:CGFloat(withMargin)) - } - - func alignAbove(view:UIView, withMargin:CGFloat = 0.0) -> UIView { - snp.makeConstraints { (make) in - make.bottom.equalTo(view.snp.top).offset(-withMargin) - } - return self - } - - func alignAbove(view:UIView, withMargin:Int) -> UIView { - return alignAbove(view: view,withMargin:CGFloat(withMargin)) - } - - func alignBottomWith(otherView:UIView) -> UIView { - snp.makeConstraints { (make) in - make.bottom.equalTo(otherView) - } - return self - } - - func marginLeft(_ m:CGFloat) -> UIView { - snp.makeConstraints { (make) in - make.left.equalToSuperview().offset(m) - } - return self - } - - func alignParentLeft(withMargin:CGFloat = 0.0) -> UIView { - snp.makeConstraints { (make) in - make.left.equalToSuperview().offset(withMargin) - } - return self - } - - func updateAlignParentLeft(withMargin:CGFloat = 0.0) -> UIView { - snp.updateConstraints { (make) in - make.left.equalToSuperview().offset(withMargin) - } - return self - } - - func alignParentLeft(withMargin:Int) -> UIView { - return alignParentLeft(withMargin:CGFloat(withMargin)) - } - - func alignParentRight(withMargin:Int = 0) -> UIView { - snp.makeConstraints { (make) in - make.right.equalToSuperview().offset(-withMargin) - } - return self - } - - func updateAlignParentRight(withMargin:CGFloat = 0) -> UIView { - snp.updateConstraints { (make) in - make.right.equalToSuperview().offset(-withMargin) - } - return self - } - - func alignParentRight(withMargin:CGFloat) -> UIView { - return alignParentRight(withMargin:Int(withMargin)) - } - - func alignRightWith(_ view:UIView) -> UIView { - snp.makeConstraints { (make) in - make.right.equalTo(view.snp.right) - } - return self - } - - func toRightOf(_ view:UIView, withLeftMargin:Int = 0) -> UIView { - snp.makeConstraints { (make) in - make.left.equalTo(view.snp.right).offset(withLeftMargin) - } - return self - } - - func toRightOf(_ view:UIView, withLeftMargin:CGFloat) -> UIView { - return toRightOf(view,withLeftMargin: Int(withLeftMargin)) - } - - - func alignHorizontalCenterWith(_ view:UIView) -> UIView { - snp.makeConstraints { (make) in - make.centerY.equalTo(view) - } - return self - } - - func alignVerticalCenterWith(_ view:UIView) -> UIView { - snp.makeConstraints { (make) in - make.centerX.equalTo(view) - } - return self - } - - - func toLeftOf(_ view:UIView) -> UIView { - snp.makeConstraints { (make) in - make.right.equalTo(view.snp.left) - } - return self - } - - func toLeftOf(_ view:UIView, withRightMargin:CGFloat) -> UIView { - snp.makeConstraints { (make) in - make.right.equalTo(view.snp.left).offset(-withRightMargin) - } - return self - } - - func centerX(withDx:Int = 0) -> UIView { - snp.makeConstraints { (make) in - make.centerX.equalToSuperview().offset(withDx) - } - return self - } - - func centerY(withDy:Int = 0) -> UIView { - snp.makeConstraints { (make) in - make.centerY.equalToSuperview().offset(withDy) - } - return self - } - - func matchCenterXOf(view:UIView, withDx:Int = 0) -> UIView { - snp.makeConstraints { (make) in - make.centerX.equalTo(view).offset(withDx) - } - return self - } - - func matchCenterYOf(view:UIView, withDy:Int = 0) -> UIView { - snp.makeConstraints { (make) in - make.centerY.equalTo(view).offset(withDy) - } - return self - } - - func wrapContentY() -> UIView { - subviews.first?.snp.makeConstraints({ make in - make.top.equalToSuperview() - }) - subviews.last?.snp.makeConstraints({ make in - make.bottom.equalToSuperview() - }) - return self - } - - func wrapContentX() -> UIView { - subviews.first?.snp.makeConstraints({ make in - make.left.equalToSuperview() - }) - subviews.last?.snp.makeConstraints({ make in - make.right.equalToSuperview() - }) - return self - } - - func wrapContent(inset:UIEdgeInsets) -> UIView { - subviews.first?.snp.makeConstraints({ make in - make.left.equalToSuperview().offset(inset.left) - }) - subviews.last?.snp.makeConstraints({ make in - make.right.equalToSuperview().offset(-inset.right) - }) - subviews.first?.snp.makeConstraints({ make in - make.top.equalToSuperview().offset(inset.top) - }) - subviews.last?.snp.makeConstraints({ make in - make.bottom.equalToSuperview().offset(-inset.bottom) - }) - return self - } - - func done() { - // to avoid the unused variable warning - } - - // Single click - - class TapGestureRecognizer: UITapGestureRecognizer { - var action : (()->Void)? = nil - } - - func onClick(action : @escaping ()->Void ){ - let tap = TapGestureRecognizer(target: self , action: #selector(self.handleTap(_:))) - tap.action = action - tap.numberOfTapsRequired = 1 - tap.cancelsTouchesInView = false - - self.addGestureRecognizer(tap) - self.isUserInteractionEnabled = true - - } - @objc func handleTap(_ sender: TapGestureRecognizer) { - sender.action!() - } - - // Long click - class LongPressGestureRecognizer: UILongPressGestureRecognizer { - var action : (()->Void)? = nil - } - func onLongClick(action : @escaping ()->Void ){ - let tap = LongPressGestureRecognizer(target: self , action: #selector(self.handleLongClick(_:))) - tap.action = action - tap.cancelsTouchesInView = false - self.addGestureRecognizer(tap) - self.isUserInteractionEnabled = true - - } - @objc func handleLongClick(_ sender: LongPressGestureRecognizer) { - sender.action!() - } - - func onLongClickOneClick(action : @escaping ()->Void ){ - let tap = LongPressGestureRecognizer(target: self , action: #selector(self.handleLongClickOneClick(_:))) - tap.action = action - tap.cancelsTouchesInView = false - self.addGestureRecognizer(tap) - self.isUserInteractionEnabled = true - } - @objc func handleLongClickOneClick(_ sender: LongPressGestureRecognizer) { - if (sender.state == .began){ - sender.action!() - } - } - - func VIEW( _ desc: UICompositeViewDescription) -> T{ - return PhoneMainView.instance().mainViewController.getCachedController(desc.name) as! T - } - - // Theming - - func setFormInputBackground(readOnly:Bool) { - if (readOnly) { - backgroundColor = VoipTheme.voipFormDisabledFieldBackgroundColor.get() - } else { - layer.borderWidth = 1 - layer.borderColor = VoipTheme.voipFormFieldBackgroundColor.get().cgColor - } - layer.cornerRadius = 3 - clipsToBounds = true - } - - @objc func toImage() -> UIImage? { - UIGraphicsBeginImageContextWithOptions(bounds.size, false, 0) - guard let context = UIGraphicsGetCurrentContext() else { return nil } - context.saveGState() - layer.render(in: context) - context.restoreGState() - guard let image = UIGraphicsGetImageFromCurrentImageContext() else { return nil } - UIGraphicsEndImageContext() - return image - } - -} diff --git a/Classes/Swift/Extensions/LinphoneCore/AddressExtensions.swift b/Classes/Swift/Extensions/LinphoneCore/AddressExtensions.swift deleted file mode 100644 index 0caa0117f..000000000 --- a/Classes/Swift/Extensions/LinphoneCore/AddressExtensions.swift +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import linphonesw - -extension Address { - - func initials() -> String? { - var initials = Address.initials(displayName: addressBookEnhancedDisplayName()) - if (initials == nil || initials!.isEmpty) { - initials = String(username!.prefix(1)) - } - return initials - } - - static func initials(displayName: String?) -> String? { // Basic ImproveMe - let separator = displayName?.contains(" ") == true ? " " : "." - return displayName?.components(separatedBy: separator) - .reduce("") { - ($0.isEmpty ? "" : "\($0.first?.uppercased() ?? "")") + - ($1.isEmpty ? "" : "\($1.first?.uppercased() ?? "")") - } - } - - func addressBookEnhancedDisplayName() -> String? { - if let contact = FastAddressBook.getContactWith(getCobject) { - return contact.displayName - } else if (displayName != nil && !displayName!.isEmpty) { - return displayName - } else { - return username - } - } - - func contact() -> Contact? { - return FastAddressBook.getContactWith(getCobject) - } - - func isMe() -> Bool { - guard let accountAddress = Core.get().defaultAccount?.params?.identityAddress else { - return false - } - return weakEqual(address2: accountAddress) - } - -} diff --git a/Classes/Swift/Extensions/LinphoneCore/CallExtensions.swift b/Classes/Swift/Extensions/LinphoneCore/CallExtensions.swift deleted file mode 100644 index 12096e830..000000000 --- a/Classes/Swift/Extensions/LinphoneCore/CallExtensions.swift +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import linphonesw - -extension Call { - func answerVideoUpdateRequest(accept:Bool) { - guard let params = try?core? .createCallParams(call: self) else { - Log.i("[Call] \(self) unable to answerVideoUpdateRequest : could not create params ") - return - } - if (accept) { - params.videoEnabled = true - core?.videoCaptureEnabled = true && Core.get().config?.getBool(section: "app", key: "disable_video_feature", defaultValue: false) == false - core?.videoDisplayEnabled = true && Core.get().config?.getBool(section: "app", key: "disable_video_feature", defaultValue: false) == false - } else { - params.videoEnabled = false - } - try?acceptUpdate(params: params) - } -} - -extension Call : CustomStringConvertible { - public var description: String { - return "" - } -} - diff --git a/Classes/Swift/Extensions/LinphoneCore/ConferenceExtensions.swift b/Classes/Swift/Extensions/LinphoneCore/ConferenceExtensions.swift deleted file mode 100644 index 986c44007..000000000 --- a/Classes/Swift/Extensions/LinphoneCore/ConferenceExtensions.swift +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import linphonesw - - - -extension Conference : CustomStringConvertible { - public var description: String { - if let username = conferenceAddress?.username { - return "<\(username)>" - } - return "" - } - -} - diff --git a/Classes/Swift/Extensions/LinphoneCore/CoreExtensions.swift b/Classes/Swift/Extensions/LinphoneCore/CoreExtensions.swift deleted file mode 100644 index 158c5afec..000000000 --- a/Classes/Swift/Extensions/LinphoneCore/CoreExtensions.swift +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import linphonesw - -extension Core { - static func get() -> Core { - return CallManager.instance().lc! - } - - func showSwitchCameraButton() -> Bool { - return videoDevicesList.count > 2 // Count StaticImage camera - } - - func toggleCamera() { - Log.i("[Core] Current camera device is \(videoDevice)") - var switched = false - videoDevicesList.forEach { - if (!switched && $0 != videoDevice && $0 != "StaticImage: Static picture") { - Log.i("[Core] New camera device will be \($0)") - try?setVideodevice(newValue: $0) - switched = true - } - } - } -} diff --git a/Classes/Swift/Extensions/LinphoneCore/IceState.swift b/Classes/Swift/Extensions/LinphoneCore/IceState.swift deleted file mode 100644 index 7274e2f7e..000000000 --- a/Classes/Swift/Extensions/LinphoneCore/IceState.swift +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import linphonesw - -extension IceState { - func toString()->String { - switch (self) { - case .NotActivated: return NSLocalizedString("Not activated", tableName:"ICE has not been activated for this call",comment : "") - case .Failed: return NSLocalizedString("Failed", tableName:"ICE processing has failed",comment :"") - case .InProgress: return NSLocalizedString("In progress", tableName:"ICE process is in progress",comment :"") - case .HostConnection: return NSLocalizedString("Direct connection", tableName:"ICE has established a direct connection to the remote host",comment :"") - case .ReflexiveConnection: return NSLocalizedString( "NAT(s) connection", tableName:"ICE has established a connection to the remote host through one or several NATs",comment :"") - case .RelayConnection: return NSLocalizedString("Relay connection", tableName:"ICE has established a connection through a relay",comment :"") - } - - } -} diff --git a/Classes/Swift/Extensions/LinphoneCore/ParticipantExtensions.swift b/Classes/Swift/Extensions/LinphoneCore/ParticipantExtensions.swift deleted file mode 100644 index 9b7b07652..000000000 --- a/Classes/Swift/Extensions/LinphoneCore/ParticipantExtensions.swift +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import linphonesw - - - -extension Participant : CustomStringConvertible { - public var description: String { - if let address = address?.asStringUriOnly() { - return "" - } - return "" - } -} - diff --git a/Classes/Swift/Extensions/LinphoneCore/PayloadType.swift b/Classes/Swift/Extensions/LinphoneCore/PayloadType.swift deleted file mode 100644 index 197a8d733..000000000 --- a/Classes/Swift/Extensions/LinphoneCore/PayloadType.swift +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import linphonesw -import linphone - -extension linphonesw.PayloadType { - - -} diff --git a/Classes/Swift/FileUtil.swift b/Classes/Swift/FileUtil.swift deleted file mode 100644 index 08a80e826..000000000 --- a/Classes/Swift/FileUtil.swift +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import UIKit -import linphonesw - -@objc class FileUtil: NSObject { - public class func bundleFilePath(_ file: NSString) -> String? { - return Bundle.main.path(forResource: file.deletingPathExtension, ofType: file.pathExtension) - } - - public class func bundleFilePathAsUrl(_ file: NSString) -> URL? { - if let bPath = bundleFilePath(file) { - return URL.init(fileURLWithPath: bPath) - } - return nil - } - - public class func documentsDirectory() -> URL { - let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) - let documentsDirectory = paths[0] - return documentsDirectory - } - - public class func libraryDirectory() -> URL { - let paths = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask) - let documentsDirectory = paths[0] - return documentsDirectory - } - - public class func sharedContainerUrl(appGroupName:String) -> URL { - return FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroupName)! - } - - - @objc public class func ensureDirectoryExists(path:String) { - if !FileManager.default.fileExists(atPath: path) { - do { - try FileManager.default.createDirectory(atPath: path, withIntermediateDirectories: true, attributes: nil) - } catch { - Log.e(error.localizedDescription) - } - } - } - - public class func ensureFileExists(path:String) { - if !FileManager.default.fileExists(atPath: path) { - FileManager.default.createFile(atPath: path, contents: nil, attributes: nil) - } - } - - public class func fileExists(path:String) -> Bool { - return FileManager.default.fileExists(atPath: path) - } - - public class func fileExistsAndIsNotEmpty(path:String) -> Bool { - guard FileManager.default.fileExists(atPath: path) else {return false} - do { - let attribute = try FileManager.default.attributesOfItem(atPath: path) - if let size = attribute[FileAttributeKey.size] as? NSNumber { - return size.doubleValue > 0 - } else { - return false - } - } catch { - Log.e(error.localizedDescription) - return false - } - } - - public class func write(string:String, toPath:String) { - do { - try string.write(to: URL(fileURLWithPath:toPath), atomically: true, encoding: String.Encoding.utf8) - } catch { - Log.e(error.localizedDescription) - } - } - - public class func delete(path:String) { - do { - try FileManager.default.removeItem(atPath: path) - Log.i("FIle \(path) was removed") - } catch { - Log.e("Error deleting file at path \(path) error is \(error)") - } - } - - public class func mkdir(path:String) { - do { - try FileManager.default.createDirectory(atPath: path, withIntermediateDirectories: true, attributes: nil) - Log.i("Dir \(path) was created") - } catch { - Log.e("Error creating dir at path \(path) error is \(error)") - } - } - - - - public class func copy(_ fromPath:String, _ toPath: String, overWrite:Bool) { - do { - if (overWrite && fileExists(path: toPath)) { - delete(path: toPath) - } - try FileManager.default.copyItem(at: URL(fileURLWithPath:fromPath), to: URL(fileURLWithPath:toPath)) - } catch { - Log.e(error.localizedDescription) - } - } - - - // For debugging - - public class func showListOfFilesInSharedDir(appGroupName:String) { - let fileManager = FileManager.default - do { - let fileURLs = try fileManager.contentsOfDirectory(at: FileUtil.sharedContainerUrl(appGroupName: appGroupName), includingPropertiesForKeys: nil) - fileURLs.forEach{print($0)} - } catch { - Log.e("Error while enumerating files \(error.localizedDescription)") - } - } - -} diff --git a/Classes/Swift/LocalPushManager.swift b/Classes/Swift/LocalPushManager.swift deleted file mode 100644 index ce9181ed3..000000000 --- a/Classes/Swift/LocalPushManager.swift +++ /dev/null @@ -1,129 +0,0 @@ -/* -* Copyright (c) 2010-2020 Belledonne Communications SARL. -* -* This file is part of linphone-iphone -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*/ - -import Foundation -import NetworkExtension -import linphonesw -import Combine - - -let localPushProviderBundleIdentifier = "org.linphone.phone.localpushprovider" - -@available(iOS 15.0, *) -@objc class LocalPushManager : NSObject, NEAppPushDelegate { - - @objc static let shared = LocalPushManager() - private var appPushManager: NEAppPushManager? - private let isInitialized = MutableLiveData(false) - let isActive = MutableLiveData(false) - private let dispatchQueue = DispatchQueue(label: "DirectoryViewModel.dispatchQueue") - private let pushManagerIsActiveSubject = CurrentValueSubject(false) - private var pushManagerIsActiveCancellable: AnyCancellable? - private var cancellables = Set() - private(set) lazy var pushManagerIsActivePublisher = { - pushManagerIsActiveSubject - .debounce(for: .milliseconds(500), scheduler: dispatchQueue) - .eraseToAnyPublisher() - }() - - override init() { - super.init() - NEAppPushManager.loadAllFromPreferences { managers, error in - if let error = error { - Log.w("[LocalPushManager] Failed to load all NEAppPushManager's from preferences: \(error)") - } - self.appPushManager = managers?.first ?? NEAppPushManager() - let appPushManager = self.appPushManager! - self.pushManagerIsActiveCancellable = NSObject.KeyValueObservingPublisher(object: appPushManager, keyPath: \.isActive, options: [.initial, .new]) - .subscribe(self.pushManagerIsActiveSubject) - self.pushManagerIsActivePublisher - .receive(on: DispatchQueue.main) - .sink { [weak self] isAppPushManagerActive in - self?.isActive.value = isAppPushManagerActive - } - .store(in: &self.cancellables) - - appPushManager.delegate = self - - self.isInitialized.value = true - Log.i("[LocalPushManager] NEAppPushManager initialisation : enabled=\(String(describing: appPushManager.isEnabled)) ssids=\(String(describing: appPushManager.matchSSIDs))") - } - } - - @objc func extensionIsActive() -> Bool { - return appPushManager?.isActive == true - } - - private func applyConfig(coreConfig:Config) { - let appPushManager = self.appPushManager! - let ssids = coreConfig.getStringList(section: "local_push", key: "ssids", defaultList: []) // csv - let enabled = !ssids.isEmpty - appPushManager.isEnabled = enabled - appPushManager.matchSSIDs = ssids - appPushManager.providerConfiguration = [ - "coreconfig": coreConfig.dump() - ] - appPushManager.localizedDescription = NSLocalizedString("Local Push Manager", comment: "") - appPushManager.providerBundleIdentifier = localPushProviderBundleIdentifier - - if (appPushManager.isEnabled) { - self.pushManagerIsActiveCancellable = NSObject.KeyValueObservingPublisher(object: appPushManager, keyPath: \.isActive, options: [.initial, .new]) - .subscribe(self.pushManagerIsActiveSubject) - appPushManager.saveToPreferences { error in - if (error != nil) { - Log.e("[LocalPushManager] error saving Local Push preferences \(String(describing: error)) enabled=\(String(describing: appPushManager.isEnabled)) ssids=\(String(describing: appPushManager.matchSSIDs))") - } else { - Log.i("[LocalPushManager] NEAppPushManager saved : enabled=\(String(describing: appPushManager.isEnabled)) ssids=\(String(describing: appPushManager.matchSSIDs))") - } - appPushManager.loadFromPreferences { error in - if (error != nil) { - Log.e("[LocalPushManager] error post save reloading Local Push preferences \(String(describing: error)) enabled=\(String(describing: appPushManager.isEnabled)) ssids=\(String(describing: appPushManager.matchSSIDs))") - } else { - Log.i("[LocalPushManager] NEAppPushManager post save reloaded : enabled=\(String(describing: appPushManager.isEnabled)) ssids=\(String(describing: appPushManager.matchSSIDs))") - } - - } - } - } else { - pushManagerIsActiveSubject.send(false) - Log.i("[LocalPushManager] NEAppPushManager disabled.") - } - } - - @objc func configureLocalPush(cCoreConfig:OpaquePointer) { - if (self.isInitialized.value != true ) { - self.isInitialized.observeOnce { _ in - self.applyConfig(coreConfig: Config.getSwiftObject(cObject: cCoreConfig)) - } - } else { - applyConfig(coreConfig: Config.getSwiftObject(cObject: cCoreConfig)) - } - - } - func appPushManager(_ manager: NEAppPushManager, didReceiveIncomingCallWithUserInfo userInfo: [AnyHashable : Any] = [:]) { - // Call handling - } - - @objc func addActiveCallBackObserver (action:@escaping(Bool) -> Void) { - isActive.readCurrentAndObserve { active in - action(active!) - } - } - -} diff --git a/Classes/Swift/ProviderDelegate.swift b/Classes/Swift/ProviderDelegate.swift deleted file mode 100644 index f50c39a3f..000000000 --- a/Classes/Swift/ProviderDelegate.swift +++ /dev/null @@ -1,365 +0,0 @@ -/* -* Copyright (c) 2010-2020 Belledonne Communications SARL. -* -* This file is part of linphone-iphone -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*/ - -import Foundation -import CallKit -import UIKit -import linphonesw -import AVFoundation -import os - -@objc class CallInfo: NSObject { - var callId: String = "" - var toAddr: Address? - var isOutgoing = false - var sasEnabled = false - var connected = false - var reason: Reason = Reason.None - var displayName: String? - var videoEnabled = false - var isConference = false - - static func newIncomingCallInfo(callId: String) -> CallInfo { - let callInfo = CallInfo() - callInfo.callId = callId - return callInfo - } - - static func newOutgoingCallInfo(addr: Address, isSas: Bool, displayName: String, isVideo: Bool, isConference:Bool) -> CallInfo { - let callInfo = CallInfo() - callInfo.isOutgoing = true - callInfo.sasEnabled = isSas - callInfo.toAddr = addr - callInfo.displayName = displayName - callInfo.videoEnabled = isVideo - callInfo.isConference = isConference - return callInfo - } -} - -/* -* A delegate to support callkit. -*/ -class ProviderDelegate: NSObject { - static var shared = ProviderDelegate() - let provider: CXProvider - var uuids: [String : UUID] = [:] - var callInfos: [UUID : CallInfo] = [:] - - override init() { - provider = CXProvider(configuration: ProviderDelegate.providerConfiguration) - super.init() - provider.setDelegate(self, queue: nil) - } - - static var providerConfiguration: CXProviderConfiguration { - get { - let providerConfiguration = CXProviderConfiguration(localizedName: Bundle.main.infoDictionary!["CFBundleName"] as! String) - providerConfiguration.ringtoneSound = ConfigManager.instance().lpConfigBoolForKey(key: "use_device_ringtone") ? nil : "notes_of_the_optimistic.caf" - providerConfiguration.supportsVideo = true - providerConfiguration.iconTemplateImageData = UIImage(named: "callkit_logo")?.pngData() - providerConfiguration.supportedHandleTypes = [.generic, .phoneNumber, .emailAddress] - - providerConfiguration.maximumCallsPerCallGroup = 10 - providerConfiguration.maximumCallGroups = 10 - - //not show app's calls in tel's history - //providerConfiguration.includesCallsInRecents = YES; - - return providerConfiguration - } - } - - @objc static func resetSharedProviderConfiguration() { - shared.provider.configuration = ProviderDelegate.providerConfiguration - } - - func reportIncomingCall(call:Call?, uuid: UUID, handle: String, hasVideo: Bool, displayName:String) { - let update = CXCallUpdate() - update.remoteHandle = CXHandle(type:.generic, value: handle) - update.hasVideo = hasVideo - update.localizedCallerName = displayName - - let callInfo = callInfos[uuid] - let callId = callInfo?.callId - - if (ConfigManager.instance().config?.hasEntry(section: "app", key: "max_calls") == 1) { // moved from misc to app section intentionally upon app start or remote configuration - if let maxCalls = ConfigManager.instance().config?.getInt(section: "app",key: "max_calls",defaultValue: 10), Core.get().callsNb > maxCalls { - Log.directLog(BCTBX_LOG_MESSAGE, text: "CallKit: declining call, as max calls (\(maxCalls)) reached call-id: [\(String(describing: callId))] and UUID: [\(uuid.description)]") - decline(uuid: uuid) - DispatchQueue.main.async { - try?call?.decline(reason: .Busy) - } - return - } - } - - Log.directLog(BCTBX_LOG_MESSAGE, text: "CallKit: report new incoming call with call-id: [\(String(describing: callId))] and UUID: [\(uuid.description)]") - //CallManager.instance().setHeldOtherCalls(exceptCallid: callId ?? "") - provider.reportNewIncomingCall(with: uuid, update: update) { error in - if error == nil { - if CallManager.instance().endCallkit { - let call = CallManager.instance().lc?.getCallByCallid(callId: callId ?? "") - if (call?.state == .PushIncomingReceived) { - try? call?.terminate() - } - } - } else { - Log.directLog(BCTBX_LOG_ERROR, text: "CallKit: cannot complete incoming call with call-id: [\(String(describing: callId))] and UUID: [\(uuid.description)] from [\(handle)] caused by [\(error!.localizedDescription)]") - let code = (error as NSError?)?.code - switch code { - case CXErrorCodeIncomingCallError.filteredByDoNotDisturb.rawValue: - callInfo?.reason = Reason.Busy // This answer is only for this device. Using Reason.DoNotDisturb will make all other end point stop ringing. - case CXErrorCodeIncomingCallError.filteredByBlockList.rawValue: - callInfo?.reason = Reason.DoNotDisturb - default: - callInfo?.reason = Reason.Unknown - } - self.callInfos.updateValue(callInfo!, forKey: uuid) - try? call?.decline(reason: callInfo!.reason) - } - } - } - - func updateCall(uuid: UUID, handle: String, hasVideo: Bool = false, displayName:String) { - let update = CXCallUpdate() - update.remoteHandle = CXHandle(type:.generic, value:handle) - update.localizedCallerName = displayName - update.hasVideo = hasVideo - provider.reportCall(with:uuid, updated:update); - } - - func reportOutgoingCallStartedConnecting(uuid:UUID) { - provider.reportOutgoingCall(with: uuid, startedConnectingAt: nil) - } - - func reportOutgoingCallConnected(uuid:UUID) { - provider.reportOutgoingCall(with: uuid, connectedAt: nil) - } - - func endCall(uuid: UUID) { - provider.reportCall(with: uuid, endedAt: .init(), reason: .failed) - } - - func decline(uuid: UUID) { - provider.reportCall(with: uuid, endedAt: .init(), reason: .unanswered) - } - - func endCallNotExist(uuid: UUID, timeout: DispatchTime) { - DispatchQueue.main.asyncAfter(deadline: timeout) { - let callId = CallManager.instance().providerDelegate.callInfos[uuid]?.callId - if (callId == nil) { - // callkit already ended - return - } - let call = CallManager.instance().callByCallId(callId: callId) - if (call == nil) { - Log.directLog(BCTBX_LOG_MESSAGE, text: "CallKit: terminate call with call-id: \(String(describing: callId)) and UUID: \(uuid) which does not exist.") - CallManager.instance().providerDelegate.endCall(uuid: uuid) - } - } - } -} - -// MARK: - CXProviderDelegate -extension ProviderDelegate: CXProviderDelegate { - func provider(_ provider: CXProvider, perform action: CXEndCallAction) { - - let uuid = action.callUUID - let callId = callInfos[uuid]?.callId - - // remove call infos first, otherwise CXEndCallAction will be called more than onece - if (callId != nil) { - uuids.removeValue(forKey: callId!) - } - callInfos.removeValue(forKey: uuid) - - let call = CallManager.instance().callByCallId(callId: callId) - if let call = call { - CallManager.instance().terminateCall(call: call.getCobject); - Log.directLog(BCTBX_LOG_MESSAGE, text: "CallKit: Call ended with call-id: \(String(describing: callId)) an UUID: \(uuid.description).") - } - action.fulfill() - } - - func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) { - let uuid = action.callUUID - let callInfo = callInfos[uuid] - let callId = callInfo?.callId - Log.directLog(BCTBX_LOG_MESSAGE, text: "CallKit: answer call with call-id: \(String(describing: callId)) and UUID: \(uuid.description).") - - let call = CallManager.instance().callByCallId(callId: callId) - - if (UIApplication.shared.applicationState != .active) { - CallManager.instance().backgroundContextCall = call - CallManager.instance().backgroundContextCameraIsEnabled = call?.params?.videoEnabled == true || call?.callLog?.wasConference() == true - /*if #available(iOS 16.0, *) { - if (call?.cameraEnabled == true) { - call?.cameraEnabled = AVCaptureSession().isMultitaskingCameraAccessSupported - } - } else { - 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() - } - - func provider(_ provider: CXProvider, perform action: CXSetHeldCallAction) { - let uuid = action.callUUID - let callId = callInfos[uuid]?.callId - let call = CallManager.instance().callByCallId(callId: callId) - - if (call == nil) { - Log.directLog(BCTBX_LOG_ERROR, text: "CXSetHeldCallAction: no call !") - action.fail() - return - } - - do { - if (CallManager.instance().lc?.isInConference ?? false && action.isOnHold) { - try CallManager.instance().lc?.leaveConference() - Log.directLog(BCTBX_LOG_DEBUG, text: "CallKit: call-id: [\(String(describing: callId))] leaving conference") - NotificationCenter.default.post(name: Notification.Name("LinphoneCallUpdate"), object: self) - action.fulfill() - }else{ - let state = action.isOnHold ? "Paused" : "Resumed" - Log.directLog(BCTBX_LOG_DEBUG, text: "CallKit: Call with call-id: [\(String(describing: callId))] and UUID: [\(uuid)] paused status changed to: [\(state)]") - if (action.isOnHold) { - CallManager.instance().speakerBeforePause = CallManager.instance().isSpeakerEnabled() - try call!.pause() - // fullfill() the action now to indicate to Callkit that this call is no longer active, even if the - // SIP transaction is not completed yet. At this stage, the media streams are off. - // If callkit is not aware that the pause action is completed, it will terminate this call if we - // attempt to resume another one. - action.fulfill() - } else { - if (CallManager.instance().lc?.conference != nil && CallManager.instance().lc?.callsNb ?? 0 > 1) { - try CallManager.instance().lc?.enterConference() - action.fulfill() - NotificationCenter.default.post(name: Notification.Name("LinphoneCallUpdate"), object: self) - } else { - try call!.resume() - // We'll notify callkit that the action is fulfilled when receiving the 200Ok, which is the point - // where we actually start the media streams. - CallManager.instance().actionToFulFill = action; - // HORRIBLE HACK HERE - PLEASE APPLE FIX THIS !! - // When resuming a SIP call after a native call has ended remotely, didActivate: audioSession - // is never called. - // It looks like in this case, it is implicit. - // As a result we have to notify the Core that the AudioSession is active. - // The SpeakerBox demo application written by Apple exhibits this behavior. - // https://developer.apple.com/documentation/callkit/making_and_receiving_voip_calls_with_callkit - // We can clearly see there that startAudio() is called immediately in the CXSetHeldCallAction - // handler, while it is called from didActivate: audioSession otherwise. - // Callkit's design is not consistent, or its documentation imcomplete, wich is somewhat disapointing. - // - Log.directLog(BCTBX_LOG_DEBUG, text: "Assuming AudioSession is active when executing a CXSetHeldCallAction with isOnHold=false.") - CallManager.instance().lc?.activateAudioSession(actived: true) - CallManager.instance().callkitAudioSessionActivated = true - } - } - } - } catch { - Log.directLog(BCTBX_LOG_ERROR, text: "CallKit: Call set held (paused or resumed) \(uuid) failed because \(error)") - action.fail() - } - } - - func provider(_ provider: CXProvider, perform action: CXStartCallAction) { - do { - - let uuid = action.callUUID - let callInfo = callInfos[uuid] - let update = CXCallUpdate() - update.remoteHandle = action.handle - update.localizedCallerName = callInfo?.displayName - self.provider.reportCall(with: action.callUUID, updated: update) - - let addr = callInfo?.toAddr - if (addr == nil) { - Log.directLog(BCTBX_LOG_ERROR, text: "CallKit: can not call a null address!") - action.fail() - } - - CallManager.instance().lc?.configureAudioSession() - try CallManager.instance().doCall(addr: addr!, isSas: callInfo?.sasEnabled ?? false, isVideo: callInfo?.videoEnabled ?? false, isConference: callInfo?.isConference ?? false) - } catch { - Log.directLog(BCTBX_LOG_ERROR, text: "CallKit: Call started failed because \(error)") - action.fail() - } - action.fulfill() - } - - func provider(_ provider: CXProvider, perform action: CXSetGroupCallAction) { - Log.directLog(BCTBX_LOG_MESSAGE, text: "CallKit: Call grouped callUUid : \(action.callUUID) with callUUID: \(String(describing: action.callUUIDToGroupWith)).") - CallManager.instance().addAllToLocalConference() - action.fulfill() - } - - func provider(_ provider: CXProvider, perform action: CXSetMutedCallAction) { - let uuid = action.callUUID - let callId = callInfos[uuid]?.callId - Log.directLog(BCTBX_LOG_MESSAGE, text: "CallKit: Call muted with call-id: \(String(describing: callId)) an UUID: \(uuid.description).") - CallManager.instance().lc!.micEnabled = !CallManager.instance().lc!.micEnabled - action.fulfill() - } - - func provider(_ provider: CXProvider, perform action: CXPlayDTMFCallAction) { - let uuid = action.callUUID - let callId = callInfos[uuid]?.callId - Log.directLog(BCTBX_LOG_MESSAGE, text: "CallKit: Call send dtmf with call-id: \(String(describing: callId)) an UUID: \(uuid.description).") - let call = CallManager.instance().callByCallId(callId: callId) - if (call != nil) { - let digit = (action.digits.cString(using: String.Encoding.utf8)?[0])! - do { - try call!.sendDtmf(dtmf: digit) - } catch { - Log.directLog(BCTBX_LOG_ERROR, text: "CallKit: Call send dtmf \(uuid) failed because \(error)") - } - } - action.fulfill() - } - - func provider(_ provider: CXProvider, timedOutPerforming action: CXAction) { - let uuid = action.uuid - let callId = callInfos[uuid]?.callId - Log.directLog(BCTBX_LOG_MESSAGE, text: "CallKit: Call time out with call-id: \(String(describing: callId)) an UUID: \(uuid.description).") - action.fulfill() - } - - func providerDidReset(_ provider: CXProvider) { - Log.directLog(BCTBX_LOG_MESSAGE, text: "CallKit: did reset.") - } - - 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/Swift/SwiftUtil.swift b/Classes/Swift/SwiftUtil.swift deleted file mode 100644 index 601685009..000000000 --- a/Classes/Swift/SwiftUtil.swift +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import UIKit -import Photos -import linphonesw - - -@objc class SwiftUtil: NSObject { - - @objc static func textToImage(drawText text: String, inImage image: UIImage, forReplyBubble:Bool) -> UIImage { - let textColor = UIColor.black - let fontMax = UIFont.systemFont(ofSize: 12) - let backgroundColor = forReplyBubble ? UIColor(red: 246/255.0, green: 246/255.0, blue: 246/255.0, alpha: 1.0) : UIColor.white - let size = CGSize(width: 120, height: 120) - let scale = UIScreen.main.scale - UIGraphicsBeginImageContextWithOptions(size, false, scale) - let context = UIGraphicsGetCurrentContext() - backgroundColor.setFill() - context!.fill(CGRect(x: 0, y: 0, width: size.width, height: size.height)) - let imageSize:CGSize = forReplyBubble ? CGSize(width: 80, height:80*(image.size.height / image.size.width)): image.size - image.draw(in: CGRect(origin: CGPoint(x: size.width/2 - (imageSize.width)/2,y: (forReplyBubble ? size.height/2 : 90/2) - (imageSize.height)/2), size: imageSize)) - - if (!forReplyBubble) { - let label = UILabel(frame: CGRect(x: 0,y: 0,width: size.width,height: 30)) - label.numberOfLines = 1 - label.font = fontMax - label.adjustsFontSizeToFitWidth = false - label.text = text - label.textColor = textColor - label.textAlignment = .center - label.allowsDefaultTighteningForTruncation = true - label.lineBreakMode = .byTruncatingMiddle - imageWithLabel(label: label).draw(in: CGRect(origin: CGPoint(x:5,y: 70), size: CGSize(width: size.width-10,height: 30))) - } else { - let borderWidth: CGFloat = 2.0 - let path = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: 120, height: 120).insetBy(dx: borderWidth / 2, dy: borderWidth / 2), cornerRadius: 5.0) - context!.saveGState() - path.addClip() - UIColor.gray.setStroke() - path.lineWidth = borderWidth - path.stroke() - } - - let newImage = UIGraphicsGetImageFromCurrentImageContext() - UIGraphicsEndImageContext() - - return newImage! - } - - static func imageWithLabel(label: UILabel) -> UIImage { - UIGraphicsBeginImageContextWithOptions(label.frame.size, false, 0.0) - label.layer.render(in: UIGraphicsGetCurrentContext()!) - let img = UIGraphicsGetImageFromCurrentImageContext()! - UIGraphicsEndImageContext() - return img - } - - // Image cache - static var imageCache:[String:UIImage] = [:] - - @objc static func getCachedImage(key:String) -> UIImage? { - return key != nil ? imageCache[key] : nil - } - - @objc static func setCachedImage(key:String,image:UIImage) { - imageCache[key] = image - } - - @objc static func resetCachedAsset() { - imageCache.removeAll() - } - - // Chat bubble height cache : - - static var cacheMessageSize:[String:CGSize] = [:] - - @objc static func getCachedMessageHeight(cmessage:OpaquePointer) -> CGSize { - let message = ChatMessage.getSwiftObject(cObject: cmessage) - if let cached = cacheMessageSize[message.messageId] { - return cached - } else { - return .zero - } - } - - @objc static func setCachedMessageHeight(cmessage:OpaquePointer, size:CGSize) { - let message = ChatMessage.getSwiftObject(cObject: cmessage) - cacheMessageSize[message.messageId] = size - } - - @objc static func removeCachedMessageHeight(cmessage:OpaquePointer) { - let message = ChatMessage.getSwiftObject(cObject: cmessage) - cacheMessageSize.removeValue(forKey: message.messageId) - } - - @objc static func messageHeightCanBeCached(cmessage:OpaquePointer) -> Bool { - let message = ChatMessage.getSwiftObject(cObject: cmessage) - return (message.isOutgoing && [.Delivered, .DeliveredToUser, .Displayed].contains(message.state)) || (!message.isOutgoing && [.Displayed].contains(message.state)) - } - - // Call Log - @objc static func isCallLogMissed(cLog:OpaquePointer) -> Bool { - let log = CallLog.getSwiftObject(cObject: cLog) - return log.dir == .Incoming && [.Missed,.Aborted,.EarlyAborted].contains(log.status) - } - -} - diff --git a/Classes/Swift/Util/AudioPlayer.swift b/Classes/Swift/Util/AudioPlayer.swift deleted file mode 100644 index 850b8bd33..000000000 --- a/Classes/Swift/Util/AudioPlayer.swift +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import linphonesw - - -class AudioPlayer { - static let sharedModel = AudioPlayer() - - static var linphonePlayer : Player? = nil - - var fileChanged = MutableLiveData() - - static func getSharedPlayer() -> Player?{ - return linphonePlayer - } - - static func initSharedPlayer(){ - Log.i("[Voice Message] Creating shared player") - - let core = Core.getSwiftObject(cObject: LinphoneManager.getLc()) - do{ - if linphonePlayer?.userData == nil { - linphonePlayer = try core.createLocalPlayer(soundCardName: CallManager.instance().getSpeakerSoundCard(), videoDisplayName: nil, windowId: nil) - } - }catch{ - Log.e(error.localizedDescription) - } - } - - static func startSharedPlayer(_ path: String?) { - Log.i("[Voice Message] Starting shared player path = \(String(describing: path))") - if ((linphonePlayer!.userData) != nil) { - Log.i("[Voice Message] a play was requested (\(String(describing: path)), but there is already one going (\(String(describing: linphonePlayer?.userData))") - let userInfo = [ - "path": linphonePlayer!.userData - ] - NotificationCenter.default.post(name: NSNotification.Name(rawValue: "LinphoneVoiceMessagePlayerEOF"), object: nil, userInfo: userInfo as [AnyHashable : Any]) - } - CallManager.instance().changeRouteToSpeaker() - do{ - try linphonePlayer?.open(filename: path!) - try linphonePlayer?.start() - }catch{ - Log.e(error.localizedDescription) - } - } - - static func cancelVoiceRecordingVM(_ voiceRecorder: Recorder?) { - voiceRecorder?.close() - if let recordingFile = voiceRecorder?.file { - AppManager.removeFile(file: String(utf8String: recordingFile)!) - } - } - - static func stopSharedPlayer() { - Log.i("[Voice Message] Stopping shared player path = \(String(describing: linphonePlayer?.userData))") - do{ - try linphonePlayer?.pause() - try linphonePlayer?.seek(timeMs: 0) - //linphonePlayer?.close() - linphonePlayer?.userData = nil - }catch{ - Log.e(error.localizedDescription) - } - } -} diff --git a/Classes/Swift/Util/BackActionsNavigationView.swift b/Classes/Swift/Util/BackActionsNavigationView.swift deleted file mode 100644 index a8e6a085a..000000000 --- a/Classes/Swift/Util/BackActionsNavigationView.swift +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import UIKit -import Foundation -import linphonesw -import SnapKit - -class BackActionsNavigationView: UIViewController { - let contentMessageView = ContentMessageView() - - let topBar = UIView() - let top_bar_height = 66.0 - let side_buttons_margin = 5 - - let titleLabel = StyledLabel(VoipTheme.chat_conversation_title) - let titleParticipants = UIView() - let titleGroupLabel = StyledLabel(VoipTheme.chat_conversation_title) - let participantsGroupLabel = StyledLabel(VoipTheme.chat_conversation_participants) - - var backAction : (() -> Void)? = nil - var action1 : (() -> Void)? = nil - var action2 : (() -> Void)? = nil - - let backButton = CallControlButton(buttonTheme:VoipTheme.nav_button("back_default")) - let cancelButton = CallControlButton(buttonTheme:VoipTheme.nav_button("cancel_edit_default")) - let action1Button = CallControlButton(buttonTheme:VoipTheme.nav_button("call_audio_start_default")) - let action1BisButton = CallControlButton(buttonTheme:VoipTheme.nav_button("voip_conference_new")) - let action1SelectAllButton = CallControlButton(buttonTheme:VoipTheme.nav_button("select_all_default")) - let action1DeselectAllButton = CallControlButton(buttonTheme:VoipTheme.nav_button("deselect_all")) - let action2Button = CallControlButton(buttonTheme:VoipTheme.nav_button("more_menu_default")) - let action2Delete = CallControlButton(buttonTheme:VoipTheme.nav_button("delete_default")) - - var isGroupChat : Bool = false - - func viewDidLoad(backAction : @escaping () -> Void, - action1 : @escaping () -> Void, - action2 : @escaping () -> Void, - action3 : @escaping () -> Void, - action4 : @escaping () -> Void, - title: String, - participants: String?) { - self.backAction = backAction - self.action1 = action1 - self.action2 = action2 - - self.view.addSubview(topBar) - //topBar.alignParentTop().height(top_bar_height).matchParentSideBorders().done() - topBar.alignParentTop().height(top_bar_height).done() - topBar.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor).isActive = true - topBar.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor).isActive = true - - topBar.addSubview(backButton) - backButton.alignParentLeft(withMargin: side_buttons_margin).matchParentHeight().done() - backButton.onClickAction = backAction - - topBar.addSubview(cancelButton) - cancelButton.alignParentLeft(withMargin: side_buttons_margin).matchParentHeight().done() - cancelButton.onClickAction = editModeOff - cancelButton.isHidden = true - - topBar.addSubview(action2Button) - action2Button.alignParentRight(withMargin: side_buttons_margin).matchParentHeight().done() - action2Button.onClickAction = action2 - action2Button.onLongClick(action: action4) - - topBar.addSubview(action2Delete) - action2Delete.alignParentRight(withMargin: side_buttons_margin).matchParentHeight().done() - action2Delete.onClickAction = deleteSelected - action2Delete.isHidden = true - - topBar.addSubview(action1Button) - topBar.addSubview(action1BisButton) - action1Button.toLeftOf(action2Button, withRightMargin: 20).matchParentHeight().done() - action1BisButton.toLeftOf(action2Button, withRightMargin: 12).matchParentHeight().done() - action1Button.size(w: 34, h: 34).done() - - action1Button.onClickAction = action1 - action1BisButton.onClickAction = action1 - action1BisButton.isHidden = true - - topBar.addSubview(action1SelectAllButton) - topBar.addSubview(action1DeselectAllButton) - action1SelectAllButton.toLeftOf(action2Button, withRightMargin: 12).matchParentHeight().done() - action1DeselectAllButton.toLeftOf(action2Button, withRightMargin: 12).matchParentHeight().done() - action1SelectAllButton.onClickAction = selectDeselectAll - action1DeselectAllButton.onClickAction = selectDeselectAll - action1SelectAllButton.isHidden = true - action1DeselectAllButton.isHidden = true - - topBar.addSubview(titleLabel) - titleLabel.toRightOf(backButton, withLeftMargin: 10).matchParentHeight().done() - titleLabel.toLeftOf(action1Button, withRightMargin: 20).done() - titleLabel.text = title - - topBar.addSubview(titleParticipants) - titleParticipants.toRightOf(backButton, withLeftMargin: 10).matchParentHeight().done() - titleParticipants.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get() - titleParticipants.toLeftOf(action1Button, withRightMargin: 20).done() - - titleParticipants.addSubview(titleGroupLabel) - titleGroupLabel.alignParentTop(withMargin: 10).matchParentSideBorders().done() - titleGroupLabel.text = title - - titleParticipants.addSubview(participantsGroupLabel) - participantsGroupLabel.alignParentBottom(withMargin: 10).matchParentSideBorders().done() - participantsGroupLabel.text = participants - - super.viewDidLoad() - - view.addSubview(contentMessageView.view) - - view.bringSubviewToFront(topBar) - - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - self.topBar.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get() - self.titleParticipants.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get() - } - } - - func resetRecordingProgressBar(){ - - } - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - topBar.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get() - } - - func editModeOn(){ - backButton.isHidden = true - cancelButton.isHidden = false - action1Button.isHidden = true - action1BisButton.isHidden = true - action1SelectAllButton.isHidden = false - action1DeselectAllButton.isHidden = true - action2Button.isHidden = true - action2Delete.isHidden = false - action2Delete.isEnabled = false - } - - func editModeOff(){ - backButton.isHidden = false - cancelButton.isHidden = true - action1DeselectAllButton.isHidden = true - action1SelectAllButton.isHidden = true - action2Button.isHidden = false - action2Delete.isHidden = true - changeCallIcon(groupChat: isGroupChat) - } - - func changeCallIcon(groupChat: Bool){ - isGroupChat = groupChat - let defaultAccount = Core.getSwiftObject(cObject: LinphoneManager.getLc()).defaultAccount - if(groupChat && (defaultAccount != nil) && (defaultAccount!.params!.audioVideoConferenceFactoryAddress != nil)){ - action1Button.isHidden = true - action1BisButton.isHidden = false - }else if(groupChat){ - action1Button.isHidden = true - action1BisButton.isHidden = true - }else{ - action1Button.isHidden = false - action1BisButton.isHidden = true - } - } - - func selectDeselectAll(){ - if(action1SelectAllButton.isHidden){ - action1SelectAllButton.isHidden = false - action1DeselectAllButton.isHidden = true - action2Delete.isEnabled = false - }else{ - action1SelectAllButton.isHidden = true - action1DeselectAllButton.isHidden = false - action2Delete.isEnabled = true - } - } - - func changeTitle(titleString: String){ - titleLabel.text = titleString - titleGroupLabel.text = titleString - } - - func deleteSelected(){ - } -} - -extension UIView { - func setHeight(_ h:CGFloat, animateTime:TimeInterval?=nil) { - if let c = self.constraints.first(where: { $0.firstAttribute == .height && $0.relation == .equal }) { - c.constant = CGFloat(h) - if self.superview != nil { - if let animateTime = animateTime { - UIView.animate(withDuration: animateTime, animations:{ - self.superview?.layoutIfNeeded() - }) - } else { - self.superview?.layoutIfNeeded() - } - } - } - } -} diff --git a/Classes/Swift/Util/BackNextNavigationView.swift b/Classes/Swift/Util/BackNextNavigationView.swift deleted file mode 100644 index 22582c4cb..000000000 --- a/Classes/Swift/Util/BackNextNavigationView.swift +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import linphonesw - -@objc class BackNextNavigationView: UIViewController { - - - // layout constants - let top_bar_height = 66.0 - let navigation_buttons_padding = 18.0 - let content_margin_top = 20 - let side_buttons_margin = 5 - - // User by subviews - let form_margin = 10.0 - let form_input_height = 40.0 - let schdule_for_later_height = 80.0 - let description_height = 150.0 - - let titleLabel = StyledLabel(VoipTheme.calls_list_header_font) - - let topBar = UIView() - let scrollView = UIScrollView() - let contentView = UIView() - var backAction : (() -> Void)? = nil - var nextAction : (() -> Void)? = nil - - let backButton = CallControlButton(buttonTheme:VoipTheme.nav_button("back_default")) - let nextButton = CallControlButton(buttonTheme:VoipTheme.nav_button("next_default")) - - func viewDidLoad(backAction : @escaping () -> Void, - nextAction : @escaping () -> Void, - nextActionEnableCondition: MutableLiveData, - title:String) { - self.backAction = backAction - self.nextAction = nextAction - - self.view.addSubview(topBar) - topBar.alignParentTop().height(top_bar_height).matchParentSideBorders().done() - - topBar.addSubview(backButton) - backButton.alignParentLeft(withMargin: side_buttons_margin).matchParentHeight().done() - backButton.onClickAction = backAction - - topBar.addSubview(nextButton) - nextButton.alignParentRight(withMargin: side_buttons_margin).matchParentHeight().done() - nextButton.onClickAction = nextAction - nextActionEnableCondition.readCurrentAndObserve { (enableNext) in - self.nextButton.isEnabled = enableNext == true - } - - topBar.addSubview(titleLabel) - titleLabel.matchParentHeight().centerX().done() - titleLabel.text = title - - super.viewDidLoad() - - view.addSubview(scrollView) - scrollView.alignUnder(view: topBar, withMargin: content_margin_top).alignParentBottom().matchParentSideBorders().done() - scrollView.addSubview(contentView) - contentView.matchBordersOf(view: view).alignParentBottom().alignParentTop().done() // don't forget a bottom constraint b/w last element of contentview and contentview - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - self.topBar.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get() - } - } - -} diff --git a/Classes/Swift/Util/ContentMessageView.swift b/Classes/Swift/Util/ContentMessageView.swift deleted file mode 100644 index c59056ca2..000000000 --- a/Classes/Swift/Util/ContentMessageView.swift +++ /dev/null @@ -1,272 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import UIKit - -class ContentMessageView: UIViewController { - var message_height = 66.0 - let top_bar_height = 66.0 - let contentView = UIView() - let isComposingView = UIView() - let isComposingTextView = StyledLabel(VoipTheme.chat_conversation_is_composing_text) - let replyLabelTextView = StyledLabel(VoipTheme.chat_conversation_reply_label) - let replyContentTextView = StyledLabel(VoipTheme.chat_conversation_reply_content) - let replyContentTextSpacing = UIView() - let replyContentForMeetingTextView = StyledLabel(VoipTheme.chat_conversation_reply_content) - let replyDeleteButton = CallControlButton(width: 22, height: 22, buttonTheme:VoipTheme.nav_color_button("reply_cancel")) - let replyMeetingSchedule = UIImageView() - let recordingView = UIView() - let recordingDeleteButton = CallControlButton(width: 40, height: 40, buttonTheme:VoipTheme.nav_button("delete_default")) - let recordingPlayButton = CallControlButton(width: 40, height: 40, buttonTheme:VoipTheme.nav_button("vr_play")) - let recordingStopButton = CallControlButton(width: 40, height: 40, buttonTheme:VoipTheme.nav_button("vr_stop")) - var recordingWaveView = UIProgressView() - let recordingDurationTextView = StyledLabel(VoipTheme.chat_conversation_recording_duration) - let recordingWaveImage = UIImageView(image: UIImage(named: "vr_wave.png")) - let recordingWaveImageMask = UIView() - - let recordingPlayerImage = UIView() - - let messageView = MessageView() - let mediaSelector = UIView() - let mediaSelectorReply = UIView() - var replyBubble = UIView() - var backgroundReplyColor = UIView() - - var isSecure : Bool = false - let floatingButton = CallControlButton(buttonTheme:VoipTheme.nav_button("")) - var constraintFloatingButton : NSLayoutConstraint? = nil - var constraintLandscapeFloatingButton : NSLayoutConstraint? = nil - - var stackView = UIStackView() - var stackViewReply = UIStackView() - - override func viewDidLoad() { - super.viewDidLoad() - - view.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get() - - stackView.axis = .vertical; - stackView.distribution = .fill; - stackView.alignment = .center; - stackView.spacing = 1; - - stackView.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(stackView) - - let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first - if keyWindow != nil { - stackView.alignParentTop().alignParentBottom(withMargin: keyWindow!.safeAreaInsets.bottom/2).done() - }else{ - stackView.alignParentTop().alignParentBottom().done() - } - - stackView.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor).isActive = true - stackView.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor).isActive = true - - stackView.addArrangedSubview(contentView) - contentView.alignParentTop(withMargin: top_bar_height).matchParentSideBorders().done() - - stackView.addArrangedSubview(isComposingView) - isComposingView.height(top_bar_height/2).matchParentSideBorders().done() - isComposingView.isHidden = true - - isComposingView.addSubview(isComposingTextView) - isComposingTextView.alignParentLeft(withMargin: 10).alignParentRight(withMargin: 10).alignParentTop(withMargin: 10).matchParentHeight().done() - isComposingView.backgroundColor = VoipTheme.backgroundWhiteBlack.get() - - stackView.addArrangedSubview(replyBubble) - replyBubble.matchParentSideBorders().maxHeight(top_bar_height*3).done() - replyBubble.translatesAutoresizingMaskIntoConstraints = false - replyBubble.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get() - replyBubble.isHidden = true - - replyBubble.addSubview(backgroundReplyColor) - backgroundReplyColor.matchParentSideBorders().matchParentHeight().done() - - stackViewReply.axis = .vertical; - stackViewReply.distribution = .fill; - stackViewReply.alignment = .leading; - - replyBubble.addSubview(stackViewReply) - stackViewReply.alignParentLeft(withMargin: 10).alignParentRight(withMargin: 50).alignParentBottom(withMargin: 10).matchParentHeight().wrapContentY().done() - stackViewReply.translatesAutoresizingMaskIntoConstraints = false - - stackViewReply.addArrangedSubview(replyLabelTextView) - replyLabelTextView.height(30).done() - - stackViewReply.addArrangedSubview(replyMeetingSchedule) - replyMeetingSchedule.size(w: 100, h: 40).wrapContentY().done() - replyMeetingSchedule.contentMode = .scaleAspectFit - replyMeetingSchedule.isHidden = true - - stackViewReply.addArrangedSubview(replyContentForMeetingTextView) - replyContentForMeetingTextView.width(100).wrapContentY().done() - replyContentForMeetingTextView.textAlignment = .center - replyContentForMeetingTextView.numberOfLines = 5 - replyContentForMeetingTextView.isHidden = true - - stackViewReply.addArrangedSubview(mediaSelectorReply) - mediaSelectorReply.height(top_bar_height).wrapContentY().alignParentRight(withMargin: 50).done() - mediaSelectorReply.isHidden = true - - stackViewReply.addArrangedSubview(replyContentTextSpacing) - replyContentTextSpacing.height(8 ).wrapContentY().done() - replyContentTextSpacing.isHidden = true - - stackViewReply.addArrangedSubview(replyContentTextView) - replyContentTextView.wrapContentY().done() - replyContentTextView.numberOfLines = 5 - - replyBubble.addSubview(replyDeleteButton) - replyDeleteButton.alignParentRight(withMargin: 15).centerY().done() - - stackView.addArrangedSubview(recordingView) - recordingView.height(top_bar_height).wrapContentY().matchParentSideBorders().done() - recordingView.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get() - recordingView.isHidden = true - - resetRecordingProgressBar() - - stackView.addArrangedSubview(mediaSelector) - mediaSelector.height(top_bar_height*2).matchParentSideBorders().done() - mediaSelector.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get() - mediaSelector.isHidden = true - - stackView.addArrangedSubview(messageView) - if keyWindow != nil { - message_height = 66 - ((keyWindow!.safeAreaInsets.bottom/2)/2) - } - - messageView.alignParentBottom().height(message_height).matchParentSideBorders().done() - - stackView.translatesAutoresizingMaskIntoConstraints = false; - view.addSubview(stackView) - - view.addSubview(floatingButton) - constraintFloatingButton = floatingButton.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: 3) - constraintLandscapeFloatingButton = floatingButton.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: -56) - if UIDevice.current.orientation.isLandscape { - constraintLandscapeFloatingButton!.isActive = true - } else { - constraintFloatingButton!.isActive = true - } - floatingButton.topAnchor.constraint(equalTo: self.view.layoutMarginsGuide.topAnchor, constant: top_bar_height).isActive = true - floatingButton.setImage(UIImage(named:"security_alert_indicator.png"), for: .normal) - floatingButton.imageEdgeInsets = UIEdgeInsets(top: 42, left: 42, bottom: 42, right: 42) - - stackView.centerXAnchor.constraint(equalTo:self.view.centerXAnchor).isActive = true - stackView.centerYAnchor.constraint(equalTo:self.view.centerYAnchor).isActive = true - - self.dismissKeyboard() - - NotificationCenter.default.addObserver(self, selector: #selector(self.rotated), name: UIDevice.orientationDidChangeNotification, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(self.changeSizeOfTextView), name: Notification.Name("LinphoneTextViewSize"), object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(self.resetSizeOfTextView), name: Notification.Name("LinphoneResetTextViewSize"), object: nil) - - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - self.replyBubble.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get() - self.recordingView.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get() - self.mediaSelector.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get() - self.isComposingView.backgroundColor = VoipTheme.backgroundWhiteBlack.get() - self.recordingWaveView.backgroundColor = VoipTheme.backgroundWhiteBlack.get() - self.recordingWaveImageMask.backgroundColor = VoipTheme.backgroundWhiteBlack.get() - self.view.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get() - } - } - - deinit { - NotificationCenter.default.removeObserver(self) - } - - func resetRecordingProgressBar(){ - recordingView.addSubview(recordingDeleteButton) - recordingDeleteButton.alignParentLeft(withMargin: 10).matchParentHeight().done() - - recordingView.addSubview(recordingPlayButton) - recordingPlayButton.alignParentRight(withMargin: 10).matchParentHeight().done() - recordingPlayButton.isHidden = true - - recordingView.addSubview(recordingStopButton) - recordingStopButton.alignParentRight(withMargin: 10).matchParentHeight().done() - - let newRecordingWaveView = UIProgressView() - recordingWaveView = newRecordingWaveView - - recordingView.addSubview(recordingWaveView) - recordingWaveView.toRightOf(recordingDeleteButton, withLeftMargin: 10).toLeftOf(recordingStopButton, withRightMargin: 10).alignParentTop(withMargin: 10).alignParentBottom(withMargin: 10).done() - recordingWaveView.progressViewStyle = .bar - recordingWaveView.layer.cornerRadius = 5 - recordingWaveView.backgroundColor = VoipTheme.backgroundWhiteBlack.get() - recordingWaveView.progressImage = UIImage.withColor(UIColor("L")) - recordingWaveView.clipsToBounds = true - - recordingWaveView.addSubview(recordingDurationTextView) - recordingDurationTextView.alignParentRight(withMargin: 10).matchParentHeight().done() - - recordingWaveView.addSubview(recordingWaveImage) - recordingWaveImage.alignParentTop(withMargin: 10).alignParentBottom(withMargin: 10).alignParentLeft(withMargin: 10).alignParentRight(withMargin: 65).done() - - recordingWaveView.addSubview(recordingWaveImageMask) - recordingWaveImageMask.alignParentTop(withMargin: 5).alignParentBottom(withMargin: 5).alignParentLeft(withMargin: 10).alignParentRight(withMargin: 65).done() - recordingWaveImageMask.backgroundColor = VoipTheme.backgroundWhiteBlack.get() - } - - @objc func rotated() { - if UIDevice.current.orientation.isLandscape { - constraintLandscapeFloatingButton!.isActive = true - constraintFloatingButton!.isActive = false - } else if UIDevice.current.orientation.isPortrait { - constraintLandscapeFloatingButton!.isActive = false - constraintFloatingButton!.isActive = true - } - } - - @objc func changeSizeOfTextView(){ - let numLines = (messageView.messageText.contentSize.height / messageView.messageText.font!.lineHeight) - if numLines >= 2 && numLines <= 6 { - messageView.setHeight((message_height * numLines)/2) - } else if numLines < 2 { - messageView.setHeight(message_height) - } - } - - @objc func resetSizeOfTextView(){ - messageView.setHeight(message_height) - } - - func dismissKeyboard() { - let tap: UITapGestureRecognizer = UITapGestureRecognizer( target: self, action: #selector(self.dismissKeyboardTouchOutside)) - tap.cancelsTouchesInView = false - view.addGestureRecognizer(tap) - } - - @objc private func dismissKeyboardTouchOutside() { - view.endEditing(true) - } - - func changeSecureLevel(secureLevel: Bool, imageBadge: UIImage?){ - isSecure = secureLevel - if(isSecure){ - floatingButton.isHidden = false - floatingButton.setImage(imageBadge, for: .normal) - }else{ - floatingButton.isHidden = true - } - } -} diff --git a/Classes/Swift/Util/CustomAlertController.swift b/Classes/Swift/Util/CustomAlertController.swift deleted file mode 100644 index 7546488cc..000000000 --- a/Classes/Swift/Util/CustomAlertController.swift +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation - -class CustomAlertController: UIAlertController { - - let cancel_button_alert = UIButton() - let ok_button_alert = UIButton() - let checkBoxButton = CallControlButton(buttonTheme:VoipTheme.nav_button("checkbox_unchecked")) - var isChecked = false - let checkBoxText = UILabel() - - @objc func dismissOnTapOutsideOrCancel(){ - self.dismiss(animated: true, completion: nil) - } - - @objc func onTapOk(){ - self.dismiss(animated: true, completion: nil) - } - - @objc func changeCheckValue(){ - isChecked = !isChecked - checkBoxButton.isSelected = isChecked - } - - func addButtonsAlertController(alertController: UIAlertController, buttonsViewHeightV: CGFloat, checkboxViewHeightV: CGFloat? = nil, buttonsAlertHeightV: CGFloat){ - let buttonsViewHeight = buttonsViewHeightV - let checkboxViewHeight = checkboxViewHeightV ?? 0 - let buttonsAlertHeight = buttonsAlertHeightV - - let alertControllerHeight : CGFloat = (buttonsViewHeight + checkboxViewHeight + buttonsAlertHeight) * 2 - - let buttonsView = UIView() - alertController.view.addSubview(buttonsView) - buttonsView.translatesAutoresizingMaskIntoConstraints = false - buttonsView.bottomAnchor.constraint(equalTo: alertController.view.bottomAnchor, constant: -10).isActive = true - buttonsView.rightAnchor.constraint(equalTo: alertController.view.rightAnchor, constant: -10).isActive = true - buttonsView.leftAnchor.constraint(equalTo: alertController.view.leftAnchor, constant: 10).isActive = true - buttonsView.heightAnchor.constraint(equalToConstant: buttonsViewHeight).isActive = true - - alertController.view.translatesAutoresizingMaskIntoConstraints = false - alertController.view.heightAnchor.constraint(equalToConstant: alertControllerHeight).isActive = true - - cancel_button_alert.setTitle(VoipTexts.cancel.uppercased(), for: .normal) - cancel_button_alert.backgroundColor = .systemRed - cancel_button_alert.layer.cornerRadius = 5 - cancel_button_alert.addTarget(self, action: #selector(dismissOnTapOutsideOrCancel), for: .touchUpInside) - buttonsView.addSubview(cancel_button_alert) - cancel_button_alert.alignParentLeft(withMargin: 40).size(w: 100, h: buttonsAlertHeight).done() - - ok_button_alert.setTitle(VoipTexts.ok.uppercased(), for: .normal) - ok_button_alert.backgroundColor = .systemGreen - ok_button_alert.layer.cornerRadius = 5 - ok_button_alert.addTarget(self, action: #selector(onTapOk), for: .touchUpInside) - buttonsView.addSubview(ok_button_alert) - ok_button_alert.alignParentRight(withMargin: 40).size(w: 100, h: buttonsAlertHeight).done() - - if(checkboxViewHeight != 0){ - let checkboxView = UIView() - alertController.view.addSubview(checkboxView) - checkboxView.translatesAutoresizingMaskIntoConstraints = false - checkboxView.bottomAnchor.constraint(equalTo: buttonsView.topAnchor, constant: -5).isActive = true - checkboxView.centerXAnchor.constraint(equalTo: alertController.view.centerXAnchor).isActive = true - checkboxView.heightAnchor.constraint(equalToConstant: checkboxViewHeight).isActive = true - checkboxView.width(180).done() - - checkBoxButton.setImage(UIImage(named:"checkbox_unchecked.png"), for: .normal) - checkBoxButton.setImage(UIImage(named:"checkbox_checked.png"), for: .selected) - checkBoxButton.addTarget(self, action: #selector(changeCheckValue), for: .touchUpInside) - checkboxView.addSubview(checkBoxButton) - - checkBoxText.text = VoipTexts.alert_dialog_secure_badge_button_chat_conversation_checkboxtext - checkBoxText.textColor = .white - checkboxView.addSubview(checkBoxText) - checkBoxText.toRightOf(checkBoxButton, withLeftMargin: -5).height(checkboxViewHeight).done() - checkBoxText.sizeToFit() - } - } - - func setBackgroundColor(color: UIColor) { - if let bgView = self.view.subviews.first, let groupView = bgView.subviews.first, let contentView = groupView.subviews.first { - contentView.backgroundColor = color - } - } - - func setMaxWidth(alert: UIAlertController) { - let widthConstraints = alert.view.constraints.filter({ return $0.firstAttribute == .width }) - alert.view.removeConstraints(widthConstraints) - let newWidth = UIScreen.main.bounds.width * 0.90 - let widthConstraint = NSLayoutConstraint(item: alert.view, - attribute: .width, - relatedBy: .equal, - toItem: nil, - attribute: .notAnAttribute, - multiplier: 1, - constant: newWidth) - alert.view.addConstraint(widthConstraint) - let firstContainer = alert.view.subviews[0] - let constraint = firstContainer.constraints.filter({ return $0.firstAttribute == .width && $0.secondItem == nil }) - firstContainer.removeConstraints(constraint) - alert.view.addConstraint(NSLayoutConstraint(item: firstContainer, - attribute: .width, - relatedBy: .equal, - toItem: alert.view, - attribute: .width, - multiplier: 1.0, - constant: 0)) - let innerBackground = firstContainer.subviews[0] - let innerConstraints = innerBackground.constraints.filter({ return $0.firstAttribute == .width && $0.secondItem == nil }) - innerBackground.removeConstraints(innerConstraints) - firstContainer.addConstraint(NSLayoutConstraint(item: innerBackground, - attribute: .width, - relatedBy: .equal, - toItem: firstContainer, - attribute: .width, - multiplier: 1.0, - constant: 0)) - } - - func setTitle(font: UIFont?, color: UIColor?) { - guard let title = self.title else { return } - let attributeString = NSMutableAttributedString(string: title) - - if let titleFont = font { - attributeString.addAttributes([NSAttributedString.Key.font : titleFont], - range: NSMakeRange(0, title.count)) - } - - if let titleColor = color { - attributeString.addAttributes([NSAttributedString.Key.foregroundColor : titleColor], - range: NSMakeRange(0, title.count)) - } - - self.setValue(attributeString, forKey: "attributedTitle") - } - - func setMessage(font: UIFont?, color: UIColor?) { - guard let message = self.message else { return } - let attributeString = NSMutableAttributedString(string: message) - if let messageFont = font { - attributeString.addAttributes([NSAttributedString.Key.font : messageFont], - range: NSMakeRange(0, message.count)) - } - - if let messageColorColor = color { - attributeString.addAttributes([NSAttributedString.Key.foregroundColor : messageColorColor], - range: NSMakeRange(0, message.count)) - } - self.setValue(attributeString, forKey: "attributedMessage") - } - - func setTint(color: UIColor) { - self.view.tintColor = color - } -} diff --git a/Classes/Swift/Util/MutableLiveData.swift b/Classes/Swift/Util/MutableLiveData.swift deleted file mode 100644 index 125939785..000000000 --- a/Classes/Swift/Util/MutableLiveData.swift +++ /dev/null @@ -1,138 +0,0 @@ -/* -* Copyright (c) 2010-2020 Belledonne Communications SARL. -* -* This file is part of linhome -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*/ - - -import Foundation - - -class MutableLiveDataOnChangeClosure: NSObject { - let value: (Type?) -> Void - let onlyOnce: Bool - init(_ function: @escaping (Type?) -> Void, onlyOnce:Bool = false) { - value = function - self.onlyOnce = onlyOnce - } -} - -class MutableLiveData { - - private var _value : T? = nil - private var observers = [MutableLiveDataOnChangeClosure] () - private var _opposite : MutableLiveData? = nil - - init(_ initial:T) { - self.value = initial - } - - init() { - } - - var value : T? { - get { - return self._value - } - set { - self._value = newValue - self.notifyAllObservers(with: newValue) - } - } - - - func addObserver(observer: MutableLiveDataOnChangeClosure, andNotifyOnce: Bool = false) { - observers.append(observer) - if (andNotifyOnce) { - notifyValue() - } - } - - func removeObserver(observer: MutableLiveDataOnChangeClosure) { - observers = observers.filter({$0 !== observer}) - } - - - func clearObservers() { - observers.forEach { - removeObserver(observer: $0) - } - } - - - func notifyAllObservers(with newValue: T?) { - for observer in observers { - observer.value(newValue) - if (observer.onlyOnce) { - removeObserver(observer: observer) - } - } - } - - func notifyValue() { - for observer in observers { - observer.value(value) - if (observer.onlyOnce) { - removeObserver(observer: observer) - } - } - } - - func observe(onChange : @escaping (T?)->Void) { - let observer = MutableLiveDataOnChangeClosure({ value in - onChange(value) - }, onlyOnce: false) - addObserver(observer: observer) - } - - func readCurrentAndObserve(onChange : @escaping (T?)->Void) { - let observer = MutableLiveDataOnChangeClosure({ value in - onChange(value) - }, onlyOnce: false) - addObserver(observer: observer) - observer.value(value) - } - - func observeAsUniqueObserver (onChange : @escaping (T?)->Void, unique: Bool = false) { - let observer = MutableLiveDataOnChangeClosure({ value in - onChange(value) - }, onlyOnce: false) - if (unique) { - clearObservers() - } - addObserver(observer: observer) - } - - func observeOnce(onChange : @escaping (T?)->Void) { - let observer = MutableLiveDataOnChangeClosure({ value in - onChange(value) - }, onlyOnce: true) - addObserver(observer: observer) - } - - func opposite() -> MutableLiveData? { - if (_opposite != nil) { - return _opposite - } - _opposite = MutableLiveData(!(value! as! Bool)) - observe { (value) in - self._opposite!.value = !(value! as! Bool) - } - return _opposite - } - - -} diff --git a/Classes/Swift/Util/Pair.swift b/Classes/Swift/Util/Pair.swift deleted file mode 100644 index f49b6fa98..000000000 --- a/Classes/Swift/Util/Pair.swift +++ /dev/null @@ -1,33 +0,0 @@ -/* -* Copyright (c) 2010-2020 Belledonne Communications SARL. -* -* This file is part of linhome -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*/ - - -import Foundation - -class Pair { - var first:T1 - var second:T2 - - init(_ first:T1, _ second:T2) { - self.first = first - self.second = second - } - - -} diff --git a/Classes/Swift/Util/TimestampUtils.swift b/Classes/Swift/Util/TimestampUtils.swift deleted file mode 100644 index 18087c33a..000000000 --- a/Classes/Swift/Util/TimestampUtils.swift +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-android - * (see https://www.linphone.org). - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -class TimestampUtils { - - static func is24Hour() -> Bool { - let dateFormat = DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: Locale.current)! - return dateFormat.firstIndex(of: "a") == nil - } - - static func timeToString(unixTimestamp: Double, timestampInSecs: Bool = true) -> String { - let date = Date(timeIntervalSince1970: unixTimestamp) - let dateFormat = DateFormatter() - dateFormat.dateFormat = is24Hour() ? "HH'h'mm" : "h:mm a" - return dateFormat.string(from: date) - } - - static func toString( - unixTimestamp: Double, - onlyDate: Bool = false, - timestampInSecs: Bool = true, - shortDate: Bool = true - ) -> String { - let date = Date(timeIntervalSince1970: unixTimestamp) - let dateFormatter = DateFormatter() - dateFormatter.dateStyle = onlyDate ? .none : .long - dateFormatter.timeStyle = shortDate ? .short : .long - dateFormatter.doesRelativeDateFormatting = true - return dateFormatter.string(from: date) - } - - static func dateToString(date:Date) -> String { - let dateFormatter = DateFormatter() - dateFormatter.dateStyle = .short - dateFormatter.timeStyle = .none - return dateFormatter.string(from: date) - } - - static func dateLongToString(date:Date) -> String { - let dateFormatter = DateFormatter() - dateFormatter.dateStyle = .long - dateFormatter.timeStyle = .none - let dayFormatter = DateFormatter() - dayFormatter.dateFormat = "EEEE" - let day = dayFormatter.string(from: date) - return day.prefix(1).uppercased() + day.dropFirst()+" "+dateFormatter.string(from: date) - } - - static func timeToString(date:Date) -> String { - let dateFormatter = DateFormatter() - dateFormatter.dateStyle = .none - dateFormatter.timeStyle = .short - return dateFormatter.string(from: date) - } - - -} - diff --git a/Classes/Swift/Util/UIImageExtension.swift b/Classes/Swift/Util/UIImageExtension.swift deleted file mode 100644 index ed0bb52cd..000000000 --- a/Classes/Swift/Util/UIImageExtension.swift +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation - -extension UIImage { - - public static func withColor(_ color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) -> UIImage { - let format = UIGraphicsImageRendererFormat() - format.scale = 1 - let image = UIGraphicsImageRenderer(size: size, format: format).image { rendererContext in - color.setFill() - rendererContext.fill(CGRect(origin: .zero, size: size)) - } - return image - } - -} diff --git a/Classes/Swift/Util/ViewModel/MediatorLiveData.swift b/Classes/Swift/Util/ViewModel/MediatorLiveData.swift deleted file mode 100644 index f040df597..000000000 --- a/Classes/Swift/Util/ViewModel/MediatorLiveData.swift +++ /dev/null @@ -1,48 +0,0 @@ -/* -* Copyright (c) 2010-2020 Belledonne Communications SARL. -* -* This file is part of linhome -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*/ - - -import Foundation - - -class MediatorLiveData : MutableLiveData { - - private var sources : [MutableLiveData?] = [] - - override init(_ initial:T) { - super.init(initial) - } - - override init () { - super.init() - } - - func addSource(_ source: MutableLiveData, _ onSourceChange:@escaping ()->Void) { - sources.append(source) - source.observe(onChange: { _ in - onSourceChange() - }) - } - - func destroy() { - sources.forEach { $0?.clearObservers() } - clearObservers() - } - -} diff --git a/Classes/Swift/Util/Viewers/ImageViewer.swift b/Classes/Swift/Util/Viewers/ImageViewer.swift deleted file mode 100644 index 44d15fbe3..000000000 --- a/Classes/Swift/Util/Viewers/ImageViewer.swift +++ /dev/null @@ -1,157 +0,0 @@ -// -// ImageViewer.swift -// linphone -// -// Created by Benoît Martins on 21/06/2023. -// - -import Foundation - -@objc class ImageViewer: BackNextNavigationView, UICompositeViewDelegate, UIScrollViewDelegate, QLPreviewControllerDelegate, QLPreviewControllerDataSource { - static let compositeDescription = UICompositeViewDescription(ImageViewer.self, statusBar: StatusBarView.self, tabBar: nil, sideMenu: SideMenuView.self, fullscreen: false, isLeftFragment: false,fragmentWith: nil) - static func compositeViewDescription() -> UICompositeViewDescription! { return compositeDescription } - func compositeViewDescription() -> UICompositeViewDescription! { return type(of: self).compositeDescription } - - @objc var imageNameViewer = "" - @objc var imagePathViewer = "" - @objc var imageViewer = UIImage() - var newImageView = UIImageView() - let imageViewViewer = UIImageView() - let imageScrollView = UIScrollView() - var previewItems : [QLPreviewItem?] = [] - - override func viewDidLoad() { - - super.viewDidLoad( - backAction: { - PhoneMainView.instance().popView(self.compositeViewDescription()) - },nextAction: { - }, - nextActionEnableCondition: MutableLiveData(false), - title:"") - super.nextButton.isHidden = true - - let shareButton = CallControlButton(buttonTheme:VoipTheme.nav_button("voip_export")) - super.topBar.addSubview(shareButton) - shareButton.alignParentRight(withMargin: side_buttons_margin).alignParentBottom(withMargin: 18).alignParentTop(withMargin: 18).done() - - shareButton.addTarget(self, action: #selector(shareTextButton), for: .touchUpInside) - - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - self.view.backgroundColor = VoipTheme.voipBackgroundBWColor.get() - } - - } - - override func viewWillAppear(_ animated: Bool) { - let vWidth = self.view.bounds.size.width - let vHeight = self.view.bounds.size.height-66 - - - newImageView.removeFromSuperview() - imageViewViewer.removeFromSuperview() - imageScrollView.removeFromSuperview() - - imageScrollView.delegate = self - imageScrollView.frame = CGRectMake(0, 66, vWidth, vHeight) - imageScrollView.showsVerticalScrollIndicator = true - - imageScrollView.minimumZoomScale = 1.0 - imageScrollView.maximumZoomScale = 10.0 - - self.view.addSubview(imageScrollView) - - imageViewViewer.contentMode = .scaleAspectFit - imageScrollView.addSubview(imageViewViewer) - self.imageViewViewer.frame = CGRect(x: 0, y: 0, width: vWidth, height: vHeight) - self.view.bringSubviewToFront(topBar) - - let pictureTap = UITapGestureRecognizer(target: self, action: #selector(imageTapped)) - imageViewViewer.addGestureRecognizer(pictureTap) - imageViewViewer.isUserInteractionEnabled = true - - imageViewViewer.image = imageViewer - titleLabel.text = imageNameViewer - } - - override func didRotate(from fromInterfaceOrientation: UIInterfaceOrientation) { - dismissFullscreenImageRotated() - self.viewWillAppear(true) - } - - @IBAction func imageTapped(_ sender: UITapGestureRecognizer) { - let imageView = sender.view as! UIImageView - newImageView = UIImageView(image: imageView.image) - newImageView.frame = UIScreen.main.bounds - newImageView.frame = CGRectMake(0, 0, UIScreen.main.bounds.size.width, UIScreen.main.bounds.size.height-20) - newImageView.backgroundColor = .black - newImageView.contentMode = .scaleAspectFit - newImageView.isUserInteractionEnabled = true - let tap = UITapGestureRecognizer(target: self, action: #selector(dismissFullscreenImage)) - newImageView.addGestureRecognizer(tap) - self.view.addSubview(newImageView) - self.navigationController?.isNavigationBarHidden = true - self.tabBarController?.tabBar.isHidden = true - PhoneMainView.instance().hideStatusBar(true) - } - - func dismissFullscreenImageRotated() { - self.navigationController?.isNavigationBarHidden = false - self.tabBarController?.tabBar.isHidden = false - PhoneMainView.instance().hideStatusBar(false) - } - - @objc func dismissFullscreenImage(_ sender: UITapGestureRecognizer) { - self.navigationController?.isNavigationBarHidden = false - self.tabBarController?.tabBar.isHidden = false - PhoneMainView.instance().hideStatusBar(false) - sender.view?.removeFromSuperview() - } - - func viewForZooming(in scrollView: UIScrollView) -> UIView? { - return self.imageViewViewer - } - - @IBAction func shareTextButton(_ sender: UIButton) { - /* - // text to share - let text = textViewer - - // set up activity view controller - let textToShare = [ text ] - let activityViewController = UIActivityViewController(activityItems: textToShare, applicationActivities: nil) - activityViewController.popoverPresentationController?.sourceView = self.view // so that iPads won't crash - - // exclude some activity types from the list (optional) - activityViewController.excludedActivityTypes = [ UIActivity.ActivityType.airDrop, UIActivity.ActivityType.postToFacebook ] - - // present the view controller - self.present(activityViewController, animated: true, completion: nil) - */ - - - - let previewController = QLPreviewController() - self.previewItems = [] - - self.previewItems.append(self.getPreviewItem(filePath: imagePathViewer)) - - previewController.dataSource = self - previewController.delegate = self - PhoneMainView.instance().mainViewController.present(previewController, animated: true, completion: nil) - - } - - func numberOfPreviewItems(in controller: QLPreviewController) -> Int { - return previewItems.count - } - - func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem { - return (previewItems[index] as QLPreviewItem?)! - } - - func getPreviewItem(filePath: String) -> NSURL{ - let url = NSURL(fileURLWithPath: filePath) - return url - } -} diff --git a/Classes/Swift/Util/Viewers/MediaViewer.swift b/Classes/Swift/Util/Viewers/MediaViewer.swift deleted file mode 100644 index 730ffebec..000000000 --- a/Classes/Swift/Util/Viewers/MediaViewer.swift +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import AVFoundation -import AVKit -import PDFKit - -class MediaViewer: BackNextNavigationView, UICompositeViewDelegate, UIScrollViewDelegate, QLPreviewControllerDelegate, QLPreviewControllerDataSource { - - static let compositeDescription = UICompositeViewDescription(MediaViewer.self, statusBar: StatusBarView.self, tabBar: nil, sideMenu: SideMenuView.self, fullscreen: false, isLeftFragment: false,fragmentWith: nil) - static func compositeViewDescription() -> UICompositeViewDescription! { return compositeDescription } - func compositeViewDescription() -> UICompositeViewDescription! { return type(of: self).compositeDescription } - - var imageNameViewer = "" - var imagePathViewer = "" - var imageViewer = UIImage() - var previewItems : [QLPreviewItem?] = [] - var contentType : String? - let shareButton = CallControlButton(buttonTheme:VoipTheme.nav_button("voip_export")) - - //Image - var newImageView = UIImageView() - let imageViewViewer = UIImageView() - let imageScrollView = UIScrollView() - - //Video - var player: AVPlayer? = AVPlayer() - var playerLayer = AVPlayerLayer() - - //PDF - let pdfView = PDFView() - - override func viewDidLoad() { - super.viewDidLoad( - backAction: { - PhoneMainView.instance().popView(self.compositeViewDescription()) - },nextAction: { - }, - nextActionEnableCondition: MutableLiveData(false), - title:"") - super.nextButton.isHidden = true - - super.topBar.addSubview(shareButton) - shareButton.alignParentRight(withMargin: side_buttons_margin).alignParentBottom(withMargin: 18).alignParentTop(withMargin: 18).done() - - shareButton.addTarget(self, action: #selector(shareMediaButton), for: .touchUpInside) - try! AVAudioSession.sharedInstance().setCategory(.playback) - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - self.view.backgroundColor = VoipTheme.voipBackgroundBWColor.get() - } - } - - override func viewWillAppear(_ animated: Bool) { - newImageView.removeFromSuperview() - imageViewViewer.removeFromSuperview() - imageScrollView.removeFromSuperview() - playerLayer.removeFromSuperlayer() - pdfView.removeFromSuperview() - var extensionFile = imagePathViewer.lowercased().components(separatedBy: ".").last ?? "" - - if contentType == "image" { - setUpImageView() - } else if contentType == "video" || (["mkv", "avi", "mov", "mp4"].contains(extensionFile)) { - setUpPlayerContainerView() - } else if contentType == "file" || contentType == "application"{ - if imageNameViewer.lowercased().components(separatedBy: ".").last == "pdf" { - displayPDF() - } - } - - try! AVAudioSession.sharedInstance().setActive(true) - titleLabel.text = imageNameViewer - titleLabel.toRightOf(backButton).toLeftOf(shareButton).done() - } - - override func viewDidAppear(_ animated: Bool) { - self.navigationController?.isNavigationBarHidden = false - self.tabBarController?.tabBar.isHidden = false - PhoneMainView.instance().hideStatusBar(false) - } - - override func viewWillDisappear(_ animated: Bool) { - stopPlayer() - } - - func stopPlayer() { - if let play = player { - play.pause() - play.replaceCurrentItem(with: nil) - try! AVAudioSession.sharedInstance().setActive(false) - print("Player deallocated") - } else { - print("Player was already deallocated") - } - } - - override func didRotate(from fromInterfaceOrientation: UIInterfaceOrientation) { - dismissFullscreenImageRotated() - stopPlayer() - self.viewWillAppear(true) - } - - @IBAction func imageTapped(_ sender: UITapGestureRecognizer) { - let imageView = sender.view as! UIImageView - newImageView = UIImageView(image: imageView.image) - newImageView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height-20) - newImageView.backgroundColor = .black - newImageView.contentMode = .scaleAspectFit - newImageView.isUserInteractionEnabled = true - let tap = UITapGestureRecognizer(target: self, action: #selector(dismissFullscreenImage)) - newImageView.addGestureRecognizer(tap) - self.view.addSubview(newImageView) - self.navigationController?.isNavigationBarHidden = true - self.tabBarController?.tabBar.isHidden = true - PhoneMainView.instance().hideStatusBar(true) - } - - func dismissFullscreenImageRotated() { - self.navigationController?.isNavigationBarHidden = false - self.tabBarController?.tabBar.isHidden = false - PhoneMainView.instance().hideStatusBar(false) - } - - @objc func dismissFullscreenImage(_ sender: UITapGestureRecognizer) { - self.navigationController?.isNavigationBarHidden = false - self.tabBarController?.tabBar.isHidden = false - PhoneMainView.instance().hideStatusBar(false) - sender.view?.removeFromSuperview() - } - - func viewForZooming(in scrollView: UIScrollView) -> UIView? { - return self.imageViewViewer - } - - @objc func shareMediaButton(_ sender: UIButton) { - let previewController = QLPreviewController() - self.previewItems = [] - - self.previewItems.append(self.getPreviewItem(filePath: imagePathViewer)) - - previewController.dataSource = self - previewController.delegate = self - PhoneMainView.instance().mainViewController.present(previewController, animated: true, completion: nil) - - } - - private func setUpImageView() { - let vWidth = self.view.bounds.size.width - let vHeight = self.view.bounds.size.height-66 - - imageScrollView.delegate = self - imageScrollView.frame = CGRect(x: 0, y: 66, width: vWidth, height: vHeight) - imageScrollView.showsVerticalScrollIndicator = true - - imageScrollView.minimumZoomScale = 1.0 - imageScrollView.maximumZoomScale = 10.0 - - self.view.addSubview(imageScrollView) - - imageViewViewer.contentMode = .scaleAspectFit - imageScrollView.addSubview(imageViewViewer) - self.imageViewViewer.frame = CGRect(x: 0, y: 0, width: vWidth, height: vHeight) - self.view.bringSubviewToFront(topBar) - - let pictureTap = UITapGestureRecognizer(target: self, action: #selector(imageTapped)) - imageViewViewer.addGestureRecognizer(pictureTap) - imageViewViewer.isUserInteractionEnabled = true - - imageViewViewer.image = imageViewer - } - - private func setUpPlayerContainerView() { - let vWidth = self.view.bounds.size.width - let vHeight = self.view.bounds.size.height-66 - if let urlEncoded = imagePathViewer.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed){ - if !urlEncoded.isEmpty { - if let urlVideo = URL(string: "file://" + urlEncoded){ - player = AVPlayer(url: urlVideo) - playerLayer = AVPlayerLayer(player: player) - playerLayer.frame = CGRect(x: 0, y: 66, width: vWidth, height: vHeight) - self.view.layer.addSublayer(playerLayer) - if player != nil { - player!.play() - } - - let pictureTap = UITapGestureRecognizer(target: self, action: #selector(videoTapped)) - self.view.addGestureRecognizer(pictureTap) - self.view.isUserInteractionEnabled = true - } - } - } - } - - func displayPDF() { - if let urlEncoded = imagePathViewer.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed){ - if !urlEncoded.isEmpty { - pdfView.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(pdfView) - - pdfView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true - pdfView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true - pdfView.topAnchor.constraint(equalTo: super.topBar.bottomAnchor).isActive = true - pdfView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true - pdfView.autoScales = true - - if let urlEncoded = imagePathViewer.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed){ - if let path = URL(string: "file://" + urlEncoded) { - if let document = PDFDocument(url: path) { - pdfView.document = document - } - } - - } - } - } - } - - @objc func videoTapped(){ - if let urlEncoded = imagePathViewer.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed){ - if !urlEncoded.isEmpty { - if let urlVideo = URL(string: "file://" + urlEncoded){ - let player = AVPlayer(url: urlVideo) - let playerViewController = AVPlayerViewController() - playerViewController.player = player - self.present(playerViewController, animated: true) { - playerViewController.player!.play() - } - } - } - } - } - - func getPreviewItem(filePath: String) -> NSURL{ - let url = NSURL(fileURLWithPath: filePath) - return url - } - - func numberOfPreviewItems(in controller: QLPreviewController) -> Int { - return previewItems.count - } - - func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem { - return (previewItems[index] as QLPreviewItem?)! - } -} diff --git a/Classes/Swift/Util/Viewers/TextViewer.swift b/Classes/Swift/Util/Viewers/TextViewer.swift deleted file mode 100644 index 80760ae65..000000000 --- a/Classes/Swift/Util/Viewers/TextViewer.swift +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation - -class TextViewer: BackNextNavigationView, UICompositeViewDelegate { - - static let compositeDescription = UICompositeViewDescription(TextViewer.self, statusBar: StatusBarView.self, tabBar: nil, sideMenu: SideMenuView.self, fullscreen: false, isLeftFragment: false,fragmentWith: nil) - static func compositeViewDescription() -> UICompositeViewDescription! { return compositeDescription } - func compositeViewDescription() -> UICompositeViewDescription! { return type(of: self).compositeDescription } - - @objc var textViewer = "" - @objc var textNameViewer = "" - let textViewViewer = UITextView() - - override func viewDidLoad() { - - super.viewDidLoad( - backAction: { - PhoneMainView.instance().popView(self.compositeViewDescription()) - },nextAction: { - }, - nextActionEnableCondition: MutableLiveData(false), - title:"") - super.nextButton.isHidden = true - - let shareButton = CallControlButton(buttonTheme:VoipTheme.nav_button("voip_export")) - super.topBar.addSubview(shareButton) - shareButton.alignParentRight(withMargin: side_buttons_margin).alignParentBottom(withMargin: 18).alignParentTop(withMargin: 18).done() - - shareButton.addTarget(self, action: #selector(shareMediaButton), for: .touchUpInside) - - textViewViewer.isScrollEnabled = true - textViewViewer.isUserInteractionEnabled = true - textViewViewer.frame = CGRect(x: 0, y: top_bar_height, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height-top_bar_height*2-32.0) - - self.view.addSubview(textViewViewer) - - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - self.view.backgroundColor = VoipTheme.voipBackgroundBWColor.get() - self.textViewViewer.frame = CGRect(x: 0, y: self.top_bar_height, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height - (self.top_bar_height * 2) - 32.0) - } - - } - - override func viewDidAppear(_ animated: Bool) { - textViewViewer.text = textViewer - titleLabel.text = textNameViewer - } - - @objc func shareMediaButton(_ sender: UIButton) { - let text = textViewer - - let textToShare = [ text ] - let activityViewController = UIActivityViewController(activityItems: textToShare, applicationActivities: nil) - activityViewController.popoverPresentationController?.sourceView = self.view // so that iPads won't crash - - activityViewController.excludedActivityTypes = [ UIActivity.ActivityType.airDrop, UIActivity.ActivityType.postToFacebook ] - - self.present(activityViewController, animated: true, completion: nil) - - } -} diff --git a/Classes/Swift/VFSUtil.swift b/Classes/Swift/VFSUtil.swift deleted file mode 100644 index 6dc09d5ae..000000000 --- a/Classes/Swift/VFSUtil.swift +++ /dev/null @@ -1,243 +0,0 @@ -/* -* Copyright (c) 2010-2020 Belledonne Communications SARL. -* -* This file is part of linphone-iphone -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*/ - -import UIKit -import Foundation -import Security -import CommonCrypto -import linphonesw -import os - - -@objc class VFSUtil: NSObject { - - @objc static let keyChainSharingGroup = "org.linphone.phone" // Enable Keychain Sharing capabilities in app and all app extensions that need to activate VFS and set key chain group to be the bundle ID for all and here - @objc static let TEAM_ID = "Z2V957B3D6" // Apple TEAM ID - - @objc static let keyName = "\(keyChainSharingGroup).vfskey" - @objc static let prefName = "\(keyChainSharingGroup).vfspref" - @objc static let accessGroup = "\(TEAM_ID).\(keyChainSharingGroup)" - - @objc static func generateKey(requiresBiometry: Bool = false) throws { - - let flags: SecAccessControlCreateFlags - if #available(iOS 11.3, *) { - flags = requiresBiometry ? - [.privateKeyUsage, .biometryCurrentSet] : .privateKeyUsage - } else { - flags = requiresBiometry ? - [.privateKeyUsage, .touchIDCurrentSet] : .privateKeyUsage - } - let access = - SecAccessControlCreateWithFlags(kCFAllocatorDefault, kSecAttrAccessibleAlwaysThisDeviceOnly,flags,nil)! - let tag = keyName.data(using: .utf8)! - let attributes: [String: Any] = [ - kSecAttrKeyType as String : kSecAttrKeyTypeECSECPrimeRandom, - kSecAttrKeySizeInBits as String : 256, - kSecAttrTokenID as String : kSecAttrTokenIDSecureEnclave, - kSecPrivateKeyAttrs as String : [ - kSecAttrIsPermanent as String : true, - kSecAttrApplicationTag as String : tag, - kSecAttrAccessControl as String : access - ], - kSecAttrAccessGroup as String : accessGroup - ] - - var error: Unmanaged? - guard let _ = SecKeyCreateRandomKey(attributes as CFDictionary, &error) else { - throw error!.takeRetainedValue() as Error - } - } - - @objc static func loadKey(name: String) -> SecKey? { - let tag = name.data(using: .utf8)! - let query: [String: Any] = [ - kSecClass as String : kSecClassKey, - kSecAttrApplicationTag as String : tag, - kSecAttrKeyType as String : kSecAttrKeyTypeEC, - kSecReturnRef as String : true, - kSecAttrAccessGroup as String : accessGroup - ] - - var item: CFTypeRef? - let status = SecItemCopyMatching(query as CFDictionary, &item) - guard status == errSecSuccess else { - return nil - } - return (item as! SecKey) - } - - - @objc static func encrypt(clearText: String) -> String? { - let algorithm: SecKeyAlgorithm = .eciesEncryptionCofactorX963SHA512AESGCM - guard let privateKey = loadKey(name: keyName), let publicKey = SecKeyCopyPublicKey(privateKey), SecKeyIsAlgorithmSupported(publicKey, .encrypt, algorithm) else { - return nil - } - var error: Unmanaged? - let clearTextData = clearText.data(using: .utf8)! - guard let encryptedData = SecKeyCreateEncryptedData(publicKey, algorithm,clearTextData as CFData, &error) as Data? else { - return nil - } - return encryptedData.base64EncodedString() - } - - @objc static func decrypt(encryptedText: String) -> String? { - let algorithm: SecKeyAlgorithm = .eciesEncryptionCofactorX963SHA512AESGCM - guard let key = loadKey(name: keyName), SecKeyIsAlgorithmSupported(key, .decrypt, algorithm) else { - return nil - } - var error: Unmanaged? - guard let clearTextData = SecKeyCreateDecryptedData(key,algorithm,Data(base64Encoded: encryptedText)! as CFData,&error) as Data? else { - print("[VFS] failed deciphering data \(String(describing: error))") - return nil - } - return String(decoding: clearTextData, as: UTF8.self) - } - - - @objc static func addSecuredPreference(key:String, value:String) -> Bool { - let delQuery: [String: Any] = [kSecClass as String: kSecClassGenericPassword, - kSecAttrAccount as String: key.data(using: .utf8)!, - kSecAttrAccessGroup as String : accessGroup] - SecItemDelete(delQuery as CFDictionary) - - - let insertQUery: [String: Any] = [kSecClass as String: kSecClassGenericPassword, - kSecAttrAccessGroup as String : accessGroup, - kSecAttrAccessible as String : kSecAttrAccessibleAlwaysThisDeviceOnly, - kSecAttrService as String: Bundle.main.bundleIdentifier!, - kSecAttrAccount as String: key.data(using: .utf8)!, - kSecValueData as String:value.data(using: .utf8)!] - let insertStatus = SecItemAdd(insertQUery as CFDictionary, nil) - log("[VFS] addSecuredPreference : SecItemAdd status \(insertStatus)", .info) - return insertStatus == errSecSuccess - - } - - @objc static func deleteSecurePreference(key:String) { - let delQuery: [String: Any] = [kSecClass as String: kSecClassGenericPassword, - kSecAttrAccount as String: key.data(using: .utf8)!, - kSecAttrAccessGroup as String : accessGroup] - let deleteSatus = SecItemDelete(delQuery as CFDictionary) - log("[VFS] deleteSecurePreference : SecItemDelete status for removing key \(key) = \(deleteSatus)", .info) - } - - - - @objc static func getSecuredPreference(key:String) -> String? { - let query: [String:Any] = [ - kSecClass as String: kSecClassGenericPassword, - kSecAttrAccount as String: key.data(using: .utf8)!, - kSecReturnData as String: kCFBooleanTrue, - kSecAttrAccessGroup as String : accessGroup, - ] - - var result: AnyObject? - let status: OSStatus = withUnsafeMutablePointer(to: &result) { - SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0)) - } - log("[VFS] getSecuredPreference : SecItemCopyMatching status \(status)", .info) - return status == errSecSuccess ? String(decoding: result as! Data , as: UTF8.self) : nil - } - - @objc static func randomSha512() -> String { - let data = UUID.init().uuidString.data(using: .utf8)! - var digest = [UInt8](repeating: 0, count: Int(CC_SHA512_DIGEST_LENGTH)) - data.withUnsafeBytes({ - _ = CC_SHA512($0, CC_LONG(data.count), &digest) - }) - return digest.map({ String(format: "%02hhx", $0) }).joined(separator: "") - } - - - - @objc static func activateVFS(forFirstTime: Bool = false) -> Bool { - do { - if (forFirstTime) { - removeExistingVFSKeyIfAny() - } - if (getSecuredPreference(key: prefName) == nil) { - log("[VFS] no secret key set, building one.", .info) - try generateKey(requiresBiometry: false) - guard let encryptedHash = encrypt(clearText: randomSha512()) else { - return false - } - if (!addSecuredPreference(key: prefName, value: encryptedHash)) { - log("[VFS] Unable to save encrypted key in secured defaults.", .error) - } - } - guard let encryptedKey = getSecuredPreference(key: prefName) else { - log("[VFS] Unable to retrieve encrypted key.", .error) - return false - } - guard let secret = decrypt(encryptedText: encryptedKey) else { - log("[VFS] Unable to decryt encrypted key.", .error) - removeExistingVFSKeyIfAny() - return false - } - Factory.Instance.setVfsEncryption(encryptionModule: 2, secret: secret, secretSize: 32) - log("[VFS] activated", .info) - return true - } catch { - log("[VFS] Error setting up VFS: \(error)", .info) - return false - } - } - - @objc static func vfsEnabled(groupName: String) -> Bool { - let defaults = UserDefaults.init(suiteName: groupName) - if (defaults == nil) { - log("[VFS] Unable to get VFS enabled preference userDefaults is null",.error); - } - return defaults?.bool(forKey: "vfs_enabled_preference") == true - } - - @objc static func setVfsEnabbled(enabled: Bool, groupName: String) { - let defaults = UserDefaults.init(suiteName: groupName) - if (defaults == nil) { - log("[VFS] Unable to set VFS enabled preferece userDefaults is null",.error); - } - defaults?.setValue(enabled, forKey: "vfs_enabled_preference") - } - - @objc static func log(_ log:String, _ level: OSLogType) { - switch (level) { - case.info:LoggingService.Instance.message(message: log) - case.debug:LoggingService.Instance.debug(message: log) - case.error:LoggingService.Instance.error(message: log) - case.fault:LoggingService.Instance.fatal(message: log) - default:LoggingService.Instance.message(message: log) - } - if #available(iOS 10.0, *) { - os_log("%{public}@", type: level,log) - } else { - NSLog(log) - } - } - - @objc static func removeExistingVFSKeyIfAny() { - log("[VFS] removing existing key if any",.debug) - if (getSecuredPreference(key: prefName) != nil) { - deleteSecurePreference(key: prefName) - } - } - - - -} diff --git a/Classes/Swift/Voip/AudioRouteUtils.swift b/Classes/Swift/Voip/AudioRouteUtils.swift deleted file mode 100644 index f6ee2895a..000000000 --- a/Classes/Swift/Voip/AudioRouteUtils.swift +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright (c) 2010-2021 Belledonne Communications SARL. - * - * This file is part of linphone-android - * (see https://www.linphone.org). - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import AVFoundation -import linphonesw - -@objc class AudioRouteUtils : NSObject { - - static var core : Core { get { Core.get() } } - - static private func applyAudioRouteChange( call: Call?, types: [AudioDevice.Kind], output: Bool = true) { - let typesNames = types.map { String(describing: $0) }.joined(separator: "/") - - let currentCall = core.callsNb > 0 ? (call != nil) ? call : core.currentCall != nil ? core.currentCall : core.calls[0] : nil - if (currentCall == nil) { - Log.w("[Audio Route Helper] No call found, setting audio route on Core") - } - let conference = core.conference - let capability = output ? AudioDevice.Capabilities.CapabilityPlay : AudioDevice.Capabilities.CapabilityRecord - - var found = false - - core.audioDevices.forEach { (audioDevice) in - Log.i("[Audio Route Helper] registered coe audio devices are : [\(audioDevice.deviceName)] [\(audioDevice.type)] [\(audioDevice.capabilities)] ") - } - - core.audioDevices.forEach { (audioDevice) in - if (!found && types.contains(audioDevice.type) && audioDevice.hasCapability(capability: capability)) { - if (conference != nil && conference?.isIn == true) { - Log.i("[Audio Route Helper] Found [\(audioDevice.type)] \(output ? "playback" : "recorder") audio device [\(audioDevice.deviceName)], routing conference audio to it") - if (output) { - conference?.outputAudioDevice = audioDevice - } else { - conference?.inputAudioDevice = audioDevice - } - } else if (currentCall != nil) { - Log.i("[Audio Route Helper] Found [\(audioDevice.type)] \(output ? "playback" : "recorder") audio device [\(audioDevice.deviceName)], routing call audio to it") - if (output) { - currentCall?.outputAudioDevice = audioDevice - } - else { - currentCall?.inputAudioDevice = audioDevice - } - } else { - Log.i("[Audio Route Helper] Found [\(audioDevice.type)] \(output ? "playback" : "recorder") audio device [\(audioDevice.deviceName)], changing core default audio device") - if (output) { - core.outputAudioDevice = audioDevice - } else { - core.inputAudioDevice = audioDevice - } - } - found = true - } - } - if (!found) { - Log.e("[Audio Route Helper] Couldn't find \(typesNames) audio device") - } - } - - static private func changeCaptureDeviceToMatchAudioRoute(call: Call?, types: [AudioDevice.Kind]) { - switch (types.first) { - case .Bluetooth :if (isBluetoothAudioRecorderAvailable()) { - Log.i("[Audio Route Helper] Bluetooth device is able to record audio, also change input audio device") - applyAudioRouteChange(call: call, types: [AudioDevice.Kind.Bluetooth], output: false) - } - case .Headset, .Headphones : if (isHeadsetAudioRecorderAvailable()) { - Log.i("[Audio Route Helper] Headphones/headset device is able to record audio, also change input audio device") - applyAudioRouteChange(call:call,types: [AudioDevice.Kind.Headphones, AudioDevice.Kind.Headset], output:false) - } - default: applyAudioRouteChange(call:call,types: [AudioDevice.Kind.Microphone], output:false) - } - } - - static private func routeAudioTo( call: Call?, types: [AudioDevice.Kind]) { - let currentCall = call != nil ? call : core.currentCall != nil ? core.currentCall : (core.callsNb > 0 ? core.calls[0] : nil) - if (call != nil || currentCall != nil) { - let callToUse = call != nil ? call : currentCall - applyAudioRouteChange(call: callToUse, types: types) - changeCaptureDeviceToMatchAudioRoute(call: callToUse, types: types) - } else { - applyAudioRouteChange(call: call, types: types) - changeCaptureDeviceToMatchAudioRoute(call: call, types: types) - } - } - - static func routeAudioToEarpiece(call: Call? = nil) { - routeAudioTo(call: call, types: [AudioDevice.Kind.Microphone]) // on iOS Earpiece = Microphone - } - - static func routeAudioToSpeaker(call: Call? = nil) { - routeAudioTo(call: call, types: [AudioDevice.Kind.Speaker]) - } - - @objc static func routeAudioToSpeaker() { - routeAudioTo(call: nil, types: [AudioDevice.Kind.Speaker]) - } - - static func routeAudioToBluetooth(call: Call? = nil) { - routeAudioTo(call: call, types: [AudioDevice.Kind.Bluetooth]) - } - - static func routeAudioToHeadset(call: Call? = nil) { - routeAudioTo(call: call, types: [AudioDevice.Kind.Headphones, AudioDevice.Kind.Headset]) - } - - static func isSpeakerAudioRouteCurrentlyUsed(call: Call? = nil) -> Bool { - - let currentCall = core.callsNb > 0 ? (call != nil) ? call : core.currentCall != nil ? core.currentCall : core.calls[0] : nil - if (currentCall == nil) { - Log.w("[Audio Route Helper] No call found, setting audio route on Core") - } - - let conference = core.conference - let audioDevice = conference != nil && conference?.isIn == true ? conference!.outputAudioDevice : currentCall != nil ? currentCall!.outputAudioDevice : core.outputAudioDevice - Log.i("[Audio Route Helper] Playback audio currently in use is [\(audioDevice?.deviceName ?? "n/a")] with type (\(audioDevice?.type ?? .Unknown)") - return audioDevice?.type == AudioDevice.Kind.Speaker - } - - static func isBluetoothAudioRouteCurrentlyUsed(call: Call? = nil) -> Bool { - if (core.callsNb == 0) { - Log.w("[Audio Route Helper] No call found, so bluetooth audio route isn't used") - return false - } - let currentCall = call != nil ? call : core.currentCall != nil ? core.currentCall : core.calls[0] - let conference = core.conference - - let audioDevice = conference != nil && conference?.isIn == true ? conference!.outputAudioDevice : currentCall?.outputAudioDevice - Log.i("[Audio Route Helper] Playback audio device currently in use is [\(audioDevice?.deviceName ?? "n/a")] with type (\(audioDevice?.type ?? .Unknown)") - return audioDevice?.type == AudioDevice.Kind.Bluetooth - } - - static func isBluetoothAudioRouteAvailable() -> Bool { - if let device = core.audioDevices.first(where: { $0.type == AudioDevice.Kind.Bluetooth && $0.hasCapability(capability: .CapabilityPlay) }) { - Log.i("[Audio Route Helper] Found bluetooth audio device [\(device.deviceName)]") - return true - } - return false - } - - static private func isBluetoothAudioRecorderAvailable() -> Bool { - if let device = core.audioDevices.first(where: { $0.type == AudioDevice.Kind.Bluetooth && $0.hasCapability(capability: .CapabilityRecord) }) { - Log.i("[Audio Route Helper] Found bluetooth audio recorder [\(device.deviceName)]") - return true - } - return false - } - - static func isHeadsetAudioRouteAvailable() -> Bool { - if let device = core.audioDevices.first(where: { ($0.type == AudioDevice.Kind.Headset||$0.type == AudioDevice.Kind.Headphones) && $0.hasCapability(capability: .CapabilityPlay) }) { - Log.i("[Audio Route Helper] Found headset/headphones audio device [\(device.deviceName)]") - return true - } - return false - } - - static private func isHeadsetAudioRecorderAvailable() -> Bool { - if let device = core.audioDevices.first(where: { ($0.type == AudioDevice.Kind.Headset||$0.type == AudioDevice.Kind.Headphones) && $0.hasCapability(capability: .CapabilityRecord) }) { - Log.i("[Audio Route Helper] Found headset/headphones audio recorder [\(device.deviceName)]") - return true - } - return false - } - - - - static func isReceiverEnabled() -> Bool { - if let outputDevice = core.outputAudioDevice { - return outputDevice.type == AudioDevice.Kind.Microphone - } - return false - } - -} diff --git a/Classes/Swift/Voip/Theme/ButtonTheme.swift b/Classes/Swift/Voip/Theme/ButtonTheme.swift deleted file mode 100644 index 88b8306bb..000000000 --- a/Classes/Swift/Voip/Theme/ButtonTheme.swift +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import Foundation -import UIKit - - -struct ButtonTheme { - var tintableStateIcons: [UInt: TintableIcon] // State indexed - var backgroundStateColors: [UInt: LightDarkColor] // State indexed -} - -struct TintableIcon { - var name:String - var tintColor: LightDarkColor? = nil -} diff --git a/Classes/Swift/Voip/Theme/LightDarkColor.swift b/Classes/Swift/Voip/Theme/LightDarkColor.swift deleted file mode 100644 index f87cf42f5..000000000 --- a/Classes/Swift/Voip/Theme/LightDarkColor.swift +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation - -@objc class LightDarkColor : NSObject { - var light: UIColor - var dark : UIColor - init(_ l:UIColor,_ d:UIColor){ - light = l - dark = d - } - - @objc func get() -> UIColor { - if #available(iOS 13.0, *) { - if UITraitCollection.current.userInterfaceStyle == .light { - return light - } else { - return dark - } - } else { - return light - } - } - -} diff --git a/Classes/Swift/Voip/Theme/TextStyle.swift b/Classes/Swift/Voip/Theme/TextStyle.swift deleted file mode 100644 index 508a91bf9..000000000 --- a/Classes/Swift/Voip/Theme/TextStyle.swift +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -struct TextStyle { - var fgColor:LightDarkColor - var bgColor:LightDarkColor - var allCaps:Bool - var align:NSTextAlignment - var font:String - var size:Float - - func boldEd() -> TextStyle { - return self.font.contains("Bold") ? self : TextStyle(fgColor: self.fgColor,bgColor: self.bgColor,allCaps: self.allCaps,align: self.align,font: self.font.replacingOccurrences(of: "Regular", with: "Bold"), size: self.size) - } -} - - -extension UILabel { - - func applyStyleColors(_ style:TextStyle) { - textColor = style.fgColor.get() - backgroundColor = style.bgColor.get() - } - - func applyStyle(_ style:TextStyle) { - applyStyleColors(style) - if (style.allCaps) { - text = self.text?.uppercased() - tag = 1 - } - textAlignment = style.align - let fontSizeMultiplier: Float = (UIDevice.ipad() ? 1.25 : UIDevice.is5SorSEGen1() ? 0.9 : 1.0) - font = UIFont.init(name: style.font, size: CGFloat(style.size*fontSizeMultiplier)) - } - - func addIndicatorIcon(iconName:String, padding:CGFloat = 5.0, y:CGFloat = 4.0, trailing: Bool = true) { - let imageAttachment = NSTextAttachment() - imageAttachment.image = UIImage(named:iconName)?.tinted(with: VoipTheme.voipDrawableColor.get()) - imageAttachment.bounds = CGRect(x: 0.0, y: y , width: font.lineHeight - 2*padding, height: font.lineHeight - 2*padding) - let iconString = NSMutableAttributedString(attachment: imageAttachment) - let textXtring = NSMutableAttributedString(string: text != nil ? (!trailing ? " " : "") + text! + (trailing ? " " : "") : "") - if (trailing) { - textXtring.append(iconString) - self.text = nil - self.attributedText = textXtring - } else { - iconString.append(textXtring) - self.text = nil - self.attributedText = iconString - } - } -} - -extension UIButton { - func applyTitleStyle(_ style:TextStyle) { - titleLabel?.applyStyle(style) - if (style.allCaps) { - setTitle(self.title(for: .normal)?.uppercased(), for: .normal) - tag = 1 - } - setTitleColor(style.fgColor.get(), for: .normal) - contentHorizontalAlignment = style.align == .left ? .left : style.align == .center ? .center : style.align == .right ? .right : .left - } -} - -extension UITextView { - - func applyStyleColors(_ style:TextStyle) { - textColor = style.fgColor.get() - backgroundColor = style.bgColor.get() - } - - func applyStyle(_ style:TextStyle) { - applyStyleColors(style) - if (style.allCaps) { - text = self.text?.uppercased() - tag = 1 - } - textAlignment = style.align - let fontSizeMultiplier: Float = (UIDevice.ipad() ? 1.25 : UIDevice.is5SorSEGen1() ? 0.9 : 1.0) - font = UIFont.init(name: style.font, size: CGFloat(style.size*fontSizeMultiplier)) - } - var numberOfCurrentlyDisplayedLines: Int { - return text.components(separatedBy: "\n").count - } - func removeTextUntilSatisfying(maxNumberOfLines: Int) { - while numberOfCurrentlyDisplayedLines > (maxNumberOfLines) { - text = String(text.dropLast()) - } - } -} - diff --git a/Classes/Swift/Voip/Theme/VoipTexts.swift b/Classes/Swift/Voip/Theme/VoipTexts.swift deleted file mode 100644 index 99446b6f9..000000000 --- a/Classes/Swift/Voip/Theme/VoipTexts.swift +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -@objc class VoipTexts : NSObject { // From android key names. Added intentionnally with NSLocalizedString calls for each key, so it can be picked up by translation system (Weblate or Xcode). - - static let appName = Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as! String - - // FROM ANDROID START (check script scripts/android_import.sh for details) - @objc static let call_action_add_call = NSLocalizedString("Start new call",comment:"") - @objc static let call_action_calls_list = NSLocalizedString("Calls list",comment:"") - @objc static let call_action_change_conf_layout = NSLocalizedString("Change layout",comment:"") - @objc static let call_action_chat = NSLocalizedString("Chat",comment:"") - @objc static let call_action_numpad = NSLocalizedString("Numpad",comment:"") - @objc static let call_action_speakers_list = NSLocalizedString("Speakers list",comment:"") - @objc static let call_action_participants_list = NSLocalizedString("Participants list",comment:"") - @objc static let call_action_statistics = NSLocalizedString("Call statistics",comment:"") - @objc static let call_action_transfer_call = NSLocalizedString("Transfer call",comment:"") - @objc static let call_context_action_answer = NSLocalizedString("Answer call",comment:"") - @objc static let call_context_action_hangup = NSLocalizedString("Terminate call",comment:"") - @objc static let call_context_action_pause = NSLocalizedString("Pause call",comment:"") - @objc static let call_context_action_resume = NSLocalizedString("Resume call",comment:"") - @objc static let call_context_action_transfer = NSLocalizedString("Transfer call",comment:"") - @objc static let call_context_action_attended_transfer = NSLocalizedString("Attended transfer",comment:"") - @objc static let call_error_declined = NSLocalizedString("Call has been declined",comment:"") - @objc static let call_error_generic = NSLocalizedString("Error: %s",comment:"") - @objc static let call_error_incompatible_media_params = NSLocalizedString("Incompatible media parameters",comment:"") - @objc static let call_error_io_error = NSLocalizedString("Service unavailable or network error",comment:"") - @objc static let call_error_network_unreachable = NSLocalizedString("Network is unreachable",comment:"") - @objc static let call_error_server_timeout = NSLocalizedString("Server timeout",comment:"") - @objc static let call_error_temporarily_unavailable = NSLocalizedString("Temporarily unavailable",comment:"") - @objc static let call_error_user_busy = NSLocalizedString("User is busy",comment:"") - @objc static let call_error_user_not_found = NSLocalizedString("User hasn't been found",comment:"") - @objc static let call_incoming_title = NSLocalizedString("Incoming Call",comment:"") - @objc static let call_locally_paused_subtitle = NSLocalizedString("Click on play button to resume it.",comment:"") - @objc static let call_locally_paused_title = NSLocalizedString("You have paused the call.",comment:"") - @objc static let call_notification_active = NSLocalizedString("Call running",comment:"") - @objc static let call_notification_outgoing = NSLocalizedString("Outgoing call",comment:"") - @objc static let call_notification_paused = NSLocalizedString("Paused call",comment:"") - @objc static let call_outgoing_title = NSLocalizedString("Outgoing Call",comment:"") - @objc static let call_remote_recording = NSLocalizedString("This call is being recorded.",comment:"") - @objc static let call_remotely_paused_title = NSLocalizedString("Call has been paused by remote.",comment:"") - @objc static let call_stats_audio = NSLocalizedString("Audio",comment:"") - @objc static let call_stats_capture_filter = NSLocalizedString("Capture filter:",comment:"") - @objc static let call_stats_codec = NSLocalizedString("Codec:",comment:"") - @objc static let call_stats_decoder_name = NSLocalizedString("Decoder:",comment:"") - @objc static let call_stats_download = NSLocalizedString("Download bandwidth:",comment:"") - @objc static let call_stats_encoder_name = NSLocalizedString("Encoder:",comment:"") - @objc static let call_stats_estimated_download = NSLocalizedString("Estimated download bandwidth:",comment:"") - @objc static let call_stats_ice = NSLocalizedString("ICE connectivity:",comment:"") - @objc static let call_stats_ip = NSLocalizedString("IP Family:",comment:"") - @objc static let call_stats_jitter_buffer = NSLocalizedString("Jitter buffer:",comment:"") - @objc static let call_stats_player_filter = NSLocalizedString("Player filter:",comment:"") - @objc static let call_stats_receiver_loss_rate = NSLocalizedString("Receiver loss rate:",comment:"") - @objc static let call_stats_sender_loss_rate = NSLocalizedString("Sender loss rate:",comment:"") - @objc static let call_stats_upload = NSLocalizedString("Upload bandwidth:",comment:"") - @objc static let call_stats_video = NSLocalizedString("Video",comment:"") - @objc static let call_stats_video_fps_received = NSLocalizedString("Received video fps:",comment:"") - @objc static let call_stats_video_fps_sent = NSLocalizedString("Sent video fps:",comment:"") - @objc static let call_stats_video_resolution_received = NSLocalizedString("Received video resolution:",comment:"") - @objc static let call_stats_video_resolution_sent = NSLocalizedString("Sent video resolution:",comment:"") - @objc static let call_video_update_requested_dialog = NSLocalizedString("Correspondent would like to turn the video on",comment:"") - @objc static let cancel = NSLocalizedString("Cancel",comment:"") - @objc static let chat_room_group_info_admin = NSLocalizedString("Admin",comment:"") - @objc static let chat_room_group_info_speaker = NSLocalizedString("Speaker",comment:"") - @objc static let conference_creation_failed = NSLocalizedString("Failed to create meeting",comment:"") - @objc static let conference_default_title = NSLocalizedString("Remote group call",comment:"") - @objc static let conference_description_title = NSLocalizedString("Description",comment:"") - @objc static let conference_display_mode_active_speaker = NSLocalizedString("Active speaker mode",comment:"") - @objc static let conference_display_mode_audio_only = NSLocalizedString("Audio only mode",comment:"") - @objc static let conference_display_mode_mosaic = NSLocalizedString("Mosaic mode",comment:"") - @objc static let conference_first_to_join = NSLocalizedString("You're the first to join the group call",comment:"") - @objc static let conference_go_to_chat = NSLocalizedString("Meeting's chat room",comment:"") - @objc static let conference_group_call_create = NSLocalizedString("Start group call",comment:"") - @objc static let conference_group_call_title = NSLocalizedString("Start a group call",comment:"") - @objc static let conference_incoming_title = NSLocalizedString("Incoming group call",comment:"") - @objc static let conference_info_confirm_removal = NSLocalizedString("Do you really want to delete this meeting?",comment:"") - @objc static let conference_infos_confirm_removal = NSLocalizedString("Do you really want to delete these meetings?",comment:"") - @objc static let conference_info_removed = NSLocalizedString("Meeting info has been deleted",comment:"") - @objc static let conference_infos_removed = NSLocalizedString("Meeting infos have been deleted",comment:"") - - @objc static let conference_invite_join = NSLocalizedString("Join",comment:"") - @objc static let conference_invite_participants_count = NSLocalizedString("%d participants",comment:"") - @objc static let conference_invite_title = NSLocalizedString("Meeting invite:",comment:"") - @objc static let conference_update_title = NSLocalizedString("Meeting has been updated:",comment:"") - @objc static let conference_cancel_title = NSLocalizedString("Meeting has been cancelled:",comment:"") - @objc static let conference_invite_broadcast_title = NSLocalizedString("Broadcast invite:",comment:"") - @objc static let conference_update_broadcast_title = NSLocalizedString("Broadcast has been updated:",comment:"") - @objc static let conference_cancel_broadcast_title = NSLocalizedString("Broadcast has been cancelled:",comment:"") - @objc static let conference_last_user = NSLocalizedString("All other participants have left the group call",comment:"") - @objc static let conference_local_title = NSLocalizedString("Local group call",comment:"") - @objc static let conference_no_schedule = NSLocalizedString("No scheduled meeting yet.",comment:"") - @objc static let conference_no_terminated_schedule = NSLocalizedString("No terminated meeting yet.",comment:"") - @objc static let conference_participant_paused = NSLocalizedString("(paused)",comment:"") - @objc static let conference_participants_title = NSLocalizedString("Participants (%d)",comment:"") - @objc static let conference_paused_subtitle = NSLocalizedString("Click on play button to join it back.",comment:"") - @objc static let conference_paused_title = NSLocalizedString("You are currently out of the meeting.",comment:"") - @objc static let conference_schedule_address_copied_to_clipboard = NSLocalizedString("Meeting address copied into clipboard",comment:"") - @objc static let conference_schedule_address_title = NSLocalizedString("Meeting address",comment:"") - @objc static let conference_schedule_address_broadcast_copied_to_clipboard = NSLocalizedString("Broadcast address copied into clipboard",comment:"") - @objc static let conference_schedule_address_broadcast_title = NSLocalizedString("Broadcast address",comment:"") - @objc static let conference_schedule_mode = NSLocalizedString("Mode",comment:"") - @objc static let conference_schedule_date = NSLocalizedString("Date",comment:"") - @objc static let conference_schedule_description_hint = NSLocalizedString("Description",comment:"") - @objc static let conference_schedule_description_title = NSLocalizedString("Add a description",comment:"") - @objc static let conference_schedule_duration = NSLocalizedString("Duration",comment:"") - @objc static let conference_schedule_encryption = NSLocalizedString("Would you like to encrypt the meeting?",comment:"") - @objc static let conference_schedule_info_created = NSLocalizedString("Meeting has been scheduled",comment:"") - @objc static let conference_schedule_info_not_sent_to_participant = NSLocalizedString("Failed to send meeting info to a participant",comment:"") - @objc static let conference_schedule_later = NSLocalizedString("Do you want to schedule a meeting for later?",comment:"") - @objc static let conference_schedule_mandatory_field = NSLocalizedString("Mandatory",comment:"") - @objc static let conference_schedule_organizer = NSLocalizedString("Organizer:",comment:"") - @objc static let conference_schedule_participants_list = NSLocalizedString("Participants list",comment:"") - @objc static let conference_schedule_speakers_list = NSLocalizedString("Speakers list",comment:"") - @objc static let conference_schedule_speakers_list_empty = NSLocalizedString("Select at least one speaker",comment:"") - @objc static let conference_schedule_participants_list_empty = NSLocalizedString("Select at least one participant",comment:"") - @objc static let conference_schedule_send_invite_chat = NSLocalizedString("Send invite via &appName;",comment:"").replacingOccurrences(of: "&appName;", with: appName) - @objc static let conference_schedule_send_invite_chat_summary = NSLocalizedString("Invite will be sent out from my &appName; account",comment:"").replacingOccurrences(of: "&appName;", with: appName) - @objc static let conference_schedule_send_invite_email = NSLocalizedString("Send invite via email",comment:"") - @objc static let conference_schedule_start = NSLocalizedString("Schedule",comment:"") - @objc static let conference_schedule_edit = NSLocalizedString("Edit",comment:"") - @objc static let conference_schedule_subject_hint = NSLocalizedString("Meeting subject",comment:"") - @objc static let conference_group_call_subject_hint = NSLocalizedString("Group call subject",comment:"") - @objc static let conference_schedule_subject_title = NSLocalizedString("Subject",comment:"") - @objc static let conference_schedule_summary = NSLocalizedString("Meeting info",comment:"") - @objc static let conference_schedule_broadcast_summary = NSLocalizedString("Broadcast info",comment:"") - @objc static let conference_schedule_time = NSLocalizedString("Time",comment:"") - @objc static let conference_schedule_timezone = NSLocalizedString("Timezone",comment:"") - @objc static let conference_schedule_title = NSLocalizedString("Schedule a meeting",comment:"") - @objc static let conference_scheduled = NSLocalizedString("Meetings",comment:"") - @objc static let conference_start_group_call_dialog_message = NSLocalizedString("Do you want to start a group call?\nEveryone in this group will receive a call to join the meeting.",comment:"") - @objc static let conference_start_group_call_dialog_ok_button = NSLocalizedString("Start",comment:"") - @objc static let conference_too_many_participants_for_mosaic_layout = NSLocalizedString("There is too many participants for mosaic layout, switching to active speaker",comment:"") - @objc static let conference_waiting_room_cancel_call = NSLocalizedString("Cancel",comment:"") - @objc static let conference_waiting_room_start_call = NSLocalizedString("Start",comment:"") - @objc static let conference_waiting_room_video_disabled = NSLocalizedString("Video is currently disabled",comment:"") - @objc static let dialog_accept = NSLocalizedString("Accept",comment:"") - @objc static let dialog_decline = NSLocalizedString("Decline",comment:"") - @objc static let conference_empty = NSLocalizedString("You are currently alone in this group call",comment:"") - @objc static let conference_admin_set = NSLocalizedString("%s is now admin",comment:"") - @objc static let conference_admin_unset = NSLocalizedString("%s is no longer admin",comment:"") - @objc static let conference_scheduled_terminated_filter = NSLocalizedString("Terminated",comment:"") - @objc static let conference_scheduled_future_filter = NSLocalizedString("Scheduled",comment:"") - @objc static let conference_scheduled_cancelled_by_me = NSLocalizedString("You have cancelled the conference",comment:"") - @objc static let conference_scheduled_cancelled_by_organizer = NSLocalizedString("Conference has been cancelled by organizer",comment:"") - @objc static let conference_scheduled_title_meeting_cell = NSLocalizedString("Meeting: ",comment:"") - @objc static let conference_scheduled_title_broadcast_cell = NSLocalizedString("Broadcast: ",comment:"") - @objc static let conference_scheduled_title_participant_cell = NSLocalizedString("Participants",comment:"") - @objc static let conference_scheduled_title_speakers_cell = NSLocalizedString("Speakers",comment:"") - @objc static let conference_scheduled_title_guests_cell = NSLocalizedString("Guests",comment:"") - @objc static let conference_you_are_speaker = NSLocalizedString("You're a speaker",comment:"") - @objc static let conference_you_are_listener = NSLocalizedString("You're a listener",comment:"") - @objc static let conference_no_speaker = NSLocalizedString("No speaker has joined the meeting yet",comment:"") - - @objc static let image_picker_view_alert_action_title = NSLocalizedString("Select the source",comment:"") - @objc static let image_picker_view_alert_action_camera = NSLocalizedString("Camera",comment:"") - @objc static let image_picker_view_alert_action_photo_library = NSLocalizedString("Photo library",comment:"") - @objc static let image_picker_view_alert_action_document = NSLocalizedString("Document",comment:"") - @objc static let alert_dialog_secure_badge_button_chat_conversation_title = NSLocalizedString("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.",comment:"") - @objc static let alert_dialog_secure_badge_button_chat_conversation_checkboxtext = NSLocalizedString("Do not show again",comment:"") - @objc static let dropdown_menu_chat_conversation_go_to_contact = NSLocalizedString("Go to contact",comment:"") - @objc static let dropdown_menu_chat_conversation_add_to_contact = NSLocalizedString("Add to contacts",comment:"") - @objc static let dropdown_menu_chat_conversation_group_infos = NSLocalizedString("Group infos",comment:"") - @objc static let dropdown_menu_chat_conversation_conversation_device = NSLocalizedString("Conversation's devices",comment:"") - @objc static let dropdown_menu_chat_conversation_ephemeral_messages = NSLocalizedString("Ephemeral messages",comment:"") - @objc static let dropdown_menu_chat_conversation_mute_notifications = NSLocalizedString("Mute notifications",comment:"") - @objc static let dropdown_menu_chat_conversation_unmute_notifications = NSLocalizedString("Un-mute notifications",comment:"") - @objc static let dropdown_menu_chat_conversation_delete_messages = NSLocalizedString("Delete messages",comment:"") - @objc static let dropdown_menu_chat_conversation_debug_infos = NSLocalizedString("Debug infos",comment:"") - @objc static let operation_in_progress_wait = NSLocalizedString("Operation in progress, please wait",comment:"") - @objc static let bubble_chat_transferred = NSLocalizedString("Transferred",comment:"") - @objc static let bubble_chat_reply = NSLocalizedString("Answer",comment:"") - @objc static let bubble_chat_reply_message_does_not_exist = NSLocalizedString("Original message does not exist anymore.",comment:"") - - @objc static let bubble_chat_dropDown_emojis = NSLocalizedString("Emojis",comment:"") - @objc static let bubble_chat_dropDown_resend = NSLocalizedString("Resend",comment:"") - @objc static let bubble_chat_dropDown_copy_text = NSLocalizedString("Copy text",comment:"") - @objc static let bubble_chat_dropDown_forward = NSLocalizedString("Forward",comment:"") - @objc static let bubble_chat_dropDown_reply = NSLocalizedString("Reply",comment:"") - @objc static let bubble_chat_dropDown_infos = NSLocalizedString("Delivery Status",comment:"") - @objc static let bubble_chat_dropDown_add_to_contact = NSLocalizedString("Add to contacts",comment:"") - @objc static let bubble_chat_dropDown_delete = NSLocalizedString("Delete",comment:"") - - @objc static let bubble_chat_event_message_new_subject = NSLocalizedString("New subject : %@",comment:"").replacingOccurrences(of: "%@", with: "") - @objc static let bubble_chat_event_message_has_joined = NSLocalizedString("%@ has joined",comment:"").replacingOccurrences(of: "%@", with: "") - @objc static let bubble_chat_event_message_has_left = NSLocalizedString("%@ has left",comment:"").replacingOccurrences(of: "%@", with: "") - @objc static let bubble_chat_event_message_now_admin = NSLocalizedString("%@ is now an admin",comment:"").replacingOccurrences(of: "%@", with: "") - @objc static let bubble_chat_event_message_no_longer_admin = NSLocalizedString("%@ is no longer an admin",comment:"").replacingOccurrences(of: "%@", with: "") - @objc static let bubble_chat_event_message_left_group = NSLocalizedString("You have left the group",comment:"") - @objc static let bubble_chat_event_message_joined_group = NSLocalizedString("You have joined the group",comment:"") - @objc static let bubble_chat_event_message_disabled_ephemeral = NSLocalizedString("You disabled ephemeral messages",comment:"") - @objc static let bubble_chat_event_message_enabled_ephemeral = NSLocalizedString("You enabled ephemeral messages: %@",comment:"").replacingOccurrences(of: ": %@", with: "") - @objc static let bubble_chat_event_message_expiry_ephemeral = NSLocalizedString("Ephemeral messages expiry date: %@",comment:"").replacingOccurrences(of: "%@", with: "") - - @objc static let bubble_chat_event_message_ephemeral_disable = NSLocalizedString("Disabled",comment:"") - @objc static let bubble_chat_event_message_ephemeral_one_minute = NSLocalizedString("1 minute",comment:"") - @objc static let bubble_chat_event_message_ephemeral_one_hour = NSLocalizedString("1 hour",comment:"") - @objc static let bubble_chat_event_message_ephemeral_one_day = NSLocalizedString("1 day",comment:"") - @objc static let bubble_chat_event_message_ephemeral_three_days = NSLocalizedString("3 days",comment:"") - @objc static let bubble_chat_event_message_ephemeral_one_week = NSLocalizedString("1 week",comment:"") - @objc static let bubble_chat_event_message_ephemeral_unexpected_duration = NSLocalizedString("Unexpected duration",comment:"") - - @objc static let bubble_chat_event_message_security_level_decreased = NSLocalizedString("Security level decreased",comment:"") - @objc static let bubble_chat_event_message_security_level_decreased_because = NSLocalizedString("Security level decreased because of %@",comment:"").replacingOccurrences(of: "%@", with: "") - @objc static let bubble_chat_event_message_max_participant = NSLocalizedString("Max participant count exceeded",comment:"") - @objc static let bubble_chat_event_message_max_participant_by = NSLocalizedString("Max participant count exceeded by %@",comment:"").replacingOccurrences(of: "%@", with: "") - @objc static let bubble_chat_event_message_lime_changed = NSLocalizedString("LIME identity key changed",comment:"") - @objc static let bubble_chat_event_message_lime_changed_for = NSLocalizedString("LIME identity key changed for %@",comment:"").replacingOccurrences(of: "%@", with: "") - @objc static let bubble_chat_event_message_attack_detected = NSLocalizedString("Man-in-the-middle attack detected",comment:"") - @objc static let bubble_chat_event_message_attack_detected_for = NSLocalizedString("Man-in-the-middle attack detected for %@",comment:"").replacingOccurrences(of: "%@", with: "") - - @objc static let bubble_chat_download_file = NSLocalizedString("Download",comment:"") - - @objc static let chat_room_presence_online = NSLocalizedString("Online",comment:"") - @objc static let chat_room_presence_last_seen_online_today = NSLocalizedString("Online today at ",comment:"") - @objc static let chat_room_presence_last_seen_online_yesterday = NSLocalizedString("Online yesterday at ",comment:"") - @objc static let chat_room_presence_last_seen_online = NSLocalizedString("Online on ",comment:"") - @objc static let chat_room_presence_away = NSLocalizedString("Away",comment:"") - - @objc static let chat_message_cant_open_file_in_app_dialog_title = NSLocalizedString("It seems we can't display the file",comment:"") - @objc static let chat_message_cant_open_file_in_app_dialog_message = NSLocalizedString("Would you like to open it as text or export it (unencrypted) to a third party app if available?",comment:"") - @objc static let chat_message_cant_open_file_in_app_dialog_export_button = NSLocalizedString("Export",comment:"") - // FROM ANDROID END - - - // Added in iOS - static let camera_required_for_video = NSLocalizedString("Camera use is not Authorized for &appName;. This permission is required to activate Video.",comment:"").replacingOccurrences(of: "&appName;", with: appName) - static let microphone_non_authorized_warning = NSLocalizedString("Warning : Microphone access is not Authorized for &appName;. To enable access, tap Settings and turn on Microphone, this will end your call",comment:"").replacingOccurrences(of: "&appName;", with: appName) - static let system_app_settings = NSLocalizedString("SETTINGS",comment:"") - static let conference_edit_error = NSLocalizedString("Unable to edit conference this time, date is invalid",comment:"") - static let ok = NSLocalizedString("ok",comment:"") - static let conference_info_confirm_removal_delete = NSLocalizedString("DELETE",comment:"") - static let conference_unable_to_share_via_calendar = NSLocalizedString("Unable to add event to calendar. Check permissions",comment:"") - static let screenshot_restrictions = NSLocalizedString("Can't take a screenshot due to app restrictions", comment: "") -} diff --git a/Classes/Swift/Voip/Theme/VoipTheme.swift b/Classes/Swift/Voip/Theme/VoipTheme.swift deleted file mode 100644 index 8b768f026..000000000 --- a/Classes/Swift/Voip/Theme/VoipTheme.swift +++ /dev/null @@ -1,456 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -@objc class VoipTheme : NSObject { // Names & values replicated from Android - - // Voip Colors - static let voip_gray_blue_color = UIColor(hex:"#798791") - static let voip_light_gray = UIColor(hex:"#D0D8DE") - @objc static let voip_dark_gray = UIColor(hex:"#4B5964") - @objc static let voip_gray = UIColor(hex:"#96A5B1") - static let voip_gray_background = UIColor(hex:"#AFAFAF") - static let voip_call_record_background = UIColor(hex:"#EBEBEB") - static let voip_calls_list_inactive_background = UIColor(hex:"#F0F1F2") - static let voip_translucent_popup_background = UIColor(hex:"#A64B5964") - static let voip_translucent_popup_alt_background = UIColor(hex:"#E64B5964") - static let voip_numpad_background = UIColor(hex:"#E4E4E4") - static let voip_contact_avatar_background_alt = UIColor(hex:"#AFAFAF") - static let voip_contact_avatar_calls_list = UIColor(hex:"#A1A1A1") - static let voip_conference_participant_paused_background = UIColor(hex:"#303030") - static let voip_drawable_color = UIColor(hex:"#A6B2BC") - static let voip_dark_color = UIColor(hex:"#252E35") - static let voip_dark_color2 = UIColor(hex:"#3F464B") - static let voip_dark_color3 = UIColor(hex:"#475663") - static let voip_dark_color4 = UIColor(hex:"#2D3841") - - // General colors (used by VoIP) - - @objc static let primary_color = UIColor(hex:"#ff5e00") - @objc static let primary_light_color = UIColor(hex:"#ffdfcc") - @objc static let gray_light_color = UIColor(hex:"#e1e1e1") - static let primary_dark_color = UIColor(hex:"#e65000") - static let green_color = UIColor(hex:"#96c11f") - static let dark_green_color = UIColor(hex:"#7d9f21") - @objc static let toolbar_color = UIColor(hex:"#e1e1e1") - static let form_field_gray_background = UIColor(hex:"#F7F7F7") - static let light_grey_color = UIColor(hex:"#c4c4c4") - static let header_background_color = UIColor(hex:"#f3f3f3") - static let dark_grey_color = UIColor(hex:"#444444") - static let voip_conference_invite_out = UIColor(hex:"ffeee5") - static let voip_conference_invite_in = header_background_color - static let voip_conference_updated = UIColor(hex:"#EFAE00") - static let voip_conference_cancelled_bg_color = UIColor(hex:"#FFE6E6") - static let voip_dark_color5 = UIColor(hex:"#353B3F") - - - - - // Light / Dark variations - static let voipBackgroundColor = LightDarkColor(voip_gray_blue_color,voip_dark_color) - @objc static let voipBackgroundBWColor = LightDarkColor(.white,voip_dark_color) - @objc static let backgroundWhiteBlack = LightDarkColor(.white,.black) - @objc static let backgroundBlackWhite = LightDarkColor(.black,.white) - static let voipParticipantBackgroundColor = LightDarkColor(voip_gray_background,voip_dark_color2) - static let voipParticipantMeBackgroundColor = LightDarkColor(voip_dark_color3,voip_dark_color3) - static let voipExtraButtonsBackgroundColor = LightDarkColor(voip_gray,voip_dark_color3) - @objc static let voipToolbarBackgroundColor = LightDarkColor(toolbar_color,voip_dark_color4) - static let voipDrawableColor = LightDarkColor(voip_dark_gray,.white) - static let voipDrawableColorHighlighted = LightDarkColor(voip_gray,voip_gray) - static let voipTextColor = LightDarkColor(voip_dark_gray,.white) - static let voipFormBackgroundColor = LightDarkColor(form_field_gray_background,voip_dark_color4) - static let voipFormFieldBackgroundColor = LightDarkColor(light_grey_color,voip_dark_color4) - static let voipFormDisabledFieldBackgroundColor = LightDarkColor(header_background_color,voip_dark_color4) - static let primarySubtextLightColor = LightDarkColor(light_grey_color,toolbar_color) - static let primaryTextColor = LightDarkColor(dark_grey_color,.white) - static let backgroundColor3 = LightDarkColor(voip_light_gray,voip_dark_color5) - static let backgroundColor4 = LightDarkColor(header_background_color,voip_dark_color5) - static let separatorColor = LightDarkColor(light_grey_color,.white) - static let chatBubbleBGColor = LightDarkColor(voip_light_gray, voip_dark_color5) - - // Text styles - static let fontName = "Roboto" - static let call_header_title = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .center, font: fontName+"-Bold", size: 18.0) - static let call_header_subtitle = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .center, font: fontName+"-Regular", size: 14.0) - static let call_generated_avatar_large = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: true, align: .center, font: fontName+"-Regular", size: 53.0) - static let call_generated_avatar_medium = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: true, align: .center, font: fontName+"-Regular", size: 27.0) - static let call_generated_avatar_small = TextStyle(fgColor: LightDarkColor(.white,voip_dark_gray), bgColor: LightDarkColor(.clear,.clear), allCaps: true, align: .center, font: fontName+"-Bold", size: 25.0) - - static let dtmf_label = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .center, font: fontName+"-Regular", size: 30.0) - static let call_remote_name = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Regular", size: 18.0) - static let call_remote_recording = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .center, font: fontName+"-Regular", size: 16.0) - static let call_or_conference_title = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .center, font: fontName+"-Bold", size: 30.0) - static let call_or_conference_subtitle = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .center, font: fontName+"-Bold", size: 20.0) - static let basic_popup_title = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .center, font: fontName+"-Regular", size: 21.0) - static let form_button_bold = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: true, align: .center, font: fontName+"-Bold", size: 17.0) - static let form_button_light = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: true, align: .center, font: fontName+"-Regular", size: 17.0) - - static let call_display_name_duration = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Regular", size: 17.0) - static let call_sip_address = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Regular", size: 14.0) - static let voip_extra_button = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .center, font: fontName+"-Regular", size: 12.0) - static let unread_count_font = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .center, font: fontName+"-Regular", size: 11.0) - static let call_stats_font = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .center, font: fontName+"-Regular", size: 12.0) - static let call_stats_font_title = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .center, font: fontName+"-Regular", size: 18.0) - static let calls_list_header_font = TextStyle(fgColor: voipTextColor, bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .center, font: fontName+"-Regular", size: 20.0) - static let navigation_header_font = TextStyle(fgColor: LightDarkColor(primary_color,primary_color), bgColor: LightDarkColor(.clear,.clear), allCaps: true, align: .center, font: fontName+"-Bold", size: 27.0) - - static let call_list_active_name_font = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .center, font: fontName+"-Regular", size: 18.0) - static let call_list_active_sip_uri_font = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .center, font: fontName+"-Regular", size: 12.0) - - static let call_list_name_font = TextStyle(fgColor: voipTextColor, bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .center, font: fontName+"-Regular", size: 18.0) - static let call_list_sip_uri_font = TextStyle(fgColor: voipTextColor, bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .center, font: fontName+"-Regular", size: 12.0) - - static let call_context_menu_item_font = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: true, align: .left, font: fontName+"-Bold", size: 16.0) - - - static let conference_participant_admin_label = TextStyle(fgColor: primarySubtextLightColor, bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Bold", size: 13.0) - static let conference_participant_name_font = TextStyle(fgColor: LightDarkColor(dark_grey_color,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Regular", size: 18.0) - static let conference_participant_sip_uri_font = TextStyle(fgColor: LightDarkColor(primary_color,primary_color), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Regular", size: 12.0) - static let conference_participant_name_font_grid = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Bold", size: 15.0) - static let conference_participant_name_font_as = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Bold", size: 12.0) - static let conference_participant_name_font_audio_only = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName, size: 14.0) - - static let conference_mode_title = TextStyle(fgColor: LightDarkColor(dark_grey_color,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Regular", size: 17.0) - static let conference_mode_title_selected = conference_mode_title.boldEd() - static let conference_scheduling_font = TextStyle(fgColor: voipTextColor, bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Regular", size: 17.0) - static let conference_invite_participant_title_font = TextStyle(fgColor: LightDarkColor(dark_grey_color,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Bold", size: 14.0) - static let conference_invite_desc_font = TextStyle(fgColor: LightDarkColor(dark_grey_color,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Regular", size: 14.0) - static let conference_invite_desc_title_font = TextStyle(fgColor: LightDarkColor(voip_dark_gray,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Bold", size: 14.0) - static let conference_invite_subject_font = TextStyle(fgColor: LightDarkColor(voip_dark_gray,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Bold", size: 14.0) - static let conference_invite_title_font = TextStyle(fgColor: LightDarkColor(dark_grey_color,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Bold", size: 16.0) - static let conference_cancelled_title_font = TextStyle(fgColor: LightDarkColor(.red,.red), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Bold", size: 16.0) - static let conference_updated_title_font = TextStyle(fgColor: LightDarkColor(voip_conference_updated,voip_conference_updated), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Bold", size: 16.0) - - static let conference_preview_subject_font = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Regular", size: 24.0) - static let conference_waiting_room_no_video_font = TextStyle(fgColor: LightDarkColor(.white,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .center, font: fontName+"-Regular", size: 16.0) - - static let empty_list_font = TextStyle(fgColor: primaryTextColor, bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .center, font: fontName+"-Regular", size: 18.0) - static let conf_list_filter_button_font = TextStyle(fgColor: LightDarkColor(.black,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .center, font: fontName+"-Regular", size: 14.0) - static let conference_list_subject_font = TextStyle(fgColor: LightDarkColor(voip_dark_gray,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Bold", size: 18.0) - static let conference_list_address_desc_font = TextStyle(fgColor: LightDarkColor(voip_dark_gray,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Regular", size: 18.0) - - static let chat_conversation_title = TextStyle(fgColor: LightDarkColor(voip_dark_gray,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Regular", size: 22.0) - static let chat_conversation_participants = TextStyle(fgColor: LightDarkColor(voip_dark_gray,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Regular", size: 14.0) - static let chat_conversation_is_composing_text = TextStyle(fgColor: LightDarkColor(voip_dark_gray,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Regular", size: 16.0) - static let chat_conversation_operation_in_progress_wait = TextStyle(fgColor: LightDarkColor(primary_color,primary_color), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .center, font: fontName+"-Bold", size: 18.0) - static let chat_conversation_reply_label = TextStyle(fgColor: LightDarkColor(voip_dark_gray,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Bold", size: 14.0) - static let chat_conversation_reply_content = TextStyle(fgColor: LightDarkColor(voip_dark_gray,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Regular", size: 14.0) - static let chat_conversation_recording_duration = TextStyle(fgColor: LightDarkColor(voip_dark_gray, voip_dark_gray), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Regular", size: 18.0) - static let chat_conversation_forward_label = TextStyle(fgColor: LightDarkColor(voip_dark_gray,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Regular", size: 12.0) - static let chat_conversation_black_text = TextStyle(fgColor: LightDarkColor(.black,.black), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .left, font: fontName+"-Regular", size: 12.0) - - static let chat_conversation_download_button = TextStyle(fgColor: LightDarkColor(voip_dark_gray,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .center, font: fontName+"-Regular", size: 14.0) - static let chat_conversation_download_progress_text = TextStyle(fgColor: LightDarkColor(voip_dark_gray,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: false, align: .center, font: fontName+"-Regular", size: 12.0) - static let chat_conversation_avatar_small = TextStyle(fgColor: LightDarkColor(.white,voip_dark_gray), bgColor: LightDarkColor(.clear,.clear), allCaps: true, align: .center, font: fontName+"-Bold", size: 14.0) - static let chat_conversation_contact_date = TextStyle(fgColor: LightDarkColor(voip_dark_gray,.white), bgColor: LightDarkColor(.clear,.clear), allCaps: true, align: .left, font: fontName+"-Bold", size: 12.0) - static let chat_conversation_ephemeral_timer = TextStyle(fgColor: LightDarkColor(.orange,.orange), bgColor: LightDarkColor(.clear,.clear), allCaps: true, align: .left, font: fontName+"-Bold", size: 8.0) - - // Buttons Background (State colors) - - static let button_background = [ - UIButton.State.normal.rawValue : LightDarkColor(voip_gray,voip_gray), - UIButton.State.highlighted.rawValue : LightDarkColor(voip_dark_gray,voip_dark_gray), - UIButton.State.selected.union(.highlighted).rawValue : LightDarkColor(voip_dark_gray,voip_dark_gray), - UIButton.State.disabled.rawValue : LightDarkColor(voip_light_gray,voip_light_gray) - ] - - static let button_background_reverse = [ - UIButton.State.normal.rawValue : LightDarkColor(voip_dark_gray,voip_dark_gray), - UIButton.State.highlighted.rawValue : LightDarkColor(voip_gray,voip_gray), - UIButton.State.selected.union(.highlighted).rawValue : LightDarkColor(voip_gray,voip_gray), - UIButton.State.disabled.rawValue : LightDarkColor(voip_light_gray,voip_light_gray) - ] - - static let button_call_recording_background = [ - UIButton.State.normal.rawValue : LightDarkColor(voip_call_record_background,voip_call_record_background), - UIButton.State.selected.rawValue : LightDarkColor(primary_color,primary_color), - UIButton.State.disabled.rawValue : LightDarkColor(voip_light_gray,voip_light_gray) - ] - - static let button_toggle_background = [ - UIButton.State.normal.rawValue : LightDarkColor(voip_gray,voip_gray), - UIButton.State.selected.rawValue : LightDarkColor(primary_color,primary_color), - UIButton.State.highlighted.rawValue : LightDarkColor(voip_dark_gray,voip_dark_gray), - UIButton.State.disabled.rawValue : LightDarkColor(voip_light_gray,voip_light_gray) - ] - - static let button_toggle_background_reverse = [ - UIButton.State.normal.rawValue : LightDarkColor(voip_dark_gray,voip_dark_gray), - UIButton.State.selected.rawValue : LightDarkColor(primary_color,primary_color), - UIButton.State.highlighted.rawValue : LightDarkColor(voip_gray,voip_gray), - UIButton.State.disabled.rawValue : LightDarkColor(voip_light_gray,voip_light_gray) - ] - - static let primary_colors_background = [ - UIButton.State.normal.rawValue : LightDarkColor(primary_color,primary_color), - UIButton.State.highlighted.rawValue : LightDarkColor(primary_dark_color,primary_dark_color), - ] - - static let button_green_background = [ - UIButton.State.normal.rawValue : LightDarkColor(green_color,green_color), - UIButton.State.highlighted.rawValue : LightDarkColor(primary_color,primary_color), - ] - - static let primary_colors_background_gray = [ - UIButton.State.normal.rawValue : LightDarkColor(voip_gray,voip_gray), - UIButton.State.highlighted.rawValue : LightDarkColor(voip_dark_gray,voip_dark_gray), - ] - - static let numpad_digit_background = [ - UIButton.State.normal.rawValue : LightDarkColor(voip_numpad_background,voip_numpad_background), - UIButton.State.highlighted.rawValue : LightDarkColor(voip_gray_blue_color,voip_gray_blue_color) - ] - - static let button_round_background = [ - UIButton.State.normal.rawValue : LightDarkColor(primary_color,primary_color), - UIButton.State.highlighted.rawValue : LightDarkColor(dark_grey_color,dark_grey_color), - UIButton.State.disabled.rawValue : LightDarkColor(voip_light_gray,voip_light_gray) - ] - - static let button_call_context_menu_background = [ - UIButton.State.normal.rawValue : LightDarkColor(voip_gray,voip_gray), - UIButton.State.highlighted.rawValue : LightDarkColor(primary_color,primary_color), - ] - - static let button_conference_list_filter = [ - UIButton.State.normal.rawValue : LightDarkColor(light_grey_color,dark_grey_color), - UIButton.State.selected.rawValue : LightDarkColor(primary_color.withAlphaComponent(0.24),primary_color.withAlphaComponent(0.24)), - ] - - // Buttons Icons (State colors) + Background colors - - static let call_terminate = ButtonTheme( - tintableStateIcons:[UIButton.State.normal.rawValue : TintableIcon(name: "voip_hangup",tintColor: LightDarkColor(.white,.white))], - backgroundStateColors: [ - UIButton.State.normal.rawValue : LightDarkColor(primary_color,primary_color), - UIButton.State.highlighted.rawValue : LightDarkColor(primary_dark_color,primary_dark_color) - ]) - - static let call_record = ButtonTheme( - tintableStateIcons:[ - UIButton.State.normal.rawValue : TintableIcon(name: "voip_call_record",tintColor: LightDarkColor(.white,.white)), - ], - backgroundStateColors: button_toggle_background) - - static let call_pause = ButtonTheme( - tintableStateIcons:[ - UIButton.State.normal.rawValue : TintableIcon(name: "voip_pause",tintColor: LightDarkColor(.white,.white)), - ], - backgroundStateColors: button_toggle_background) - - static let call_accept = ButtonTheme( - tintableStateIcons:[UIButton.State.normal.rawValue : TintableIcon(name: "voip_call",tintColor: LightDarkColor(.white,.white))], - backgroundStateColors: [ - UIButton.State.normal.rawValue : LightDarkColor(green_color,green_color), - UIButton.State.highlighted.rawValue : LightDarkColor(dark_green_color,dark_green_color) - ]) - - static let call_mute = ButtonTheme( - tintableStateIcons:[ - UIButton.State.normal.rawValue : TintableIcon(name: "voip_micro_on",tintColor: LightDarkColor(.white,.white)), - UIButton.State.selected.rawValue : TintableIcon(name: "voip_micro_off",tintColor: LightDarkColor(.white,.white)), - ], - backgroundStateColors: button_background_reverse) - - static let call_speaker = ButtonTheme( - tintableStateIcons:[ - UIButton.State.normal.rawValue : TintableIcon(name: "voip_speaker_off",tintColor: LightDarkColor(.white,.white)), - UIButton.State.selected.rawValue : TintableIcon(name: "voip_speaker_on",tintColor: LightDarkColor(.white,.white)), - ], - backgroundStateColors: button_background_reverse) - - static let call_audio_route = ButtonTheme( - tintableStateIcons:[ - UIButton.State.normal.rawValue : TintableIcon(name: "voip_audio_routes",tintColor: LightDarkColor(.white,.white)), - ], - backgroundStateColors: button_toggle_background_reverse) - - - static let call_video = ButtonTheme( - tintableStateIcons:[ - UIButton.State.normal.rawValue : TintableIcon(name: "voip_camera_off",tintColor: LightDarkColor(.white,.white)), - UIButton.State.selected.rawValue : TintableIcon(name: "voip_camera_on",tintColor: LightDarkColor(.white,.white)), - ], - backgroundStateColors: button_background_reverse) - - static let call_numpad = ButtonTheme( - tintableStateIcons:[ - UIButton.State.normal.rawValue : TintableIcon(name: "voip_call_numpad",tintColor: LightDarkColor(.white,.white)), - UIButton.State.highlighted.rawValue : TintableIcon(name: "voip_call_numpad",tintColor: LightDarkColor(voip_dark_gray,voip_dark_gray)), - UIButton.State.disabled.rawValue : TintableIcon(name: "voip_call_numpad",tintColor: LightDarkColor(voip_light_gray,voip_light_gray)), - ], - backgroundStateColors: button_background) - - // Waiting room layout picker - - static let conf_waiting_room_layout_picker = ButtonTheme( - tintableStateIcons:[:], - backgroundStateColors: button_toggle_background_reverse) - - // AUuio routes - - static let route_bluetooth = ButtonTheme( - tintableStateIcons:[ - UIButton.State.normal.rawValue : TintableIcon(name: "voip_bluetooth",tintColor: LightDarkColor(.white,.white)), - ], - backgroundStateColors: button_toggle_background_reverse) - - static let route_earpiece = ButtonTheme( - tintableStateIcons:[ - UIButton.State.normal.rawValue : TintableIcon(name: "voip_earpiece",tintColor: LightDarkColor(.white,.white)), - ], - backgroundStateColors: button_toggle_background_reverse) - - static let route_speaker = ButtonTheme( - tintableStateIcons:[ - UIButton.State.normal.rawValue : TintableIcon(name: "voip_speaker_on",tintColor: LightDarkColor(.white,.white)), - ], - backgroundStateColors: button_toggle_background_reverse) - - - - static let call_more = ButtonTheme( - tintableStateIcons:[ - UIButton.State.normal.rawValue : TintableIcon(name: "voip_call_more",tintColor: LightDarkColor(.white,.white)) - ], - backgroundStateColors: button_background) - - - static let voip_cancel = ButtonTheme( - tintableStateIcons:[ - UIButton.State.normal.rawValue : TintableIcon(name: "voip_cancel",tintColor: voipDrawableColor), - UIButton.State.highlighted.rawValue : TintableIcon(name: "voip_cancel",tintColor: voipDrawableColorHighlighted) - ], - backgroundStateColors: [UIButton.State.normal.rawValue : LightDarkColor(.clear,.clear)]) - - - static let voip_cancel_light = ButtonTheme( - tintableStateIcons:[ - UIButton.State.normal.rawValue : TintableIcon(name: "voip_cancel",tintColor: LightDarkColor(voip_gray,voip_gray)), - UIButton.State.highlighted.rawValue : TintableIcon(name: "voip_cancel",tintColor: LightDarkColor(voip_dark_gray,voip_dark_gray)) - ], - backgroundStateColors: [UIButton.State.normal.rawValue : LightDarkColor(.clear,.clear)]) - - static let voip_edit = ButtonTheme( - tintableStateIcons:[ - UIButton.State.normal.rawValue : TintableIcon(name: "voip_edit",tintColor: LightDarkColor(dark_grey_color,.white)), - UIButton.State.highlighted.rawValue : TintableIcon(name: "voip_edit",tintColor: voipDrawableColorHighlighted) - ], - backgroundStateColors: [UIButton.State.normal.rawValue : LightDarkColor(.clear,.clear)]) - - static let radio_button = ButtonTheme( - tintableStateIcons:[ - UIButton.State.normal.rawValue : TintableIcon(name: "voip_radio_off",tintColor: LightDarkColor(dark_grey_color,.white)), - UIButton.State.selected.rawValue : TintableIcon(name: "voip_radio_on",tintColor: LightDarkColor(primary_color,primary_color)) - ], - backgroundStateColors: [UIButton.State.normal.rawValue : LightDarkColor(.clear,.clear)]) - - static let voip_call_list_active_menu = ButtonTheme( - tintableStateIcons:[ - UIButton.State.normal.rawValue : TintableIcon(name: "voip_call_list_menu",tintColor: LightDarkColor(.white,.white)), - UIButton.State.highlighted.rawValue : TintableIcon(name: "voip_call_list_menu",tintColor: voipDrawableColorHighlighted) - ], - backgroundStateColors: [UIButton.State.normal.rawValue : LightDarkColor(.clear,.clear)]) - - static let voip_call_list_menu = ButtonTheme( - tintableStateIcons:[ - UIButton.State.normal.rawValue : TintableIcon(name: "voip_call_list_menu",tintColor: voipTextColor), - UIButton.State.highlighted.rawValue : TintableIcon(name: "voip_call_list_menu",tintColor: voipDrawableColorHighlighted) - ], - backgroundStateColors: [UIButton.State.normal.rawValue : LightDarkColor(.clear,.clear)]) - - - static func call_action(_ iconName:String) -> ButtonTheme { - return ButtonTheme( - tintableStateIcons:[ - UIButton.State.normal.rawValue : TintableIcon(name: iconName,tintColor: LightDarkColor(.white,.white)), - UIButton.State.highlighted.rawValue : TintableIcon(name: iconName,tintColor: LightDarkColor(voip_dark_gray,voip_dark_gray)), - UIButton.State.disabled.rawValue : TintableIcon(name: iconName,tintColor: LightDarkColor(voip_light_gray,voip_light_gray)), - ], - backgroundStateColors: [:]) - } - - static let call_add = ButtonTheme( - tintableStateIcons:[UIButton.State.normal.rawValue : TintableIcon(name: "voip_call_add",tintColor: LightDarkColor(.white,.white))], - backgroundStateColors: button_round_background) - - static let call_merge = ButtonTheme( - tintableStateIcons:[UIButton.State.normal.rawValue : TintableIcon(name: "voip_merge_calls",tintColor: LightDarkColor(.white,.white))], - backgroundStateColors: button_round_background) - - // Navigation - - static func nav_button(_ iconName:String) -> ButtonTheme { - return ButtonTheme( - tintableStateIcons:[ - UIButton.State.normal.rawValue : TintableIcon(name: iconName,tintColor: LightDarkColor(voip_dark_gray,.white)), - UIButton.State.highlighted.rawValue : TintableIcon(name: iconName,tintColor: LightDarkColor(primary_color,primary_color)), - UIButton.State.disabled.rawValue : TintableIcon(name: iconName,tintColor: LightDarkColor(light_grey_color,.white)), - ], - backgroundStateColors: [:]) - } - - static func nav_color_button(_ iconName:String) -> ButtonTheme { - return ButtonTheme( - tintableStateIcons:[ - UIButton.State.normal.rawValue : TintableIcon(name: iconName), - UIButton.State.highlighted.rawValue : TintableIcon(name: iconName,tintColor: LightDarkColor(primary_color,primary_color)), - UIButton.State.disabled.rawValue : TintableIcon(name: iconName,tintColor: LightDarkColor(light_grey_color,.white)), - ], - backgroundStateColors: [:]) - } - - // Conference scheduling - static func scheduled_conference_action(_ iconName:String) -> ButtonTheme { - return ButtonTheme( - tintableStateIcons:[UIButton.State.normal.rawValue : TintableIcon(name: iconName,tintColor: LightDarkColor(.white,.white))], - backgroundStateColors: button_background) - } - - static let conference_info_button = [ - UIButton.State.normal.rawValue : TintableIcon(name: "voip_info",tintColor: LightDarkColor(voip_drawable_color,voip_drawable_color)), - UIButton.State.selected.rawValue : TintableIcon(name: "voip_info",tintColor: LightDarkColor(primary_color,primary_color)), - ] - - static let conference_create_button = [ - UIButton.State.normal.rawValue : TintableIcon(name: "voip_conference_new",tintColor: LightDarkColor(.darkGray,.white)), - UIButton.State.highlighted.rawValue : TintableIcon(name: "voip_conference_new",tintColor: LightDarkColor(primary_color,primary_color)), - UIButton.State.disabled.rawValue : TintableIcon(name: "voip_conference_new",tintColor: LightDarkColor(voip_light_gray,voip_light_gray)), - ] - - static let generic_delete_button = [ - UIButton.State.normal.rawValue : TintableIcon(name: "delete_default",tintColor: LightDarkColor(.darkGray,.white)), - UIButton.State.highlighted.rawValue : TintableIcon(name: "delete_default",tintColor: LightDarkColor(primary_color,primary_color)), - UIButton.State.disabled.rawValue : TintableIcon(name: "delete_disabled",tintColor: LightDarkColor(voip_light_gray,.white)), - ] - - static let generic_back = [ - UIButton.State.normal.rawValue : TintableIcon(name: "back_default",tintColor: LightDarkColor(.darkGray,.white)), - UIButton.State.highlighted.rawValue : TintableIcon(name: "back_default",tintColor: LightDarkColor(primary_color,primary_color)), - UIButton.State.disabled.rawValue : TintableIcon(name: "back_default",tintColor: LightDarkColor(voip_light_gray,voip_light_gray)), - ] - - static let generic_cancel = [ - UIButton.State.normal.rawValue : TintableIcon(name: "cancel_edit_default",tintColor: LightDarkColor(.darkGray,.white)), - ] -} - - diff --git a/Classes/Swift/Voip/ViewModels/CallData.swift b/Classes/Swift/Voip/ViewModels/CallData.swift deleted file mode 100644 index 628b9a89d..000000000 --- a/Classes/Swift/Voip/ViewModels/CallData.swift +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linhome - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import linphonesw -import Foundation - -class CallData { - - var call : Call - let address :String? - - let isPaused = MutableLiveData() - let isRemotelyPaused = MutableLiveData() - let canBePaused = MutableLiveData() - let isRecording = MutableLiveData() - let isRemotelyRecorded = MutableLiveData() - let isInRemoteConference = MutableLiveData() - let remoteConferenceSubject = MutableLiveData() - let isConferenceCall = MediatorLiveData() - let conferenceParticipants = MutableLiveData<[Address]>() - let conferenceParticipantsCountLabel = MutableLiveData() - let callKitConferenceLabel = MutableLiveData() - - let isOutgoing = MutableLiveData() - let isIncoming = MutableLiveData() - let callState = MutableLiveData() - let iFrameReceived = MutableLiveData(false) - let outgoingEarlyMedia = MutableLiveData() - let enteredDTMF = MutableLiveData("") - - var chatRoom: ChatRoom? = nil - - private var callDelegate : CallDelegateStub? - - init (call:Call) { - self.call = call - address = call.remoteAddress?.asStringUriOnly() - callDelegate = CallDelegateStub( - onStateChanged : { (call: linphonesw.Call, state: linphonesw.Call.State, message: String) -> Void in - self.update() - }, - onNextVideoFrameDecoded : { (call: linphonesw.Call) -> Void in - self.iFrameReceived.value = true - }, - onRemoteRecording: { (call: linphonesw.Call, recording:Bool) -> Void in - self.isRemotelyRecorded.value = recording - } - ) - call.addDelegate(delegate: callDelegate!) - - remoteConferenceSubject.readCurrentAndObserve { _ in - self.isConferenceCall.value = self.remoteConferenceSubject.value?.count ?? 0 > 0 || self.conferenceParticipants.value?.count ?? 0 > 0 - } - conferenceParticipants.readCurrentAndObserve { _ in - self.isConferenceCall.value = self.remoteConferenceSubject.value?.count ?? 0 > 0 || self.conferenceParticipants.value?.count ?? 0 > 0 - } - - update() - } - - - private func isCallPaused() -> Bool { - return [Call.State.Paused, Call.State.Pausing].contains(call.state) - } - - private func isCallRemotelyPaused() -> Bool { - return [Call.State.PausedByRemote].contains(call.state) - } - - private func isOutGoing() -> Bool { - return [Call.State.OutgoingInit, Call.State.OutgoingEarlyMedia, Call.State.OutgoingProgress, Call.State.OutgoingRinging].contains(call.state) - } - - private func isInComing() -> Bool { - return [Call.State.IncomingReceived, Call.State.IncomingEarlyMedia].contains(call.state) - } - - private func canCallBePaused() -> Bool { - return !call.mediaInProgress() && [Call.State.StreamsRunning, Call.State.PausedByRemote].contains(call.state) - } - - private func update() { - isPaused.value = isCallPaused() - isRemotelyPaused.value = isCallRemotelyPaused() - canBePaused.value = canCallBePaused() - - updateConferenceInfo() - - let outgoing = isOutGoing() - if (outgoing != isOutgoing.value) { - isOutgoing.value = outgoing - } - let incoming = isInComing() - if (incoming != isIncoming.value) { - isIncoming.value = incoming - } - - if (call.mediaInProgress()) { - DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1)) { - self.update() - } - } - outgoingEarlyMedia.value = callState.value == .OutgoingEarlyMedia - isRecording.value = call.params?.isRecording - callState.value = call.state - } - - private func updateConferenceInfo() { - let conference = call.conference - isInRemoteConference.value = conference != nil - if (conference != nil) { - Log.d("[Call] Found conference attached to call") - remoteConferenceSubject.value = ConferenceViewModel.getConferenceSubject(conference: conference!) - Log.d("[Call] Found conference related to this call with subject \(remoteConferenceSubject.value)") - var participantsList:[Address] = [] - conference?.participantList.forEach { - $0.address.map {participantsList.append($0)} - } - conferenceParticipants.value = participantsList - conferenceParticipantsCountLabel.value = VoipTexts.conference_participants_title.replacingOccurrences(of:"%d",with:String(participantsList.count)) - } else { - if let conferenceAddress = getConferenceAddress(call: call), let conferenceInfo = Core.get().findConferenceInformationFromUri(uri:conferenceAddress) { - Log.d("[Call] Found matching conference info with subject: \(conferenceInfo.subject)") - remoteConferenceSubject.value = conferenceInfo.subject - var participantsList:[Address] = [] - conferenceInfo.participants.forEach { - participantsList.append($0) - } - // Add organizer if not in participants list - if let organizer = conferenceInfo.organizer { - if (participantsList.filter { $0.weakEqual(address2: organizer) }.first == nil) { - participantsList.insert(organizer, at:0) - } - conferenceParticipants.value = participantsList - conferenceParticipantsCountLabel.value = VoipTexts.conference_participants_title.replacingOccurrences(of:"%d",with:String(participantsList.count)) - } - } - } - } - - func getConferenceAddress(call: Call) -> Address? { - let remoteContact = call.remoteContact - return call.dir == .Incoming ? (remoteContact != nil ? Core.get().interpretUrl(url: remoteContact!, applyInternationalPrefix: CallManager.instance().applyInternationalPrefix()) : nil) : call.remoteAddress - } - - func sendDTMF(dtmf:String) { - enteredDTMF.value = enteredDTMF.value! + dtmf - Core.get().playDtmf(dtmf: dtmf.utf8CString[0], durationMs: 1000) - try?call.sendDtmf(dtmf: dtmf.utf8CString[0]) - } - - func destroy() { - call.removeDelegate(delegate: callDelegate!) - isPaused.clearObservers() - isRemotelyPaused.clearObservers() - canBePaused.clearObservers() - isRecording.clearObservers() - isRemotelyRecorded.clearObservers() - isInRemoteConference.clearObservers() - remoteConferenceSubject.clearObservers() - isOutgoing.clearObservers() - isIncoming.clearObservers() - callState.clearObservers() - iFrameReceived.clearObservers() - outgoingEarlyMedia.clearObservers() - enteredDTMF.clearObservers() - } - - func toggleRecord() { - if (call.params?.isRecording == true) { - call.stopRecording() - } else { - call.startRecording() - } - isRecording.value = call.params?.isRecording - } - - func togglePause() { - if (isCallPaused()) { - CallsViewModel.shared.callsData.value?.forEach { - if ($0.canCallBePaused()) { - CallManager.instance().setHeld(call: $0.call, hold: true) - } - } - CallManager.instance().setHeld(call: call, hold: false) - } else { - CallManager.instance().setHeld(call: call, hold: true) - } - isPaused.value = isCallPaused() - } - - func isOngoingSingleCall() -> Bool { - return !isOutGoing() && !isInComing() && call.conference == nil && call.callLog?.wasConference() != true - } - - func isOngoingConference() -> Bool { - return !isOutGoing() && !isInComing() && (call.conference != nil || call.callLog?.wasConference() == true) - } - - -} diff --git a/Classes/Swift/Voip/ViewModels/CallStatisticsData.swift b/Classes/Swift/Voip/ViewModels/CallStatisticsData.swift deleted file mode 100644 index 8fe0aa416..000000000 --- a/Classes/Swift/Voip/ViewModels/CallStatisticsData.swift +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Copyright (c) 2010-2021 Belledonne Communications SARL. - * - * This file is part of linphone-android - * (see https://www.linphone.org). - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import linphonesw - -class CallStatisticsData { - - var call : Call - var audioStats:[StatItemData] = [] - var videoStats:[StatItemData] = [] - let isVideoEnabled = MutableLiveData() - let statsUpdated = MutableLiveData(true) - - private var callDelegate : CallDelegateStub? - - init (call:Call) { - self.call = call - callDelegate = CallDelegateStub( - onStatsUpdated : { (call: Call, stats: CallStats) -> Void in - self.isVideoEnabled.value = self.videoStatsAvailable(call) - self.updateCallStats(stats: stats) - self.statsUpdated.value = true - } - ) - call.addDelegate(delegate: callDelegate!) - initCallStats() - isVideoEnabled.value = videoStatsAvailable(call) - call.audioStats.map { updateCallStats(stats: $0) } - call.videoStats.map { updateCallStats(stats: $0) } - } - - private func videoStatsAvailable(_ call:Call) -> Bool { - return call.conference != nil ? call.params?.videoDirection == .SendRecv : call.currentParams?.videoEnabled == true - } - - private func initCallStats() { - - audioStats.append(StatItemData(type: StatType.CAPTURE)) - audioStats.append(StatItemData(type: StatType.PLAYBACK)) - audioStats.append(StatItemData(type: StatType.PAYLOAD)) - audioStats.append(StatItemData(type: StatType.ENCODER)) - audioStats.append(StatItemData(type: StatType.DECODER)) - audioStats.append(StatItemData(type: StatType.DOWNLOAD_BW)) - audioStats.append(StatItemData(type: StatType.UPLOAD_BW)) - audioStats.append(StatItemData(type: StatType.ICE)) - audioStats.append(StatItemData(type: StatType.IP_FAM)) - audioStats.append(StatItemData(type: StatType.SENDER_LOSS)) - audioStats.append(StatItemData(type: StatType.RECEIVER_LOSS)) - audioStats.append(StatItemData(type: StatType.JITTER)) - - videoStats.append(StatItemData(type: StatType.CAPTURE)) - videoStats.append(StatItemData(type: StatType.PLAYBACK)) - videoStats.append(StatItemData(type: StatType.PAYLOAD)) - videoStats.append(StatItemData(type: StatType.ENCODER)) - videoStats.append(StatItemData(type: StatType.DECODER)) - videoStats.append(StatItemData(type: StatType.DOWNLOAD_BW)) - videoStats.append(StatItemData(type: StatType.UPLOAD_BW)) - videoStats.append(StatItemData(type: StatType.ESTIMATED_AVAILABLE_DOWNLOAD_BW)) - videoStats.append(StatItemData(type: StatType.ICE)) - videoStats.append(StatItemData(type: StatType.IP_FAM)) - videoStats.append(StatItemData(type: StatType.SENDER_LOSS)) - videoStats.append(StatItemData(type: StatType.RECEIVER_LOSS)) - videoStats.append(StatItemData(type: StatType.SENT_RESOLUTION)) - videoStats.append(StatItemData(type: StatType.RECEIVED_RESOLUTION)) - videoStats.append(StatItemData(type: StatType.SENT_FPS)) - videoStats.append(StatItemData(type: StatType.RECEIVED_FPS)) - } - - private func updateCallStats(stats: CallStats) { - if (stats.type == StreamType.Audio) { - audioStats.forEach{ $0.update(call: call, stats: stats)} - } else if (stats.type == StreamType.Video) { - videoStats.forEach{ $0.update(call: call, stats: stats)} - } - } -} - - -enum StatType { - case CAPTURE - case PLAYBACK - case PAYLOAD - case ENCODER - case DECODER - case DOWNLOAD_BW - case UPLOAD_BW - case ICE - case IP_FAM - case SENDER_LOSS - case RECEIVER_LOSS - case JITTER - case SENT_RESOLUTION - case RECEIVED_RESOLUTION - case SENT_FPS - case RECEIVED_FPS - case ESTIMATED_AVAILABLE_DOWNLOAD_BW -} - -struct StatItemData { - var type:StatType - - let value = MutableLiveData() - - func update(call: Call, stats: CallStats) { - guard let payloadType = stats.type == StreamType.Audio ? call.currentParams?.usedAudioPayloadType : call.currentParams?.usedVideoPayloadType, let core = call.core else { - value.value = "n/a" - return - } - switch(type) { - case StatType.CAPTURE: value.value = stats.type == StreamType.Audio ? core.captureDevice : core.videoDevice - case StatType.PLAYBACK: value.value = stats.type == StreamType.Audio ? core.playbackDevice : core.videoDisplayFilter - case StatType.PAYLOAD: value.value = "\(payloadType.mimeType)/\(payloadType.clockRate / 1000) kHz" - case StatType.ENCODER: value.value = payloadType.description - case StatType.DECODER: value.value = payloadType.description - case StatType.DOWNLOAD_BW: value.value = "\(stats.downloadBandwidth) kbits/s" - case StatType.UPLOAD_BW: value.value = "\(stats.uploadBandwidth) kbits/s" - case StatType.ICE: value.value = stats.iceState.toString() - case StatType.IP_FAM: value.value = stats.ipFamilyOfRemote == Address.Family.Inet6 ? "IPv6" : "IPv4" - case StatType.SENDER_LOSS: value.value = String(format: "%.2f%",stats.senderLossRate) - case StatType.RECEIVER_LOSS: value.value = String(format: "%.2f%",stats.receiverLossRate) - case StatType.JITTER: value.value = String(format: "%.2f ms",stats.jitterBufferSizeMs) - case StatType.SENT_RESOLUTION: value.value = call.currentParams?.sentVideoDefinition?.name - case StatType.RECEIVED_RESOLUTION: value.value = call.currentParams?.receivedVideoDefinition?.name - case StatType.SENT_FPS: value.value = "\(call.currentParams?.sentFramerate ?? 0.0)" - case StatType.RECEIVED_FPS: value.value = "\(call.currentParams?.receivedFramerate ?? 0.0)" - case StatType.ESTIMATED_AVAILABLE_DOWNLOAD_BW: value.value = "\(stats.estimatedDownloadBandwidth) kbit/s" - } - } - - - func getTypeTitle() -> String { - switch (type) { - case .CAPTURE: return VoipTexts.call_stats_capture_filter - case .PLAYBACK: return VoipTexts.call_stats_player_filter - case .PAYLOAD: return VoipTexts.call_stats_codec - case .ENCODER: return VoipTexts.call_stats_encoder_name - case .DECODER: return VoipTexts.call_stats_decoder_name - case .DOWNLOAD_BW: return VoipTexts.call_stats_download - case .UPLOAD_BW: return VoipTexts.call_stats_upload - case .ICE: return VoipTexts.call_stats_ice - case .IP_FAM: return VoipTexts.call_stats_ip - case .SENDER_LOSS: return VoipTexts.call_stats_sender_loss_rate - case .RECEIVER_LOSS: return VoipTexts.call_stats_receiver_loss_rate - case .JITTER: return VoipTexts.call_stats_jitter_buffer - case .SENT_RESOLUTION: return VoipTexts.call_stats_video_resolution_sent - case .RECEIVED_RESOLUTION: return VoipTexts.call_stats_video_resolution_received - case .SENT_FPS: return VoipTexts.call_stats_video_fps_sent - case .RECEIVED_FPS: return VoipTexts.call_stats_video_fps_received - case .ESTIMATED_AVAILABLE_DOWNLOAD_BW: return VoipTexts.call_stats_estimated_download - } - } - - - - - -} diff --git a/Classes/Swift/Voip/ViewModels/CallsViewModel.swift b/Classes/Swift/Voip/ViewModels/CallsViewModel.swift deleted file mode 100644 index a62613b1b..000000000 --- a/Classes/Swift/Voip/ViewModels/CallsViewModel.swift +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linhome - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import Foundation -import linphonesw -import AVFoundation - - -class CallsViewModel { - - let currentCallData = MutableLiveData(nil) - let callsData = MutableLiveData<[CallData]>([]) - let inactiveCallsCount = MutableLiveData(0) - let currentCallUnreadChatMessageCount = MutableLiveData(0) - let chatAndCallsCount = MutableLiveData(0) - let callConnectedEvent = MutableLiveData() - let callUpdateEvent = MutableLiveData() - let noMoreCallEvent = MutableLiveData(false) - - static let shared = CallsViewModel() - - private var coreDelegate : CoreDelegateStub? - - init () { - coreDelegate = CoreDelegateStub( - onCallStateChanged : { (core: Core, call: Call, state: Call.State, message:String) -> Void in - Log.i("[Calls] Call state changed: \(call) : \(state)") - if (state == .IncomingEarlyMedia || state == .IncomingReceived || state == .OutgoingInit) { - self.addCallToList(call:call) - } - let currentCall = core.currentCall - Log.i("[Calls] Current call is \(currentCall)") - if (currentCall != nil && self.currentCallData.value??.call.getCobject != currentCall?.getCobject) { - self.updateCurrentCallData(currentCall: currentCall) - } else if (currentCall == nil && core.callsNb > 0) { - self.updateCurrentCallData(currentCall: currentCall) - } - if ([.End,.Released,.Error].contains(state)) { - self.removeCallFromList(call: call) - } else if ([.OutgoingInit].contains(state)) { - self.addCallToList(call:call) - } else if ([.IncomingReceived].contains(state)) { - self.addCallToList(call:call) - } else if (state == .UpdatedByRemote) { - let remoteVideo = call.remoteParams?.videoEnabled == true - let localVideo = call.currentParams?.videoEnabled == true - let autoAccept = call.core?.videoActivationPolicy?.automaticallyAccept == true - if (remoteVideo && !localVideo && !autoAccept) { - if (core.videoCaptureEnabled || core.videoDisplayEnabled) && Core.get().config?.getBool(section: "app", key: "disable_video_feature", defaultValue: false) == false { - try?call.deferUpdate() - self.callUpdateEvent.value = call - } else { - call.answerVideoUpdateRequest(accept: false) - } - } - } else if (state == Call.State.Connected) { - self.callConnectedEvent.value = call - } else if (state == Call.State.StreamsRunning) { - self.callUpdateEvent.value = call - } - self.updateInactiveCallsCount() - self.callsData.notifyValue() - self.currentCallData.notifyValue() - }, - - onMessageReceived : { (core: Core, room: ChatRoom, message: ChatMessage) -> Void in - self.updateUnreadChatCount() - }, - onChatRoomRead : { (core: Core, room: ChatRoom) -> Void in - self.updateUnreadChatCount() - }, - onLastCallEnded: { (core: Core) -> Void in - self.currentCallData.value??.destroy() - self.currentCallData.value = nil - self.noMoreCallEvent.value = true - } - ) - - Core.get().addDelegate(delegate: coreDelegate!) - - if let currentCall = Core.get().currentCall { - currentCallData.value??.destroy() - currentCallData.value = CallData(call:currentCall) - } - - chatAndCallsCount.value = 0 - inactiveCallsCount.readCurrentAndObserve { (_) in - self.updateCallsAndChatCount() - } - currentCallUnreadChatMessageCount.readCurrentAndObserve { (_) in - self.updateCallsAndChatCount() - } - - initCallList() - updateInactiveCallsCount() - updateUnreadChatCount() - - } - - private func initCallList() { - Core.get().calls.forEach { addCallToList(call: $0) } - } - - private func removeCallFromList(call: Call) { - Log.i("[Calls] Removing call \(call) from calls list") - if let removeCandidate = callsData.value?.filter{$0.call.getCobject == call.getCobject}.first { - removeCandidate.destroy() - } - - callsData.value = callsData.value?.filter(){$0.call.getCobject != call.getCobject} - callsData.notifyValue() - } - - private func addCallToList(call: Call) { - Log.i("[Calls] Adding call \(call) to calls list") - guard self.callsData.value?.filter({$0.call.getCobject == call.getCobject}).first == nil else { - Log.i("[Calls] \(call) already present in the list") - return - } - callsData.value?.append(CallData(call: call)) - callsData.notifyValue() - } - - private func updateUnreadChatCount() { - guard let unread = currentCallData.value??.chatRoom?.unreadMessagesCount else { - currentCallUnreadChatMessageCount.value = 0 - return - } - currentCallUnreadChatMessageCount.value = unread - } - - private func updateInactiveCallsCount() { - inactiveCallsCount.value = Core.get().callsNb - 1 - } - - private func updateCallsAndChatCount() { - var value = 0 - if let calls = inactiveCallsCount.value { - value += calls - } - if let chats = currentCallUnreadChatMessageCount.value { - value += chats - } - chatAndCallsCount.value = value - } - - func mergeCallsIntoLocalConference() { - CallManager.instance().startLocalConference() - } - - private func updateCurrentCallData(currentCall: Call?) { - var callToUse = currentCall - if (currentCall == nil) { - Log.w("[Calls] Current call is now null") - - if (Core.get().callsNb == 1) { - let firstData = callsData.value?.first - if (firstData != nil && currentCallData.value??.call.getCobject != firstData?.call.getCobject) { - Log.i("[Calls] Only one call in Core and the current call data doesn't match it, updating it") - currentCallData.value = firstData - } - return - } - - let firstCall = Core.get().calls.filter {$0.state != .Error && $0.state != .End && $0.state != .Released}.first - if (firstCall != nil && currentCallData.value??.call.getCobject != firstCall?.getCobject) { - Log.i("[Calls] Using \(firstCall?.callLog?.callId) as \"current\" call") - callToUse = firstCall - } - } - - guard let callToUse = callToUse else { - Log.w("[Calls] No call found to be used as \"current\"") - return - } - - let firstToUse = callsData.value?.filter{$0.call.getCobject == callToUse.getCobject}.first - if (firstToUse != nil) { - Log.i("[Calls] Updating current call to : \(firstToUse?.call)") - currentCallData.value = firstToUse - } else { - Log.w("[Calls] Call not found in calls data list, shouldn't happen! currentCallData is \(callToUse)") - currentCallData.value = CallData(call: callToUse) - } - ControlsViewModel.shared.updateMicState() - //updateUnreadChatCount() - } - func updateCore() { - Core.get().removeDelegate(delegate: coreDelegate!) - Core.get().addDelegate(delegate: coreDelegate!) - } -} - -@objc class CallsViewModelBridge : NSObject { - - @objc static func updateCore() { - CallsViewModel.shared.updateCore() - } - - @objc static func callViewToDisplay() -> UICompositeViewDescription? { - if let call = CallsViewModel.shared.currentCallData.value??.call { - if (call.conference != nil) { - return ConferenceCallView.compositeDescription - } else { - return SingleCallView.compositeDescription - } - } else { - return DialerView.compositeViewDescription() - } - } - @objc static func setupCallsViewNavigation() { - CallsViewModel.shared.currentCallData.readCurrentAndObserve { currentCallData in - guard currentCallData != nil && currentCallData??.call != nil && currentCallData??.isOutgoing.value != true && currentCallData??.isIncoming.value != true else { - PhoneMainView.instance().popView(SingleCallView.compositeDescription) - PhoneMainView.instance().popView(ConferenceCallView.compositeDescription) - return - } - if (currentCallData??.call.conference != nil) { - PhoneMainView.instance().pop(toView:ConferenceCallView.compositeDescription) - } else { - PhoneMainView.instance().pop(toView:SingleCallView.compositeDescription) - } - } - } -} diff --git a/Classes/Swift/Voip/ViewModels/ConferenceParticipantData.swift b/Classes/Swift/Voip/ViewModels/ConferenceParticipantData.swift deleted file mode 100644 index 80a9e072b..000000000 --- a/Classes/Swift/Voip/ViewModels/ConferenceParticipantData.swift +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linhome - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import linphonesw -import Foundation - -class ConferenceParticipantData { - - var conference:Conference - var participant:Participant - - let isAdmin = MutableLiveData() - let isMeAdmin = MutableLiveData() - let isBroadcast = MutableLiveData() - let isSpeaker = MutableLiveData() - - private var callDelegate : CallDelegateStub? - - init (conference:Conference, participant:Participant) { - self.conference = conference - self.participant = participant - isAdmin.value = participant.isAdmin - isMeAdmin.value = conference.me?.isAdmin - - var isBroadcastTmp = false - conference.call?.callLog?.conferenceInfo?.participantInfos.forEach { participant in - if participant.role == .Listener { - isBroadcastTmp = true - } - } - isBroadcast.value = isBroadcastTmp - - isSpeaker.value = participant.role != .Listener - - Log.i("[Conference Participant] Participant \(sipUri!) is admin=\(isAdmin.value!)") - - } - - var sipUri:String? { - get { - return self.participant.address?.asString() - } - } - - func destroy() { - isAdmin.clearObservers() - isMeAdmin.clearObservers() - } -} diff --git a/Classes/Swift/Voip/ViewModels/ConferenceParticipantDeviceData.swift b/Classes/Swift/Voip/ViewModels/ConferenceParticipantDeviceData.swift deleted file mode 100644 index cc7beeab4..000000000 --- a/Classes/Swift/Voip/ViewModels/ConferenceParticipantDeviceData.swift +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linhome - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import linphonesw -import Foundation - -class ConferenceParticipantDeviceData { - - var participantDevice:ParticipantDevice - let isMe:Bool - - let videoEnabled = MutableLiveData() - let videoAvailable = MutableLiveData() - let isSendingVideo = MutableLiveData() - - let isSpeaking = MutableLiveData() - let micMuted = MutableLiveData() - - let isInConference = MutableLiveData() - - let isJoining = MutableLiveData() - - - var core : Core { get { Core.get() } } - - private var participantDeviceDelegate : ParticipantDeviceDelegate? - - init (participantDevice:ParticipantDevice, isMe:Bool) { - self.isMe = isMe - self.participantDevice = participantDevice - participantDeviceDelegate = ParticipantDeviceDelegateStub( - onIsSpeakingChanged: { (participantDevice, isSpeaking) in - Log.i("[Conference Participant Device] Participant \(participantDevice.address?.asStringUriOnly()) isspeaking = \(isSpeaking)") - self.isSpeaking.value = isSpeaking - }, - onIsMuted: { (participantDevice, isMuted) in - Log.i("[Conference Participant Device] Participant \(participantDevice.address?.asStringUriOnly()) muted = \(isMuted)") - self.micMuted.value = isMuted - }, - onStateChanged: { (participantDevice, state) in - Log.i("[Conference Participant Device] Participant \(participantDevice.address?.asStringUriOnly()) state has changed: \(state)") - if ([.Joining,.Alerting].contains(state)) { - self.isJoining.value = true - } else if (state == .OnHold) { - self.isInConference.value = false - } else if (state == .Present) { - self.isJoining.value = false - self.isInConference.value = true - } - }, - onStreamCapabilityChanged: { (participantDevice, direction, streamType) in - Log.i("[Conference Participant Device] Participant \(participantDevice.address?.asStringUriOnly()) video stream direction changed: \(direction)") - if (streamType == StreamType.Video) { - self.isSendingVideo.value = direction == MediaDirection.SendRecv || direction == MediaDirection.SendOnly - Log.i("[Conference Participant Device] Participant [\(participantDevice.address?.asStringUriOnly())] video capability changed to \(direction)") - } - }, - onStreamAvailabilityChanged: { (participantDevice, available, streamType) in - if (streamType == StreamType.Video) { - Log.i("[Conference Participant Device] Participant [\(participantDevice.address?.asStringUriOnly())] video availability changed to \(available)") - self.videoAvailable.value = available - } - } - - ) - - participantDevice.addDelegate(delegate: participantDeviceDelegate!) - isSpeaking.value = false - micMuted.value = participantDevice.isMuted - - let videoCapability = participantDevice.getStreamCapability(streamType: StreamType.Video) - isSendingVideo.value = videoCapability == MediaDirection.SendRecv || videoCapability == MediaDirection.SendOnly - videoAvailable.value = participantDevice.getStreamAvailability(streamType: .Video) - videoAvailable.readCurrentAndObserve { _ in - self.videoEnabled.value = self.isVideoAvailableAndSendReceive() - } - isSendingVideo.observe { _ in - self.videoEnabled.value = self.isVideoAvailableAndSendReceive() - } - - isInConference.value = participantDevice.isInConference - - isJoining.value = [.Joining,.Alerting].contains(participantDevice.state) - - Log.i("[Conference Participant Device] Participant [\(participantDevice.address?.asStringUriOnly())], is in conf? \(isInConference.value), is video enabled? \(videoEnabled.value) \(videoCapability)") - } - - func destroy() { - clearObservers() - participantDevice.removeDelegate(delegate: participantDeviceDelegate!) - } - - func clearObservers() { - isInConference.clearObservers() - videoEnabled.clearObservers() - isSpeaking.clearObservers() - isJoining.clearObservers() - micMuted.clearObservers() - } - - func switchCamera() { - Core.get().toggleCamera() - } - - func isSwitchCameraAvailable() -> Bool { - return isMe && Core.get().showSwitchCameraButton() - } - - func setVideoView(view:UIView) { - Log.i("[Conference Participant Device] Setting textureView \(view) for participant \(participantDevice.address?.asStringUriOnly())") - view.contentMode = .scaleAspectFill - if (isMe) { - core.usePreviewWindow(yesno: false) - core.nativePreviewWindow = view - } else { - participantDevice.nativeVideoWindowId = UnsafeMutableRawPointer(Unmanaged.passRetained(view).toOpaque()) - } - } - - private func isVideoAvailableAndSendReceive() -> Bool { - return videoAvailable.value == true && isSendingVideo.value == true - } -} diff --git a/Classes/Swift/Voip/ViewModels/ConferenceSpeakerData.swift b/Classes/Swift/Voip/ViewModels/ConferenceSpeakerData.swift deleted file mode 100644 index 1aaafd7b3..000000000 --- a/Classes/Swift/Voip/ViewModels/ConferenceSpeakerData.swift +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linhome - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import linphonesw -import Foundation - -class ConferenceSpeakerData { - - var conference:Conference - var speaker:Participant - - let isAdmin = MutableLiveData() - let isMeAdmin = MutableLiveData() - - private var callDelegate : CallDelegateStub? - - init (conference:Conference, speaker:Participant) { - self.conference = conference - self.speaker = speaker - isAdmin.value = speaker.isAdmin - isMeAdmin.value = conference.me?.isAdmin - Log.i("[Conference Speaker] Speaker \(sipUri!) is admin=\(isAdmin.value!)") - - } - - var sipUri:String? { - get { - return self.speaker.address?.asString() - } - } - - func destroy() { - isAdmin.clearObservers() - isMeAdmin.clearObservers() - } -} diff --git a/Classes/Swift/Voip/ViewModels/ConferenceViewModel.swift b/Classes/Swift/Voip/ViewModels/ConferenceViewModel.swift deleted file mode 100644 index 6c55059ae..000000000 --- a/Classes/Swift/Voip/ViewModels/ConferenceViewModel.swift +++ /dev/null @@ -1,563 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linhome - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import Foundation -import linphonesw -import linphone -import AVFoundation - -class ConferenceViewModel { - - var core : Core { get { Core.get() } } - static let shared = ConferenceViewModel() - - let conferenceExists = MutableLiveData() - let subject = MutableLiveData() - let isConferenceLocallyPaused = MutableLiveData() - let isVideoConference = MutableLiveData() - let isMeAdmin = MutableLiveData() - - let conference = MutableLiveData() - let conferenceCreationPending = MutableLiveData() - let conferenceSpeakers = MutableLiveData<[ConferenceSpeakerData]>() - let conferenceParticipants = MutableLiveData<[ConferenceParticipantData]>() - let conferenceParticipantDevices = MutableLiveData<[ConferenceParticipantDeviceData]>() - let conferenceDisplayMode = MutableLiveData() - let activeSpeakerConferenceParticipantDevices = MutableLiveData<[ConferenceParticipantDeviceData]>() - - let isRecording = MutableLiveData() - let isRemotelyRecorded = MutableLiveData() - - let maxParticipantsForMosaicLayout = ConfigManager.instance().lpConfigIntForKey(key: "max_conf_part_mosaic_layout",defaultValue: 6) - - let moreThanTwoParticipants = MutableLiveData() - let noSpeaker = MutableLiveData() - - let speakingParticipant = MutableLiveData() - - let meParticipant = MutableLiveData() - - let participantAdminStatusChangedEvent = MutableLiveData() - - let firstToJoinEvent = MutableLiveData(false) - - let allParticipantsLeftEvent = MutableLiveData(false) - - private var conferenceDelegate : ConferenceDelegateStub? - private var coreDelegate : CoreDelegateStub? - - var conferenceScheduler:ConferenceScheduler? = nil - - init () { - conferenceDelegate = ConferenceDelegateStub( - onParticipantAdded: { (conference: Conference, participant: Participant) in - Log.i("[Conference] \(conference) Participant \(participant) added") - self.updateParticipantsList(conference) - }, - onParticipantRemoved: {(conference: Conference, participant: Participant) in - Log.i("[Conference] \(conference) \(participant) Participant removed") - self.updateParticipantsList(conference) - if (self.conferenceParticipants.value?.count == 0) { - self.allParticipantsLeftEvent.value = true - } - var noSpeaker = true - conference.participantList.forEach { participant in - if participant.role == .Speaker { - noSpeaker = false - } - } - if conference.me?.role == .Speaker { - noSpeaker = false - } - if noSpeaker { - self.noSpeaker.value = noSpeaker - } - }, - onParticipantDeviceAdded: {(conference: Conference, participantDevice: ParticipantDevice) in - Log.i("[Conference] \(conference) Participant device \(participantDevice) added") - self.addParticipantDevice(device: participantDevice) - }, - onParticipantDeviceRemoved: { (conference: Conference, participantDevice: ParticipantDevice) in - Log.i("[Conference] \(conference) Participant device \(participantDevice) removed") - self.removeParticipantDevice(device: participantDevice) - }, - onParticipantRoleChanged: { (conference: Conference, participant: Participant) in - Log.i("[Conference] \(conference) Participant \(participant) added") - self.updateParticipantsList(conference) - }, - onParticipantAdminStatusChanged: { (conference: Conference, participant: Participant) in - Log.i("[Conference] \(conference) Participant admin status changed") - self.isMeAdmin.value = conference.me?.isAdmin - self.updateParticipantsList(conference) - if let participantData = self.conferenceParticipants.value?.filter ({$0.participant.address!.weakEqual(address2: participant.address!)}).first { - self.participantAdminStatusChangedEvent.value = participantData - if(ControlsViewModel.shared.goToConferenceParticipantsListEvent.value!){ - self.notifyAdminStatusChanged(participantData: participantData) - } - } else { - Log.w("[Conference] Failed to find participant [\(participant.address!.asStringUriOnly())] in conferenceParticipants list") - } - }, - onParticipantDeviceStateChanged: { (conference: Conference, device: ParticipantDevice, state: ParticipantDevice.State) in - if (conference.isMe(uri: device.address!)) { - if (state == .Present) { - Log.i("[Conference] Entered conference") - self.isConferenceLocallyPaused.value = false - } - if (state == .OnHold) { - Log.i("[Conference] Left conference") - self.isConferenceLocallyPaused.value = true - } - } - }, - onStateChanged: { (conference: Conference, state: Conference.State) in - Log.i("[Conference] State changed: \(state)") - self.isVideoConference.value = conference.currentParams?.videoEnabled - if (state == .Created) { - self.configureConference(conference) - } - if (state == .TerminationPending) { - self.terminateConference(conference) - } - }, - onSubjectChanged: { (conference: Conference, subject: String) in - self.subject.value = subject - }, - onActiveSpeakerParticipantDevice: { (conference: Conference, participantDevice: ParticipantDevice) in - Log.i("[Conference] Participant [\(participantDevice.address?.asStringUriOnly())] is currently being displayed as active speaker") - if let device = self.conferenceParticipantDevices.value?.filter ({ - $0.participantDevice.address!.weakEqual(address2: participantDevice.address!) - }).first { - if (device.participantDevice.address?.asString() != self.speakingParticipant.value?.participantDevice.address?.asString()) { - Log.i("[Conference] Found actively speaking participant device") - self.speakingParticipant.value = device - } - } else { - Log.w("[Conference] Participant device [\((participantDevice.address?.asStringUriOnly()).orNil)] is the active speaker but couldn't find it in devices list") - } - } - ) - - coreDelegate = CoreDelegateStub( - onConferenceStateChanged: { (core, conference, state) in - Log.i("[Conference] \(conference) Conference state changed: \(state)") - if (state == Conference.State.Instantiated) { - self.conferenceCreationPending.value = true - self.initConference(conference) - } else if (state == Conference.State.Created) { - if (self.conferenceCreationPending.value == true) { - self.conferenceCreationPending.value = false - } - } - } - ) - - Core.get().addDelegate(delegate: coreDelegate!) - conferenceParticipants.value = [] - conferenceParticipantDevices.value = [] - - if let conference = core.conference != nil ? core.conference : core.currentCall?.conference { - Log.i("[Conference] Found an existing conference: \(conference) in state \(conference.state)") - - if (conference.state != .TerminationPending && conference.state != .Terminated) { - initConference(conference) - if (conference.state == Conference.State.Created) { - configureConference(conference) - } else { - conferenceCreationPending.value = true - } - } - } - - } - - func updateActiveSpeakerConferenceParticipantDevices () { - activeSpeakerConferenceParticipantDevices.value = self.conferenceParticipantDevices.value!.filter { data in // Filter me and speaking device - data.isMe != true && speakingParticipant.value?.participantDevice.address?.weakEqual(address2: data.participantDevice.address!) != true - } - } - - func notifyAdminStatusChanged(participantData:ConferenceParticipantData) { - if let participantName = participantData.participant.address?.addressBookEnhancedDisplayName() { - let message = (participantData.participant.isAdmin ? VoipTexts.conference_admin_set : VoipTexts.conference_admin_unset).replacingOccurrences(of: "%s", with: participantName) - VoipDialog.toast(message: message) - } - } - - func pauseConference() { - Log.i("[Conference] Leaving conference with address \(conference.value) temporarily") - let _ = conference.value?.leave() - } - - func resumeConference() { - Log.i("[Conference] entering conference with address \(conference.value)") - let _ = conference.value?.enter() - } - - func toggleRecording() { - if (conference.value?.isRecording == true) { - Log.i("[Conference] Stopping conference recording") - let _ = conference.value?.stopRecording() - } else { - let writablePath = AppManager.recordingFilePathFromCall(address: (conference.value?.conferenceAddress!.asString())!) - Log.i("[Conference] Starting recording in file $path") - let _ = conference.value?.startRecording(path: writablePath) - } - isRecording.value = conference.value?.isRecording - } - - func initConference(_ conference: Conference) { - conferenceExists.value = true - - self.conference.value = conference - conference.addDelegate(delegate: self.conferenceDelegate!) - - isRecording.value = conference.isRecording - subject.value = ConferenceViewModel.getConferenceSubject(conference: conference) - - updateConferenceLayout(conference: conference) - } - - func configureConference(_ conference: Conference) { - self.updateParticipantsList(conference) - if (conferenceParticipants.value?.count == 0) { - firstToJoinEvent.value = true - } - self.updateParticipantsDevicesList(conference) - - isConferenceLocallyPaused.value = !conference.isIn - self.isMeAdmin.value = conference.me?.isAdmin == true - isVideoConference.value = conference.currentParams?.videoEnabled == true - - subject.value = ConferenceViewModel.getConferenceSubject(conference: conference) - updateConferenceLayout(conference: conference) - - } - - - func addCallsToConference() { - Log.i("[Conference] Trying to merge all calls into existing conference") - guard let conf = conference.value else { - return - } - core.calls.forEach { call in - if (call.conference == nil) { - try? conf.addParticipant(call: call) - } - } - if (!conf.isIn) { - Log.i("[Conference] Conference was paused, resuming it") - let _ = conf.enter() - } - } - - - func changeLayout(layout: ConferenceDisplayMode, sendVideo:Bool = false) { - Log.i("[Conference] Trying to change conference layout to $layout") - if let conference = conference.value, let call = conference.call, let params = try?call.core?.createCallParams(call: call) { - params.videoEnabled = layout != .AudioOnly - params.conferenceVideoLayout = layout == ConferenceDisplayMode.Grid ? .Grid : .ActiveSpeaker - params.videoDirection = sendVideo ? .SendRecv : .RecvOnly - try?call.update(params: params) - - conferenceDisplayMode.value = layout - let list = sortDevicesDataList(devices: conferenceParticipantDevices.value!) - conferenceParticipantDevices.value = list - } else { - Log.e("[Conference] Conference or Call Or Call Params is null in ConferenceViewModel") - } - } - - private func updateConferenceLayout(conference: Conference) { - if let call = conference.call, let params = call.params { - conferenceDisplayMode.value = !params.videoEnabled || Core.get().config?.getBool(section: "app", key: "disable_video_feature", defaultValue: false) == true ? ConferenceDisplayMode.AudioOnly : params.conferenceVideoLayout == .Grid ? .Grid : .ActiveSpeaker - let list = sortDevicesDataList(devices: conferenceParticipantDevices.value!) - conferenceParticipantDevices.value = list - Log.i("[Conference] Conference current layout is: \(conferenceDisplayMode.value)") - } - } - - - - func terminateConference(_ conference: Conference) { - conferenceExists.value = false - isVideoConference.value = false - - conference.removeDelegate(delegate: conferenceDelegate!) - - self.conferenceParticipants.value?.forEach{ $0.destroy()} - self.conferenceParticipantDevices.value?.forEach{ $0.destroy()} - conferenceParticipants.clearObservers() - conferenceParticipants.value = [] - conferenceParticipantDevices.clearObservers() - conferenceParticipantDevices.value = [] - meParticipant.value = nil - isConferenceLocallyPaused.value = false - } - - - private func updateParticipantsList(_ conference: Conference) { - self.conferenceParticipants.value?.forEach{ $0.destroy()} - var participants :[ConferenceParticipantData] = [] - - let participantsList = conference.participantList - Log.i("[Conference] \(conference) Conference has \(participantsList.count) participants") - - participantsList.forEach { (participant) in - let participantDevices = participant.devices - Log.i("[Conference] \(conference) Participant found: \(participant) with \(participantDevices.count) device(s)") - let participantData = ConferenceParticipantData(conference: conference, participant: participant) - participants.append(participantData) - } - - conferenceParticipants.value = participants - } - - private func updateParticipantsDevicesList(_ conference: Conference) { - self.conferenceParticipantDevices.value?.forEach{ $0.destroy()} - var devices :[ConferenceParticipantDeviceData] = [] - - let participantsList = conference.participantList.filter({$0.role == .Speaker}) - Log.i("[Conference] \(conference) Conference has \(participantsList.count) participants") - - participantsList.forEach { (participant) in - let participantDevices = participant.devices - Log.i("[Conference] \(conference) Participant found: \(participant) with \(participantDevices.count) device(s)") - - participantDevices.forEach { (device) in - Log.i("[Conference] \(conference) Participant device found: \(device.name) (\(device.address!.asStringUriOnly()))") - let deviceData = ConferenceParticipantDeviceData(participantDevice: device, isMe: false) - devices.append(deviceData) - } - - } - - if (devices.count > 0) { - speakingParticipant.value = devices.first - } - - if conference.me?.role == .Speaker{ - conference.me?.devices.forEach { (device) in - Log.i("[Conference] \(conference) Participant device for myself found: \(device.name) (\(device.address!.asStringUriOnly()))") - let deviceData = ConferenceParticipantDeviceData(participantDevice: device, isMe: true) - devices.append(deviceData) - meParticipant.value = deviceData - } - } - - conferenceParticipantDevices.value = devices - } - - private func addParticipantDevice(device: ParticipantDevice) { - var devices :[ConferenceParticipantDeviceData] = [] - conferenceParticipantDevices.value?.forEach{devices.append($0)} - - if let deviceAddress = device.address, let _ = devices.filter({ $0.participantDevice.address!.weakEqual(address2: deviceAddress)}).first { - Log.e("[Conference] Participant is already in devices list: \(device.name) (\((device.address?.asStringUriOnly()) ?? "nil")") - return - } - - Log.i("[Conference] New participant device found: \(device.name) (\((device.address?.asStringUriOnly()).orNil)") - if (device.address != nil && conference.value?.findParticipant(uri: device.address!)?.role == .Speaker){ - let deviceData = ConferenceParticipantDeviceData(participantDevice: device, isMe: false) - devices.append(deviceData) - - let sortedDevices = sortDevicesDataList(devices: devices) - - if (speakingParticipant.value == nil) { - speakingParticipant.value = deviceData - } - - conferenceParticipantDevices.value = sortedDevices - } - } - - private func removeParticipantDevice(device: ParticipantDevice) { - let devices = conferenceParticipantDevices.value?.filter { - $0.participantDevice.address?.asStringUriOnly() != device.address?.asStringUriOnly() - } - if (device.address != nil && conference.value?.findParticipant(uri: device.address!)?.role == .Speaker){ - conferenceParticipantDevices.value?.filter { - $0.participantDevice.address?.asStringUriOnly() == device.address?.asStringUriOnly() - }.first?.destroy() - - if (devices?.count == conferenceParticipantDevices.value?.count) { - Log.e("[Conference] Failed to remove participant device: \(device.name) (\((device.address?.asStringUriOnly()).orNil)") - } else { - Log.i("[Conference] Participant device removed: \(device.name) (\((device.address?.asStringUriOnly()).orNil)") - } - - conferenceParticipantDevices.value = devices - } - } - - - private func sortDevicesDataList(devices: [ConferenceParticipantDeviceData]) -> [ConferenceParticipantDeviceData] { - if let meDeviceData = devices.filter({$0.isMe}).first { - var devicesWithoutMe = devices.filter { !$0.isMe } - if (conferenceDisplayMode.value == .ActiveSpeaker) { - devicesWithoutMe.insert(meDeviceData, at: 0) - } else { - devicesWithoutMe.append(meDeviceData) - } - return devicesWithoutMe - } - return devices - } - - - func togglePlayPause () { - if (isConferenceLocallyPaused.value == true) { - resumeConference() - } else { - pauseConference() - } - } - - // Review below (dynamic add/remove) - - func updateParticipants(addresses:[Address]) { - guard let conference = conference.value else { - Log.w("[Conference Participants] conference not set, can't update participants") - return - } - do { - // Adding new participants first, because if we remove all of them (or all of them except one) - // It will terminate the conference first and we won't be able to add new participants after - try addresses.forEach { address in - let participant = conference.participantList.filter {$0.address?.asStringUriOnly() == address.asStringUriOnly() }.first - if (participant == nil) { - Log.i("[Conference Participants] Participant \(address.asStringUriOnly()) will be added to group") - try conference.addParticipant(uri: address) - } - } - - // Removing participants - try conference.participantList.forEach { participant in - let member = addresses.filter { $0.asStringUriOnly() == participant.address?.asStringUriOnly() }.first - if (member == nil) { - Log.w("[Conference Participants] Participant \((participant.address?.asStringUriOnly()).orNil) will be removed from conference") - try conference.removeParticipant(participant: participant) - } - } - } catch { - Log.e("[Conference Participants] Error updating participant lists \(error)") - } - } - - static func getConferenceSubject(conference:Conference) -> String? { - if (conference.subject != nil && conference.subject!.count > 0) { - return conference.subject - } else { - if conference.conferenceAddress != nil { - let conferenceInfo = Core.get().findConferenceInformationFromUri(uri: conference.conferenceAddress!) - if (conferenceInfo != nil) { - return conferenceInfo?.subject - } else { - if (conference.me?.isFocus == true) { - return VoipTexts.conference_local_title - } else { - return VoipTexts.conference_default_title - } - } - } else { - return VoipTexts.conference_default_title - } - } - } - - -} - -@objc class ConferenceViewModelBridge : NSObject { - - @objc static func updateParticipantsList(addresses:[String]) { - do { - try ConferenceViewModel.shared.updateParticipants(addresses: addresses.map { try Factory.Instance.createAddress(addr: $0)} ) - } catch { - Log.e("[ParticipantsListView] unable to update participants list \(error)") - } - } - - - @objc static func startGroupCall(cChatRoom: OpaquePointer ) { - let core = Core.get() - let chatRoom = ChatRoom.getSwiftObject(cObject: cChatRoom) - guard let localAddress = chatRoom.localAddress?.clone() else { - Log.e("[Group Call] Couldn't get local address from default account!") - return - } - localAddress.clean() // Remove GRUU - ConferenceViewModel.shared.conferenceScheduler = try?Core.get().createConferenceScheduler() - let conferenceInfo = try?Factory.Instance.createConferenceInfo() - conferenceInfo?.participants = chatRoom.participants.map {$0.address!} - conferenceInfo?.organizer = localAddress - conferenceInfo?.subject = chatRoom.subject - ConferenceViewModel.shared.conferenceScheduler?.account = core.accountList.filter { $0.params?.identityAddress?.weakEqual(address2: localAddress) == true}.first - ConferenceViewModel.shared.conferenceScheduler?.info = conferenceInfo // Will trigger the conference creation automatically - } - - @objc static func showCancelledMeeting(cConferenceInfo: OpaquePointer) { - let core = Core.get() - var message = VoipTexts.conference_scheduled_cancelled_by_organizer - let conferenceInfo = ConferenceInfo.getSwiftObject(cObject: cConferenceInfo) - if let organizerAddress = conferenceInfo.organizer { - let localAccount = Core.get().accountList.filter { account in - account.params?.identityAddress != nil && organizerAddress.weakEqual(address2: account.params!.identityAddress!) - }.first - if (localAccount != nil) { - message = VoipTexts.conference_scheduled_cancelled_by_me - } - } - VoipDialog.toast(message: message) - } - - @objc static func scheduleFromGroupChat(cChatRoom: OpaquePointer ) { - ConferenceSchedulingViewModel.shared.reset() - - do { - try ChatRoom.getSwiftObject(cObject: cChatRoom).participants.forEach { - ConferenceSchedulingViewModel.shared.selectedParticipants.value?.append( - try Factory.Instance.createParticipantInfo(address: $0.address!) - ) - ConferenceSchedulingViewModel.shared.selectedParticipants.value?.last?.role = .Listener - } - } catch { - Log.e("[ScheduleFromGroupChat] unable to create ParticipantInfo \(error)") - } - - ConferenceSchedulingViewModel.shared.scheduleForLater.value = true - } - -} - - -enum FlexDirection { - case ROW - case ROW_REVERSE - case COLUMN - case COLUMN_REVERSE -} - -enum ConferenceDisplayMode { - case Grid - case ActiveSpeaker - case AudioOnly -} diff --git a/Classes/Swift/Voip/ViewModels/ControlsViewModel.swift b/Classes/Swift/Voip/ViewModels/ControlsViewModel.swift deleted file mode 100644 index 439b76d00..000000000 --- a/Classes/Swift/Voip/ViewModels/ControlsViewModel.swift +++ /dev/null @@ -1,300 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linhome - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import Foundation -import linphonesw -import AVFoundation - - -class ControlsViewModel { - var core : Core { get { Core.get() } } - - let isSpeakerSelected = MutableLiveData() - let isMicrophoneMuted = MutableLiveData() - let isMuteMicrophoneEnabled = MutableLiveData() - let isBluetoothHeadsetSelected = MutableLiveData() - let isBluetoothHeadsetAvailable = MutableLiveData() - let nonEarpieceOutputAudioDevice = MutableLiveData() - let audioRoutesSelected = MutableLiveData() - let audioRoutesEnabled = MutableLiveData() - - let isVideoUpdateInProgress = MutableLiveData() - let isVideoEnabled = MutableLiveData() - let isVideoAvailable = MutableLiveData() - - let fullScreenMode = MutableLiveData(false) - let numpadVisible = MutableLiveData(false) - let callStatsVisible = MutableLiveData(false) - let goToConferenceLayoutSettings = MutableLiveData(false) - let goToConferenceParticipantsListEvent = MutableLiveData(false) - let goToChatEvent = MutableLiveData(false) - let goToCallsListEvent = MutableLiveData(false) - let hideExtraButtons = MutableLiveData(true) - - let proximitySensorEnabled = MutableLiveData() - - - static let shared = ControlsViewModel() - private var coreDelegate : CoreDelegateStub? - private var previousCallState = Call.State.Idle - - var imSpeaker : Bool = true - - init () { - coreDelegate = CoreDelegateStub( - onCallStateChanged : { (core: Core, call: Call, state: Call.State, message:String) -> Void in - Log.i("[Call Controls] Call state changed: \(call) : \(state)") - if (state == Call.State.StreamsRunning) { - self.isVideoUpdateInProgress.value = false - } - self.updateUI() - self.setAudioRoutes(call,state) - self.previousCallState = state - }, - onAudioDeviceChanged : { (core: Core, audioDevice: AudioDevice) -> Void in - Log.i("[Call Controls] Audio device changed: \(audioDevice.deviceName)") - self.nonEarpieceOutputAudioDevice.value = audioDevice.type != AudioDevice.Kind.Microphone // on iOS Earpiece = Microphone - self.updateSpeakerState() - self.updateBluetoothHeadsetState() - }, - onAudioDevicesListUpdated : { (core: Core) -> Void in - self.isBluetoothHeadsetAvailable.value = !core.audioDevices.filter { [.Bluetooth,.BluetoothA2DP].contains($0.type)}.isEmpty - } - ) - Core.get().addDelegate(delegate: coreDelegate!) - proximitySensorEnabled.value = shouldProximitySensorBeEnabled() - isVideoEnabled.readCurrentAndObserve { _ in - self.proximitySensorEnabled.value = self.shouldProximitySensorBeEnabled() - } - nonEarpieceOutputAudioDevice.readCurrentAndObserve { _ in - self.proximitySensorEnabled.value = self.shouldProximitySensorBeEnabled() - } - proximitySensorEnabled.readCurrentAndObserve { (enabled) in - UIDevice.current.isProximityMonitoringEnabled = enabled == true - } - updateUI() - ConferenceViewModel.shared.conferenceDisplayMode.readCurrentAndObserve { _ in - self.updateVideoAvailable() - } - self.isBluetoothHeadsetAvailable.value = !core.audioDevices.filter { [.Bluetooth,.BluetoothA2DP].contains($0.type)}.isEmpty - } - - private func setAudioRoutes(_ call:Call,_ state:Call.State) { - if (state == .OutgoingProgress) { - if (core.callsNb == 1 && ConfigManager.instance().lpConfigBoolForKey(key: "route_audio_to_bluetooth_if_available",defaultValue:true)) { - AudioRouteUtils.routeAudioToBluetooth(call: call) - } - } - if (state == .StreamsRunning) { - if (core.callsNb == 1) { - // Only try to route bluetooth / headphone / headset when the call is in StreamsRunning for the first time - if (previousCallState == Call.State.Connected) { - Log.i("[Context] First call going into StreamsRunning state for the first time, trying to route audio to headset or bluetooth if available") - if (AudioRouteUtils.isHeadsetAudioRouteAvailable()) { - AudioRouteUtils.routeAudioToHeadset(call: call) - } else if (ConfigManager.instance().lpConfigBoolForKey(key: "route_audio_to_bluetooth_if_available",defaultValue:true) && - AudioRouteUtils.isBluetoothAudioRouteAvailable()) { - AudioRouteUtils.routeAudioToBluetooth(call: call) - } - } - } - - if (ConfigManager.instance().lpConfigBoolForKey(key: "route_audio_to_speaker_when_video_enabled",defaultValue:true) && call.currentParams?.videoEnabled == true && call.conference == nil) { - // Do not turn speaker on when video is enabled if headset or bluetooth is used - if (!AudioRouteUtils.isHeadsetAudioRouteAvailable() && - !AudioRouteUtils.isBluetoothAudioRouteCurrentlyUsed(call: call) - ) { - Log.i("[Context] Video enabled and no wired headset not bluetooth in use, routing audio to speaker") - AudioRouteUtils.routeAudioToSpeaker(call: call) - } - } - } - } - - - private func shouldProximitySensorBeEnabled() -> Bool { - return core.callsNb > 0 && isVideoEnabled.value != true && nonEarpieceOutputAudioDevice.value != true - } - - - func hangUp() { - if (core.currentCall != nil) { - try?core.currentCall?.terminate() - } else if (core.conference?.isIn == true) { - try?core.terminateConference() - } else { - try?core.terminateAllCalls() - } - } - - func toggleVideo() { - if let currentCall = core.currentCall { - if (currentCall.conference != nil) { - if (ConferenceViewModel.shared.conferenceDisplayMode.value == .AudioOnly) { - ConferenceViewModel.shared.changeLayout(layout: .ActiveSpeaker, sendVideo:Core.get().videoActivationPolicy?.automaticallyInitiate == true) - } else if let params = try?core.createCallParams(call: currentCall) { - isVideoUpdateInProgress.value = true - params.videoDirection = params.videoDirection == MediaDirection.RecvOnly ? MediaDirection.SendRecv : MediaDirection.RecvOnly - try?currentCall.update(params: params) - } - } else { - let state = currentCall.state - if (state == Call.State.End || state == Call.State.Released || state == Call.State.Error) { - return - } - isVideoUpdateInProgress.value = true - if let params = try?core.createCallParams(call: currentCall) { - params.videoEnabled = !(currentCall.currentParams?.videoEnabled == true) - try?currentCall.update(params: params) - if (params.videoEnabled) { - currentCall.requestNotifyNextVideoFrameDecoded() - } - } - } - } - } - - - func updateUI() { - updateVideoAvailable() - updateVideoEnabled() - updateMicState() - updateSpeakerState() - updateAudioRoutesState() - proximitySensorEnabled.value = shouldProximitySensorBeEnabled() - } - - private func updateAudioRoutesState() { - let bluetoothDeviceAvailable = AudioRouteUtils.isBluetoothAudioRouteAvailable() - audioRoutesEnabled.value = bluetoothDeviceAvailable - - if (!bluetoothDeviceAvailable) { - audioRoutesSelected.value = false - audioRoutesEnabled.value = false - } - } - - private func updateSpeakerState() { - isSpeakerSelected.value = AudioRouteUtils.isSpeakerAudioRouteCurrentlyUsed() - } - - private func updateBluetoothHeadsetState() { - isBluetoothHeadsetSelected.value = AudioRouteUtils.isBluetoothAudioRouteCurrentlyUsed() - } - - private func updateVideoAvailable() { - let currentCall = core.currentCall - isVideoAvailable.value = - ((core.videoCaptureEnabled || core.videoPreviewEnabled) && - currentCall?.state != .Paused && - currentCall?.state != .PausedByRemote && - ((currentCall != nil && currentCall?.mediaInProgress() != true) || (core.conference?.isIn == true))) && Core.get().config?.getBool(section: "app", key: "disable_video_feature", defaultValue: false) == false - } - - private func updateVideoEnabled() { - let enabled = isVideoCallOrConferenceActive() - isVideoEnabled.value = enabled - } - - func updateMicState() { - isMicrophoneMuted.value = !micAuthorized() || !core.micEnabled - isMuteMicrophoneEnabled.value = CallsViewModel.shared.currentCallData.value??.call != nil - } - - func micAuthorized() -> Bool { - return AVCaptureDevice.authorizationStatus(for: .audio) == .authorized - } - - func isVideoCallOrConferenceActive() -> Bool { - if let currentCall = core.currentCall, let params = currentCall.params { - return currentCall.state != .PausedByRemote && params.videoEnabled && (currentCall.conference == nil || params.videoDirection == MediaDirection.SendRecv) - } else { - return false - } - } - - func toggleFullScreen() { - ControlsViewModel.shared.audioRoutesSelected.value = false - fullScreenMode.value = fullScreenMode.value != true - } - - func toggleMuteMicrophone() { - if (!micAuthorized()) { - askMicrophoneAccess() - } - core.micEnabled = !core.micEnabled - updateMicState() - } - - var microphoneAsking = false - func askMicrophoneAccess() { - microphoneAsking = true - let settings = ButtonAttributes(text:VoipTexts.system_app_settings, action: { - self.microphoneAsking = false - try! self.core.terminateAllCalls() - UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!) - }, isDestructive:false) - let cancel = ButtonAttributes(text:VoipTexts.cancel, action: {self.microphoneAsking = false}, isDestructive:true) - VoipDialog(message:VoipTexts.microphone_non_authorized_warning, givenButtons: [cancel,settings]).show() - } - - func forceEarpieceAudioRoute() { - if (AudioRouteUtils.isHeadsetAudioRouteAvailable()) { - Log.i("[Call Controls] Headset found, route audio to it instead of earpiece") - AudioRouteUtils.routeAudioToHeadset() - } else { - AudioRouteUtils.routeAudioToEarpiece() - } - } - - func forceSpeakerAudioRoute() { - AudioRouteUtils.routeAudioToSpeaker() - } - - func forceBluetoothAudioRoute() { - AudioRouteUtils.routeAudioToBluetooth() - } - - func toggleSpeaker() { - if (AudioRouteUtils.isSpeakerAudioRouteCurrentlyUsed()) { - forceEarpieceAudioRoute() - } else { - forceSpeakerAudioRoute() - } - } - - func toggleRoutesMenu() { - audioRoutesSelected.value = audioRoutesSelected.value != true - } - -} - -@objc class ControlsViewModelBridge: NSObject { - @objc static func showParticipants() { - ControlsViewModel.shared.goToConferenceParticipantsListEvent.value = true - } - @objc static func toggleStatsVisibility() -> Void { - if (ControlsViewModel.shared.callStatsVisible.value == true) { - ControlsViewModel.shared.callStatsVisible.value = false - } else { - ControlsViewModel.shared.callStatsVisible.value = true - } - } -} diff --git a/Classes/Swift/Voip/Views/CompositeViewControllers/AbstractCallView.swift b/Classes/Swift/Voip/Views/CompositeViewControllers/AbstractCallView.swift deleted file mode 100644 index d13f12c69..000000000 --- a/Classes/Swift/Voip/Views/CompositeViewControllers/AbstractCallView.swift +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import linphonesw - - -@objc class AbstractCallView: UIViewController { - - let extraButtonsView = VoipExtraButtonsView() - var numpadView : NumpadView? = nil - var currentCallStatsVew : CallStatsView? = nil - var shadingMask = UIView() - var videoAcceptDialog : VoipDialog? = nil - var dismissableView : DismissableView? = nil - - var audioRoutesView : AudioRoutesView? = nil - let fullScreenMutableContainerView = UIView() - let controlsView = ControlsView(showVideo: true, controlsViewModel: ControlsViewModel.shared) - - override func viewDidLoad() { - super.viewDidLoad() - - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - self.view.backgroundColor = VoipTheme.voipBackgroundColor.get() - } - - // Hangup - let hangup = CallControlButton(width: 65, imageInset:AbstractIncomingOutgoingCallView.answer_decline_inset, buttonTheme: VoipTheme.call_terminate, onClickAction: { - ControlsViewModel.shared.hangUp() - }) - view.addSubview(hangup) - hangup.alignParentLeft(withMargin:SharedLayoutConstants.margin_call_view_side_controls_buttons).alignParentBottom(withMargin:SharedLayoutConstants.buttons_bottom_margin).done() - - - // Controls - view.addSubview(controlsView) - controlsView.alignParentBottom(withMargin:SharedLayoutConstants.buttons_bottom_margin).centerX().done() - - // Container view - fullScreenMutableContainerView.backgroundColor = .clear - self.view.addSubview(fullScreenMutableContainerView) - fullScreenMutableContainerView.alignParentLeft(withMargin: SharedLayoutConstants.content_inset).alignParentRight(withMargin: SharedLayoutConstants.content_inset).matchParentHeight().alignAbove(view:controlsView,withMargin:SharedLayoutConstants.buttons_bottom_margin).done() - - - // Calls List - ControlsViewModel.shared.goToCallsListEvent.observe { _ in - if (self.view.superview != nil) { - self.dismissableView = CallsListView() - self.view.addSubview(self.dismissableView!) - self.dismissableView?.matchParentDimmensions().done() - } - } - - // Goto chat - ControlsViewModel.shared.goToChatEvent.observe { (_) in - self.goToChat() - } - - - // Shading mask, everything before will be shaded upon displaying of the mask - shadingMask.backgroundColor = VoipTheme.voip_translucent_popup_background - shadingMask.isHidden = true - self.view.addSubview(shadingMask) - shadingMask.matchParentDimmensions().done() - - // Extra Buttons - let showextraButtons = CallControlButton(imageInset:AbstractIncomingOutgoingCallView.answer_decline_inset, buttonTheme: VoipTheme.call_more, onClickAction: { - self.view.bringSubviewToFront(self.shadingMask) - self.view.bringSubviewToFront(self.extraButtonsView) - self.showModalSubview(view: self.extraButtonsView) - ControlsViewModel.shared.audioRoutesSelected.value = false - }) - view.addSubview(showextraButtons) - showextraButtons.alignParentRight(withMargin:SharedLayoutConstants.margin_call_view_side_controls_buttons).alignParentBottom(withMargin:SharedLayoutConstants.buttons_bottom_margin).done() - - let boucingCounter = BouncingCounter(inButton:showextraButtons) - view.addSubview(boucingCounter) - boucingCounter.dataSource = CallsViewModel.shared.chatAndCallsCount - - view.addSubview(extraButtonsView) - extraButtonsView.matchParentSideBorders(insetedByDx: SharedLayoutConstants.content_inset).alignParentBottom(withMargin:SharedLayoutConstants.bottom_margin_notch_clearance).done() - ControlsViewModel.shared.hideExtraButtons.readCurrentAndObserve { (_) in - self.hideModalSubview(view: self.extraButtonsView) - } - shadingMask.onClick { - if (!self.extraButtonsView.isHidden) { - self.hideModalSubview(view: self.extraButtonsView) - } else if (self.extraButtonsView.isHidden && !self.shadingMask.isHidden && ControlsViewModel.shared.numpadVisible.value == false && ControlsViewModel.shared.callStatsVisible.value == false){ - self.shadingMask.isHidden = true - } - ControlsViewModel.shared.audioRoutesSelected.value = false - } - - // Numpad - ControlsViewModel.shared.numpadVisible.readCurrentAndObserve { (visible) in - showextraButtons.isHidden = visible == true - if (visible == true && CallsViewModel.shared.currentCallData.value != nil ) { - self.numpadView?.removeFromSuperview() - self.shadingMask.isHidden = false - self.numpadView = NumpadView(superView: self.view,callData: CallsViewModel.shared.currentCallData.value!!,marginTop: 0.0, above:self.controlsView, onDismissAction: { - ControlsViewModel.shared.numpadVisible.value = false - }) - } else { - self.numpadView?.removeFromSuperview() - self.shadingMask.isHidden = true - } - - } - - // Call stats - ControlsViewModel.shared.callStatsVisible.readCurrentAndObserve { (visible) in - showextraButtons.isHidden = visible == true - if (visible == true && CallsViewModel.shared.currentCallData.value != nil ) { - self.currentCallStatsVew?.removeFromSuperview() - self.shadingMask.isHidden = false - self.currentCallStatsVew = CallStatsView(superView: self.view,callData: CallsViewModel.shared.currentCallData.value!!,marginTop:0.0, above:self.controlsView, onDismissAction: { - ControlsViewModel.shared.callStatsVisible.value = false - }) - } else { - self.currentCallStatsVew?.removeFromSuperview() - self.shadingMask.isHidden = true - } - } - - // Audio Routes - audioRoutesView = AudioRoutesView() - view.addSubview(audioRoutesView!) - audioRoutesView!.alignBottomWith(otherView: controlsView).done() - ControlsViewModel.shared.audioRoutesSelected.readCurrentAndObserve { (audioRoutesSelected) in - self.audioRoutesView!.isHidden = audioRoutesSelected != true - } - audioRoutesView!.alignAbove(view:controlsView,withMargin:SharedLayoutConstants.buttons_bottom_margin).centerX().done() - } - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(true) - extraButtonsView.refresh() - ControlsViewModel.shared.callStatsVisible.notifyValue() - ControlsViewModel.shared.audioRoutesSelected.value = false - } - - override func viewWillDisappear(_ animated: Bool) { - dismissableView?.removeFromSuperview() - dismissableView = nil - - ControlsViewModel.shared.numpadVisible.value = false - ControlsViewModel.shared.callStatsVisible.value = false - ControlsViewModel.shared.fullScreenMode.value = false - super.viewWillDisappear(animated) - } - - func showModalSubview(view:UIView) { - view.isHidden = false - shadingMask.isHidden = false - } - func hideModalSubview(view:UIView) { - view.isHidden = true - shadingMask.isHidden = true - } - - func goToChat() { - /*guard - let chatRoom = CallsViewModel.shared.currentCallData.value??.chatRoom - else { - Log.w("[Call] Failed to find existing chat room associated to call") - return - }*/ - PhoneMainView.instance().changeCurrentView(ChatsListView.compositeViewDescription()) - - } - - func layoutRotatableElements() { - let leftMargin = UIDevice.current.orientation == .landscapeLeft && UIDevice.hasNotch() ? UIApplication.shared.keyWindow!.safeAreaInsets.left : SharedLayoutConstants.content_inset - let rightMargin = UIDevice.current.orientation == .landscapeRight && UIDevice.hasNotch() ? UIApplication.shared.keyWindow!.safeAreaInsets.right : SharedLayoutConstants.content_inset - fullScreenMutableContainerView.updateAlignParentLeft(withMargin: leftMargin).updateAlignParentRight(withMargin: rightMargin).done() - controlsView.updateAlignParentBottom(withMargin:SharedLayoutConstants.buttons_bottom_margin).centerX().done() - } - - override func didRotate(from fromInterfaceOrientation: UIInterfaceOrientation) { - super.didRotate(from: fromInterfaceOrientation) - self.layoutRotatableElements() - } - - -} diff --git a/Classes/Swift/Voip/Views/CompositeViewControllers/AbstractIncomingOutgoingCallView.swift b/Classes/Swift/Voip/Views/CompositeViewControllers/AbstractIncomingOutgoingCallView.swift deleted file mode 100644 index 6119d4810..000000000 --- a/Classes/Swift/Voip/Views/CompositeViewControllers/AbstractIncomingOutgoingCallView.swift +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import linphonesw - -@objc class AbstractIncomingOutgoingCallView: UIViewController { // Shared between IncomingCallView and OutgoingCallVIew (all upper part except control buttons) - - // Layout constants - static let spinner_size = 50 - static let spinner_margin_top = 8.0 - static let call_type_margin_top = 10.0 - static let duration_margin_top = 10.0 - static let display_name_height = 20.0 - static let display_name_margin_top = 18.0 - static let sip_address_height = 16.0 - static let sip_address_margin_top = 6.0 - static let answer_decline_inset = UIEdgeInsets(top: 2, left: 7, bottom: 2, right: 7) - - let spinner = RotatingSpinner() - let duration = CallTimer(nil, VoipTheme.call_header_subtitle) - let avatar = Avatar(color:VoipTheme.voipParticipantBackgroundColor, textStyle: VoipTheme.call_generated_avatar_large) - let displayName = StyledLabel(VoipTheme.call_header_title) - let sipAddress = StyledLabel(VoipTheme.call_header_subtitle) - - var callData: CallData? = nil { - didSet { - duration.call = callData?.call - callData?.call.remoteAddress.map { - avatar.fillFromAddress(address: $0) - displayName.text = $0.addressBookEnhancedDisplayName() - sipAddress.text = $0.asStringUriOnly() - } - } - } - - func viewDidLoad(forCallType:String) { - super.viewDidLoad() - - view.backgroundColor = VoipTheme.voipBackgroundColor.get() - view.accessibilityIdentifier = "IO_call_view" - - view.addSubview(spinner) - spinner.square(AbstractIncomingOutgoingCallView.spinner_size).matchParentSideBorders().alignParentTop(withMargin:AbstractIncomingOutgoingCallView.spinner_margin_top + UIDevice.notchHeight()).done() - spinner.accessibilityIdentifier = "IO_call_view_spinner" - - let callType = StyledLabel(VoipTheme.call_header_title,forCallType) - view.addSubview(callType) - callType.matchParentSideBorders().alignUnder(view:spinner,withMargin:AbstractIncomingOutgoingCallView.call_type_margin_top).done() - - self.view.addSubview(duration) - duration.matchParentSideBorders().alignUnder(view:callType,withMargin:AbstractIncomingOutgoingCallView.duration_margin_top).done() - duration.accessibilityIdentifier = "IO_call_view_duration" - - // Center : Avatar + Display name + SIP Address - let centerSection = UIView() - centerSection.addSubview(avatar) - centerSection.addSubview(displayName) - displayName.height(AbstractIncomingOutgoingCallView.display_name_height).matchParentSideBorders().alignUnder(view:avatar,withMargin:AbstractIncomingOutgoingCallView.display_name_margin_top).done() - centerSection.addSubview(sipAddress) - sipAddress.height(AbstractIncomingOutgoingCallView.sip_address_height).matchParentSideBorders().alignUnder(view:displayName,withMargin:AbstractIncomingOutgoingCallView.sip_address_margin_top).done() - self.view.addSubview(centerSection) - centerSection.matchParentSideBorders().center().done() - - layoutRotatableElements() - } - - func layoutRotatableElements() { - avatar.removeConstraints().done() - if ([.landscapeLeft, .landscapeRight].contains( UIDevice.current.orientation)) { - avatar.square(Avatar.diameter_for_call_views_land).center().done() - } else { - avatar.square(Avatar.diameter_for_call_views).center().done() - } - } - - override func didRotate(from fromInterfaceOrientation: UIInterfaceOrientation) { - super.didRotate(from: fromInterfaceOrientation) - self.layoutRotatableElements() - } - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - spinner.startRotation() - } - - override func viewWillDisappear(_ animated: Bool) { - spinner.stopRotation() - duration.call = nil - super.viewWillDisappear(animated) - } - - @objc func setCall(call:OpaquePointer) { - callData = CallData(call: Call.getSwiftObject(cObject: call)) - } - -} diff --git a/Classes/Swift/Voip/Views/CompositeViewControllers/ConferenceCallView.swift b/Classes/Swift/Voip/Views/CompositeViewControllers/ConferenceCallView.swift deleted file mode 100644 index 8597e88ee..000000000 --- a/Classes/Swift/Voip/Views/CompositeViewControllers/ConferenceCallView.swift +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import linphonesw - - -@objc class ConferenceCallView: AbstractCallView, UICompositeViewDelegate { - - var conferencePausedView : PausedCallOrConferenceView? = nil - var conferenceGridView: VoipConferenceGridView? = nil - var conferenceActiveSpeakerView: VoipConferenceActiveSpeakerView? = nil - var conferenceAudioOnlyView: VoipConferenceAudioOnlyView? = nil - let conferenceJoinSpinner = RotatingSpinner(color:VoipTheme.dark_grey_color) - @objc var participantsListView : ParticipantsListView? = nil - - static let compositeDescription = UICompositeViewDescription(ConferenceCallView.self, statusBar: StatusBarView.self, tabBar: nil, sideMenu: nil, fullscreen: false, isLeftFragment: false,fragmentWith: nil) - static func compositeViewDescription() -> UICompositeViewDescription! { return compositeDescription } - func compositeViewDescription() -> UICompositeViewDescription! { return type(of: self).compositeDescription } - - override func viewDidLoad() { - super.viewDidLoad() - - // Conference paused - conferencePausedView = PausedCallOrConferenceView(iconName: "voip_conference_play_big",titleText: VoipTexts.conference_paused_title,subTitleText: VoipTexts.conference_paused_subtitle, onClickAction: { - ConferenceViewModel.shared.togglePlayPause() - }) - view.addSubview(conferencePausedView!) - conferencePausedView?.matchParentSideBorders().matchParentHeight().alignAbove(view:controlsView,withMargin:SharedLayoutConstants.buttons_bottom_margin).done() - conferencePausedView?.isHidden = true - - // Conference grid - conferenceGridView = VoipConferenceGridView() - fullScreenMutableContainerView.addSubview(conferenceGridView!) - conferenceGridView?.matchParentDimmensions().done() - conferenceGridView?.isHidden = true - ConferenceViewModel.shared.conferenceExists.readCurrentAndObserve { (exists) in - if (exists == true) { - self.extraButtonsView.isHidden = true - self.conferencePausedView?.isHidden = ConferenceViewModel.shared.isConferenceLocallyPaused.value != true - self.displaySelectedConferenceLayout() - UIApplication.shared.isIdleTimerDisabled = true - } else { - self.conferenceGridView?.isHidden = true - self.conferenceActiveSpeakerView?.isHidden = true - self.conferenceActiveSpeakerView?.isHidden = true - self.conferencePausedView?.isHidden = true - UIApplication.shared.isIdleTimerDisabled = false - } - } - - ConferenceViewModel.shared.conferenceCreationPending.readCurrentAndObserve { isCreationPending in - if (isCreationPending == true) { - self.fullScreenMutableContainerView.addSubview(self.conferenceJoinSpinner) - self.conferenceJoinSpinner.square(AbstractIncomingOutgoingCallView.spinner_size).center().done() - self.conferenceJoinSpinner.startRotation() - } else { - self.conferenceJoinSpinner.removeFromSuperview() - self.conferenceJoinSpinner.stopRotation() - self.switchToFullScreenIfPossible(conference: ConferenceViewModel.shared.conference.value) - } - } - - // Conference active speaker - conferenceActiveSpeakerView = VoipConferenceActiveSpeakerView() - fullScreenMutableContainerView.addSubview(conferenceActiveSpeakerView!) - conferenceActiveSpeakerView?.matchParentDimmensions().done() - conferenceActiveSpeakerView?.isHidden = true - - // Conference audio only - conferenceAudioOnlyView = VoipConferenceAudioOnlyView() - fullScreenMutableContainerView.addSubview(conferenceAudioOnlyView!) - conferenceAudioOnlyView?.matchParentDimmensions().done() - conferenceAudioOnlyView?.isHidden = true - - ConferenceViewModel.shared.conferenceDisplayMode.readCurrentAndObserve { (conferenceMode) in - if (ConferenceViewModel.shared.conferenceExists.value == true) { - self.displaySelectedConferenceLayout() - if (conferenceMode != .AudioOnly) { - self.switchToFullScreenIfPossible(conference: ConferenceViewModel.shared.conference.value) - } - } - } - ConferenceViewModel.shared.isConferenceLocallyPaused.readCurrentAndObserve { (paused) in - self.conferencePausedView?.isHidden = paused != true - } - - // Conference Participants List - ControlsViewModel.shared.goToConferenceParticipantsListEvent.observe { goToConferenceParticipantsList in - if goToConferenceParticipantsList! { - self.participantsListView = ParticipantsListView() - self.view.addSubview(self.participantsListView!) - self.participantsListView?.matchParentDimmensions().done() - } - } - - // Conference mode selection - ControlsViewModel.shared.goToConferenceLayoutSettings.observe { (_) in - self.dismissableView = VoipConferenceDisplayModeSelectionView() - self.view.addSubview(self.dismissableView!) - self.dismissableView?.matchParentDimmensions().done() - } - - // First/Last to join conference : - ConferenceViewModel.shared.allParticipantsLeftEvent.observe { (allLeft) in - if (allLeft == true) { - VoipDialog.toast(message: VoipTexts.conference_last_user) - self.conferenceActiveSpeakerView?.grid.isHidden = true - } - } - ConferenceViewModel.shared.firstToJoinEvent.observe { (first) in - if (first == true) { - VoipDialog.toast(message: VoipTexts.conference_first_to_join) - } - } - - view.onClick { - ControlsViewModel.shared.audioRoutesSelected.value = false - } - - } - - func displaySelectedConferenceLayout() { - let conferenceMode = ConferenceViewModel.shared.conferenceDisplayMode.value - self.conferenceGridView!.isHidden = conferenceMode != .Grid - self.conferenceActiveSpeakerView!.isHidden = conferenceMode != .ActiveSpeaker - self.conferenceAudioOnlyView!.isHidden = conferenceMode != .AudioOnly - if (conferenceMode == .Grid) { - self.conferenceGridView?.conferenceViewModel = ConferenceViewModel.shared - } - if (conferenceMode == .AudioOnly) { - self.conferenceAudioOnlyView?.conferenceViewModel = ConferenceViewModel.shared - } - if (conferenceMode == .ActiveSpeaker) { - self.conferenceActiveSpeakerView?.conferenceViewModel = ConferenceViewModel.shared - } - } - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(true) - ConferenceViewModel.shared.conferenceExists.notifyValue() - } - - override func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) - participantsListView?.removeFromSuperview() - participantsListView = nil - } - - override func didRotate(from fromInterfaceOrientation: UIInterfaceOrientation) { - super.didRotate(from: fromInterfaceOrientation) - self.conferenceActiveSpeakerView?.layoutRotatableElements() - } - - private func switchToFullScreenIfPossible(conference: Conference?) { - if (ConfigManager.instance().lpConfigBoolForKey(key: "enter_video_conference_enable_full_screen_mode", defaultValue: true)) { - if (conference?.currentParams?.isVideoEnabled == true) { - if (conference?.me?.devices.count == 0) { - Log.i("[Conference Call] Conference has video enabled but our device hasn't joined yet") - } else if (conference?.me?.devices.filter { $0.isInConference && $0.getStreamAvailability(streamType: StreamType.Video) }.first != nil) { - Log.i("[Conference Call] Conference has video enabled & our device has video enabled, enabling full screen mode") - ControlsViewModel.shared.fullScreenMode.value = true - } else { - Log.i("[Conference Call] Conference has video enabled but our device video is disabled") - } - } - } - } - - -} diff --git a/Classes/Swift/Voip/Views/CompositeViewControllers/IncomingCallView.swift b/Classes/Swift/Voip/Views/CompositeViewControllers/IncomingCallView.swift deleted file mode 100644 index 44d306bca..000000000 --- a/Classes/Swift/Voip/Views/CompositeViewControllers/IncomingCallView.swift +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import linphonesw - -@objc class IncomingCallView: AbstractIncomingOutgoingCallView, UICompositeViewDelegate { - - // Layout constants - let buttons_distance_from_center_x = 38 - - static let compositeDescription = UICompositeViewDescription(IncomingCallView.self, statusBar: StatusBarView.self, tabBar: nil, sideMenu: nil, fullscreen: false, isLeftFragment: false,fragmentWith: nil) - static func compositeViewDescription() -> UICompositeViewDescription! { return compositeDescription } - func compositeViewDescription() -> UICompositeViewDescription! { return type(of: self).compositeDescription } - - var earlyMediaView : UIView? = nil - - override func viewDidLoad() { - - super.viewDidLoad(forCallType: VoipTexts.call_incoming_title) - - // Accept - let accept = CallControlButton(width: CallControlButton.hungup_width, imageInset:AbstractIncomingOutgoingCallView.answer_decline_inset, buttonTheme: VoipTheme.call_accept, onClickAction: { - self.callData.map { CallManager.instance().acceptCall(call: $0.call.getCobject, hasVideo: false)} - }) - view.addSubview(accept) - accept.centerX(withDx: buttons_distance_from_center_x).alignParentBottom(withMargin:SharedLayoutConstants.buttons_bottom_margin).done() - accept.accessibilityIdentifier = "I_call_view_accept" - accept.accessibilityLabel = "Accept" - - // Decline - let decline = CallControlButton(width: CallControlButton.hungup_width, imageInset:AbstractIncomingOutgoingCallView.answer_decline_inset, buttonTheme: VoipTheme.call_terminate, onClickAction: { - self.callData.map { CallManager.instance().terminateCall(call: $0.call.getCobject)} - }) - view.addSubview(decline) - decline.centerX(withDx: -buttons_distance_from_center_x).alignParentBottom(withMargin:SharedLayoutConstants.buttons_bottom_margin).done() - decline.accessibilityIdentifier = "I_call_view_decline" - decline.accessibilityLabel = "Decline" - } - - @objc override func setCall(call:OpaquePointer) { - super.setCall(call: call) - callData?.iFrameReceived.observe(onChange: { (video) in - if (video == true) { - Core.get().nativeVideoWindow = self.earlyMediaView - self.earlyMediaView?.isHidden = false - } - }) - callData?.callState.readCurrentAndObserve(onChange: { (state) in - if (ConfigManager.instance().lpConfigBoolForKey(key: "pref_accept_early_media") && state == .IncomingReceived) { - try?self.callData?.call.acceptEarlyMedia() - self.callData?.call.requestNotifyNextVideoFrameDecoded() - } - }) - callData?.isIncoming.readCurrentAndObserve { (incoming) in - if (incoming != true) { - PhoneMainView.instance().popView(self.compositeViewDescription()) - } - } - - if (ConfigManager.instance().lpConfigBoolForKey(key: "auto_answer")) { - CallManager.instance().acceptCall(call: call, hasVideo: false) // TODO check with old version for Video accept separate button - Not implemented in Android - } - } - - -} diff --git a/Classes/Swift/Voip/Views/CompositeViewControllers/OutgoingCallView.swift b/Classes/Swift/Voip/Views/CompositeViewControllers/OutgoingCallView.swift deleted file mode 100644 index 7470bcd01..000000000 --- a/Classes/Swift/Voip/Views/CompositeViewControllers/OutgoingCallView.swift +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import linphonesw - -@objc class OutgoingCallView: AbstractIncomingOutgoingCallView, UICompositeViewDelegate { - - // Layout constants - let numpad_icon_padding = 10.0 - - var numpadView : NumpadView? = nil - var showNumPad : CallControlButton? = nil - var shadingMask = UIView() - - - static let compositeDescription = UICompositeViewDescription(OutgoingCallView.self, statusBar: StatusBarView.self, tabBar: nil, sideMenu: nil, fullscreen: false, isLeftFragment: false,fragmentWith: nil) - static func compositeViewDescription() -> UICompositeViewDescription! { return compositeDescription } - func compositeViewDescription() -> UICompositeViewDescription! { return OutgoingCallView.compositeDescription } - - override func viewDidLoad() { - super.viewDidLoad(forCallType: VoipTexts.call_outgoing_title) - - // Cancel - let cancelCall = CallControlButton(width: CallControlButton.hungup_width, imageInset:AbstractIncomingOutgoingCallView.answer_decline_inset, buttonTheme: VoipTheme.call_terminate, onClickAction: { - self.callData.map { CallManager.instance().terminateCall(call: $0.call.getCobject)} - }) - view.addSubview(cancelCall) - cancelCall.alignParentLeft(withMargin:SharedLayoutConstants.margin_call_view_side_controls_buttons).alignParentBottom(withMargin:SharedLayoutConstants.buttons_bottom_margin).done() - cancelCall.accessibilityIdentifier = "O_call_view_cancel" - cancelCall.accessibilityLabel = "Cancel" - - // Controls - let controlsView = ControlsView(showVideo: false, controlsViewModel: ControlsViewModel.shared) - view.addSubview(controlsView) - controlsView.alignParentBottom(withMargin:SharedLayoutConstants.buttons_bottom_margin).centerX().done() - - // Shading mask, everything after will be shaded upon displayed - shadingMask.backgroundColor = VoipTheme.voip_translucent_popup_background - shadingMask.isHidden = true - self.view.addSubview(shadingMask) - shadingMask.matchParentDimmensions().done() - - // Numpad - showNumPad = CallControlButton(imageInset:UIEdgeInsets(top: numpad_icon_padding, left: numpad_icon_padding, bottom: numpad_icon_padding, right: numpad_icon_padding), buttonTheme: VoipTheme.call_numpad, onClickAction: { - self.numpadView?.removeFromSuperview() - self.shadingMask.isHidden = false - self.numpadView = NumpadView(superView: self.view,callData: self.callData!, marginTop: 0.0,above:controlsView, onDismissAction: { - self.numpadView?.removeFromSuperview() - self.shadingMask.isHidden = true - }) - }) - view.addSubview(showNumPad!) - showNumPad?.alignParentRight(withMargin:SharedLayoutConstants.margin_call_view_side_controls_buttons).alignParentBottom(withMargin:SharedLayoutConstants.buttons_bottom_margin).done() - showNumPad!.isHidden = true - - // Audio Routes - let audioRoutesView = AudioRoutesView() - view.addSubview(audioRoutesView) - audioRoutesView.alignBottomWith(otherView: controlsView).done() - ControlsViewModel.shared.audioRoutesSelected.readCurrentAndObserve { (audioRoutesSelected) in - audioRoutesView.isHidden = audioRoutesSelected != true - } - audioRoutesView.alignAbove(view:controlsView,withMargin:SharedLayoutConstants.buttons_bottom_margin).matchRightOf(view: controlsView, withMargin:+ControlsView.controls_button_spacing).done() - } - - - override func viewWillAppear(_ animated: Bool) { - ControlsViewModel.shared.audioRoutesSelected.value = false - super.viewWillAppear(animated) - if (Core.get().callsNb == 0) { - PhoneMainView.instance().popView(self.compositeViewDescription()) - } - } - - @objc override func setCall(call:OpaquePointer) { - super.setCall(call: call) - self.callData?.outgoingEarlyMedia.readCurrentAndObserve(onChange: { (outgoingEM) in - self.showNumPad!.isHidden = outgoingEM != true - }) - callData?.isOutgoing.readCurrentAndObserve { (outgoing) in - if (outgoing != true) { - PhoneMainView.instance().popView(self.compositeViewDescription()) - } - } - } - - -} diff --git a/Classes/Swift/Voip/Views/CompositeViewControllers/SingleCallView.swift b/Classes/Swift/Voip/Views/CompositeViewControllers/SingleCallView.swift deleted file mode 100644 index badd8a4fe..000000000 --- a/Classes/Swift/Voip/Views/CompositeViewControllers/SingleCallView.swift +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import linphonesw -import AVKit - - -@objc class SingleCallView: AbstractCallView, UICompositeViewDelegate { - - var callPausedByRemoteView : PausedCallOrConferenceView? = nil - var callPausedByLocalView : PausedCallOrConferenceView? = nil - var currentCallView : ActiveCallView? = nil - - private var pipController: AVPictureInPictureController! - private var pipRemoteVideoView = SampleBufferVideoCallView() - - static let compositeDescription = UICompositeViewDescription(SingleCallView.self, statusBar: StatusBarView.self, tabBar: nil, sideMenu: nil, fullscreen: false, isLeftFragment: false,fragmentWith: nil) - static func compositeViewDescription() -> UICompositeViewDescription! { return compositeDescription } - func compositeViewDescription() -> UICompositeViewDescription! { return type(of: self).compositeDescription } - - override func viewDidLoad() { - super.viewDidLoad() - - // Current (Single) Call (VoipCallView) - currentCallView = ActiveCallView() - fullScreenMutableContainerView.addSubview(currentCallView!) - CallsViewModel.shared.currentCallData.readCurrentAndObserve { (currentCallData) in - guard currentCallData??.isOngoingSingleCall() == true else { - return - } - self.currentCallView!.callData = currentCallData != nil ? currentCallData! : nil - currentCallData??.isRemotelyPaused.readCurrentAndObserve { remotelyPaused in - self.callPausedByRemoteView?.isHidden = remotelyPaused != true - } - currentCallData??.isPaused.readCurrentAndObserve { locallyPaused in - self.callPausedByLocalView?.isHidden = locallyPaused != true - } - if (currentCallData == nil) { - self.callPausedByRemoteView?.isHidden = true - self.callPausedByLocalView?.isHidden = true - - } - self.extraButtonsView.isHidden = true - } - - currentCallView!.matchParentDimmensions().done() - - // Paused by remote (Call) - callPausedByRemoteView = PausedCallOrConferenceView(iconName: "voip_conference_paused_big",titleText: VoipTexts.call_remotely_paused_title,subTitleText: nil) - view.addSubview(callPausedByRemoteView!) - callPausedByRemoteView?.matchParentSideBorders().matchParentHeight().alignAbove(view:controlsView,withMargin:SharedLayoutConstants.buttons_bottom_margin).done() - callPausedByRemoteView?.isHidden = true - - // Paused by local (Call) - callPausedByLocalView = PausedCallOrConferenceView(iconName: "voip_conference_play_big",titleText: VoipTexts.call_locally_paused_title,subTitleText: VoipTexts.call_locally_paused_subtitle, onClickAction: { - CallsViewModel.shared.currentCallData.value??.togglePause() - }) - view.addSubview(callPausedByLocalView!) - callPausedByLocalView?.matchParentSideBorders().matchParentHeight().alignAbove(view:controlsView,withMargin:SharedLayoutConstants.buttons_bottom_margin).done() - callPausedByLocalView?.isHidden = true - - // Video activation dialog request - CallsViewModel.shared.callUpdateEvent.observe { (call) in - let core = Core.get() - if (call?.state == .StreamsRunning) { - self.videoAcceptDialog?.removeFromSuperview() - self.videoAcceptDialog = nil - } else if (call?.state == .UpdatedByRemote) { - if ((core.videoCaptureEnabled || core.videoDisplayEnabled) && Core.get().config?.getBool(section: "app", key: "disable_video_feature", defaultValue: false) == false) { - if (call?.currentParams?.videoEnabled != call?.remoteParams?.videoEnabled) { - let accept = ButtonAttributes(text:VoipTexts.dialog_accept, action: {call?.answerVideoUpdateRequest(accept: true)}, isDestructive:false) - let cancel = ButtonAttributes(text:VoipTexts.dialog_decline, action: {call?.answerVideoUpdateRequest(accept: false)}, isDestructive:true) - self.videoAcceptDialog = VoipDialog(message:VoipTexts.call_video_update_requested_dialog, givenButtons: [cancel,accept]) - self.videoAcceptDialog?.show() - } - } else { - if (Core.get().config?.getBool(section: "app", key: "disable_video_feature", defaultValue: false) == true) { - call?.answerVideoUpdateRequest(accept: false) - } - Log.w("[Call] Video display & capture are disabled, don't show video dialog") - } - } - } - view.onClick { - ControlsViewModel.shared.audioRoutesSelected.value = false - } - - // picture in picture init - if #available(iOS 15.0, *) { - DispatchQueue.main.async { self.configurationPiPViewController() } - } - } - - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(true) - CallsViewModel.shared.currentCallData.notifyValue() - } - - override func didRotate(from fromInterfaceOrientation: UIInterfaceOrientation) { - super.didRotate(from: fromInterfaceOrientation) - self.currentCallView?.layoutRotatableElements() - } - - // Picture in picture on video call - override func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) - if (pipController != nil && CallsViewModel.shared.currentCallData.value??.call.state == .StreamsRunning && pipController.isPictureInPicturePossible) { - pipController.startPictureInPicture() - } - } - - override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - if pipController != nil && pipController.isPictureInPictureActive { - pipController.stopPictureInPicture() - } - } - -} - -// Picture in picture on video call -@available(iOS 15.0, *) -extension SingleCallView : AVPictureInPictureControllerDelegate { - - func configurationPiPViewController() { - let pipVideoCallController = PictureInPictureVideoCallViewController() - pipRemoteVideoView = pipVideoCallController.pipRemoteVideoView - let pipContentSource = AVPictureInPictureController.ContentSource( - activeVideoCallSourceView: currentCallView!.remoteVideo, - contentViewController: pipVideoCallController) - pipController = AVPictureInPictureController(contentSource: pipContentSource) - if (pipController != nil) { - pipController.delegate = self - - ControlsViewModel.shared.isVideoEnabled.readCurrentAndObserve{ (video) in - pipVideoCallController.matchVideoDimension() - self.pipController.canStartPictureInPictureAutomaticallyFromInline = video == true - } - - CallsViewModel.shared.currentCallData.observe(onChange: { callData in - if (callData??.call.state != .StreamsRunning && self.pipController.isPictureInPictureActive) { - self.pipController.stopPictureInPicture() - } - }) - } - } - - - func pictureInPictureControllerWillStartPictureInPicture(_ pictureInPictureController: AVPictureInPictureController) { - Core.get().nativeVideoWindow = pipRemoteVideoView - } - - func pictureInPictureControllerDidStopPictureInPicture(_ pictureInPictureController: AVPictureInPictureController) { - Core.get().nativeVideoWindow = currentCallView?.remoteVideo - } - - func pictureInPictureController(_ pictureInPictureController: AVPictureInPictureController, failedToStartPictureInPictureWithError error: Error) { - Core.get().nativeVideoWindow = currentCallView?.remoteVideo - Log.e("Start Picture in Picture video call error : \(error)") - DispatchQueue.main.async { self.configurationPiPViewController() } - } - - func pictureInPictureController(_ pictureInPictureController: AVPictureInPictureController, restoreUserInterfaceForPictureInPictureStopWithCompletionHandler completionHandler: @escaping (Bool) -> Void) { - if (CallsViewModel.shared.currentCallData.value??.call.state == .StreamsRunning && PhoneMainView.instance().currentView != self.compositeViewDescription()) { - PhoneMainView.instance().changeCurrentView(self.compositeViewDescription()) - Core.get().nativeVideoWindow = pipRemoteVideoView // let the video on the pip view during the stop animation - } - pictureInPictureController.contentSource?.activeVideoCallContentViewController.view.layer.cornerRadius = ActiveCallView.center_view_corner_radius - completionHandler(true) - } -} - -@available(iOS 15.0, *) -class PictureInPictureVideoCallViewController : AVPictureInPictureVideoCallViewController { - - var pipRemoteVideoView = SampleBufferVideoCallView() - - override func viewDidLoad() { - super.viewDidLoad() - - view.backgroundColor = .black - view.clipsToBounds = true - view.addSubview(pipRemoteVideoView) - } - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - view.layer.cornerRadius = 0 - } - - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - matchVideoDimension() - } - - func matchVideoDimension() { - let videoDefinition = CallsViewModel.shared.currentCallData.value??.call.currentParams?.receivedVideoDefinition - if (videoDefinition != nil) { - self.preferredContentSize = CGSize(width: Double(videoDefinition!.width), height: Double(videoDefinition!.height)) - pipRemoteVideoView.frame = view.bounds - } - } -} - -class SampleBufferVideoCallView: UIView { - override class var layerClass: AnyClass { - AVSampleBufferDisplayLayer.self - } - - var sampleBufferDisplayLayer: AVSampleBufferDisplayLayer { - layer as! AVSampleBufferDisplayLayer - } -} - diff --git a/Classes/Swift/Voip/Views/Fragments/ActiveCall/ActiveCallView.swift b/Classes/Swift/Voip/Views/Fragments/ActiveCall/ActiveCallView.swift deleted file mode 100644 index fb0d7085b..000000000 --- a/Classes/Swift/Voip/Views/Fragments/ActiveCall/ActiveCallView.swift +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import SnapKit -import linphonesw - -class ActiveCallView: UIView { // = currentCall - - // Layout constants : - static let top_displayname_margin_top = 20.0 - let sip_address_margin_top = 4.0 - static let remote_recording_margin_top = 10.0 - static let remote_recording_height = 30 - static let bottom_displayname_margin_bottom = 10.0 - static let bottom_displayname_margin_left = 12.0 - static let center_view_margin_top = 15.0 - static let center_view_corner_radius = 20.0 - let record_pause_button_size = 40 - let record_pause_button_inset = UIEdgeInsets(top: 7, left: 7, bottom: 7, right: 7) - let record_pause_button_margin = 10.0 - static let local_video_width = 150.0 - static let local_video_margins = 15.0 - - - let upperSection = UIStackView() - let displayNameTop = StyledLabel(VoipTheme.call_display_name_duration) - let duration = CallTimer(nil, VoipTheme.call_display_name_duration) - let sipAddress = StyledLabel(VoipTheme.call_sip_address) - let remotelyRecordedIndicator = RemotelyRecordingView(height: ActiveCallView.remote_recording_height,text: VoipTexts.call_remote_recording) - - let centerSection = UIView() - let avatar = Avatar(color:VoipTheme.voipBackgroundColor, textStyle: VoipTheme.call_generated_avatar_large) - let displayNameBottom = StyledLabel(VoipTheme.call_remote_name) - var recordCallButtons : [CallControlButton] = [] - var pauseCallButtons : [CallControlButton] = [] - let remoteVideo = UIView() - let localVideo = LocalVideoView(width: local_video_width) - - var callData: CallData? = nil { - didSet { - guard let callData = callData else { - return - } - duration.call = callData.call - callData.call.remoteAddress.map { - avatar.fillFromAddress(address: $0) - if let displayName = $0.addressBookEnhancedDisplayName() { - displayNameTop.text = displayName+" - " - displayNameBottom.text = displayName - } - sipAddress.text = $0.asStringUriOnly() - } - self.remotelyRecordedIndicator.isRemotelyRecorded = callData.isRemotelyRecorded - callData.isRecording.readCurrentAndObserve { (selected) in - self.recordCallButtons.forEach { - $0.isSelected = selected == true - } - } - callData.isPaused.readCurrentAndObserve { (paused) in - self.pauseCallButtons.forEach { - $0.isSelected = paused == true - } - if (paused == true) { - self.localVideo.isHidden = true - } - } - callData.isRemotelyRecorded.readCurrentAndObserve { (remotelyRecorded) in - self.centerSection.removeConstraints().matchParentSideBorders().alignUnder(view:remotelyRecorded == true ? self.remotelyRecordedIndicator : self.upperSection ,withMargin: ActiveCallView.center_view_margin_top).alignParentBottom().done() - self.setNeedsLayout() - } - - Core.get().nativeVideoWindow = remoteVideo - Core.get().nativePreviewWindowId = UnsafeMutableRawPointer(Unmanaged.passRetained(localVideo).toOpaque()) - - ControlsViewModel.shared.isVideoEnabled.readCurrentAndObserve{ (video) in - self.remoteVideo.isHidden = video != true - self.localVideo.isHidden = video != true - self.recordCallButtons.first?.isHidden = video != true - self.pauseCallButtons.first?.isHidden = video != true - self.recordCallButtons.last?.isHidden = video == true - self.pauseCallButtons.last?.isHidden = video == true - UIApplication.shared.isIdleTimerDisabled = video == true - } - - } - } - - init() { - super.init(frame: .zero) - let stack = UIStackView() - stack.distribution = .equalSpacing - stack.alignment = .bottom - stack.spacing = record_pause_button_margin - stack.axis = .vertical - - let displayNameDurationSipAddress = UIView() - - displayNameDurationSipAddress.addSubview(displayNameTop) - displayNameTop.alignParentLeft().done() - - displayNameDurationSipAddress.addSubview(duration) - duration.toRightOf(displayNameTop).alignParentRight().done() - duration.accessibilityIdentifier = "active_call_upper_section_duration" - - displayNameDurationSipAddress.addSubview(sipAddress) - sipAddress.matchParentSideBorders().alignUnder(view: displayNameTop,withMargin:sip_address_margin_top).done() - - upperSection.distribution = .equalSpacing - upperSection.alignment = .center - upperSection.spacing = record_pause_button_margin - upperSection.axis = .horizontal - - upperSection.addArrangedSubview(displayNameDurationSipAddress) - displayNameDurationSipAddress.wrapContentY().done() - - let recordPauseView = UIStackView() - recordPauseView.spacing = record_pause_button_margin - - // Record (with video) - var recordCall = CallControlButton(width: record_pause_button_size, height: record_pause_button_size, imageInset:record_pause_button_inset, buttonTheme: VoipTheme.call_record, onClickAction: { - self.callData.map { $0.toggleRecord() } - }) - recordCallButtons.append(recordCall) - recordPauseView.addArrangedSubview(recordCall) - recordCall.accessibilityIdentifier = "active_call_upper_section_record" - recordCall.accessibilityLabel = "Record Call" - - // Pause (with video) - var pauseCall = CallControlButton(width: record_pause_button_size, height: record_pause_button_size, imageInset:record_pause_button_inset, buttonTheme: VoipTheme.call_pause, onClickAction: { - self.callData.map { $0.togglePause() } - }) - pauseCallButtons.append(pauseCall) - recordPauseView.addArrangedSubview(pauseCall) - upperSection.addArrangedSubview(recordPauseView) - pauseCall.accessibilityIdentifier = "active_call_upper_section_pause" - pauseCall.accessibilityLabel = "Pause Call" - - - stack.addArrangedSubview(upperSection) - upperSection.matchParentSideBorders().alignParentTop(withMargin:ActiveCallView.top_displayname_margin_top).done() - - - stack.addArrangedSubview(remotelyRecordedIndicator) - remotelyRecordedIndicator.matchParentSideBorders().height(CGFloat(ActiveCallView.remote_recording_height)).done() - - // Center Section : Avatar + video + record/pause buttons + videos - centerSection.layer.cornerRadius = ActiveCallView.center_view_corner_radius - centerSection.clipsToBounds = true - centerSection.backgroundColor = VoipTheme.voipParticipantBackgroundColor.get() - //centerSection.removeConstraints().matchParentSideBorders().alignUnder(view: remotelyRecordedIndicator, withMargin: ActiveCallView.center_view_margin_top).alignParentBottom().done() - - // Record (w/o video) - recordCall = CallControlButton(width: record_pause_button_size, height: record_pause_button_size, imageInset:record_pause_button_inset, buttonTheme: VoipTheme.call_record, onClickAction: { - self.callData.map { $0.toggleRecord() } - }) - recordCallButtons.append(recordCall) - centerSection.addSubview(recordCall) - recordCall.alignParentLeft(withMargin:record_pause_button_margin).alignParentTop(withMargin:record_pause_button_margin).done() - recordCall.accessibilityIdentifier = "active_call_center_section_record" - recordCall.accessibilityLabel = "Record Call" - - // Pause (w/o video) - pauseCall = CallControlButton(width: record_pause_button_size, height: record_pause_button_size, imageInset:record_pause_button_inset, buttonTheme: VoipTheme.call_pause, onClickAction: { - self.callData.map { $0.togglePause() } - }) - pauseCallButtons.append(pauseCall) - centerSection.addSubview(pauseCall) - pauseCall.alignParentRight(withMargin:record_pause_button_margin).alignParentTop(withMargin:record_pause_button_margin).done() - pauseCall.accessibilityIdentifier = "active_call_center_section_pause" - pauseCall.accessibilityLabel = "Pause Call" - - // Avatar - centerSection.addSubview(avatar) - - // Remote Video Display - centerSection.addSubview(remoteVideo) - remoteVideo.isHidden = true - remoteVideo.matchParentDimmensions().done() - - // Local Video Display - centerSection.addSubview(localVideo) - localVideo.backgroundColor = .black - localVideo.alignParentBottom(withMargin: ActiveCallView.local_video_margins).alignParentRight(withMargin: ActiveCallView.local_video_margins).done() - localVideo.isHidden = true - localVideo.dragZone = centerSection - - // Full screen video togggle - remoteVideo.onClick { - ControlsViewModel.shared.toggleFullScreen() - } - ControlsViewModel.shared.fullScreenMode.observe { (fullScreen) in - if (self.superview?.superview?.superview == nil) { - return - } - self.remoteVideo.removeConstraints().done() - self.localVideo.removeConstraints().done() - if (fullScreen == true) { - self.remoteVideo.removeFromSuperview() - self.localVideo.removeFromSuperview() - PhoneMainView.instance().mainViewController.view?.addSubview(self.remoteVideo) - PhoneMainView.instance().mainViewController.view?.addSubview(self.localVideo) - } else { - self.remoteVideo.removeFromSuperview() - self.localVideo.removeFromSuperview() - self.centerSection.addSubview(self.remoteVideo) - self.centerSection.addSubview(self.localVideo) - } - self.remoteVideo.matchParentDimmensions().done() - self.localVideo.alignParentBottom(withMargin: ActiveCallView.local_video_margins).alignParentRight(withMargin: ActiveCallView.local_video_margins).done() - self.localVideo.setSizeConstraint() - } - - - // Bottom display name - centerSection.addSubview(displayNameBottom) - displayNameBottom.alignParentLeft(withMargin:ActiveCallView.bottom_displayname_margin_left).alignParentRight().alignParentBottom(withMargin:ActiveCallView.bottom_displayname_margin_bottom).done() - - stack.addArrangedSubview(centerSection) - - addSubview(stack) - stack.matchParentDimmensions().done() - - layoutRotatableElements() - } - - func layoutRotatableElements() { - avatar.removeConstraints().done() - if ([.landscapeLeft, .landscapeRight].contains( UIDevice.current.orientation)) { - avatar.square(Avatar.diameter_for_call_views_land).center().done() - } else { - avatar.square(Avatar.diameter_for_call_views).center().done() - } - localVideo.updateSizeConstraint() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - -} diff --git a/Classes/Swift/Voip/Views/Fragments/AudioRoutesView.swift b/Classes/Swift/Voip/Views/Fragments/AudioRoutesView.swift deleted file mode 100644 index ad5a02544..000000000 --- a/Classes/Swift/Voip/Views/Fragments/AudioRoutesView.swift +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -class AudioRoutesView: UIStackView { - - // Layout constants - let corner_radius = 6.7 - let margin = 10.0 - - init () { - super.init(frame: .zero) - axis = .vertical - distribution = .equalCentering - alignment = .center - spacing = ControlsView.controls_button_spacing - backgroundColor = VoipTheme.voip_gray - layer.cornerRadius = corner_radius - clipsToBounds = true - - // bluetooth - let blueTooth = CallControlButton(buttonTheme: VoipTheme.route_bluetooth, onClickAction: { - ControlsViewModel.shared.forceBluetoothAudioRoute() - ControlsViewModel.shared.audioRoutesSelected.value = false - }) - addArrangedSubview(blueTooth) - - ControlsViewModel.shared.isBluetoothHeadsetSelected.readCurrentAndObserve { (selected) in - blueTooth.isSelected = selected == true - } - - // Earpiece - let earpiece = CallControlButton(buttonTheme: VoipTheme.route_earpiece, onClickAction: { - ControlsViewModel.shared.forceEarpieceAudioRoute() - ControlsViewModel.shared.audioRoutesSelected.value = false - }) - addArrangedSubview(earpiece) - ControlsViewModel.shared.isSpeakerSelected.readCurrentAndObserve { (isSpeakerSelected) in - earpiece.isSelected = isSpeakerSelected != true && ControlsViewModel.shared.isBluetoothHeadsetSelected.value != true - } - ControlsViewModel.shared.isBluetoothHeadsetSelected.readCurrentAndObserve { (isBluetoothHeadsetSelected) in - earpiece.isSelected = isBluetoothHeadsetSelected != true && ControlsViewModel.shared.isSpeakerSelected.value != true - } - - // Speaker - let speaker = CallControlButton(buttonTheme: VoipTheme.route_speaker, onClickAction: { - ControlsViewModel.shared.forceSpeakerAudioRoute() - ControlsViewModel.shared.audioRoutesSelected.value = false - }) - addArrangedSubview(speaker) - ControlsViewModel.shared.isSpeakerSelected.readCurrentAndObserve { (selected) in - speaker.isSelected = selected == true - } - - size(w:CGFloat(CallControlButton.default_size)+margin, h : 3*CGFloat(CallControlButton.default_size)+2*CGFloat(ControlsView.controls_button_spacing)+margin).done() - - } - - required init(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - -} - - diff --git a/Classes/Swift/Voip/Views/Fragments/CallStatsView.swift b/Classes/Swift/Voip/Views/Fragments/CallStatsView.swift deleted file mode 100644 index d49c49ca6..000000000 --- a/Classes/Swift/Voip/Views/Fragments/CallStatsView.swift +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import linphonesw - - -@objc class CallStatsView: UIView{ - - // Layout constants - let side_margins = 10.0 - let margin_top = 25 - let corner_radius = 20.0 - let audio_video_margin = 13 - - init(superView:UIView, callData:CallData, marginTop:CGFloat, above:UIView, onDismissAction : @escaping ()->Void) { - super.init(frame:.zero) - backgroundColor = VoipTheme.voip_translucent_popup_background - layer.cornerRadius = corner_radius - clipsToBounds = true - superView.addSubview(self) - matchParentSideBorders(insetedByDx: side_margins).alignParentTop(withMargin: marginTop).alignAbove(view: above,withMargin: SharedLayoutConstants.buttons_bottom_margin).done() - accessibilityIdentifier = "call_stats_view" - accessibilityViewIsModal = true - - callData.callState.observe { state in - if (state == Call.State.End) { - onDismissAction() - } - } - - // Hide call stats button - let hide = CallControlButton(buttonTheme: VoipTheme.voip_cancel_light, onClickAction: { - onDismissAction() - }) - addSubview(hide) - hide.alignParentRight(withMargin: side_margins).alignParentTop(withMargin: side_margins).done() - hide.accessibilityIdentifier = "call_stats_view_hide" - hide.accessibilityLabel = "Hide" - - // Audio Stats Title - let model = CallStatisticsData(call: callData.call) - let encryptionTitle = StyledLabel(VoipTheme.call_stats_font_title,NSLocalizedString("Encryption", comment: "")) - addSubview(encryptionTitle) - encryptionTitle.matchParentSideBorders().alignParentTop(withMargin: margin_top).done() - - let encryptionStats = StyledLabel(VoipTheme.call_stats_font) - - encryptionStats.numberOfLines = 0 - addSubview(encryptionStats) - encryptionStats.matchParentSideBorders().alignUnder(view: encryptionTitle).done() - - - let audioTitle = StyledLabel(VoipTheme.call_stats_font_title,NSLocalizedString("Audio", comment: "")) - addSubview(audioTitle) - audioTitle.alignUnder(view: encryptionStats, withMargin:audio_video_margin).matchParentSideBorders().done() - - let audioStats = StyledLabel(VoipTheme.call_stats_font) - audioStats.numberOfLines = 0 - addSubview(audioStats) - audioStats.matchParentSideBorders().alignUnder(view: audioTitle).done() - - // Video Stats Title - let videoTitle = StyledLabel(VoipTheme.call_stats_font_title,NSLocalizedString("Video", comment: "")) - addSubview(videoTitle) - videoTitle.alignUnder(view: audioStats, withMargin:audio_video_margin).matchParentSideBorders().done() - - // Video Stats Corp - let videoStats = StyledLabel(VoipTheme.call_stats_font) - videoStats.numberOfLines = 0 - addSubview(videoStats) - videoStats.matchParentSideBorders().alignUnder(view: videoTitle).done() - - model.isVideoEnabled.readCurrentAndObserve { (video) in - videoTitle.isHidden = video != true - videoStats.isHidden = video != true - } - - model.statsUpdated.readCurrentAndObserve { (updated) in - var stats = "" - model.audioStats.forEach { - stats += "\n\($0.getTypeTitle())\($0.value.value ?? "n/a")" - } - audioStats.text = stats - stats = "" - model.videoStats.forEach { - stats += "\n\($0.getTypeTitle())\($0.value.value ?? "n/a")" - } - videoStats.text = stats - - if let mediaEncryption = model.call.currentParams?.mediaEncryption { - stats = "" - switch (mediaEncryption) { - case MediaEncryption.None: stats += "\nNone" - case MediaEncryption.SRTP: stats += "\nSRTP" - case MediaEncryption.DTLS: stats += "\nDTLS" - case MediaEncryption.ZRTP: - if let callstats = model.call.audioStats { - stats += callstats.isZrtpKeyAgreementAlgoPostQuantum ? "\nPost Quantum ZRTP" : "\nZRTP" - stats += "\nCipher algorithm: \(callstats.zrtpCipherAlgo)" - stats += "\nKey agreement algorithm: \(callstats.zrtpKeyAgreementAlgo)" - stats += "\nHash algorithm: \(callstats.zrtpHashAlgo)" - stats += "\nAuth tag algorithm: \(callstats.zrtpAuthTagAlgo)" - stats += "\nSas algorithm: \(callstats.zrtpSasAlgo)" - } - } - encryptionStats.text = stats - } - } - - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - -} - - - diff --git a/Classes/Swift/Voip/Views/Fragments/CallsList/CallsListView.swift b/Classes/Swift/Voip/Views/Fragments/CallsList/CallsListView.swift deleted file mode 100644 index 7716a26f6..000000000 --- a/Classes/Swift/Voip/Views/Fragments/CallsList/CallsListView.swift +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import linphonesw - -@objc class CallsListView: DismissableView, UITableViewDataSource { - - // Layout constants - let buttons_distance_from_center_x = 38 - let buttons_size = 60 - - let callsListTableView = UITableView() - let menuView = VoipCallContextMenu() - - var callsDataObserver : MutableLiveDataOnChangeClosure<[CallData]>? = nil - - - - init() { - super.init(title: VoipTexts.call_action_calls_list) - accessibilityIdentifier = "calls_list_view" - - // New Call - let newCall = CallControlButton(width: buttons_size,height: buttons_size, imageInset:UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10), buttonTheme: VoipTheme.call_add, onClickAction: { - let view: DialerView = self.VIEW(DialerView.compositeViewDescription()); - view.setAddress("") - CallManager.instance().nextCallIsTransfer = false - PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) - }) - addSubview(newCall) - newCall.centerX(withDx: -buttons_distance_from_center_x).alignParentBottom(withMargin:SharedLayoutConstants.buttons_bottom_margin).done() - - // Merge Calls - let mergeIntoLocalConference = CallControlButton(width: buttons_size,height: buttons_size, buttonTheme: VoipTheme.call_merge, onClickAction: { - self.removeFromSuperview() - if (ConferenceViewModel.shared.conferenceExists.value == true) { - ConferenceViewModel.shared.addCallsToConference() - } else { - CallsViewModel.shared.mergeCallsIntoLocalConference() - } - }) - addSubview(mergeIntoLocalConference) - mergeIntoLocalConference.centerX(withDx: buttons_distance_from_center_x).alignParentBottom(withMargin:SharedLayoutConstants.buttons_bottom_margin).done() - - - CallsViewModel.shared.callsData.readCurrentAndObserve { _ in - self.callsListTableView.reloadData() - mergeIntoLocalConference.isEnabled = self.mergeToConferencePossible() - } - ConferenceViewModel.shared.conferenceExists.readCurrentAndObserve { _ in - mergeIntoLocalConference.isEnabled = self.mergeToConferencePossible() - } - - - // CallsList - super.contentView.addSubview(callsListTableView) - callsListTableView.matchParentDimmensions().done() - callsListTableView.dataSource = self - callsListTableView.register(VoipCallCell.self, forCellReuseIdentifier: "VoipCallCell") - callsListTableView.allowsSelection = false - if #available(iOS 15.0, *) { - callsListTableView.allowsFocus = false - } - callsListTableView.separatorStyle = .singleLine - callsListTableView.onClick { - self.hideMenu() - } - - // Floating menu - super.contentView.addSubview(menuView) - - menuView.isHidden = true - - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - super.contentView.backgroundColor = VoipTheme.voipBackgroundBWColor.get() - self.callsListTableView.backgroundColor = VoipTheme.voipBackgroundBWColor.get() - self.callsListTableView.separatorColor = VoipTheme.separatorColor.get() - self.callsListTableView.reloadData() - } - - } - - - func numberOfCallsNotInConf() -> Int { - let core = Core.get() - var result = 0 - core.calls.forEach { call in - if (call.conference == nil && core.findConferenceInformationFromUri(uri: call.remoteAddress!) == nil) { - result += 1 - } - } - return result - } - - func mergeToConferencePossible() -> Bool { // 2 calls or more not in conf or 1 call or more and 1 conf - let callsNotInConf = numberOfCallsNotInConf() - return (ConferenceViewModel.shared.conferenceExists.value == true && callsNotInConf >= 1 && ConferenceViewModel.shared.conference.value?.me?.isAdmin == true) || (ConferenceViewModel.shared.conferenceExists.value != true && callsNotInConf >= 2 ) - } - - - func toggleMenu(forCell:VoipCallCell) { - if (menuView.isHidden) { - showMenu(forCell: forCell) - } else if (menuView.callData?.call.callLog?.callId != forCell.callData?.call.callLog?.callId) { - hideMenu() - showMenu(forCell: forCell) - } else { - hideMenu() - } - } - - func showMenu(forCell:VoipCallCell) { - menuView.removeConstraints().alignUnder(view: forCell).alignParentRight().done() - menuView.callData = forCell.callData - menuView.isHidden = false - } - - func hideMenu() { - menuView.isHidden = true - } - - // TableView datasource delegate - - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - guard let callsData = CallsViewModel.shared.callsData.value else { - return 0 - } - return callsData.count - } - - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell:VoipCallCell = tableView.dequeueReusableCell(withIdentifier: "VoipCallCell") as! VoipCallCell - guard let callData = CallsViewModel.shared.callsData.value?[indexPath.row] else { - return cell - } - cell.selectionStyle = .none - cell.callData = callData - cell.owningCallsListView = self - return cell - } - - // View controller - - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - -} diff --git a/Classes/Swift/Voip/Views/Fragments/CallsList/VoipCallCell.swift b/Classes/Swift/Voip/Views/Fragments/CallsList/VoipCallCell.swift deleted file mode 100644 index 9fc3e1d2a..000000000 --- a/Classes/Swift/Voip/Views/Fragments/CallsList/VoipCallCell.swift +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import SnapKit -import linphonesw - -class VoipCallCell: UITableViewCell { - - // Layout Constants - let cell_height = 80.0 - let call_status_icon_size = 65.0 - static let avatar_size = 45.0 - let avatar_left_margin = 40.0 - let texts_left_margin = 20.0 - let side_menu_icon_size = 70.0 - - var onMenuClickAction : (()->Void) = {} - let callStatusIcon = UIImageView() - let avatar = Avatar(color:LightDarkColor(VoipTheme.voip_contact_avatar_calls_list,VoipTheme.voip_contact_avatar_calls_list), textStyle: VoipTheme.call_generated_avatar_small) - let displayName = StyledLabel(VoipTheme.call_list_active_name_font) - let sipAddress = StyledLabel(VoipTheme.call_list_active_sip_uri_font) - var menuButton : CallControlButton? = nil - var owningCallsListView : CallsListView? = nil - - var callData: CallData? = nil { - didSet { - if let data = callData { - contentView.backgroundColor = data.isPaused.value == true ? VoipTheme.voip_calls_list_inactive_background : VoipTheme.voip_dark_gray - callStatusIcon.image = - data.isIncoming.value == true ? UIImage(named:"voip_call_header_incoming") : - data.isOutgoing.value == true ? UIImage(named:"voip_call_header_outgoing") : - data.isPaused.value == true ? UIImage(named:"voip_call_header_paused") : - UIImage(named:"voip_call_header_active") - if (data.isInRemoteConference.value == true) { - displayName.text = data.remoteConferenceSubject.value - //sipAddress.text = data.call.conference?.participantList.map{ String($0.address?.addressBookEnhancedDisplayName())}.joined(separator: ",") - avatar.fillFromAddress(address: data.call.remoteAddress!,isGroup:true) - } else { - displayName.text = data.call.remoteAddress?.addressBookEnhancedDisplayName() - avatar.fillFromAddress(address: data.call.remoteAddress!) - sipAddress.text = data.call.remoteAddress?.asStringUriOnly() - } - displayName.applyStyle(data.isPaused.value == true ? VoipTheme.call_list_name_font : VoipTheme.call_list_active_name_font) - sipAddress.applyStyle(data.isPaused.value == true ? VoipTheme.call_list_sip_uri_font : VoipTheme.call_list_active_sip_uri_font) - menuButton?.applyTintedIcons(tintedIcons: data.isPaused.value == true ? VoipTheme.voip_call_list_menu.tintableStateIcons : VoipTheme.voip_call_list_active_menu.tintableStateIcons) - } - } - } - - - override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { - super.init(style: style, reuseIdentifier: reuseIdentifier) - contentView.height(cell_height).matchParentSideBorders().done() - - contentView.addSubview(callStatusIcon) - callStatusIcon.size(w: call_status_icon_size, h: call_status_icon_size).done() - - contentView.addSubview(avatar) - avatar.size(w: VoipCallCell.avatar_size, h: VoipCallCell.avatar_size).centerY().alignParentLeft(withMargin: avatar_left_margin).done() - - let nameAddress = UIView() - nameAddress.addSubview(displayName) - nameAddress.addSubview(sipAddress) - displayName.alignParentTop().done() - sipAddress.alignUnder(view: displayName).done() - contentView.addSubview(nameAddress) - nameAddress.toRightOf(avatar,withLeftMargin:texts_left_margin).wrapContentY().centerY().done() - - menuButton = CallControlButton(width:Int(side_menu_icon_size), height:Int(side_menu_icon_size), buttonTheme: VoipTheme.voip_call_list_active_menu, onClickAction: { - self.owningCallsListView?.toggleMenu(forCell: self) - }) - addSubview(menuButton!) - menuButton!.alignParentRight().centerY().done() - - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} diff --git a/Classes/Swift/Voip/Views/Fragments/CallsList/VoipCallContextMenu.swift b/Classes/Swift/Voip/Views/Fragments/CallsList/VoipCallContextMenu.swift deleted file mode 100644 index 6e2927b2c..000000000 --- a/Classes/Swift/Voip/Views/Fragments/CallsList/VoipCallContextMenu.swift +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import SnapKit -import linphonesw - -class VoipCallContextMenu: UIStackView { - - //Layout constants - static let item_height = 50.0 - let width = 250.0 - let margin_bw_items = 1.0 - static let texts_margin_left = 10.0 - - - let resume : ButtonWithStateBackgrounds - let pause : ButtonWithStateBackgrounds - let transfer : ButtonWithStateBackgrounds - let answer : ButtonWithStateBackgrounds - let terminate : ButtonWithStateBackgrounds - - var callData: CallData? = nil { - didSet { - callData?.callState.readCurrentAndObserve(onChange: { (state) in - self.resume.isHidden = false - self.pause.isHidden = false - self.transfer.isHidden = false - self.answer.isHidden = false - self.terminate.isHidden = false - var count = 5.0 - - if let callData = self.callData { - if (callData.isPaused.value == true || - callData.isIncoming.value == true || - callData.isOutgoing.value == true || - callData.isInRemoteConference.value == true - ) { - self.pause.isHidden = true - count -= 1 - } - - if (callData.isIncoming.value == true || - callData.isOutgoing.value == true || - callData.isInRemoteConference.value == true - ) { - self.resume.isHidden = true - self.transfer.isHidden = true - count -= 2 - } else if (callData.isPaused.value == false) { - self.resume.isHidden = true - count -= 1 - } - - if (callData.isIncoming.value == false) { - count -= 1 - self.answer.isHidden = true - } - self.size(w:self.width,h:count*VoipCallContextMenu.item_height).done() - } - - }) - } - } - - - init () { - - resume = VoipCallContextMenu.getButton(title: VoipTexts.call_context_action_resume) - pause = VoipCallContextMenu.getButton(title: VoipTexts.call_context_action_pause) - transfer = VoipCallContextMenu.getButton(title: VoipTexts.call_context_action_transfer) - answer = VoipCallContextMenu.getButton(title: VoipTexts.call_context_action_answer) - terminate = VoipCallContextMenu.getButton(title: VoipTexts.call_context_action_hangup) - - super.init(frame: .zero) - backgroundColor = .white - axis = .vertical - spacing = margin_bw_items - - - addArrangedSubview(resume) - addArrangedSubview(pause) - addArrangedSubview(transfer) - addArrangedSubview(answer) - addArrangedSubview(terminate) - - resume.onClick { - self.isHidden = true - guard let call = self.callData?.call else { return } - if (CallManager.callKitEnabled()) { - CallManager.instance().setHeld(call:call.getCobject!,hold:false); - } else { - try?call.resume() - } - } - pause.onClick { - self.isHidden = true - guard let call = self.callData?.call else { return } - if (CallManager.callKitEnabled()) { - CallManager.instance().setHeld(call:call,hold:true); - } else { - try?call.pause() - } - } - transfer.onClick { - let view: DialerView = self.VIEW(DialerView.compositeViewDescription()); - view.setAddress("") - CallManager.instance().nextCallIsTransfer = true - PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) - } - answer.onClick { - self.isHidden = true - guard let call = self.callData?.call else { return } - if (CallManager.callKitEnabled()) { - CallManager.instance().acceptCall(call: call, hasVideo: false) - } else { - try?call.accept() - } - } - terminate.onClick { - self.isHidden = true - guard let call = self.callData?.call else { return } - CallManager.instance().terminateCall(call: call.getCobject) - } - } - - required init(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - static func getButton(title:String) -> ButtonWithStateBackgrounds { - let button = ButtonWithStateBackgrounds(backgroundStateColors: VoipTheme.button_call_context_menu_background) - button.setTitle(title, for: .normal) - button.applyTitleStyle(VoipTheme.call_context_menu_item_font) - button.titleEdgeInsets = UIEdgeInsets(top: 0, left: texts_margin_left, bottom: 0, right: 0) - button.height(VoipCallContextMenu.item_height).done() - return button - } - - - -} diff --git a/Classes/Swift/Voip/Views/Fragments/Conference/MicMuted.swift b/Classes/Swift/Voip/Views/Fragments/Conference/MicMuted.swift deleted file mode 100644 index 14227ea9a..000000000 --- a/Classes/Swift/Voip/Views/Fragments/Conference/MicMuted.swift +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation - -class MicMuted : UIImageView { - required init?(coder: NSCoder) { - super.init(coder: coder) - } - init (_ diameter: Int) { - super.init(image: UIImage(named: "voip_micro_off")?.tinted(with: .white)) - layer.cornerRadius = CGFloat(diameter/2) - clipsToBounds = true - backgroundColor = VoipTheme.voip_dark_gray - square(diameter).done() - } -} diff --git a/Classes/Swift/Voip/Views/Fragments/Conference/VoipActiveSpeakerParticipantCell.swift b/Classes/Swift/Voip/Views/Fragments/Conference/VoipActiveSpeakerParticipantCell.swift deleted file mode 100644 index c37696767..000000000 --- a/Classes/Swift/Voip/Views/Fragments/Conference/VoipActiveSpeakerParticipantCell.swift +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import SnapKit -import linphonesw - -class VoipActiveSpeakerParticipantCell: UICollectionViewCell { - - // Layout Constants - let corner_radius = 20.0 - static let avatar_size = 50.0 - let switch_camera_button_margins = 8.0 - let switch_camera_button_size = 30 - static let mute_size = 25 - let mute_margin = 5 - - - let videoView = UIView() - let avatar = Avatar(color:VoipTheme.voipBackgroundColor, textStyle: VoipTheme.call_generated_avatar_medium) - let pause = UIImageView(image: UIImage(named: "voip_pause")?.tinted(with: .white)) - let switchCamera = UIImageView(image: UIImage(named:"voip_change_camera")?.tinted(with:.white)) - let displayName = StyledLabel(VoipTheme.conference_participant_name_font_as) - let muted = MicMuted(VoipActiveSpeakerParticipantCell.mute_size) - let joining = RotatingSpinner() - - var participantData: ConferenceParticipantDeviceData? = nil { - didSet { - if let data = participantData { - self.updateElements() - data.isJoining.clearObservers() - data.isJoining.observe { _ in - self.updateElements() - } - data.isInConference.clearObservers() - data.isInConference.observe { _ in - self.updateElements() - } - data.videoEnabled.clearObservers() - data.videoEnabled.observe { _ in - self.updateElements() - } - data.participantDevice.address.map { - avatar.fillFromAddress(address: $0) - if let displayName = $0.addressBookEnhancedDisplayName() { - self.displayName.text = displayName - } - } - data.isSpeaking.clearObservers() - data.isSpeaking.observe { _ in - self.updateElements(skipVideo: true) - } - data.micMuted.clearObservers() - data.micMuted.observe { _ in - self.updateElements(skipVideo: true) - } - } - } - } - - func updateElements(skipVideo:Bool = false) { - if let data = participantData { - - // Background - if (data.isInConference.value != true && data.isJoining.value != true) { - self.contentView.backgroundColor = VoipTheme.voip_conference_participant_paused_background - } else if (data.videoEnabled.value == true) { - self.contentView.backgroundColor = .black - } else { - self.contentView.backgroundColor = data.isMe ? VoipTheme.voipParticipantMeBackgroundColor.get() : VoipTheme.voipParticipantBackgroundColor.get() - - } - - // Avatar - self.avatar.isHidden = (data.isInConference.value != true && data.isJoining.value != true) || data.videoEnabled.value == true - - // Video - if (!skipVideo) { - self.videoView.isHidden = data.isInConference.value != true || data.videoEnabled.value != true - if (!self.videoView.isHidden) { - data.setVideoView(view: self.videoView) - } - self.switchCamera.isHidden = self.videoView.isHidden || !data.isSwitchCameraAvailable() - } - - // Pause - self.pause.isHidden = data.isInConference.value == true || data.isJoining.value == true - - // Border for active speaker - self.layer.borderWidth = data.isSpeaking.value == true ? 2 : 0 - - // Joining indicator - if (data.isJoining.value == true) { - self.joining.isHidden = false - self.joining.startRotation() - } else { - self.joining.isHidden = true - self.joining.stopRotation() - } - - // Muted - self.muted.isHidden = data.micMuted.value != true - - } - } - - - override init(frame:CGRect) { - super.init(frame:.zero) - layer.cornerRadius = corner_radius - clipsToBounds = true - layer.borderColor = VoipTheme.primary_color.cgColor - - contentView.addSubview(videoView) - videoView.matchParentDimmensions().done() - - contentView.addSubview(avatar) - avatar.size(w: VoipActiveSpeakerParticipantCell.avatar_size, h: VoipActiveSpeakerParticipantCell.avatar_size).center().done() - - contentView.addSubview(pause) - pause.layer.cornerRadius = VoipActiveSpeakerParticipantCell.avatar_size/2 - pause.clipsToBounds = true - pause.backgroundColor = VoipTheme.voip_gray - pause.size(w: VoipActiveSpeakerParticipantCell.avatar_size, h: VoipActiveSpeakerParticipantCell.avatar_size).center().done() - - contentView.addSubview(switchCamera) - switchCamera.alignParentTop(withMargin: switch_camera_button_margins).alignParentRight(withMargin: switch_camera_button_margins).square(switch_camera_button_size).done() - switchCamera.contentMode = .scaleAspectFit - - switchCamera.onClick { - Core.get().toggleCamera() - } - - contentView.addSubview(displayName) - displayName.matchParentSideBorders(insetedByDx:ActiveCallView.bottom_displayname_margin_left).alignParentBottom(withMargin:ActiveCallView.bottom_displayname_margin_bottom).done() - - contentView.addSubview(muted) - muted.alignParentLeft(withMargin: mute_margin).alignParentTop(withMargin:mute_margin).done() - - contentView.addSubview(joining) - joining.square(VoipActiveSpeakerParticipantCell.mute_size).alignParentTop(withMargin: mute_margin).alignParentLeft(withMargin: mute_margin).done() - - contentView.matchParentDimmensions().done() - makeHeightMatchWidth().done() - - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} diff --git a/Classes/Swift/Voip/Views/Fragments/Conference/VoipAudioOnlyParticipantCell.swift b/Classes/Swift/Voip/Views/Fragments/Conference/VoipAudioOnlyParticipantCell.swift deleted file mode 100644 index 376b88c3d..000000000 --- a/Classes/Swift/Voip/Views/Fragments/Conference/VoipAudioOnlyParticipantCell.swift +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import SnapKit -import linphonesw - -class VoipAudioOnlyParticipantCell: UICollectionViewCell { - - // Layout Constants - static let cell_height = 80.0 - static let avatar_size = 40.0 - static let mute_size = 30 - let corner_radius = 6.7 - let common_margin = 10.0 - - - let avatar = Avatar(color:VoipTheme.voipBackgroundColor, textStyle: VoipTheme.call_generated_avatar_small) - let paused = UIImageView(image: UIImage(named: "voip_pause")?.tinted(with: .white)) - let muted = MicMuted(VoipAudioOnlyParticipantCell.mute_size) - let joining = RotatingSpinner() - - let displayName = StyledLabel(VoipTheme.conference_participant_name_font_as) - - var participantData: ConferenceParticipantDeviceData? = nil { - didSet { - if let data = participantData { - self.updateElements() - data.isJoining.clearObservers() - data.isJoining.observe { _ in - self.updateElements() - } - data.isInConference.clearObservers() - data.isInConference.observe { _ in - self.updateElements() - } - data.participantDevice.address.map { - avatar.fillFromAddress(address: $0) - if let displayName = $0.addressBookEnhancedDisplayName() { - self.displayName.text = displayName - } - } - data.isSpeaking.clearObservers() - data.isSpeaking.observe { _ in - self.updateElements(skipVideo: true) - } - data.micMuted.clearObservers() - data.micMuted.observe { _ in - self.updateElements(skipVideo: true) - } - } - } - } - - func updateElements(skipVideo:Bool = false) { - if let data = participantData { - - // background - contentView.backgroundColor = data.isMe ? VoipTheme.voipParticipantMeBackgroundColor.get() : VoipTheme.voipParticipantBackgroundColor.get() - - // Avatar - self.avatar.isHidden = data.isInConference.value != true && data.isJoining.value != true - - - // Pause - self.paused.isHidden = data.isInConference.value == true || data.isJoining.value == true - - // Border for active speaker - self.layer.borderWidth = data.isSpeaking.value == true ? 2 : 0 - - // Joining indicator - if (data.isJoining.value == true) { - self.joining.isHidden = false - self.joining.startRotation() - } else { - self.joining.isHidden = true - self.joining.stopRotation() - } - - // Muted - self.muted.isHidden = data.micMuted.value != true - - } - } - - - override init(frame:CGRect) { - super.init(frame:.zero) - contentView.height(VoipAudioOnlyParticipantCell.cell_height).matchParentSideBorders().done() - - layer.cornerRadius = corner_radius - clipsToBounds = true - - layer.borderColor = VoipTheme.primary_color.cgColor - - contentView.addSubview(avatar) - avatar.size(w: VoipCallCell.avatar_size, h: VoipCallCell.avatar_size).centerY().alignParentLeft(withMargin: common_margin).done() - - contentView.addSubview(paused) - paused.layer.cornerRadius = VoipAudioOnlyParticipantCell.avatar_size/2 - paused.clipsToBounds = true - paused.backgroundColor = VoipTheme.voip_gray - paused.size(w: VoipAudioOnlyParticipantCell.avatar_size, h: VoipAudioOnlyParticipantCell.avatar_size).alignParentLeft(withMargin: common_margin).centerY().done() - - contentView.addSubview(displayName) - displayName.centerY().toRightOf(avatar,withLeftMargin: common_margin).done() - displayName.numberOfLines = 3 - - contentView.addSubview(muted) - muted.alignParentRight(withMargin: common_margin).toRightOf(displayName,withLeftMargin: common_margin).centerY().done() - - contentView.addSubview(joining) - joining.alignParentRight(withMargin: common_margin).toRightOf(displayName,withLeftMargin: common_margin).centerY().done() - - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} diff --git a/Classes/Swift/Voip/Views/Fragments/Conference/VoipConferenceActiveSpeakerView.swift b/Classes/Swift/Voip/Views/Fragments/Conference/VoipConferenceActiveSpeakerView.swift deleted file mode 100644 index 5a689dac1..000000000 --- a/Classes/Swift/Voip/Views/Fragments/Conference/VoipConferenceActiveSpeakerView.swift +++ /dev/null @@ -1,510 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import SnapKit -import linphonesw - -class VoipConferenceActiveSpeakerView: UIView, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { - - // Layout constants : - let inter_cell = 10.0 - let record_pause_button_margin = 10.0 - let duration_margin_top = 4.0 - let record_pause_button_size = 40 - let record_pause_button_inset = UIEdgeInsets(top: 7, left: 7, bottom: 7, right: 7) - let grid_height = 100.0 - let cell_width = 100.0 - let switch_camera_button_size = 35 - let switch_camera_button_margins = 7.0 - - let switchCamera = UIImageView(image: UIImage(named:"voip_change_camera")?.tinted(with:.white)) - let subjectLabel = StyledLabel(VoipTheme.call_display_name_duration) - let duration = CallTimer(nil, VoipTheme.call_display_name_duration) - let muted = MicMuted(VoipActiveSpeakerParticipantCell.mute_size) - let pause = UIImageView(image: UIImage(named: "voip_pause")?.tinted(with: .white)) - let remotelyRecording = RemotelyRecordingView(height: ActiveCallView.remote_recording_height,text: VoipTexts.call_remote_recording) - var recordCallButtons : [CallControlButton] = [] - var pauseCallButtons : [CallControlButton] = [] - - let activeSpeakerView = UIView() - let activeSpeakerVideoView = UIView() - let activeSpeakerVideoViewAlone = UIView() - let activeSpeakerAvatar = Avatar(color:VoipTheme.voipBackgroundColor, textStyle: VoipTheme.call_generated_avatar_large) - let activeSpeakerDisplayName = StyledLabel(VoipTheme.call_remote_name) - - var grid : UICollectionView - var meGrid : UICollectionView - - let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() - var fullScreenOpaqueMasqForNotchedDevices = UIView() - let conferenceJoinSpinner = RotatingSpinner(color:VoipTheme.dark_grey_color) - - var imSpeaker = true - - let noSpeakerLabel = StyledLabel(VoipTheme.conference_waiting_room_no_video_font, VoipTexts.conference_no_speaker) - - var conferenceViewModel: ConferenceViewModel? = nil { - didSet { - if let model = conferenceViewModel { - imSpeaker = conferenceViewModel?.conference.value?.me?.role == .Speaker - self.activeSpeakerVideoView.isHidden = true - self.activeSpeakerVideoViewAlone.isHidden = true - self.setJoininngSpeakerState(enabled: false) - self.activeSpeakerAvatar.showAsAvatarIcon() - model.subject.readCurrentAndObserve { (subject) in - self.subjectLabel.text = subject - } - duration.conference = model.conference.value - self.remotelyRecording.isRemotelyRecorded = model.isRemotelyRecorded - - model.conferenceParticipantDevices.readCurrentAndObserve { _ in - model.updateActiveSpeakerConferenceParticipantDevices() - } - model.speakingParticipant.readCurrentAndObserve { _ in - model.updateActiveSpeakerConferenceParticipantDevices() - } - model.activeSpeakerConferenceParticipantDevices.readCurrentAndObserve { (_) in - self.reloadData() - let otherSpeakersCount = model.conferenceParticipantDevices.value!.count - (self.imSpeaker ? 1 : 0) - self.switchCamera.isHidden = true - if (otherSpeakersCount == 0) { - self.layoutRotatableElements() - self.meGrid.isHidden = true - self.grid.isHidden = true - model.meParticipant.value?.videoEnabled.readCurrentAndObserve { video in - self.switchCamera.isHidden = video != true - self.fillActiveSpeakerSpace(data: model.meParticipant.value,video: video == true, alone:true) - } - model.meParticipant.value?.micMuted.readCurrentAndObserve { muted in - self.muted.isHidden = muted != true - } - model.meParticipant.value?.isInConference.readCurrentAndObserve { isIn in - self.pause.isHidden = isIn == true - if (isIn != true) { - self.activeSpeakerVideoView.isHidden = true - self.activeSpeakerVideoViewAlone.isHidden = true - } - } - } else if (otherSpeakersCount == 1) { - if let data = model.conferenceParticipantDevices.value!.last { - data.isInConference.readCurrentAndObserve { isIn in - self.pause.isHidden = isIn == true || data.isJoining.value == true - if (isIn != true) { - self.activeSpeakerVideoView.isHidden = true - self.activeSpeakerVideoViewAlone.isHidden = true - } - } - data.videoEnabled.readCurrentAndObserve { video in - self.fillActiveSpeakerSpace(data: data,video: video == true) - } - data.micMuted.readCurrentAndObserve { muted in - self.muted.isHidden = muted != true - } - } - self.layoutRotatableElements() - self.meGrid.isHidden = false - self.grid.isHidden = true - } else if (otherSpeakersCount == 2) { - self.meGrid.isHidden = !self.imSpeaker - self.grid.isHidden = false - self.layoutRotatableElements() - } else { - self.activeSpeakerVideoView.isHidden = false - self.activeSpeakerVideoViewAlone.isHidden = true - self.meGrid.isHidden = !self.imSpeaker - self.grid.isHidden = false - self.layoutRotatableElements() - } - } - model.isConferenceLocallyPaused.readCurrentAndObserve { (paused) in - self.pauseCallButtons.forEach { - $0.isSelected = paused == true - } - } - model.isRecording.readCurrentAndObserve { (selected) in - self.recordCallButtons.forEach { - $0.isSelected = selected == true - } - } - model.speakingParticipant.readCurrentAndObserve { speakingParticipant in - if (model.conferenceParticipantDevices.value!.count - (self.imSpeaker ? 1 : 0) > 1) { - speakingParticipant?.videoEnabled.readCurrentAndObserve { video in - self.fillActiveSpeakerSpace(data: speakingParticipant,video: video == true) - self.muted.isHidden = true - } - speakingParticipant?.isInConference.readCurrentAndObserve { isIn in - self.pause.isHidden = isIn == true - if (isIn != true) { - self.activeSpeakerVideoView.isHidden = true - self.activeSpeakerVideoViewAlone.isHidden = true - } - } - } - } - model.noSpeaker.readCurrentAndObserve { noSpeaker in - if noSpeaker != nil { - self.activeSpeakerView.isHidden = noSpeaker! - } - } - } - self.reloadData() - - } - } - - func setJoininngSpeakerState(enabled: Bool) { - if (!enabled) { - self.conferenceJoinSpinner.isHidden = true - self.conferenceJoinSpinner.stopRotation() - } else { - self.conferenceJoinSpinner.isHidden = false - self.conferenceJoinSpinner.startRotation() - } - } - - func fillActiveSpeakerSpace(data: ConferenceParticipantDeviceData?, video: Bool, alone: Bool = false) { - data?.isJoining.readCurrentAndObserve { joining in - self.setJoininngSpeakerState(enabled: joining == true || data?.participantDevice.address == nil) - } - if let address = data?.participantDevice.address { - self.activeSpeakerAvatar.fillFromAddress(address: address) - self.activeSpeakerDisplayName.text = address.addressBookEnhancedDisplayName() - } else { - self.activeSpeakerAvatar.showAsAvatarIcon() - self.activeSpeakerDisplayName.text = nil - } - if (video) { - if (alone) { - Core.get().nativePreviewWindow = self.activeSpeakerVideoViewAlone - } else { - Core.get().nativeVideoWindow = self.activeSpeakerVideoView - } - } - self.activeSpeakerVideoView.isHidden = !video || alone - self.activeSpeakerVideoViewAlone.isHidden = !video || !alone - } - - func reloadData() { - self.grid.reloadData() - self.meGrid.reloadData() - - var noSpeaker = true - conferenceViewModel?.conference.value?.participantList.forEach({ participant in - if participant.role == .Speaker { - noSpeaker = false - } - }) - - if imSpeaker { - noSpeaker = false - } - - self.activeSpeakerView.isHidden = noSpeaker - } - - init() { - imSpeaker = conferenceViewModel?.conference.value?.me?.role == .Speaker - - layout.minimumInteritemSpacing = 0 - layout.minimumLineSpacing = 0 - layout.scrollDirection = .horizontal - layout.itemSize = CGSize(width:cell_width, height:grid_height) - grid = UICollectionView(frame:.zero, collectionViewLayout: layout) - - let meLayout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() - meLayout.scrollDirection = .horizontal - meLayout.minimumInteritemSpacing = 0 - meLayout.minimumLineSpacing = 0 - meLayout.itemSize = CGSize(width:cell_width, height:grid_height) - meGrid = UICollectionView(frame:.zero, collectionViewLayout: meLayout) - - super.init(frame: .zero) - - let headerView = UIStackView() - addSubview(headerView) - headerView.matchParentSideBorders().alignParentTop().done() - - headerView.distribution = .equalSpacing - headerView.alignment = .bottom - headerView.spacing = record_pause_button_margin - headerView.axis = .vertical - - let subjectDuration = UIView() - - subjectDuration.addSubview(subjectLabel) - subjectLabel.alignParentLeft().done() - - subjectDuration.addSubview(duration) - duration.alignParentLeft().alignUnder(view: subjectLabel,withMargin:duration_margin_top).done() - - let upperSection = UIStackView() - upperSection.distribution = .equalSpacing - upperSection.alignment = .center - upperSection.spacing = record_pause_button_margin - upperSection.axis = .horizontal - - upperSection.addArrangedSubview(subjectDuration) - subjectDuration.wrapContentY().done() - - // Record (with video) - let recordCall = CallControlButton(width: record_pause_button_size, height: record_pause_button_size, imageInset:record_pause_button_inset, buttonTheme: VoipTheme.call_record, onClickAction: { - self.conferenceViewModel?.toggleRecording() - }) - - recordCall.isHidden = true; - - let recordPauseView = UIStackView() - recordPauseView.spacing = record_pause_button_margin - recordCallButtons.append(recordCall) - recordPauseView.addArrangedSubview(recordCall) - - // Pause (with video) - let pauseCall = CallControlButton(width: record_pause_button_size, height: record_pause_button_size, imageInset:record_pause_button_inset, buttonTheme: VoipTheme.call_pause, onClickAction: { - self.conferenceViewModel?.togglePlayPause() - - }) - pauseCallButtons.append(pauseCall) - recordPauseView.addArrangedSubview(pauseCall) - - upperSection.addArrangedSubview(recordPauseView) - - headerView.addArrangedSubview(upperSection) - upperSection.matchParentSideBorders().alignParentTop(withMargin:ActiveCallView.top_displayname_margin_top).done() - - headerView.addArrangedSubview(remotelyRecording) - remotelyRecording.matchParentSideBorders().alignUnder(view:upperSection, withMargin:ActiveCallView.remote_recording_margin_top).height(CGFloat(ActiveCallView.remote_recording_height)).done() - - // Container view that can toggle full screen by single tap - let fullScreenMutableView = UIView() - addSubview(fullScreenMutableView) - fullScreenMutableView.backgroundColor = ControlsViewModel.shared.fullScreenMode.value == true ? .black : VoipTheme.voipBackgroundColor.get() - fullScreenMutableView.matchParentSideBorders().alignUnder(view:headerView,withMargin: ActiveCallView.center_view_margin_top).alignParentBottom().done() - fullScreenOpaqueMasqForNotchedDevices.backgroundColor = fullScreenMutableView.backgroundColor - - fullScreenMutableView.addSubview(noSpeakerLabel) - noSpeakerLabel.matchParentSideBorders().centerY().done() - - // Active speaker - fullScreenMutableView.addSubview(activeSpeakerView) - activeSpeakerView.layer.cornerRadius = ActiveCallView.center_view_corner_radius - activeSpeakerView.clipsToBounds = true - activeSpeakerView.backgroundColor = VoipTheme.voipParticipantBackgroundColor.get() - - activeSpeakerView.addSubview(activeSpeakerAvatar) - - activeSpeakerView.addSubview(activeSpeakerVideoView) - activeSpeakerVideoView.matchParentDimmensions().done() - activeSpeakerVideoView.contentMode = .scaleAspectFill - activeSpeakerView.addSubview(activeSpeakerVideoViewAlone) - activeSpeakerVideoViewAlone.matchParentDimmensions().done() - activeSpeakerVideoViewAlone.contentMode = .scaleAspectFill - - activeSpeakerView.addSubview(switchCamera) - switchCamera.contentMode = .scaleAspectFit - switchCamera.onClick { - Core.get().toggleCamera() - } - - activeSpeakerView.addSubview(muted) - muted.isHidden = true - muted.alignParentLeft(withMargin: switch_camera_button_margins).alignParentTop(withMargin:switch_camera_button_margins).done() - - activeSpeakerView.addSubview(conferenceJoinSpinner) - conferenceJoinSpinner.square(AbstractIncomingOutgoingCallView.spinner_size).center().done() - - switchCamera.alignParentTop(withMargin: switch_camera_button_margins).alignParentRight(withMargin: switch_camera_button_margins).square(switch_camera_button_size).done() - - activeSpeakerView.addSubview(activeSpeakerDisplayName) - activeSpeakerDisplayName.alignParentLeft(withMargin:ActiveCallView.bottom_displayname_margin_left).alignParentRight().alignParentBottom(withMargin:ActiveCallView.bottom_displayname_margin_bottom).done() - - activeSpeakerAvatar.addSubview(pause) - pause.isHidden = true - pause.backgroundColor = activeSpeakerAvatar.backgroundColor - pause.matchParentDimmensions().done() - pause.contentMode = .scaleAspectFit - - // CollectionViews - grid.dataSource = self - grid.delegate = self - grid.register(VoipActiveSpeakerParticipantCell.self, forCellWithReuseIdentifier: "VoipActiveSpeakerParticipantCell") - grid.backgroundColor = .clear - grid.isScrollEnabled = true - fullScreenMutableView.addSubview(grid) - - meGrid.dataSource = self - meGrid.delegate = self - meGrid.register(VoipActiveSpeakerParticipantCell.self, forCellWithReuseIdentifier: "VoipActiveSpeakerParticipantCell") - meGrid.backgroundColor = .clear - meGrid.isScrollEnabled = false - fullScreenMutableView.addSubview(meGrid) - - - // Full screen video togggle - activeSpeakerView.onClick { - ControlsViewModel.shared.toggleFullScreen() - } - - ControlsViewModel.shared.fullScreenMode.observe { (fullScreen) in - if (self.superview?.superview?.superview == nil || self.conferenceViewModel?.conference.value?.call?.params?.conferenceVideoLayout != .ActiveSpeaker) { - return - } - fullScreenMutableView.removeConstraints().done() - fullScreenMutableView.removeFromSuperview() - self.fullScreenOpaqueMasqForNotchedDevices.removeFromSuperview() - if (fullScreen == true) { - fullScreenMutableView.backgroundColor = .black - self.fullScreenOpaqueMasqForNotchedDevices.backgroundColor = .black - self.fullScreenOpaqueMasqForNotchedDevices.addSubview(fullScreenMutableView) - PhoneMainView.instance().mainViewController.view?.addSubview(self.fullScreenOpaqueMasqForNotchedDevices) - self.fullScreenOpaqueMasqForNotchedDevices.matchParentDimmensions().done() - if (UIDevice.hasNotch()) { - fullScreenMutableView.matchParentDimmensions(insetedBy:UIApplication.shared.keyWindow!.safeAreaInsets).done() - } else { - fullScreenMutableView.matchParentDimmensions().done() - } - } else { - fullScreenMutableView.backgroundColor = VoipTheme.voipBackgroundColor.get() - self.addSubview(fullScreenMutableView) - fullScreenMutableView.matchParentSideBorders().alignUnder(view:headerView,withMargin: ActiveCallView.center_view_margin_top).alignParentBottom().done() - } - UIView.animate(withDuration: 0.3, animations: { - self.layoutIfNeeded() - }) - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - self.reloadData() - } - } - - //Rotation - layoutRotatableElements() - - //Appearance - UIDeviceBridge.displayModeSwitched.observe { _ in - fullScreenMutableView.backgroundColor = ControlsViewModel.shared.fullScreenMode.value == true ? .black : VoipTheme.voipBackgroundColor.get() - self.fullScreenOpaqueMasqForNotchedDevices.backgroundColor = fullScreenMutableView.backgroundColor - self.activeSpeakerView.backgroundColor = VoipTheme.voipParticipantBackgroundColor.get() - self.pause.backgroundColor = self.activeSpeakerAvatar.backgroundColor - self.reloadData() - } - - } - - // Rotations - - func bounceGrids() { - let superView = grid.superview - grid.removeFromSuperview() - meGrid.removeFromSuperview() - superView?.addSubview(grid) - superView?.addSubview(meGrid) - } - - func layoutRotatableElements() { - grid.removeConstraints().done() - meGrid.removeConstraints().done() - activeSpeakerView.removeConstraints().done() - activeSpeakerAvatar.removeConstraints().done() - var otherParticipantsCount = (conferenceViewModel?.conferenceParticipantDevices.value!.count ?? 0) > 0 ? conferenceViewModel!.conferenceParticipantDevices.value!.count - (imSpeaker ? 1 : 0) : 0 - if ([.landscapeLeft, .landscapeRight].contains( UIDevice.current.orientation)) { - if (otherParticipantsCount == 0) { - activeSpeakerView.matchParentDimmensions().done() - activeSpeakerAvatar.square(Avatar.diameter_for_call_views_land).center().done() - if (UIDevice.current.orientation == .landscapeLeft) { // work around some constraints issues with Notch on the left. - bounceGrids() - } - } else if (otherParticipantsCount == 1) { - activeSpeakerView.matchParentDimmensions().done() - if (UIDevice.current.orientation == .landscapeLeft) { // work around some constraints issues with Notch on the left. - bounceGrids() - } - activeSpeakerAvatar.square(Avatar.diameter_for_call_views_land).center().done() - meGrid.alignParentRight(withMargin: ActiveCallView.center_view_margin_top).height(grid_height).width(grid_height).alignParentBottom(withMargin: ActiveCallView.center_view_margin_top).done() - } else { - activeSpeakerView.alignParentTop().alignParentBottom().alignParentLeft().toLeftOf(grid,withRightMargin: SharedLayoutConstants.content_inset).done() - if (UIDevice.current.orientation == .landscapeLeft) { // work around some constraints issues with Notch on the left. - bounceGrids() - } - meGrid.width(grid_height).height(grid_height).toRightOf(activeSpeakerView,withLeftMargin: SharedLayoutConstants.content_inset).alignParentBottom().alignParentRight().done() - grid.width(grid_height).toRightOf(activeSpeakerView,withLeftMargin: SharedLayoutConstants.content_inset).alignParentTop().alignAbove(view: meGrid, withMargin: SharedLayoutConstants.content_inset).alignParentRight().done() - layout.scrollDirection = .vertical - activeSpeakerAvatar.square(Avatar.diameter_for_call_views_land).center().done() - } - } else { - if (otherParticipantsCount == 0) { - activeSpeakerView.matchParentDimmensions().done() - activeSpeakerAvatar.square(Avatar.diameter_for_call_views).center().done() - } else if (otherParticipantsCount == 1) { - activeSpeakerView.matchParentDimmensions().done() - activeSpeakerAvatar.square(Avatar.diameter_for_call_views).center().done() - meGrid.alignParentRight(withMargin: ActiveCallView.center_view_margin_top).height(grid_height).width(grid_height).alignParentBottom(withMargin: ActiveCallView.center_view_margin_top).done() - } else { - activeSpeakerAvatar.square(Avatar.diameter_for_call_views).center().done() - activeSpeakerView.matchParentSideBorders().alignParentTop().done() - meGrid.alignParentLeft().height(grid_height).width(grid_height).alignParentBottom().alignUnder(view: activeSpeakerView, withMargin:ActiveCallView.center_view_margin_top).done() - if self.imSpeaker { - grid.toRightOf(meGrid,withLeftMargin: SharedLayoutConstants.content_inset).height(grid_height).alignParentRight().alignParentBottom().alignUnder(view: activeSpeakerView, withMargin:ActiveCallView.center_view_margin_top).done() - } else { - grid.alignParentLeft().height(grid_height).alignParentRight().alignParentBottom().alignUnder(view: activeSpeakerView, withMargin:ActiveCallView.center_view_margin_top).done() - } - layout.scrollDirection = .horizontal - } - } - UIView.animate(withDuration: 0.3, animations: { - self.layoutIfNeeded() - }) - } - - // UICollectionView related delegates - - func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { - return inter_cell - } - - func collectionView(_ collectionView: UICollectionView, layout - collectionViewLayout: UICollectionViewLayout, - minimumLineSpacingForSectionAt section: Int) -> CGFloat { - return inter_cell - } - - func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - if (self.isHidden || conferenceViewModel?.conference.value?.call?.params?.conferenceVideoLayout != .ActiveSpeaker) { - return 0 - } - guard let participantsCount = collectionView == meGrid ? (conferenceViewModel?.meParticipant.value != nil ? 1 : 0) : conferenceViewModel?.activeSpeakerConferenceParticipantDevices.value?.count else { - return .zero - } - return participantsCount - } - - func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { - let cell:VoipActiveSpeakerParticipantCell = collectionView.dequeueReusableCell(withReuseIdentifier: "VoipActiveSpeakerParticipantCell", for: indexPath) as! VoipActiveSpeakerParticipantCell - guard let participantData = collectionView == meGrid ? conferenceViewModel?.meParticipant.value : conferenceViewModel?.activeSpeakerConferenceParticipantDevices.value?[indexPath.row] else { - return cell - } - cell.participantData = participantData - return cell - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} diff --git a/Classes/Swift/Voip/Views/Fragments/Conference/VoipConferenceAudioOnlyView.swift b/Classes/Swift/Voip/Views/Fragments/Conference/VoipConferenceAudioOnlyView.swift deleted file mode 100644 index 04a185f67..000000000 --- a/Classes/Swift/Voip/Views/Fragments/Conference/VoipConferenceAudioOnlyView.swift +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import SnapKit -import linphonesw - -class VoipConferenceAudioOnlyView: UIView, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { - - // Layout constants : - let inter_cell = 5.0 - let record_pause_button_margin = 10.0 - let duration_margin_top = 4.0 - let record_pause_button_size = 40 - let record_pause_button_inset = UIEdgeInsets(top: 7, left: 7, bottom: 7, right: 7) - - - let subjectLabel = StyledLabel(VoipTheme.call_display_name_duration) - let duration = CallTimer(nil, VoipTheme.call_display_name_duration) - - let remotelyRecording = RemotelyRecordingView(height: ActiveCallView.remote_recording_height,text: VoipTexts.call_remote_recording) - var recordCallButtons : [CallControlButton] = [] - var pauseCallButtons : [CallControlButton] = [] - var grid : UICollectionView - var gridContainer = UIView() - - - var conferenceViewModel: ConferenceViewModel? = nil { - didSet { - if let model = conferenceViewModel { - model.subject.clearObservers() - model.subject.readCurrentAndObserve { (subject) in - self.subjectLabel.text = subject - } - duration.conference = model.conference.value - self.remotelyRecording.isRemotelyRecorded = model.isRemotelyRecorded - model.conferenceParticipantDevices.clearObservers() - model.conferenceParticipantDevices.readCurrentAndObserve { (_) in - self.reloadData() - } - model.isConferenceLocallyPaused.readCurrentAndObserve { (paused) in - self.pauseCallButtons.forEach { - $0.isSelected = paused == true - } - } - model.isRecording.clearObservers() - model.isRecording.readCurrentAndObserve { (selected) in - self.recordCallButtons.forEach { - $0.isSelected = selected == true - } - } - } - self.reloadData() - } - } - - init() { - - let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() - layout.minimumInteritemSpacing = 0 - layout.minimumLineSpacing = 0 - layout.estimatedItemSize = .zero - grid = UICollectionView(frame:.zero, collectionViewLayout: layout) - - super.init(frame: .zero) - - let headerView = UIStackView() - addSubview(headerView) - - headerView.distribution = .equalSpacing - headerView.alignment = .bottom - headerView.spacing = record_pause_button_margin - headerView.axis = .vertical - - let subjectDuration = UIView() - - subjectDuration.addSubview(subjectLabel) - subjectLabel.alignParentLeft().done() - - subjectDuration.addSubview(duration) - duration.alignParentLeft().alignUnder(view: subjectLabel,withMargin:duration_margin_top).done() - - let upperSection = UIStackView() - upperSection.distribution = .equalSpacing - upperSection.alignment = .center - upperSection.spacing = record_pause_button_margin - upperSection.axis = .horizontal - - upperSection.addArrangedSubview(subjectDuration) - subjectDuration.wrapContentY().done() - - // Record (with video) - let recordCall = CallControlButton(width: record_pause_button_size, height: record_pause_button_size, imageInset:record_pause_button_inset, buttonTheme: VoipTheme.call_record, onClickAction: { - self.conferenceViewModel?.toggleRecording() - }) - - recordCall.isHidden = true; - - let recordPauseView = UIStackView() - recordPauseView.spacing = record_pause_button_margin - recordCallButtons.append(recordCall) - recordPauseView.addArrangedSubview(recordCall) - - // Pause (with video) - let pauseCall = CallControlButton(width: record_pause_button_size, height: record_pause_button_size, imageInset:record_pause_button_inset, buttonTheme: VoipTheme.call_pause, onClickAction: { - self.conferenceViewModel?.togglePlayPause() - - }) - pauseCallButtons.append(pauseCall) - recordPauseView.addArrangedSubview(pauseCall) - - upperSection.addArrangedSubview(recordPauseView) - - headerView.addArrangedSubview(upperSection) - upperSection.matchParentSideBorders().alignParentTop(withMargin:ActiveCallView.top_displayname_margin_top).done() - - headerView.addArrangedSubview(remotelyRecording) - remotelyRecording.matchParentSideBorders().alignUnder(view:upperSection, withMargin:ActiveCallView.remote_recording_margin_top).height(CGFloat(ActiveCallView.remote_recording_height)).done() - - // CollectionView - grid.dataSource = self - grid.delegate = self - grid.register(VoipAudioOnlyParticipantCell.self, forCellWithReuseIdentifier: "VoipAudioOnlyParticipantCell") - grid.backgroundColor = .clear - grid.isScrollEnabled = false - addSubview(gridContainer) - gridContainer.addSubview(grid) - gridContainer.backgroundColor = VoipTheme.voipBackgroundColor.get() - - gridContainer.matchParentSideBorders(insetedByDx: inter_cell).alignUnder(view:headerView,withMargin: ActiveCallView.center_view_margin_top).alignParentBottom(withMargin: inter_cell).done() - grid.matchParentDimmensions().done() - - headerView.matchParentSideBorders().alignParentTop().done() - - //Appearance - UIDeviceBridge.displayModeSwitched.observe { _ in - self.gridContainer.backgroundColor = VoipTheme.voipBackgroundColor.get() - self.reloadData() - } - - } - - - // UICollectionView related delegates - - func reloadData() { - conferenceViewModel?.conferenceParticipantDevices.value?.forEach { - $0.clearObservers() - } - if (self.isHidden) { - self.grid.reloadData() - return - } - self.grid.reloadData() - } - - - func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { - return inter_cell - } - - func collectionView(_ collectionView: UICollectionView, layout - collectionViewLayout: UICollectionViewLayout, - minimumLineSpacingForSectionAt section: Int) -> CGFloat { - return inter_cell - } - - func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - if (self.isHidden) { - return 0 - } - guard let participantsCount = conferenceViewModel?.conferenceParticipantDevices.value?.count else { - return .zero - } - return participantsCount - } - - func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { - let cell:VoipAudioOnlyParticipantCell = collectionView.dequeueReusableCell(withReuseIdentifier: "VoipAudioOnlyParticipantCell", for: indexPath) as! VoipAudioOnlyParticipantCell - guard let participantData = conferenceViewModel?.conferenceParticipantDevices.value?[indexPath.row] else { - return cell - } - cell.participantData = participantData - return cell - } - - func collectionView(_ collectionView: UICollectionView, - layout collectionViewLayout: UICollectionViewLayout, - sizeForItemAt indexPath: IndexPath) -> CGSize { - - guard let participantsCount:Int = conferenceViewModel?.conferenceParticipantDevices.value?.count else { - return .zero - } - - return participantsCount == 1 ? CGSize(width:collectionView.frame.size.width,height:VoipAudioOnlyParticipantCell.cell_height) : CGSize(width:collectionView.frame.size.width / 2.0 - inter_cell / 2.0,height:VoipAudioOnlyParticipantCell.cell_height) - } - - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - - -} diff --git a/Classes/Swift/Voip/Views/Fragments/Conference/VoipConferenceDisplayModeSelectionView.swift b/Classes/Swift/Voip/Views/Fragments/Conference/VoipConferenceDisplayModeSelectionView.swift deleted file mode 100644 index 90defb198..000000000 --- a/Classes/Swift/Voip/Views/Fragments/Conference/VoipConferenceDisplayModeSelectionView.swift +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import linphonesw - -@objc class VoipConferenceDisplayModeSelectionView: DismissableView, UITableViewDataSource, UITableViewDelegate{ - - // Layout constants - let buttons_distance_from_center_x = 38 - let buttons_size = 60 - - let optionsListView = UITableView() - - init() { - super.init(title: VoipTexts.call_action_change_conf_layout) - - super.contentView.addSubview(optionsListView) - optionsListView.alignParentTop().height(3*ConferenceDisplayModeSelectionCell.cell_height).matchParentSideBorders().done() - optionsListView.dataSource = self - optionsListView.delegate = self - optionsListView.register(ConferenceDisplayModeSelectionCell.self, forCellReuseIdentifier: "ConferenceDisplayModeSelectionCell") - optionsListView.separatorStyle = .singleLine - optionsListView.separatorColor = VoipTheme.separatorColor.get() - optionsListView.isScrollEnabled = false - - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - super.contentView.backgroundColor = VoipTheme.voipBackgroundBWColor.get() - self.optionsListView.backgroundColor = VoipTheme.voipBackgroundBWColor.get() - self.optionsListView.separatorColor = VoipTheme.separatorColor.get() - self.optionsListView.reloadData() - } - - } - - // TableView datasource delegate - - func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return ConferenceDisplayModeSelectionCell.cell_height - } - - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return 3 - } - - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell:ConferenceDisplayModeSelectionCell = tableView.dequeueReusableCell(withIdentifier: "ConferenceDisplayModeSelectionCell") as! ConferenceDisplayModeSelectionCell - cell.selectionStyle = .none - if (indexPath.row == 0) { - cell.setOption(title: VoipTexts.conference_display_mode_mosaic, onSelectAction: { - ConferenceViewModel.shared.changeLayout(layout: .Grid) - ConferenceViewModel.shared.conferenceDisplayMode.value = .Grid - }, image:(UIImage(named: "voip_conference_mosaic")?.tinted(with: VoipTheme.voipDrawableColor.get())!)!) - cell.isUserInteractionEnabled = ConferenceViewModel.shared.conferenceParticipantDevices.value!.count <= ConferenceViewModel.shared.maxParticipantsForMosaicLayout - cell.isSelected = ConferenceViewModel.shared.conferenceDisplayMode.value == .Grid - } - if (indexPath.row == 1) { - cell.setOption(title: VoipTexts.conference_display_mode_active_speaker, onSelectAction: { - ConferenceViewModel.shared.changeLayout(layout: .ActiveSpeaker) - ConferenceViewModel.shared.conferenceDisplayMode.value = .ActiveSpeaker - }, image:(UIImage(named: "voip_conference_active_speaker")?.tinted(with: VoipTheme.voipDrawableColor.get())!)!) - cell.isUserInteractionEnabled = true - cell.isSelected = ConferenceViewModel.shared.conferenceDisplayMode.value == .ActiveSpeaker - } - - if (indexPath.row == 2) { - cell.setOption(title: VoipTexts.conference_display_mode_audio_only, onSelectAction: { - ConferenceViewModel.shared.changeLayout(layout: .AudioOnly) - ConferenceViewModel.shared.conferenceDisplayMode.value = .AudioOnly - }, image:(UIImage(named: "voip_conference_audio_only")?.tinted(with: VoipTheme.voipDrawableColor.get())!)!) - cell.isUserInteractionEnabled = true - cell.isSelected = ConferenceViewModel.shared.conferenceDisplayMode.value == .AudioOnly - } - - cell.separatorInset = .zero - cell.selectionStyle = .none - return cell - } - - func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - let cell = tableView.cellForRow(at: indexPath) as! ConferenceDisplayModeSelectionCell - cell.onSelectAction?() - cell.isSelected = true - if (indexPath.row == 0) { - (tableView.cellForRow(at: IndexPath(row: 1, section: 0)) as! ConferenceDisplayModeSelectionCell).isSelected = false - (tableView.cellForRow(at: IndexPath(row: 2, section: 0)) as! ConferenceDisplayModeSelectionCell).isSelected = false - } - if (indexPath.row == 1) { - (tableView.cellForRow(at: IndexPath(row: 0, section: 0)) as! ConferenceDisplayModeSelectionCell).isSelected = false - (tableView.cellForRow(at: IndexPath(row: 2, section: 0)) as! ConferenceDisplayModeSelectionCell).isSelected = false - } - if (indexPath.row == 2) { - (tableView.cellForRow(at: IndexPath(row: 0, section: 0)) as! ConferenceDisplayModeSelectionCell).isSelected = false - (tableView.cellForRow(at: IndexPath(row: 1, section: 0)) as! ConferenceDisplayModeSelectionCell).isSelected = false - } - } - - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - -} - -class ConferenceDisplayModeSelectionCell : UITableViewCell { - - static let cell_height = 60.0 - let icon_size = 40.0 - let side_margins = 20.0 - - let radio = CallControlButton(buttonTheme: VoipTheme.radio_button) - let label = StyledLabel(VoipTheme.conference_mode_title) - let icon = UIImageView() - - var onSelectAction : (()->Void)? = nil - - override var isSelected: Bool { - didSet { - radio.isSelected = isSelected - label.applyStyle(isSelected ? VoipTheme.conference_mode_title_selected : VoipTheme.conference_mode_title) - } - } - - - func setOption(title:String, onSelectAction:@escaping ()->Void, image:UIImage) { - self.onSelectAction = onSelectAction - label.text = title - icon.image = image - } - - override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { - super.init(style: style, reuseIdentifier: reuseIdentifier) - contentView.matchParentDimmensions().done() - contentView.addSubview(radio) - radio.alignParentLeft(withMargin: side_margins).centerY().done() - contentView.addSubview(label) - label.toRightOf(radio).centerY().done() - contentView.addSubview(icon) - icon.size(w: icon_size, h: icon_size).alignParentRight(withMargin: side_margins).centerY().done() - radio.isUserInteractionEnabled = false - contentView.backgroundColor = .clear - backgroundColor = .clear - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - -} diff --git a/Classes/Swift/Voip/Views/Fragments/Conference/VoipConferenceGridView.swift b/Classes/Swift/Voip/Views/Fragments/Conference/VoipConferenceGridView.swift deleted file mode 100644 index fcd2df664..000000000 --- a/Classes/Swift/Voip/Views/Fragments/Conference/VoipConferenceGridView.swift +++ /dev/null @@ -1,295 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import SnapKit -import linphonesw - -class VoipConferenceGridView: UIView, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { - - // Layout constants : - let inter_cell = 10.0 - let record_pause_button_margin = 10.0 - let duration_margin_top = 4.0 - let record_pause_button_size = 40 - let record_pause_button_inset = UIEdgeInsets(top: 7, left: 7, bottom: 7, right: 7) - - - let subjectLabel = StyledLabel(VoipTheme.call_display_name_duration) - let duration = CallTimer(nil, VoipTheme.call_display_name_duration) - - let remotelyRecording = RemotelyRecordingView(height: ActiveCallView.remote_recording_height,text: VoipTexts.call_remote_recording) - var recordCallButtons : [CallControlButton] = [] - var pauseCallButtons : [CallControlButton] = [] - var grid : UICollectionView - var gridContainer = UIView() - - - var conferenceViewModel: ConferenceViewModel? = nil { - didSet { - if let model = conferenceViewModel { - model.subject.clearObservers() - model.subject.readCurrentAndObserve { (subject) in - self.subjectLabel.text = subject - } - duration.conference = model.conference.value - self.remotelyRecording.isRemotelyRecorded = model.isRemotelyRecorded - model.conferenceParticipantDevices.clearObservers() - model.conferenceParticipantDevices.readCurrentAndObserve { (devices) in - if (devices!.count > model.maxParticipantsForMosaicLayout && model.conference.value?.currentParams?.videoEnabled == true && model.conferenceDisplayMode.value == .Grid) { - Log.w("[Conference] \(model.conference) More than \(model.maxParticipantsForMosaicLayout) participants \(devices!.count), forcing active speaker layout from Grid") - model.conferenceDisplayMode.value = .ActiveSpeaker - model.changeLayout(layout: .ActiveSpeaker) - VoipDialog.toast(message: VoipTexts.conference_too_many_participants_for_mosaic_layout) - } else { - self.reloadData() - } - } - model.isConferenceLocallyPaused.readCurrentAndObserve { (paused) in - self.pauseCallButtons.forEach { - $0.isSelected = paused == true - } - } - model.isRecording.clearObservers() - model.isRecording.readCurrentAndObserve { (selected) in - self.recordCallButtons.forEach { - $0.isSelected = selected == true - } - } - } - self.reloadData() - } - } - - init() { - - let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() - layout.minimumInteritemSpacing = 0 - layout.minimumLineSpacing = 0 - layout.estimatedItemSize = .zero - grid = UICollectionView(frame:.zero, collectionViewLayout: layout) - - super.init(frame: .zero) - - let headerView = UIStackView() - addSubview(headerView) - - headerView.distribution = .equalSpacing - headerView.alignment = .bottom - headerView.spacing = record_pause_button_margin - headerView.axis = .vertical - - let subjectDuration = UIView() - - subjectDuration.addSubview(subjectLabel) - subjectLabel.alignParentLeft().done() - - subjectDuration.addSubview(duration) - duration.alignParentLeft().alignUnder(view: subjectLabel,withMargin:duration_margin_top).done() - - let upperSection = UIStackView() - upperSection.distribution = .equalSpacing - upperSection.alignment = .center - upperSection.spacing = record_pause_button_margin - upperSection.axis = .horizontal - - upperSection.addArrangedSubview(subjectDuration) - subjectDuration.wrapContentY().done() - - // Record (with video) - let recordCall = CallControlButton(width: record_pause_button_size, height: record_pause_button_size, imageInset:record_pause_button_inset, buttonTheme: VoipTheme.call_record, onClickAction: { - self.conferenceViewModel?.toggleRecording() - }) - - recordCall.isHidden = true; - - let recordPauseView = UIStackView() - recordPauseView.spacing = record_pause_button_margin - recordCallButtons.append(recordCall) - recordPauseView.addArrangedSubview(recordCall) - - // Pause (with video) - let pauseCall = CallControlButton(width: record_pause_button_size, height: record_pause_button_size, imageInset:record_pause_button_inset, buttonTheme: VoipTheme.call_pause, onClickAction: { - self.conferenceViewModel?.togglePlayPause() - - }) - pauseCallButtons.append(pauseCall) - recordPauseView.addArrangedSubview(pauseCall) - - upperSection.addArrangedSubview(recordPauseView) - - headerView.addArrangedSubview(upperSection) - upperSection.matchParentSideBorders().alignParentTop(withMargin:ActiveCallView.top_displayname_margin_top).done() - - headerView.addArrangedSubview(remotelyRecording) - remotelyRecording.matchParentSideBorders().alignUnder(view:upperSection, withMargin:ActiveCallView.remote_recording_margin_top).height(CGFloat(ActiveCallView.remote_recording_height)).done() - - // CollectionView - grid.dataSource = self - grid.delegate = self - grid.register(VoipGridParticipantCell.self, forCellWithReuseIdentifier: "VoipGridParticipantCell") - grid.backgroundColor = .clear - grid.isScrollEnabled = false - addSubview(gridContainer) - gridContainer.addSubview(grid) - gridContainer.backgroundColor = ControlsViewModel.shared.fullScreenMode.value == true ? .black : VoipTheme.voipBackgroundColor.get() - - gridContainer.matchParentSideBorders(insetedByDx: inter_cell).alignUnder(view:headerView,withMargin: ActiveCallView.center_view_margin_top).alignParentBottom(withMargin: inter_cell).done() - grid.matchParentDimmensions().done() - - headerView.matchParentSideBorders().alignParentTop().done() - - - // Full screen video togggle - gridContainer.onClick { - ControlsViewModel.shared.toggleFullScreen() - } - - ControlsViewModel.shared.fullScreenMode.observe { (fullScreen) in - if (self.superview?.superview?.superview == nil || self.conferenceViewModel?.conference.value?.call?.params?.conferenceVideoLayout != .Grid) { - return - } - self.gridContainer.removeConstraints().done() - if (fullScreen == true) { - self.gridContainer.removeFromSuperview() - PhoneMainView.instance().mainViewController.view?.addSubview(self.gridContainer) - self.gridContainer.matchParentDimmensions().center().done() - self.gridContainer.backgroundColor = .black - } else { - self.gridContainer.removeFromSuperview() - self.addSubview(self.gridContainer) - self.gridContainer.matchParentSideBorders().alignUnder(view:headerView,withMargin: ActiveCallView.center_view_margin_top).alignParentBottom().done() - self.gridContainer.backgroundColor = VoipTheme.voipBackgroundColor.get() - } - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - self.reloadData() - } - } - - //Appearance - UIDeviceBridge.displayModeSwitched.observe { _ in - self.gridContainer.backgroundColor = ControlsViewModel.shared.fullScreenMode.value == true ? .black : VoipTheme.voipBackgroundColor.get() - self.reloadData() - } - - } - - - // UICollectionView related delegates - - func reloadData() { - conferenceViewModel?.conferenceParticipantDevices.value?.forEach { - $0.clearObservers() - } - if let participantCount = conferenceViewModel?.conferenceParticipantDevices.value!.count, participantCount > conferenceViewModel!.maxParticipantsForMosaicLayout { - return - } - if (self.isHidden) { - self.grid.reloadData() - return - } - computeCellSize() - self.grid.reloadData() - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - let width:CGFloat = CGFloat(self.columnCount) * self.cellSize.width + (CGFloat(self.columnCount)-1.0)*self.inter_cell - let height:CGFloat = CGFloat(self.rowCount) * self.cellSize.height + (CGFloat(self.rowCount)-1.0)*self.inter_cell - if (width > 0) { - self.grid.removeConstraints().width(width).height(height).center().done() - } - } - } - - - func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { - return inter_cell - } - - func collectionView(_ collectionView: UICollectionView, layout - collectionViewLayout: UICollectionViewLayout, - minimumLineSpacingForSectionAt section: Int) -> CGFloat { - return inter_cell - } - - func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - if (self.isHidden) { - return 0 - } - guard let participantsCount = conferenceViewModel?.conferenceParticipantDevices.value?.count else { - return .zero - } - return participantsCount - } - - func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { - let cell:VoipGridParticipantCell = collectionView.dequeueReusableCell(withReuseIdentifier: "VoipGridParticipantCell", for: indexPath) as! VoipGridParticipantCell - guard let participantData = conferenceViewModel?.conferenceParticipantDevices.value?[indexPath.row] else { - return cell - } - cell.participantData = participantData - return cell - } - - let placement = [[1, 2, 3, 4, 5, 6], [1, 1, 2, 2, 3,3], [1, 1, 1, 2, 2, 2], [1, 1, 1, 1, 2, 2], [1, 1, 1, 1, 1, 2], [1, 1, 1, 1, 1, 1]] - var cellSize: CGSize = .zero - var columnCount: Int = 0 - var rowCount: Int = 0 - - func computeCellSize() { - let participantsCount = self.collectionView(self.grid, numberOfItemsInSection: 0) - if (participantsCount == 0) { - return - } - let availableSize = gridContainer.frame.size - var maxSize = 0.0 - for rowCount in 1...participantsCount { - let neededColumns = placement[rowCount-1][participantsCount-1] - let candidateWidth = availableSize.width / CGFloat(neededColumns) - CGFloat((neededColumns-1) * Int(inter_cell)) - let candidateHeight = availableSize.height / CGFloat(rowCount) - CGFloat((rowCount - 1) * Int(inter_cell)) - let candidateSize = min(candidateWidth,candidateHeight) - if (candidateSize > maxSize) { - self.columnCount = neededColumns - self.rowCount = rowCount - maxSize = candidateSize - } - Log.i("neededColumns \(neededColumns) rowCount \(rowCount) availableSize \(availableSize) participantsCount \(participantsCount) candidateWidth \(candidateWidth) candidateHeight \(candidateHeight) candidateSize \(candidateSize) maxSize \(maxSize)") - } - - cellSize = CGSize(width: maxSize ,height: maxSize) - } - - func collectionView(_ collectionView: UICollectionView, - layout collectionViewLayout: UICollectionViewLayout, - sizeForItemAt indexPath: IndexPath) -> CGSize { - - guard let _ = conferenceViewModel?.conferenceParticipantDevices.value?.count else { - return .zero - } - - return cellSize - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - - -} diff --git a/Classes/Swift/Voip/Views/Fragments/Conference/VoipGridParticipantCell.swift b/Classes/Swift/Voip/Views/Fragments/Conference/VoipGridParticipantCell.swift deleted file mode 100644 index 16841b8c8..000000000 --- a/Classes/Swift/Voip/Views/Fragments/Conference/VoipGridParticipantCell.swift +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import SnapKit -import linphonesw - -class VoipGridParticipantCell: UICollectionViewCell { - - // Layout Constants - let corner_radius = 20.0 - static let avatar_size = 80.0 - let switch_camera_button_margins = 8.0 - let switch_camera_button_size = 30 - let pause_label_left_margin = 5 - static let mute_size = 25 - let mute_margin = 5 - - - let videoView = UIView() - let avatar = Avatar(color:VoipTheme.voipBackgroundColor, textStyle: VoipTheme.call_generated_avatar_medium) - let pause = UIImageView(image: UIImage(named: "voip_pause")?.tinted(with: .white)) - let switchCamera = UIImageView(image: UIImage(named:"voip_change_camera")?.tinted(with:.white)) - let displayName = StyledLabel(VoipTheme.conference_participant_name_font_grid) - let pauseLabel = StyledLabel(VoipTheme.conference_participant_name_font_grid,VoipTexts.conference_participant_paused) - let muted = MicMuted(VoipActiveSpeakerParticipantCell.mute_size) - let joining = RotatingSpinner() - - var participantData: ConferenceParticipantDeviceData? = nil { - didSet { - if let data = participantData { - self.updateElements() - data.isJoining.clearObservers() - data.isJoining.observe { _ in - self.updateElements() - } - data.isInConference.clearObservers() - data.isInConference.observe { _ in - self.updateElements() - } - data.videoEnabled.clearObservers() - data.videoEnabled.observe { _ in - self.updateElements() - } - data.participantDevice.address.map { - avatar.fillFromAddress(address: $0) - if let displayName = $0.addressBookEnhancedDisplayName() { - self.displayName.text = displayName - } - } - data.isSpeaking.clearObservers() - data.isSpeaking.observe { _ in - self.updateElements(skipVideo: true) - } - data.micMuted.clearObservers() - data.micMuted.observe { _ in - self.updateElements(skipVideo: true) - } - } - } - } - - func updateElements(skipVideo:Bool = false) { - if let data = participantData { - - // Background - if (data.isInConference.value != true && data.isJoining.value != true) { - self.contentView.backgroundColor = VoipTheme.voip_conference_participant_paused_background - } else if (data.videoEnabled.value == true) { - self.contentView.backgroundColor = .black - } else { - self.contentView.backgroundColor = data.isMe ? VoipTheme.voipParticipantMeBackgroundColor.get() : VoipTheme.voipParticipantBackgroundColor.get() - } - - // Avatar - self.avatar.isHidden = (data.isInConference.value != true && data.isJoining.value != true) || data.videoEnabled.value == true - - // Video - if (!skipVideo) { - self.videoView.isHidden = data.isInConference.value != true || data.videoEnabled.value != true - if (!self.videoView.isHidden) { - data.setVideoView(view: self.videoView) - } - self.switchCamera.isHidden = self.videoView.isHidden || !data.isSwitchCameraAvailable() - } - - // Pause - self.pause.isHidden = data.isInConference.value == true || data.isJoining.value == true - self.pauseLabel.isHidden = self.pause.isHidden - - // Border for active speaker - self.layer.borderWidth = data.isSpeaking.value == true ? 2 : 0 - - // Joining indicator - if (data.isJoining.value == true) { - self.joining.isHidden = false - self.joining.startRotation() - } else { - self.joining.isHidden = true - self.joining.stopRotation() - } - - // Muted - self.muted.isHidden = data.micMuted.value != true - - } - } - - - override init(frame:CGRect) { - super.init(frame:.zero) - layer.cornerRadius = corner_radius - clipsToBounds = true - layer.borderColor = VoipTheme.primary_color.cgColor - - contentView.addSubview(videoView) - videoView.matchParentDimmensions().done() - - contentView.addSubview(avatar) - avatar.size(w: VoipGridParticipantCell.avatar_size, h: VoipGridParticipantCell.avatar_size).center().done() - - contentView.addSubview(pause) - pause.layer.cornerRadius = VoipGridParticipantCell.avatar_size/2 - pause.clipsToBounds = true - pause.backgroundColor = VoipTheme.voip_gray - pause.size(w: VoipGridParticipantCell.avatar_size, h: VoipGridParticipantCell.avatar_size).center().done() - - contentView.addSubview(switchCamera) - switchCamera.alignParentTop(withMargin: switch_camera_button_margins).alignParentRight(withMargin: switch_camera_button_margins).square(switch_camera_button_size).done() - switchCamera.contentMode = .scaleAspectFit - - switchCamera.onClick { - Core.get().toggleCamera() - } - - contentView.addSubview(displayName) - displayName.alignParentLeft(withMargin:ActiveCallView.bottom_displayname_margin_left).alignParentBottom(withMargin:ActiveCallView.bottom_displayname_margin_bottom).alignParentRight().done() - - contentView.addSubview(pauseLabel) - pauseLabel.toRightOf(displayName,withLeftMargin: pause_label_left_margin).alignParentBottom(withMargin:ActiveCallView.bottom_displayname_margin_bottom).done() - - contentView.addSubview(muted) - muted.alignParentLeft(withMargin: mute_margin).alignParentTop(withMargin:mute_margin).done() - - contentView.addSubview(joining) - joining.square(VoipActiveSpeakerParticipantCell.mute_size).alignParentTop(withMargin: mute_margin).alignParentLeft(withMargin: mute_margin).done() - - - contentView.matchParentDimmensions().done() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} diff --git a/Classes/Swift/Voip/Views/Fragments/ConferenceLayoutPickerView.swift b/Classes/Swift/Voip/Views/Fragments/ConferenceLayoutPickerView.swift deleted file mode 100644 index d7c0cec84..000000000 --- a/Classes/Swift/Voip/Views/Fragments/ConferenceLayoutPickerView.swift +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -class ConferenceLayoutPickerView: UIView { - - // Layout constants - let corner_radius = 6.7 - let margin = 10.0 - let stackView = UIStackView() - let insets = 5.0 - - - init (orientation:UIDeviceOrientation) { - super.init(frame: .zero) - stackView.distribution = .fillProportionally - stackView.alignment = .center - stackView.spacing = ControlsView.controls_button_spacing - backgroundColor = VoipTheme.voip_gray - layer.cornerRadius = corner_radius - clipsToBounds = true - - let grid = CallControlButton(imageInset : UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5),buttonTheme: VoipTheme.conf_waiting_room_layout_picker, onClickAction: { - ConferenceWaitingRoomViewModel.sharedModel.joinLayout.value = .Grid - ConferenceWaitingRoomViewModel.sharedModel.showLayoutPicker.value = false - - }) - grid.applyTintedIcons(tintedIcons: [UIButton.State.normal.rawValue : TintableIcon(name: "voip_conference_mosaic" ,tintColor: LightDarkColor(.white,.white))]) - stackView.addArrangedSubview(grid) - - let activeSpeaker = CallControlButton(imageInset : UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5),buttonTheme: VoipTheme.conf_waiting_room_layout_picker, onClickAction: { - ConferenceWaitingRoomViewModel.sharedModel.joinLayout.value = .ActiveSpeaker - ConferenceWaitingRoomViewModel.sharedModel.showLayoutPicker.value = false - }) - activeSpeaker.applyTintedIcons(tintedIcons: [UIButton.State.normal.rawValue : TintableIcon(name: "voip_conference_active_speaker" ,tintColor: LightDarkColor(.white,.white))]) - stackView.addArrangedSubview(activeSpeaker) - - let audioOnly = CallControlButton(imageInset : UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5),buttonTheme: VoipTheme.conf_waiting_room_layout_picker, onClickAction: { - ConferenceWaitingRoomViewModel.sharedModel.joinLayout.value = .AudioOnly - ConferenceWaitingRoomViewModel.sharedModel.showLayoutPicker.value = false - }) - audioOnly.applyTintedIcons(tintedIcons: [UIButton.State.normal.rawValue : TintableIcon(name: "voip_conference_audio_only" ,tintColor: LightDarkColor(.white,.white))]) - stackView.addArrangedSubview(audioOnly) - - ConferenceWaitingRoomViewModel.sharedModel.joinLayout.readCurrentAndObserve { layout in - grid.isSelected = layout == .Grid - activeSpeaker.isSelected = layout == .ActiveSpeaker - audioOnly.isSelected = layout == .AudioOnly - } - - stackView.axis = .vertical - addSubview(stackView) - wrapContent(inset: UIEdgeInsets(top: insets, left: insets, bottom: insets, right: insets)).done() - } - - required init(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - -} - - diff --git a/Classes/Swift/Voip/Views/Fragments/ControlsView.swift b/Classes/Swift/Voip/Views/Fragments/ControlsView.swift deleted file mode 100644 index ccc8c545e..000000000 --- a/Classes/Swift/Voip/Views/Fragments/ControlsView.swift +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit -import linphonesw - -class ControlsView: UIStackView { - - // Layout constants - static let controls_button_spacing = 5.0 - - init (showVideo:Bool, controlsViewModel:ControlsViewModel) { - super.init(frame: .zero) - axis = .horizontal - distribution = .equalSpacing - alignment = .center - spacing = ControlsView.controls_button_spacing - - // Mute - let mute = CallControlButton(buttonTheme: VoipTheme.call_mute, onClickAction: { - controlsViewModel.toggleMuteMicrophone() - }) - addArrangedSubview(mute) - controlsViewModel.isMicrophoneMuted.readCurrentAndObserve { (muted) in - mute.isSelected = muted == true - } - controlsViewModel.isMuteMicrophoneEnabled.readCurrentAndObserve { (enabled) in - if ControlsViewModel.shared.imSpeaker { - mute.isEnabled = enabled == true - } else { - mute.isEnabled = false - } - } - mute.accessibilityIdentifier = "call_control_view_mute" - mute.accessibilityLabel = "Mute" - - // Speaker - let speaker = CallControlButton(buttonTheme: VoipTheme.call_speaker, onClickAction: { - controlsViewModel.toggleSpeaker() - }) - addArrangedSubview(speaker) - controlsViewModel.isSpeakerSelected.readCurrentAndObserve { (selected) in - speaker.isSelected = selected == true - } - speaker.accessibilityIdentifier = "call_control_view_speaker" - speaker.accessibilityLabel = "Speaker" - - // Audio routes - let routes = CallControlButton(buttonTheme: VoipTheme.call_audio_route, onClickAction: { - controlsViewModel.toggleRoutesMenu() - }) - addArrangedSubview(routes) - controlsViewModel.audioRoutesSelected.readCurrentAndObserve { (selected) in - routes.isSelected = selected == true - } - - controlsViewModel.audioRoutesEnabled.readCurrentAndObserve { (routesEnabled) in - speaker.isHidden = routesEnabled == true - routes.isHidden = !speaker.isHidden - } - - controlsViewModel.isBluetoothHeadsetAvailable.readCurrentAndObserve { available in - speaker.isHidden = available == true - routes.isHidden = !speaker.isHidden - } - - // Video - if (showVideo && Core.get().config?.getBool(section: "app", key: "disable_video_feature", defaultValue: false) == false) { - let video = CallControlButton(buttonTheme: VoipTheme.call_video, onClickAction: { - if AVCaptureDevice.authorizationStatus(for: .video) == .authorized { - controlsViewModel.toggleVideo() - } else { - AVCaptureDevice.requestAccess(for: .video, completionHandler: { (granted: Bool) in - if granted { - controlsViewModel.toggleVideo() - } else { - VoipDialog(message:VoipTexts.camera_required_for_video).show() - } - }) - } - }) - addArrangedSubview(video) - video.showActivityIndicatorDataSource = controlsViewModel.isVideoUpdateInProgress - controlsViewModel.isVideoEnabled.readCurrentAndObserve { (selected) in - if ControlsViewModel.shared.imSpeaker { - video.isSelected = selected == true - } else { - video.isSelected = false - } - } - controlsViewModel.isVideoAvailable.readCurrentAndObserve { (available) in - if ControlsViewModel.shared.imSpeaker { - video.isEnabled = available == true && controlsViewModel.isVideoUpdateInProgress.value != true - } else { - video.isEnabled = false - } - } - controlsViewModel.isVideoUpdateInProgress.readCurrentAndObserve { (updateInProgress) in - if ControlsViewModel.shared.imSpeaker { - video.isEnabled = updateInProgress != true && controlsViewModel.isVideoAvailable.value == true - } else { - video.isEnabled = false - } - } - video.accessibilityIdentifier = "call_control_view_video" - video.accessibilityLabel = "Video" - - } - - height(CallControlButton.default_size).done() - - } - - required init(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - -} - - diff --git a/Classes/Swift/Voip/Views/Fragments/DismissableView.swift b/Classes/Swift/Voip/Views/Fragments/DismissableView.swift deleted file mode 100644 index 1ff01ea95..000000000 --- a/Classes/Swift/Voip/Views/Fragments/DismissableView.swift +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation - -class DismissableView: UIView { - - // Layout constants - let header_height = 60.0 - let title_left_margin = 20 - let dismiss_right_margin = 10 - let dismiss_icon_inset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) - let headerView = UIView() - let contentView = UIView() - var dismiss : CallControlButton? = nil - - init(title:String) { - super.init(frame:.zero) - - headerView.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get() - self.addSubview(headerView) - headerView.matchParentSideBorders().alignParentTop().height(header_height).done() - - dismiss = CallControlButton(imageInset:dismiss_icon_inset,buttonTheme: VoipTheme.voip_cancel, onClickAction: { - self.removeFromSuperview() - ControlsViewModel.shared.goToConferenceParticipantsListEvent.value = false - }) - headerView.addSubview(dismiss!) - dismiss?.alignParentRight(withMargin: dismiss_right_margin).centerY().done() - dismiss?.accessibilityIdentifier = "dismissable_view_close" - - let title = StyledLabel(VoipTheme.calls_list_header_font,title) - headerView.addSubview(title) - title.alignParentTop().alignParentLeft(withMargin: title_left_margin).centerY().done() - - self.addSubview(contentView) - contentView.alignUnder(view: headerView).matchParentSideBorders().alignParentBottom().done() - - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - self.headerView.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get() - } - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} diff --git a/Classes/Swift/Voip/Views/Fragments/LocalVideoView.swift b/Classes/Swift/Voip/Views/Fragments/LocalVideoView.swift deleted file mode 100644 index c5acb5185..000000000 --- a/Classes/Swift/Voip/Views/Fragments/LocalVideoView.swift +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import SnapKit -import linphonesw - -class LocalVideoView: UIView { - - //Layout constants - let corner_radius = 15.0 - let aspect_ratio = 4.0/3.0 - let switch_camera_button_margins = 8.0 - let switch_camera_button_size = 30 - - var width : CGFloat - - var dragZone : UIView? { - didSet { - let panGesture = UIPanGestureRecognizer(target: self, action: #selector(drag)) - isUserInteractionEnabled = true - addGestureRecognizer(panGesture) - } - } - - let switchCamera = UIImageView(image: UIImage(named:"voip_change_camera")?.tinted(with:.white)) - - var callData: CallData? = nil { - didSet { - callData?.isRemotelyRecorded.readCurrentAndObserve(onChange: { (isRemotelyRecording) in - self.isHidden = !(isRemotelyRecording == true) - }) - } - } - - required init?(coder: NSCoder) { - width = 0.0 - super.init(coder: coder) - } - - init (width:CGFloat) { - self.width = width - super.init(frame: .zero) - layer.cornerRadius = corner_radius - clipsToBounds = true - - addSubview(switchCamera) - switchCamera.alignParentTop(withMargin: switch_camera_button_margins).alignParentRight(withMargin: switch_camera_button_margins).square(switch_camera_button_size).done() - switchCamera.contentMode = .scaleAspectFit - contentMode = .scaleAspectFill - - switchCamera.onClick { - Core.get().toggleCamera() - } - setSizeConstraint() - } - - func getSize() -> CGSize { - let w = UIDevice.current.orientation.isLandscape ? width*aspect_ratio : width - let h = !UIDevice.current.orientation.isLandscape ? width*aspect_ratio : width - return CGSize(width: w,height: h) - } - - func setSizeConstraint() { - let targetSsize = getSize() - size(w: targetSsize.width, h: targetSsize.height).done() - } - - func updateSizeConstraint() { - let targetSsize = getSize() - updateSize(w: targetSsize.width, h: targetSsize.height).done() - } - - - @objc func drag(_ sender:UIPanGestureRecognizer){ - dragZone?.bringSubviewToFront(self) - let translation = sender.translation(in: dragZone) - center = CGPoint(x: center.x + translation.x, y: center.y + translation.y) - sender.setTranslation(CGPoint.zero, in: dragZone) - } - -} diff --git a/Classes/Swift/Voip/Views/Fragments/NumpadView.swift b/Classes/Swift/Voip/Views/Fragments/NumpadView.swift deleted file mode 100644 index 84cdc041e..000000000 --- a/Classes/Swift/Voip/Views/Fragments/NumpadView.swift +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import linphonesw - -@objc class NumpadView: UIView { - - // Layout constants - let side_margins = 10.0 - let margin_top = 100.0 - let eneteredDtmf_size = 40.0 - let button_size = 70 - let button_vertical_space = 17.0 - let button_horizontal_space = 14.0 - let digit_icon_inset = UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20) - let corner_radius = 20.0 - let pad_height = 550 - let side_padding = 50.0 - - - init(superView:UIView, callData:CallData, marginTop:CGFloat, above:UIView, onDismissAction : @escaping ()->Void) { - super.init(frame:.zero) - backgroundColor = VoipTheme.voip_translucent_popup_background - layer.cornerRadius = corner_radius - clipsToBounds = true - superView.addSubview(self) - accessibilityIdentifier = "call_numpad_view" - accessibilityViewIsModal = true - matchParentSideBorders(insetedByDx: side_margins).alignParentTop(withMargin: marginTop).alignAbove(view: above,withMargin: SharedLayoutConstants.buttons_bottom_margin).done() - - callData.callState.observe { state in - if (state == Call.State.End) { - //never happens - onDismissAction() - } - } - - // Hide numpad button - let hide = CallControlButton(buttonTheme: VoipTheme.voip_cancel_light, onClickAction: { - onDismissAction() - }) - addSubview(hide) - hide.alignParentRight(withMargin: side_margins).alignParentTop(withMargin: side_margins).done() - hide.accessibilityIdentifier = "call_numpad_view_hide" - hide.accessibilityLabel = "Hide" - - // DTMF History : - - let eneteredDtmf = StyledLabel(VoipTheme.dtmf_label) - addSubview(eneteredDtmf) - eneteredDtmf.height(eneteredDtmf_size).matchParentSideBorders().alignUnder(view:hide,withMargin:side_margins).done() - callData.enteredDTMF.readCurrentAndObserve { (dtmfs) in - eneteredDtmf.text = dtmfs - } - eneteredDtmf.accessibilityIdentifier = "call_numpad_view_text_field" - - // Digit buttons - - let allRows = UIStackView() - allRows.axis = .vertical - allRows.distribution = .equalSpacing - allRows.alignment = .center - allRows.spacing = button_vertical_space - allRows.layoutMargins = UIEdgeInsets(top: 0, left: side_padding, bottom: 0, right: side_padding) - allRows.isLayoutMarginsRelativeArrangement = true - addSubview(allRows) - _ = allRows.matchParentSideBorders().alignUnder(view:eneteredDtmf,withMargin: side_margins) - - - for key in [["1","2","3"],["4","5","6"],["7","8","9"],["*","0","#"]] { - let newRow = addRow(allRows: allRows) - for subkey in key { - let digit = CallControlButton(width:button_size, height:button_size, imageInset: digit_icon_inset, buttonTheme: ButtonTheme(tintableStateIcons:[UIButton.State.normal.rawValue : TintableIcon(name: "voip_numpad_\(iconNameForDigit(digit: subkey))")],backgroundStateColors:VoipTheme.numpad_digit_background), onClickAction: { - callData.sendDTMF(dtmf: "\(subkey)") - }) - newRow.addArrangedSubview(digit) - digit.accessibilityIdentifier = "call_numpad_view_digit_\(subkey)" - } - } - } - - func iconNameForDigit(digit:String) -> String { - if (digit == "*") { - return "star" - } - if (digit == "#") { - return "hash" - } - return digit - } - - func addRow(allRows:UIStackView) -> UIStackView { - let row = UIStackView() - row.axis = .horizontal - row.distribution = .equalSpacing - row.alignment = .center - row.spacing = button_vertical_space - row.isLayoutMarginsRelativeArrangement = true - allRows.addArrangedSubview(row) - return row - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - -} - - - diff --git a/Classes/Swift/Voip/Views/Fragments/ParticipantsList/ParticipantsListView.swift b/Classes/Swift/Voip/Views/Fragments/ParticipantsList/ParticipantsListView.swift deleted file mode 100644 index fabc1dc4a..000000000 --- a/Classes/Swift/Voip/Views/Fragments/ParticipantsList/ParticipantsListView.swift +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import linphonesw - -@objc class ParticipantsListView: DismissableView, UITableViewDataSource { - - // Layout constants - let side_margin = 10.0 - - let participantsListTableView = UITableView() - let noParticipantsLabel = StyledLabel(VoipTheme.empty_list_font,VoipTexts.conference_empty) - - - var callsDataObserver : MutableLiveDataOnChangeClosure<[CallData]>? = nil - - init() { - super.init(title: VoipTexts.call_action_participants_list) - - - let edit = CallControlButton(buttonTheme: VoipTheme.voip_edit, onClickAction: { - self.removeFromSuperview() - self.gotoParticipantsListSelection() - }) - super.headerView.addSubview(edit) - edit.centerY().done() - super.dismiss?.toRightOf(edit,withLeftMargin: dismiss_right_margin).centerY().done() - - - // ParticipantsList - super.contentView.addSubview(participantsListTableView) - participantsListTableView.matchParentDimmensions().done() - participantsListTableView.dataSource = self - participantsListTableView.register(VoipParticipantCell.self, forCellReuseIdentifier: "VoipParticipantCell") - participantsListTableView.allowsSelection = false - if #available(iOS 15.0, *) { - participantsListTableView.allowsFocus = false - } - participantsListTableView.separatorStyle = .singleLine - participantsListTableView.separatorColor = .white - - - ConferenceViewModel.shared.conferenceParticipants.readCurrentAndObserve{ _ in - self.participantsListTableView.reloadData() - self.noParticipantsLabel.isHidden = ConferenceViewModel.shared.conferenceParticipants.value?.count ?? 0 > 0 - } - - ConferenceViewModel.shared.isMeAdmin.readCurrentAndObserve { (meAdmin) in - edit.isHidden = meAdmin != true - } - - super.contentView.addSubview(noParticipantsLabel) - noParticipantsLabel.center().matchParentSideBorders(insetedByDx: side_margin).done() - noParticipantsLabel.isHidden = ConferenceViewModel.shared.conferenceParticipants.value?.count ?? 0 > 0 - noParticipantsLabel.numberOfLines = 2 - self.participantsListTableView.backgroundColor = VoipTheme.voipBackgroundBWColor.get() - - UIDeviceBridge.displayModeSwitched.observe { _ in - self.participantsListTableView.backgroundColor = VoipTheme.voipBackgroundBWColor.get() - self.participantsListTableView.reloadData() - } - } - - - // TableView datasource delegate - - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - guard let participants = ConferenceViewModel.shared.conferenceParticipants.value else { - return 0 - } - return participants.count - } - - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell:VoipParticipantCell = tableView.dequeueReusableCell(withIdentifier: "VoipParticipantCell") as! VoipParticipantCell - guard let participantData = ConferenceViewModel.shared.conferenceParticipants.value?[indexPath.row] else { - return cell - } - cell.selectionStyle = .none - cell.participantData = participantData - cell.owningParticpantsListView = self - return cell - } - - // View controller - - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - func gotoParticipantsListSelection() { - let view: ChatConversationCreateView = self.VIEW(ChatConversationCreateView.compositeViewDescription()) - view.unfragmentCompositeDescription() - let addresses = ConferenceViewModel.shared.conferenceParticipants.value!.map { (data) in String(data.participant.address!.asStringUriOnly()) } - view.tableController.contactsGroup = (addresses as NSArray).mutableCopy() as? NSMutableArray - view.isForEditing = false - view.isForVoipConference = true - view.isForOngoingVoipConference = true - view.tableController.notFirstTime = true - view.isGroupChat = true - PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) - } - - - - -} diff --git a/Classes/Swift/Voip/Views/Fragments/ParticipantsList/VoipParticipantCell.swift b/Classes/Swift/Voip/Views/Fragments/ParticipantsList/VoipParticipantCell.swift deleted file mode 100644 index f009cb3a3..000000000 --- a/Classes/Swift/Voip/Views/Fragments/ParticipantsList/VoipParticipantCell.swift +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import SnapKit -import linphonesw - -class VoipParticipantCell: UITableViewCell { - - // Layout Constants - - static let dismiss_icon_inset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) - let dismiss_right_margin = 10 - let check_box_size = 15 - static let cell_height = 80.0 - let avatar_left_margin = 15.0 - let texts_left_margin = 20.0 - let lime_badge_width = 18.0 - let lime_badge_offset = -10.0 - - let avatar = Avatar(color:VoipTheme.primaryTextColor, textStyle: VoipTheme.call_generated_avatar_small) - let limeBadge = UIImageView(image: UIImage(named: "security_toggle_icon_green")) - let displayName = StyledLabel(VoipTheme.conference_participant_name_font) - let sipAddress = StyledLabel(VoipTheme.conference_participant_sip_uri_font) - let isAdminView = UIStackView() - let isAdminLabel = StyledLabel(VoipTheme.conference_participant_admin_label,VoipTexts.chat_room_group_info_admin) - let isAdminCheck = UIImageView(image: UIImage(named:("check_unselected"))) - let removePart = CallControlButton(imageInset:dismiss_icon_inset,buttonTheme: VoipTheme.voip_cancel, onClickAction: {}) - let isSpeakerLabel = StyledLabel(VoipTheme.conference_participant_admin_label,VoipTexts.chat_room_group_info_speaker) - - let addButton = CallControlButton(buttonTheme:VoipTheme.nav_color_button("add_field_default")) - - var owningParticpantsListView : ParticipantsListView? = nil - - var participantData: ConferenceParticipantData? = nil { - didSet { - if let data = participantData { - limeBadge.isHidden = true - avatar.fillFromAddress(address: data.participant.address!) - displayName.text = data.participant.address?.addressBookEnhancedDisplayName() - sipAddress.text = data.participant.address?.asStringUriOnly() - data.isAdmin.readCurrentAndObserve { _ in - self.setAdminStatus(data: data) - } - data.isMeAdmin.readCurrentAndObserve { _ in - self.setAdminStatus(data: data) - } - self.isAdminView.onClick { - if !data.isBroadcast.value! { - data.conference.setParticipantAdminStatus(participant: data.participant, isAdmin: data.isAdmin.value != true) - self.owningParticpantsListView?.participantsListTableView.reloadData() - } - } - self.removePart.onClick { - try?data.conference.removeParticipant(participant: data.participant) - self.owningParticpantsListView?.participantsListTableView.reloadData() - } - } - } - } - - func setAdminStatus(data:ConferenceParticipantData) { - let isAdmin = data.isAdmin.value! - let isMeAdmin = data.isMeAdmin.value! - let isBroadcast = data.isBroadcast.value! - let isSpeaker = data.isSpeaker.value! - let isExistingConf = data.conference.call?.callLog?.conferenceInfo - if isExistingConf != nil { - addButton.isHidden = true - if isBroadcast { - self.removePart.isHidden = !isMeAdmin - self.isAdminView.isUserInteractionEnabled = isMeAdmin - self.isAdminLabel.isHidden = true - self.isSpeakerLabel.isHidden = !isSpeaker - self.isAdminCheck.isHidden = !isSpeaker - self.isAdminView.isHidden = false - } else { - self.removePart.isHidden = !isMeAdmin - self.isAdminView.isUserInteractionEnabled = isMeAdmin - self.isAdminLabel.isHidden = false - self.isSpeakerLabel.isHidden = true - self.isAdminLabel.textColor = !isAdmin ? VoipTheme.primarySubtextLightColor.get() : VoipTheme.primaryTextColor.get() - self.isAdminView.isHidden = !isAdmin && !isMeAdmin // Non admin don't see status of others non admin (they just see admins) - } - } else { - addButton.isHidden = false - } - } - - var scheduleConfParticipantAddress: Address? = nil { - didSet { - if let address = scheduleConfParticipantAddress { - avatar.fillFromAddress(address: address) - displayName.text = address.addressBookEnhancedDisplayName() - sipAddress.text = address.asStringUriOnly() - self.isAdminView.isHidden = true - self.removePart.isHidden = true - } - } - } - - - override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { - super.init(style: style, reuseIdentifier: reuseIdentifier) - contentView.height(VoipParticipantCell.cell_height).matchParentSideBorders().done() - - addSubview(avatar) - avatar.size(w: VoipCallCell.avatar_size, h: VoipCallCell.avatar_size).centerY().alignParentLeft(withMargin: avatar_left_margin).done() - - limeBadge.contentMode = .scaleAspectFit - addSubview(limeBadge) - limeBadge.toRightOf(avatar,withLeftMargin: lime_badge_offset).width(lime_badge_width).done() - - // Name Address - - let nameAddress = UIStackView() - nameAddress.addArrangedSubview(displayName) - nameAddress.addArrangedSubview(sipAddress) - nameAddress.axis = .vertical - addSubview(nameAddress) - nameAddress.toRightOf(avatar,withLeftMargin:texts_left_margin).centerY().done() - - // Admin section - isAdminView.spacing = 5 - - isAdminView.addArrangedSubview(isAdminCheck) - isAdminCheck.square(check_box_size).done() - isAdminCheck.contentMode = .scaleAspectFit - isAdminCheck.setContentHuggingPriority(.defaultHigh, for: .horizontal) - - isAdminView.addArrangedSubview(isAdminLabel) - isAdminLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal) - - isAdminView.addArrangedSubview(isSpeakerLabel) - isSpeakerLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal) - - isAdminView.addArrangedSubview(removePart) - removePart.setContentHuggingPriority(.defaultHigh, for: .horizontal) - - addSubview(isAdminView) - isAdminView.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor).isActive = true - isAdminView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true - isAdminView.matchParentHeight().toRightOf(nameAddress).alignParentRight(withMargin: dismiss_right_margin).done() - contentView.backgroundColor = .clear - backgroundColor = .clear - - // Add button for broadcast mode - addSubview(addButton) - addButton.alignParentRight(withMargin: 10).matchParentHeight().done() - addButton.isEnabled = true - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} diff --git a/Classes/Swift/Voip/Views/Fragments/PausedCallOrConferenceView.swift b/Classes/Swift/Voip/Views/Fragments/PausedCallOrConferenceView.swift deleted file mode 100644 index 456eda2da..000000000 --- a/Classes/Swift/Voip/Views/Fragments/PausedCallOrConferenceView.swift +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import SnapKit -import linphonesw - -class PausedCallOrConferenceView: UIView { - - // Layout constants - let icon_size = 200 - let icon_padding = 80.0 - let title_margin_top = 20 - - var icon : UIImageView? = nil - let title = StyledLabel(VoipTheme.call_or_conference_title) - let subtitle = StyledLabel(VoipTheme.call_or_conference_subtitle) - - var onClickAction : (()->Void)? = nil - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - init (iconName:String, titleText:String, subTitleText:String? = nil, onClickAction : (()->Void)? = nil) { - super.init(frame: .zero) - - backgroundColor = VoipTheme.voip_translucent_popup_background - accessibilityIdentifier = "paused_call_view" - accessibilityViewIsModal = true - - let centeredView = UIView() - icon = UIImageView(image: UIImage(named:iconName)?.withPadding(padding: icon_padding)) - icon!.backgroundColor = VoipTheme.primary_color - icon!.layer.cornerRadius = CGFloat(icon_size/2) - icon!.clipsToBounds = true - icon!.contentMode = .scaleAspectFit - centeredView.addSubview(icon!) - icon!.square(icon_size).centerX().done() - icon!.accessibilityIdentifier = "paused_call_view_icon" - - title.numberOfLines = 0 - centeredView.addSubview(title) - title.alignUnder(view:icon!, withMargin:title_margin_top).matchParentSideBorders().done() - title.text = titleText - - subtitle.numberOfLines = 0 - centeredView.addSubview(subtitle) - subtitle.alignUnder(view: title).matchParentSideBorders().done() - subtitle.text = subTitleText - - self.addSubview(centeredView) - centeredView.center().matchParentSideBorders().wrapContentY().done() - - self.onClickAction = onClickAction - icon!.onClick { - self.onClickAction?() - } - - self.onClickAction = onClickAction - icon!.onClick { - self.onClickAction?() - } - - self.onClickAction = onClickAction - icon!.onClick { - self.onClickAction?() - } - - } - -} diff --git a/Classes/Swift/Voip/Views/Fragments/RemotelyRecording.swift b/Classes/Swift/Voip/Views/Fragments/RemotelyRecording.swift deleted file mode 100644 index ff9eb55eb..000000000 --- a/Classes/Swift/Voip/Views/Fragments/RemotelyRecording.swift +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import SnapKit -import linphonesw - -class RemotelyRecordingView: UIView { - - let label = StyledLabel(VoipTheme.call_remote_recording) - let icon = UIImageView(image: UIImage(named:"voip_remote_recording")) - - var isRemotelyRecorded: MutableLiveData? = nil { - didSet { - isRemotelyRecorded?.readCurrentAndObserve(onChange: { (isRemotelyRecording) in - self.isHidden = isRemotelyRecording != true - }) - } - } - - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - init (height:Int, text:String) { - super.init(frame: .zero) - backgroundColor = VoipTheme.dark_grey_color - layer.cornerRadius = CGFloat(height/2) - clipsToBounds = true - - addSubview(label) - label.center().height(CGFloat(height)).done() - label.text = text - - addSubview(icon) - icon.square(height).toLeftOf(label).done() - - isHidden = true - - } - -} diff --git a/Classes/Swift/Voip/Views/Fragments/SpeakersList/SpeakersListView.swift b/Classes/Swift/Voip/Views/Fragments/SpeakersList/SpeakersListView.swift deleted file mode 100644 index 621cf771a..000000000 --- a/Classes/Swift/Voip/Views/Fragments/SpeakersList/SpeakersListView.swift +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import linphonesw - -@objc class SpeakersListView: DismissableView, UITableViewDataSource { - - // Layout constants - let side_margin = 10.0 - - let speakersListTableView = UITableView() - let noSpeakersLabel = StyledLabel(VoipTheme.empty_list_font,VoipTexts.conference_empty) - - - var callsDataObserver : MutableLiveDataOnChangeClosure<[CallData]>? = nil - - init() { - super.init(title: VoipTexts.call_action_speakers_list) - - - let edit = CallControlButton(buttonTheme: VoipTheme.voip_edit, onClickAction: { - self.removeFromSuperview() - self.gotoSpeakersListSelection() - }) - super.headerView.addSubview(edit) - edit.centerY().done() - super.dismiss?.toRightOf(edit,withLeftMargin: dismiss_right_margin).centerY().done() - - - // SpeakersList - super.contentView.addSubview(speakersListTableView) - speakersListTableView.matchParentDimmensions().done() - speakersListTableView.dataSource = self - speakersListTableView.register(VoipSpeakerCell.self, forCellReuseIdentifier: "VoipSpeakerCell") - speakersListTableView.allowsSelection = false - if #available(iOS 15.0, *) { - speakersListTableView.allowsFocus = false - } - speakersListTableView.separatorStyle = .singleLine - speakersListTableView.separatorColor = .white - - - ConferenceViewModel.shared.conferenceSpeakers.readCurrentAndObserve{ _ in - self.speakersListTableView.reloadData() - self.noSpeakersLabel.isHidden = ConferenceViewModel.shared.conferenceSpeakers.value?.count ?? 0 > 0 - } - - ConferenceViewModel.shared.isMeAdmin.readCurrentAndObserve { (meAdmin) in - edit.isHidden = meAdmin != true - } - - super.contentView.addSubview(noSpeakersLabel) - noSpeakersLabel.center().matchParentSideBorders(insetedByDx: side_margin).done() - noSpeakersLabel.isHidden = ConferenceViewModel.shared.conferenceSpeakers.value?.count ?? 0 > 0 - noSpeakersLabel.numberOfLines = 2 - self.speakersListTableView.backgroundColor = VoipTheme.voipBackgroundBWColor.get() - - UIDeviceBridge.displayModeSwitched.observe { _ in - self.speakersListTableView.backgroundColor = VoipTheme.voipBackgroundBWColor.get() - self.speakersListTableView.reloadData() - } - } - - - // TableView datasource delegate - - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - guard let speakers = ConferenceViewModel.shared.conferenceSpeakers.value else { - return 0 - } - return speakers.count - } - - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell:VoipSpeakerCell = tableView.dequeueReusableCell(withIdentifier: "VoipSpeakerCell") as! VoipSpeakerCell - guard let speakerData = ConferenceViewModel.shared.conferenceSpeakers.value?[indexPath.row] else { - return cell - } - cell.selectionStyle = .none - cell.speakerData = speakerData - cell.owningParticpantsListView = self - return cell - } - - // View controller - - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - func gotoSpeakersListSelection() { - let view: ChatConversationCreateView = self.VIEW(ChatConversationCreateView.compositeViewDescription()) - view.unfragmentCompositeDescription() - let addresses = ConferenceViewModel.shared.conferenceSpeakers.value!.map { (data) in String(data.speaker.address!.asStringUriOnly()) } - view.tableController.contactsGroup = (addresses as NSArray).mutableCopy() as? NSMutableArray - view.isForEditing = false - view.isForVoipConference = true - view.isForOngoingVoipConference = true - view.tableController.notFirstTime = true - view.isGroupChat = true - PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) - } - - - - -} diff --git a/Classes/Swift/Voip/Views/Fragments/SpeakersList/VoipSpeakerCell.swift b/Classes/Swift/Voip/Views/Fragments/SpeakersList/VoipSpeakerCell.swift deleted file mode 100644 index 04651983a..000000000 --- a/Classes/Swift/Voip/Views/Fragments/SpeakersList/VoipSpeakerCell.swift +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import SnapKit -import linphonesw - -class VoipSpeakerCell: UITableViewCell { - - // Layout Constants - - static let dismiss_icon_inset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) - let dismiss_right_margin = 10 - let check_box_size = 15 - static let cell_height = 80.0 - let avatar_left_margin = 15.0 - let texts_left_margin = 20.0 - let lime_badge_width = 18.0 - let lime_badge_offset = -10.0 - - let avatar = Avatar(color:VoipTheme.primaryTextColor, textStyle: VoipTheme.call_generated_avatar_small) - let limeBadge = UIImageView(image: UIImage(named: "security_toggle_icon_green")) - let displayName = StyledLabel(VoipTheme.conference_participant_name_font) - let sipAddress = StyledLabel(VoipTheme.conference_participant_sip_uri_font) - let isAdminView = UIStackView() - let isAdminLabel = StyledLabel(VoipTheme.conference_participant_admin_label,VoipTexts.chat_room_group_info_admin) - let isAdminCheck = UIImageView(image: UIImage(named:("check_unselected"))) - let removePart = CallControlButton(imageInset:dismiss_icon_inset,buttonTheme: VoipTheme.voip_cancel, onClickAction: {}) - - let deleteButton = CallControlButton(buttonTheme:VoipTheme.nav_color_button("delete_field_default")) - - var owningParticpantsListView : SpeakersListView? = nil - - var speakerData: ConferenceSpeakerData? = nil { - didSet { - if let data = speakerData { - limeBadge.isHidden = true - avatar.fillFromAddress(address: data.speaker.address!) - displayName.text = data.speaker.address?.addressBookEnhancedDisplayName() - sipAddress.text = data.speaker.address?.asStringUriOnly() - data.isAdmin.readCurrentAndObserve { _ in - self.setAdminStatus(data: data) - } - data.isMeAdmin.readCurrentAndObserve { _ in - self.setAdminStatus(data: data) - } - self.isAdminView.onClick { - data.conference.setParticipantAdminStatus(participant: data.speaker, isAdmin: data.isAdmin.value != true) - self.owningParticpantsListView?.speakersListTableView.reloadData() - } - self.removePart.onClick { - try?data.conference.removeParticipant(participant: data.speaker) - self.owningParticpantsListView?.speakersListTableView.reloadData() - } - } - } - } - - func setAdminStatus(data:ConferenceSpeakerData) { - let isAdmin = data.isAdmin.value! - let isMeAdmin = data.isMeAdmin.value! - self.removePart.isHidden = !isMeAdmin - self.isAdminView.isUserInteractionEnabled = isMeAdmin - self.isAdminLabel.textColor = !isAdmin ? VoipTheme.primarySubtextLightColor.get() : VoipTheme.primaryTextColor.get() - self.isAdminView.isHidden = !isAdmin && !isMeAdmin // Non admin don't see status of others non admin (they just see admins) - } - - var scheduleConfSpeakerAddress: Address? = nil { - didSet { - if let address = scheduleConfSpeakerAddress { - avatar.fillFromAddress(address: address) - displayName.text = address.addressBookEnhancedDisplayName() - sipAddress.text = address.asStringUriOnly() - self.isAdminView.isHidden = true - self.removePart.isHidden = true - } - } - } - - - override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { - super.init(style: style, reuseIdentifier: reuseIdentifier) - contentView.height(VoipSpeakerCell.cell_height).matchParentSideBorders().done() - - addSubview(avatar) - avatar.size(w: VoipCallCell.avatar_size, h: VoipCallCell.avatar_size).centerY().alignParentLeft(withMargin: avatar_left_margin).done() - - limeBadge.contentMode = .scaleAspectFit - addSubview(limeBadge) - limeBadge.toRightOf(avatar,withLeftMargin: lime_badge_offset).width(lime_badge_width).done() - - // Name Address - - let nameAddress = UIStackView() - nameAddress.addArrangedSubview(displayName) - nameAddress.addArrangedSubview(sipAddress) - nameAddress.axis = .vertical - addSubview(nameAddress) - nameAddress.toRightOf(avatar,withLeftMargin:texts_left_margin).centerY().done() - - // Admin section - isAdminView.spacing = 5 - - isAdminView.addArrangedSubview(isAdminCheck) - isAdminCheck.square(check_box_size).done() - isAdminCheck.contentMode = .scaleAspectFit - isAdminCheck.setContentHuggingPriority(.defaultHigh, for: .horizontal) - - isAdminView.addArrangedSubview(isAdminLabel) - isAdminLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal) - - isAdminView.addArrangedSubview(removePart) - removePart.setContentHuggingPriority(.defaultHigh, for: .horizontal) - - addSubview(isAdminView) - isAdminView.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor).isActive = true - isAdminView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true - isAdminView.matchParentHeight().toRightOf(nameAddress).alignParentRight(withMargin: dismiss_right_margin).done() - contentView.backgroundColor = .clear - backgroundColor = .clear - - // Delete button for broadcast mode - addSubview(deleteButton) - deleteButton.alignParentRight(withMargin: 10).matchParentHeight().done() - deleteButton.isEnabled = true - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} diff --git a/Classes/Swift/Voip/Views/Fragments/VoipExtraButtonsView.swift b/Classes/Swift/Voip/Views/Fragments/VoipExtraButtonsView.swift deleted file mode 100644 index 3db0ae930..000000000 --- a/Classes/Swift/Voip/Views/Fragments/VoipExtraButtonsView.swift +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import UIKit -import Foundation -import SnapKit -import linphonesw - -class VoipExtraButtonsView: UIStackView { - - //Layout constants - let height = 200.0 - let corner_radius = 20.0 - - required init(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - init () { - super.init(frame: .zero) - - axis = .vertical - distribution = .fillEqually - alignment = .center - layer.cornerRadius = corner_radius - clipsToBounds = true - accessibilityIdentifier = "active_call_extra_buttons_view" - accessibilityViewIsModal = true - - let background = UIView() - background.backgroundColor = VoipTheme.voipExtraButtonsBackgroundColor.get() - addSubview(background) - background.layer.cornerRadius = corner_radius - background.clipsToBounds = true - background.matchParentDimmensions().done() - - height(height).done() - - let row1 = UIStackView() - row1.axis = .horizontal - row1.distribution = .fillEqually - row1.alignment = .center - - - // First row - let numpad = VoipExtraButton(text: VoipTexts.call_action_numpad, buttonTheme: VoipTheme.call_action("voip_call_numpad"),onClickAction: { - ControlsViewModel.shared.numpadVisible.value = true - }) - row1.addArrangedSubview(numpad) - numpad.accessibilityIdentifier = "active_call_extra_buttons_numpad" - - let stats = VoipExtraButton(text: VoipTexts.call_action_statistics, buttonTheme: VoipTheme.call_action("voip_call_stats"),onClickAction: { - ControlsViewModel.shared.callStatsVisible.value = true - }) - row1.addArrangedSubview(stats) - stats.accessibilityIdentifier = "active_call_extra_buttons_stats" - - let chats = VoipExtraButton(text: VoipTexts.call_action_chat, buttonTheme: VoipTheme.call_action("voip_call_chat"),withbBoucinCounterDataSource:CallsViewModel.shared.currentCallUnreadChatMessageCount, onClickAction: { - ControlsViewModel.shared.goToChatEvent.notifyAllObservers(with: true) - }) - row1.addArrangedSubview(chats) - chats.accessibilityIdentifier = "active_call_extra_buttons_chats" - - addArrangedSubview(row1) - row1.matchParentSideBorders().done() - - // Second row - - let row2 = UIStackView() - row2.axis = .horizontal - row2.distribution = .fillEqually - row2.alignment = .center - - var transfer = VoipExtraButton(text: CallsViewModel.shared.inactiveCallsCount.value! < 1 ? VoipTexts.call_action_transfer_call : VoipTexts.call_context_action_attended_transfer, buttonTheme: VoipTheme.call_action("voip_call_forward"),onClickAction: { - if CallsViewModel.shared.inactiveCallsCount.value! < 1 { - let view: DialerView = self.VIEW(DialerView.compositeViewDescription()); - view.setAddress("") - CallManager.instance().nextCallIsTransfer = true - PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) - }else{ - self.attendedTransfer() - } - }) - row2.addArrangedSubview(transfer) - transfer.accessibilityIdentifier = "active_call_extra_buttons_transfer" - - let participants = VoipExtraButton(text: VoipTexts.call_action_participants_list, buttonTheme: VoipTheme.call_action("voip_call_participants"),onClickAction: { - ControlsViewModel.shared.goToConferenceParticipantsListEvent.value = true - }) - row2.addArrangedSubview(participants) - participants.accessibilityIdentifier = "active_call_extra_buttons_participants" - - let addcall = VoipExtraButton(text: VoipTexts.call_action_add_call, buttonTheme: VoipTheme.call_action("voip_call_add"),onClickAction: { - let view: DialerView = self.VIEW(DialerView.compositeViewDescription()); - view.setAddress("") - CallManager.instance().nextCallIsTransfer = false - PhoneMainView.instance().changeCurrentView(view.compositeViewDescription()) - }) - row2.addArrangedSubview(addcall) - addcall.accessibilityIdentifier = "active_call_extra_buttons_add_call" - - let layoutselect = VoipExtraButton(text: VoipTexts.call_action_change_conf_layout, buttonTheme: VoipTheme.call_action("voip_conference_mosaic"),onClickAction: { - ControlsViewModel.shared.goToConferenceLayoutSettings.notifyAllObservers(with: true) - }) - row2.addArrangedSubview(layoutselect) - - if (Core.get().config?.getBool(section: "app", key: "disable_video_feature", defaultValue: false) == true) { - layoutselect.isEnabled = false - layoutselect.setTitleColor(.gray, for: .disabled) - if #available(iOS 13.0, *) { - layoutselect.setImage(UIImage(named: "voip_conference_mosaic")!.withTintColor(.gray), for: .disabled) - } - } - - let calls = VoipExtraButton(text: VoipTexts.call_action_calls_list, buttonTheme: VoipTheme.call_action("voip_calls_list"), withbBoucinCounterDataSource: CallsViewModel.shared.inactiveCallsCount, onClickAction: { - ControlsViewModel.shared.goToCallsListEvent.notifyAllObservers(with: true) - }) - row2.addArrangedSubview(calls) - calls.accessibilityIdentifier = "active_call_extra_buttons_calls" - - addArrangedSubview(row2) - row2.matchParentSideBorders().done() - - ConferenceViewModel.shared.conferenceExists.readCurrentAndObserve { (isIn) in - participants.isHidden = isIn != true - layoutselect.isHidden = isIn != true - transfer.isHidden = isIn == true - addcall.isHidden = isIn == true - } - - CallsViewModel.shared.inactiveCallsCount.readCurrentAndObserve { title in - transfer.setTitle(title! < 1 ? VoipTexts.call_action_transfer_call : VoipTexts.call_context_action_attended_transfer, for: .normal) - } - } - - func refresh() { - CallsViewModel.shared.currentCallUnreadChatMessageCount.notifyValue() - CallsViewModel.shared.inactiveCallsCount.notifyValue() - } - - func attendedTransfer() { - var core = CallManager.instance().lc - var currentCall = core?.currentCall - - if (currentCall == nil) { - Log.e("[Call Controls] Can't do an attended transfer without a current call") - return - } - - if let callsNb = core?.callsNb, callsNb <= 1 { - Log.e("[Call Controls] Need at least two calls to do an attended transfer") - return - } - - var callToTransferTo = core!.calls.last { call in - call.state == Call.State.Paused - } - - if (callToTransferTo == nil) { - Log.e("[Call Controls] Couldn't find a call in Paused state to transfer current call to") - return - } - - Log.i( - "[Call Controls] Doing an attended transfer between active call [${currentCall.remoteAddress.asStringUriOnly()}] and paused call [${callToTransferTo.remoteAddress.asStringUriOnly()}]" - ) - - do{ - try callToTransferTo?.transferToAnother(dest: currentCall!) - }catch{ - Log.e("[Call Controls] Attended transfer failed!") - } - } -} diff --git a/Classes/Swift/Voip/Views/SharedLayoutConstants.swift b/Classes/Swift/Voip/Views/SharedLayoutConstants.swift deleted file mode 100644 index ccb45a9e0..000000000 --- a/Classes/Swift/Voip/Views/SharedLayoutConstants.swift +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import Foundation - -class SharedLayoutConstants { - static var buttons_bottom_margin : Int { - get { UIDevice.hasNotch() && UIDevice.current.orientation == .portrait ? 30 : 15 } - } - static let margin_call_view_side_controls_buttons = 12 - static let bottom_margin_notch_clearance = UIDevice.hasNotch() ? 30.0 : 0.0 - static let content_inset = 12.0 -} diff --git a/Classes/Swift/Voip/VoipDialog.swift b/Classes/Swift/Voip/VoipDialog.swift deleted file mode 100644 index 8aa53ed30..000000000 --- a/Classes/Swift/Voip/VoipDialog.swift +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -class VoipDialog : UIView{ - - // Layout constants - let center_corner_radius = 7.0 - let title_margin_top = 20 - let title_margin_sides = 10.0 - let button_margin = 20.0 - let button_width = 135.0 - let button_height = 40.0 - let button_radius = 3.0 - let button_spacing = 15.0 - let center_view_sides_margin = 13.0 - - - let title = StyledLabel(VoipTheme.basic_popup_title) - - init(message:String, givenButtons:[ButtonAttributes]? = nil) { - - super.init(frame: .zero) - backgroundColor = VoipTheme.voip_translucent_popup_background - - let centerView = UIView() - centerView.backgroundColor = VoipTheme.dark_grey_color.withAlphaComponent(0.8) - centerView.layer.cornerRadius = center_corner_radius - centerView.clipsToBounds = true - addSubview(centerView) - - title.numberOfLines = 0 - centerView.addSubview(title) - title.alignParentTop(withMargin:title_margin_top).matchParentSideBorders(insetedByDx: title_margin_sides).done() - title.text = message - - let buttonsView = UIStackView() - buttonsView.axis = .horizontal - buttonsView.spacing = button_spacing - - var buttons = givenButtons - - if (buttons == nil) { // assuming info popup, just putting an ok button - let ok = ButtonAttributes(text:VoipTexts.ok, action: {}, isDestructive:false) - buttons = [ok] - } - - buttons?.forEach { - let b = ButtonWithStateBackgrounds(backgroundStateColors: $0.isDestructive ? VoipTheme.primary_colors_background_gray : VoipTheme.primary_colors_background) - b.setTitle($0.text, for: .normal) - b.layer.cornerRadius = button_radius - b.clipsToBounds = true - buttonsView.addArrangedSubview(b) - b.applyTitleStyle(VoipTheme.form_button_bold) - let action = $0.action - b.onClick { - self.removeFromSuperview() - action() - } - b.size(w: button_width,h: button_height).done() - } - centerView.addSubview(buttonsView) - buttonsView.alignUnder(view:title,withMargin:button_margin).alignParentBottom(withMargin:button_margin).centerX().done() - - - - centerView.matchParentSideBorders(insetedByDx: center_view_sides_margin).center().done() - } - - func show() { - VoipDialog.rootVC()?.view.addSubview(self) - matchParentDimmensions().done() - } - - private static func rootVC() -> UIViewController? { - return PhoneMainView.instance().mainViewController - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - static var toastQueue: [String] = [] - - static func toast(message:String, timeout:CGFloat = 1.5) { - if (toastQueue.count > 0) { - toastQueue.append(message) - return - } - let rooVc = rootVC() - let alert = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) - alert.popoverPresentationController?.sourceView = PhoneMainView.instance().mainViewController.statusBarView - rooVc?.present(alert, animated: true) - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + timeout) { - alert.dismiss(animated: true) - if (toastQueue.count > 0) { - let message = toastQueue.first - toastQueue.remove(at: 0) - self.toast(message: message!) - } - } - } - -} - -struct ButtonAttributes { - let text:String - let action: (()->Void) - let isDestructive: Bool -} diff --git a/Classes/Swift/Voip/VoipDialog_BACKUP_1064.swift b/Classes/Swift/Voip/VoipDialog_BACKUP_1064.swift deleted file mode 100644 index 47c1bd059..000000000 --- a/Classes/Swift/Voip/VoipDialog_BACKUP_1064.swift +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -class VoipDialog : UIView{ - - // Layout constants - let center_corner_radius = 7.0 - let title_margin_top = 20 -<<<<<<< HEAD - let title_margin_sides = 10.0 -======= - let title_side_margin = 10 ->>>>>>> 4b91fc131 (all) - let button_margin = 20.0 - let button_width = 135.0 - let button_height = 40.0 - let button_radius = 3.0 - let button_spacing = 15.0 - let center_view_sides_margin = 13.0 - - - let title = StyledLabel(VoipTheme.basic_popup_title) - - init(message:String, givenButtons:[ButtonAttributes]? = nil) { - - super.init(frame: .zero) - backgroundColor = VoipTheme.voip_translucent_popup_background - - let centerView = UIView() - centerView.backgroundColor = VoipTheme.dark_grey_color.withAlphaComponent(0.8) - centerView.layer.cornerRadius = center_corner_radius - centerView.clipsToBounds = true - addSubview(centerView) - - title.numberOfLines = 0 - centerView.addSubview(title) -<<<<<<< HEAD - title.alignParentTop(withMargin:title_margin_top).matchParentSideBorders(insetedByDx: title_margin_sides).done() -======= - title.alignParentTop(withMargin:title_margin_top).matchParentSideBorders(insetedByDx: CGFloat(title_side_margin)).done() ->>>>>>> 4b91fc131 (all) - title.text = message - - let buttonsView = UIStackView() - buttonsView.axis = .horizontal - buttonsView.spacing = button_spacing - - var buttons = givenButtons - - if (buttons == nil) { // assuming info popup, just putting an ok button - let ok = ButtonAttributes(text:VoipTexts.ok, action: {}, isDestructive:false) - buttons = [ok] - } - - buttons?.forEach { - let b = ButtonWithStateBackgrounds(backgroundStateColors: $0.isDestructive ? VoipTheme.primary_colors_background_gray : VoipTheme.primary_colors_background) - b.setTitle($0.text, for: .normal) - b.layer.cornerRadius = button_radius - b.clipsToBounds = true - buttonsView.addArrangedSubview(b) - b.applyTitleStyle(VoipTheme.form_button_bold) - let action = $0.action - b.onClick { - self.removeFromSuperview() - action() - } - b.size(w: button_width,h: button_height).done() - } - centerView.addSubview(buttonsView) - buttonsView.alignUnder(view:title,withMargin:button_margin).alignParentBottom(withMargin:button_margin).centerX().done() - - - - centerView.matchParentSideBorders(insetedByDx: center_view_sides_margin).center().done() - } - - func show() { - VoipDialog.rootVC()?.view.addSubview(self) - matchParentDimmensions().done() - } - - private static func rootVC() -> UIViewController? { - return PhoneMainView.instance().mainViewController - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - static var toastQueue: [String] = [] - - static func toast(message:String, timeout:CGFloat = 1.5) { - if (toastQueue.count > 0) { - toastQueue.append(message) - return - } - let alert = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) - rootVC()?.present(alert, animated: true) - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + timeout) { - alert.dismiss(animated: true) - if (toastQueue.count > 0) { - let message = toastQueue.first - toastQueue.remove(at: 0) - self.toast(message: message!) - } - } - } - -} - -struct ButtonAttributes { - let text:String - let action: (()->Void) - let isDestructive: Bool -} diff --git a/Classes/Swift/Voip/VoipDialog_BACKUP_1156.swift b/Classes/Swift/Voip/VoipDialog_BACKUP_1156.swift deleted file mode 100644 index 47c1bd059..000000000 --- a/Classes/Swift/Voip/VoipDialog_BACKUP_1156.swift +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -class VoipDialog : UIView{ - - // Layout constants - let center_corner_radius = 7.0 - let title_margin_top = 20 -<<<<<<< HEAD - let title_margin_sides = 10.0 -======= - let title_side_margin = 10 ->>>>>>> 4b91fc131 (all) - let button_margin = 20.0 - let button_width = 135.0 - let button_height = 40.0 - let button_radius = 3.0 - let button_spacing = 15.0 - let center_view_sides_margin = 13.0 - - - let title = StyledLabel(VoipTheme.basic_popup_title) - - init(message:String, givenButtons:[ButtonAttributes]? = nil) { - - super.init(frame: .zero) - backgroundColor = VoipTheme.voip_translucent_popup_background - - let centerView = UIView() - centerView.backgroundColor = VoipTheme.dark_grey_color.withAlphaComponent(0.8) - centerView.layer.cornerRadius = center_corner_radius - centerView.clipsToBounds = true - addSubview(centerView) - - title.numberOfLines = 0 - centerView.addSubview(title) -<<<<<<< HEAD - title.alignParentTop(withMargin:title_margin_top).matchParentSideBorders(insetedByDx: title_margin_sides).done() -======= - title.alignParentTop(withMargin:title_margin_top).matchParentSideBorders(insetedByDx: CGFloat(title_side_margin)).done() ->>>>>>> 4b91fc131 (all) - title.text = message - - let buttonsView = UIStackView() - buttonsView.axis = .horizontal - buttonsView.spacing = button_spacing - - var buttons = givenButtons - - if (buttons == nil) { // assuming info popup, just putting an ok button - let ok = ButtonAttributes(text:VoipTexts.ok, action: {}, isDestructive:false) - buttons = [ok] - } - - buttons?.forEach { - let b = ButtonWithStateBackgrounds(backgroundStateColors: $0.isDestructive ? VoipTheme.primary_colors_background_gray : VoipTheme.primary_colors_background) - b.setTitle($0.text, for: .normal) - b.layer.cornerRadius = button_radius - b.clipsToBounds = true - buttonsView.addArrangedSubview(b) - b.applyTitleStyle(VoipTheme.form_button_bold) - let action = $0.action - b.onClick { - self.removeFromSuperview() - action() - } - b.size(w: button_width,h: button_height).done() - } - centerView.addSubview(buttonsView) - buttonsView.alignUnder(view:title,withMargin:button_margin).alignParentBottom(withMargin:button_margin).centerX().done() - - - - centerView.matchParentSideBorders(insetedByDx: center_view_sides_margin).center().done() - } - - func show() { - VoipDialog.rootVC()?.view.addSubview(self) - matchParentDimmensions().done() - } - - private static func rootVC() -> UIViewController? { - return PhoneMainView.instance().mainViewController - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - static var toastQueue: [String] = [] - - static func toast(message:String, timeout:CGFloat = 1.5) { - if (toastQueue.count > 0) { - toastQueue.append(message) - return - } - let alert = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) - rootVC()?.present(alert, animated: true) - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + timeout) { - alert.dismiss(animated: true) - if (toastQueue.count > 0) { - let message = toastQueue.first - toastQueue.remove(at: 0) - self.toast(message: message!) - } - } - } - -} - -struct ButtonAttributes { - let text:String - let action: (()->Void) - let isDestructive: Bool -} diff --git a/Classes/Swift/Voip/VoipDialog_BACKUP_884.swift b/Classes/Swift/Voip/VoipDialog_BACKUP_884.swift deleted file mode 100644 index 47c1bd059..000000000 --- a/Classes/Swift/Voip/VoipDialog_BACKUP_884.swift +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -class VoipDialog : UIView{ - - // Layout constants - let center_corner_radius = 7.0 - let title_margin_top = 20 -<<<<<<< HEAD - let title_margin_sides = 10.0 -======= - let title_side_margin = 10 ->>>>>>> 4b91fc131 (all) - let button_margin = 20.0 - let button_width = 135.0 - let button_height = 40.0 - let button_radius = 3.0 - let button_spacing = 15.0 - let center_view_sides_margin = 13.0 - - - let title = StyledLabel(VoipTheme.basic_popup_title) - - init(message:String, givenButtons:[ButtonAttributes]? = nil) { - - super.init(frame: .zero) - backgroundColor = VoipTheme.voip_translucent_popup_background - - let centerView = UIView() - centerView.backgroundColor = VoipTheme.dark_grey_color.withAlphaComponent(0.8) - centerView.layer.cornerRadius = center_corner_radius - centerView.clipsToBounds = true - addSubview(centerView) - - title.numberOfLines = 0 - centerView.addSubview(title) -<<<<<<< HEAD - title.alignParentTop(withMargin:title_margin_top).matchParentSideBorders(insetedByDx: title_margin_sides).done() -======= - title.alignParentTop(withMargin:title_margin_top).matchParentSideBorders(insetedByDx: CGFloat(title_side_margin)).done() ->>>>>>> 4b91fc131 (all) - title.text = message - - let buttonsView = UIStackView() - buttonsView.axis = .horizontal - buttonsView.spacing = button_spacing - - var buttons = givenButtons - - if (buttons == nil) { // assuming info popup, just putting an ok button - let ok = ButtonAttributes(text:VoipTexts.ok, action: {}, isDestructive:false) - buttons = [ok] - } - - buttons?.forEach { - let b = ButtonWithStateBackgrounds(backgroundStateColors: $0.isDestructive ? VoipTheme.primary_colors_background_gray : VoipTheme.primary_colors_background) - b.setTitle($0.text, for: .normal) - b.layer.cornerRadius = button_radius - b.clipsToBounds = true - buttonsView.addArrangedSubview(b) - b.applyTitleStyle(VoipTheme.form_button_bold) - let action = $0.action - b.onClick { - self.removeFromSuperview() - action() - } - b.size(w: button_width,h: button_height).done() - } - centerView.addSubview(buttonsView) - buttonsView.alignUnder(view:title,withMargin:button_margin).alignParentBottom(withMargin:button_margin).centerX().done() - - - - centerView.matchParentSideBorders(insetedByDx: center_view_sides_margin).center().done() - } - - func show() { - VoipDialog.rootVC()?.view.addSubview(self) - matchParentDimmensions().done() - } - - private static func rootVC() -> UIViewController? { - return PhoneMainView.instance().mainViewController - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - static var toastQueue: [String] = [] - - static func toast(message:String, timeout:CGFloat = 1.5) { - if (toastQueue.count > 0) { - toastQueue.append(message) - return - } - let alert = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) - rootVC()?.present(alert, animated: true) - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + timeout) { - alert.dismiss(animated: true) - if (toastQueue.count > 0) { - let message = toastQueue.first - toastQueue.remove(at: 0) - self.toast(message: message!) - } - } - } - -} - -struct ButtonAttributes { - let text:String - let action: (()->Void) - let isDestructive: Bool -} diff --git a/Classes/Swift/Voip/VoipDialog_BACKUP_973.swift b/Classes/Swift/Voip/VoipDialog_BACKUP_973.swift deleted file mode 100644 index 47c1bd059..000000000 --- a/Classes/Swift/Voip/VoipDialog_BACKUP_973.swift +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -class VoipDialog : UIView{ - - // Layout constants - let center_corner_radius = 7.0 - let title_margin_top = 20 -<<<<<<< HEAD - let title_margin_sides = 10.0 -======= - let title_side_margin = 10 ->>>>>>> 4b91fc131 (all) - let button_margin = 20.0 - let button_width = 135.0 - let button_height = 40.0 - let button_radius = 3.0 - let button_spacing = 15.0 - let center_view_sides_margin = 13.0 - - - let title = StyledLabel(VoipTheme.basic_popup_title) - - init(message:String, givenButtons:[ButtonAttributes]? = nil) { - - super.init(frame: .zero) - backgroundColor = VoipTheme.voip_translucent_popup_background - - let centerView = UIView() - centerView.backgroundColor = VoipTheme.dark_grey_color.withAlphaComponent(0.8) - centerView.layer.cornerRadius = center_corner_radius - centerView.clipsToBounds = true - addSubview(centerView) - - title.numberOfLines = 0 - centerView.addSubview(title) -<<<<<<< HEAD - title.alignParentTop(withMargin:title_margin_top).matchParentSideBorders(insetedByDx: title_margin_sides).done() -======= - title.alignParentTop(withMargin:title_margin_top).matchParentSideBorders(insetedByDx: CGFloat(title_side_margin)).done() ->>>>>>> 4b91fc131 (all) - title.text = message - - let buttonsView = UIStackView() - buttonsView.axis = .horizontal - buttonsView.spacing = button_spacing - - var buttons = givenButtons - - if (buttons == nil) { // assuming info popup, just putting an ok button - let ok = ButtonAttributes(text:VoipTexts.ok, action: {}, isDestructive:false) - buttons = [ok] - } - - buttons?.forEach { - let b = ButtonWithStateBackgrounds(backgroundStateColors: $0.isDestructive ? VoipTheme.primary_colors_background_gray : VoipTheme.primary_colors_background) - b.setTitle($0.text, for: .normal) - b.layer.cornerRadius = button_radius - b.clipsToBounds = true - buttonsView.addArrangedSubview(b) - b.applyTitleStyle(VoipTheme.form_button_bold) - let action = $0.action - b.onClick { - self.removeFromSuperview() - action() - } - b.size(w: button_width,h: button_height).done() - } - centerView.addSubview(buttonsView) - buttonsView.alignUnder(view:title,withMargin:button_margin).alignParentBottom(withMargin:button_margin).centerX().done() - - - - centerView.matchParentSideBorders(insetedByDx: center_view_sides_margin).center().done() - } - - func show() { - VoipDialog.rootVC()?.view.addSubview(self) - matchParentDimmensions().done() - } - - private static func rootVC() -> UIViewController? { - return PhoneMainView.instance().mainViewController - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - static var toastQueue: [String] = [] - - static func toast(message:String, timeout:CGFloat = 1.5) { - if (toastQueue.count > 0) { - toastQueue.append(message) - return - } - let alert = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) - rootVC()?.present(alert, animated: true) - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + timeout) { - alert.dismiss(animated: true) - if (toastQueue.count > 0) { - let message = toastQueue.first - toastQueue.remove(at: 0) - self.toast(message: message!) - } - } - } - -} - -struct ButtonAttributes { - let text:String - let action: (()->Void) - let isDestructive: Bool -} diff --git a/Classes/Swift/Voip/VoipDialog_BASE_1064.swift b/Classes/Swift/Voip/VoipDialog_BASE_1064.swift deleted file mode 100644 index 055ded827..000000000 --- a/Classes/Swift/Voip/VoipDialog_BASE_1064.swift +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -class VoipDialog : UIView{ - - // Layout constants - let center_corner_radius = 7.0 - let title_margin_top = 20 - let button_margin = 20.0 - let button_width = 135.0 - let button_height = 40.0 - let button_radius = 3.0 - let button_spacing = 15.0 - - let center_view_sides_margin = 13.0 - - - let title = StyledLabel(VoipTheme.basic_popup_title) - - init(message:String, givenButtons:[ButtonAttributes]? = nil) { - - super.init(frame: .zero) - backgroundColor = VoipTheme.voip_translucent_popup_background - - let centerView = UIView() - centerView.backgroundColor = VoipTheme.dark_grey_color.withAlphaComponent(0.8) - centerView.layer.cornerRadius = center_corner_radius - centerView.clipsToBounds = true - addSubview(centerView) - - title.numberOfLines = 0 - centerView.addSubview(title) - title.alignParentTop(withMargin:title_margin_top).matchParentSideBorders().done() - title.text = message - - let buttonsView = UIStackView() - buttonsView.axis = .horizontal - buttonsView.spacing = button_spacing - - var buttons = givenButtons - - if (buttons == nil) { // assuming info popup, just putting an ok button - let ok = ButtonAttributes(text:VoipTexts.ok, action: {}, isDestructive:false) - buttons = [ok] - } - - buttons?.forEach { - let b = ButtonWithStateBackgrounds(backgroundStateColors: $0.isDestructive ? VoipTheme.primary_colors_background_gray : VoipTheme.primary_colors_background) - b.setTitle($0.text, for: .normal) - b.layer.cornerRadius = button_radius - b.clipsToBounds = true - buttonsView.addArrangedSubview(b) - b.applyTitleStyle(VoipTheme.form_button_bold) - let action = $0.action - b.onClick { - self.removeFromSuperview() - action() - } - b.size(w: button_width,h: button_height).done() - } - centerView.addSubview(buttonsView) - buttonsView.alignUnder(view:title,withMargin:button_margin).alignParentBottom(withMargin:button_margin).centerX().done() - - - - centerView.matchParentSideBorders(insetedByDx: center_view_sides_margin).center().done() - } - - func show() { - VoipDialog.rootVC()?.view.addSubview(self) - matchParentDimmensions().done() - } - - private static func rootVC() -> UIViewController? { - return PhoneMainView.instance().mainViewController - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - static var toastQueue: [String] = [] - - static func toast(message:String, timeout:CGFloat = 1.5) { - if (toastQueue.count > 0) { - toastQueue.append(message) - return - } - let alert = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) - rootVC()?.present(alert, animated: true) - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + timeout) { - alert.dismiss(animated: true) - if (toastQueue.count > 0) { - let message = toastQueue.first - toastQueue.remove(at: 0) - self.toast(message: message!) - } - } - } - -} - -struct ButtonAttributes { - let text:String - let action: (()->Void) - let isDestructive: Bool -} diff --git a/Classes/Swift/Voip/VoipDialog_BASE_1156.swift b/Classes/Swift/Voip/VoipDialog_BASE_1156.swift deleted file mode 100644 index 055ded827..000000000 --- a/Classes/Swift/Voip/VoipDialog_BASE_1156.swift +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -class VoipDialog : UIView{ - - // Layout constants - let center_corner_radius = 7.0 - let title_margin_top = 20 - let button_margin = 20.0 - let button_width = 135.0 - let button_height = 40.0 - let button_radius = 3.0 - let button_spacing = 15.0 - - let center_view_sides_margin = 13.0 - - - let title = StyledLabel(VoipTheme.basic_popup_title) - - init(message:String, givenButtons:[ButtonAttributes]? = nil) { - - super.init(frame: .zero) - backgroundColor = VoipTheme.voip_translucent_popup_background - - let centerView = UIView() - centerView.backgroundColor = VoipTheme.dark_grey_color.withAlphaComponent(0.8) - centerView.layer.cornerRadius = center_corner_radius - centerView.clipsToBounds = true - addSubview(centerView) - - title.numberOfLines = 0 - centerView.addSubview(title) - title.alignParentTop(withMargin:title_margin_top).matchParentSideBorders().done() - title.text = message - - let buttonsView = UIStackView() - buttonsView.axis = .horizontal - buttonsView.spacing = button_spacing - - var buttons = givenButtons - - if (buttons == nil) { // assuming info popup, just putting an ok button - let ok = ButtonAttributes(text:VoipTexts.ok, action: {}, isDestructive:false) - buttons = [ok] - } - - buttons?.forEach { - let b = ButtonWithStateBackgrounds(backgroundStateColors: $0.isDestructive ? VoipTheme.primary_colors_background_gray : VoipTheme.primary_colors_background) - b.setTitle($0.text, for: .normal) - b.layer.cornerRadius = button_radius - b.clipsToBounds = true - buttonsView.addArrangedSubview(b) - b.applyTitleStyle(VoipTheme.form_button_bold) - let action = $0.action - b.onClick { - self.removeFromSuperview() - action() - } - b.size(w: button_width,h: button_height).done() - } - centerView.addSubview(buttonsView) - buttonsView.alignUnder(view:title,withMargin:button_margin).alignParentBottom(withMargin:button_margin).centerX().done() - - - - centerView.matchParentSideBorders(insetedByDx: center_view_sides_margin).center().done() - } - - func show() { - VoipDialog.rootVC()?.view.addSubview(self) - matchParentDimmensions().done() - } - - private static func rootVC() -> UIViewController? { - return PhoneMainView.instance().mainViewController - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - static var toastQueue: [String] = [] - - static func toast(message:String, timeout:CGFloat = 1.5) { - if (toastQueue.count > 0) { - toastQueue.append(message) - return - } - let alert = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) - rootVC()?.present(alert, animated: true) - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + timeout) { - alert.dismiss(animated: true) - if (toastQueue.count > 0) { - let message = toastQueue.first - toastQueue.remove(at: 0) - self.toast(message: message!) - } - } - } - -} - -struct ButtonAttributes { - let text:String - let action: (()->Void) - let isDestructive: Bool -} diff --git a/Classes/Swift/Voip/VoipDialog_BASE_884.swift b/Classes/Swift/Voip/VoipDialog_BASE_884.swift deleted file mode 100644 index 055ded827..000000000 --- a/Classes/Swift/Voip/VoipDialog_BASE_884.swift +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -class VoipDialog : UIView{ - - // Layout constants - let center_corner_radius = 7.0 - let title_margin_top = 20 - let button_margin = 20.0 - let button_width = 135.0 - let button_height = 40.0 - let button_radius = 3.0 - let button_spacing = 15.0 - - let center_view_sides_margin = 13.0 - - - let title = StyledLabel(VoipTheme.basic_popup_title) - - init(message:String, givenButtons:[ButtonAttributes]? = nil) { - - super.init(frame: .zero) - backgroundColor = VoipTheme.voip_translucent_popup_background - - let centerView = UIView() - centerView.backgroundColor = VoipTheme.dark_grey_color.withAlphaComponent(0.8) - centerView.layer.cornerRadius = center_corner_radius - centerView.clipsToBounds = true - addSubview(centerView) - - title.numberOfLines = 0 - centerView.addSubview(title) - title.alignParentTop(withMargin:title_margin_top).matchParentSideBorders().done() - title.text = message - - let buttonsView = UIStackView() - buttonsView.axis = .horizontal - buttonsView.spacing = button_spacing - - var buttons = givenButtons - - if (buttons == nil) { // assuming info popup, just putting an ok button - let ok = ButtonAttributes(text:VoipTexts.ok, action: {}, isDestructive:false) - buttons = [ok] - } - - buttons?.forEach { - let b = ButtonWithStateBackgrounds(backgroundStateColors: $0.isDestructive ? VoipTheme.primary_colors_background_gray : VoipTheme.primary_colors_background) - b.setTitle($0.text, for: .normal) - b.layer.cornerRadius = button_radius - b.clipsToBounds = true - buttonsView.addArrangedSubview(b) - b.applyTitleStyle(VoipTheme.form_button_bold) - let action = $0.action - b.onClick { - self.removeFromSuperview() - action() - } - b.size(w: button_width,h: button_height).done() - } - centerView.addSubview(buttonsView) - buttonsView.alignUnder(view:title,withMargin:button_margin).alignParentBottom(withMargin:button_margin).centerX().done() - - - - centerView.matchParentSideBorders(insetedByDx: center_view_sides_margin).center().done() - } - - func show() { - VoipDialog.rootVC()?.view.addSubview(self) - matchParentDimmensions().done() - } - - private static func rootVC() -> UIViewController? { - return PhoneMainView.instance().mainViewController - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - static var toastQueue: [String] = [] - - static func toast(message:String, timeout:CGFloat = 1.5) { - if (toastQueue.count > 0) { - toastQueue.append(message) - return - } - let alert = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) - rootVC()?.present(alert, animated: true) - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + timeout) { - alert.dismiss(animated: true) - if (toastQueue.count > 0) { - let message = toastQueue.first - toastQueue.remove(at: 0) - self.toast(message: message!) - } - } - } - -} - -struct ButtonAttributes { - let text:String - let action: (()->Void) - let isDestructive: Bool -} diff --git a/Classes/Swift/Voip/VoipDialog_BASE_973.swift b/Classes/Swift/Voip/VoipDialog_BASE_973.swift deleted file mode 100644 index 055ded827..000000000 --- a/Classes/Swift/Voip/VoipDialog_BASE_973.swift +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -class VoipDialog : UIView{ - - // Layout constants - let center_corner_radius = 7.0 - let title_margin_top = 20 - let button_margin = 20.0 - let button_width = 135.0 - let button_height = 40.0 - let button_radius = 3.0 - let button_spacing = 15.0 - - let center_view_sides_margin = 13.0 - - - let title = StyledLabel(VoipTheme.basic_popup_title) - - init(message:String, givenButtons:[ButtonAttributes]? = nil) { - - super.init(frame: .zero) - backgroundColor = VoipTheme.voip_translucent_popup_background - - let centerView = UIView() - centerView.backgroundColor = VoipTheme.dark_grey_color.withAlphaComponent(0.8) - centerView.layer.cornerRadius = center_corner_radius - centerView.clipsToBounds = true - addSubview(centerView) - - title.numberOfLines = 0 - centerView.addSubview(title) - title.alignParentTop(withMargin:title_margin_top).matchParentSideBorders().done() - title.text = message - - let buttonsView = UIStackView() - buttonsView.axis = .horizontal - buttonsView.spacing = button_spacing - - var buttons = givenButtons - - if (buttons == nil) { // assuming info popup, just putting an ok button - let ok = ButtonAttributes(text:VoipTexts.ok, action: {}, isDestructive:false) - buttons = [ok] - } - - buttons?.forEach { - let b = ButtonWithStateBackgrounds(backgroundStateColors: $0.isDestructive ? VoipTheme.primary_colors_background_gray : VoipTheme.primary_colors_background) - b.setTitle($0.text, for: .normal) - b.layer.cornerRadius = button_radius - b.clipsToBounds = true - buttonsView.addArrangedSubview(b) - b.applyTitleStyle(VoipTheme.form_button_bold) - let action = $0.action - b.onClick { - self.removeFromSuperview() - action() - } - b.size(w: button_width,h: button_height).done() - } - centerView.addSubview(buttonsView) - buttonsView.alignUnder(view:title,withMargin:button_margin).alignParentBottom(withMargin:button_margin).centerX().done() - - - - centerView.matchParentSideBorders(insetedByDx: center_view_sides_margin).center().done() - } - - func show() { - VoipDialog.rootVC()?.view.addSubview(self) - matchParentDimmensions().done() - } - - private static func rootVC() -> UIViewController? { - return PhoneMainView.instance().mainViewController - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - static var toastQueue: [String] = [] - - static func toast(message:String, timeout:CGFloat = 1.5) { - if (toastQueue.count > 0) { - toastQueue.append(message) - return - } - let alert = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) - rootVC()?.present(alert, animated: true) - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + timeout) { - alert.dismiss(animated: true) - if (toastQueue.count > 0) { - let message = toastQueue.first - toastQueue.remove(at: 0) - self.toast(message: message!) - } - } - } - -} - -struct ButtonAttributes { - let text:String - let action: (()->Void) - let isDestructive: Bool -} diff --git a/Classes/Swift/Voip/VoipDialog_LOCAL_1064.swift b/Classes/Swift/Voip/VoipDialog_LOCAL_1064.swift deleted file mode 100644 index 84231fc65..000000000 --- a/Classes/Swift/Voip/VoipDialog_LOCAL_1064.swift +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -class VoipDialog : UIView{ - - // Layout constants - let center_corner_radius = 7.0 - let title_margin_top = 20 - let title_margin_sides = 10.0 - let button_margin = 20.0 - let button_width = 135.0 - let button_height = 40.0 - let button_radius = 3.0 - let button_spacing = 15.0 - let center_view_sides_margin = 13.0 - - - let title = StyledLabel(VoipTheme.basic_popup_title) - - init(message:String, givenButtons:[ButtonAttributes]? = nil) { - - super.init(frame: .zero) - backgroundColor = VoipTheme.voip_translucent_popup_background - - let centerView = UIView() - centerView.backgroundColor = VoipTheme.dark_grey_color.withAlphaComponent(0.8) - centerView.layer.cornerRadius = center_corner_radius - centerView.clipsToBounds = true - addSubview(centerView) - - title.numberOfLines = 0 - centerView.addSubview(title) - title.alignParentTop(withMargin:title_margin_top).matchParentSideBorders(insetedByDx: title_margin_sides).done() - title.text = message - - let buttonsView = UIStackView() - buttonsView.axis = .horizontal - buttonsView.spacing = button_spacing - - var buttons = givenButtons - - if (buttons == nil) { // assuming info popup, just putting an ok button - let ok = ButtonAttributes(text:VoipTexts.ok, action: {}, isDestructive:false) - buttons = [ok] - } - - buttons?.forEach { - let b = ButtonWithStateBackgrounds(backgroundStateColors: $0.isDestructive ? VoipTheme.primary_colors_background_gray : VoipTheme.primary_colors_background) - b.setTitle($0.text, for: .normal) - b.layer.cornerRadius = button_radius - b.clipsToBounds = true - buttonsView.addArrangedSubview(b) - b.applyTitleStyle(VoipTheme.form_button_bold) - let action = $0.action - b.onClick { - self.removeFromSuperview() - action() - } - b.size(w: button_width,h: button_height).done() - } - centerView.addSubview(buttonsView) - buttonsView.alignUnder(view:title,withMargin:button_margin).alignParentBottom(withMargin:button_margin).centerX().done() - - - - centerView.matchParentSideBorders(insetedByDx: center_view_sides_margin).center().done() - } - - func show() { - VoipDialog.rootVC()?.view.addSubview(self) - matchParentDimmensions().done() - } - - private static func rootVC() -> UIViewController? { - return PhoneMainView.instance().mainViewController - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - static var toastQueue: [String] = [] - - static func toast(message:String, timeout:CGFloat = 1.5) { - if (toastQueue.count > 0) { - toastQueue.append(message) - return - } - let alert = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) - rootVC()?.present(alert, animated: true) - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + timeout) { - alert.dismiss(animated: true) - if (toastQueue.count > 0) { - let message = toastQueue.first - toastQueue.remove(at: 0) - self.toast(message: message!) - } - } - } - -} - -struct ButtonAttributes { - let text:String - let action: (()->Void) - let isDestructive: Bool -} diff --git a/Classes/Swift/Voip/VoipDialog_LOCAL_1156.swift b/Classes/Swift/Voip/VoipDialog_LOCAL_1156.swift deleted file mode 100644 index 84231fc65..000000000 --- a/Classes/Swift/Voip/VoipDialog_LOCAL_1156.swift +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -class VoipDialog : UIView{ - - // Layout constants - let center_corner_radius = 7.0 - let title_margin_top = 20 - let title_margin_sides = 10.0 - let button_margin = 20.0 - let button_width = 135.0 - let button_height = 40.0 - let button_radius = 3.0 - let button_spacing = 15.0 - let center_view_sides_margin = 13.0 - - - let title = StyledLabel(VoipTheme.basic_popup_title) - - init(message:String, givenButtons:[ButtonAttributes]? = nil) { - - super.init(frame: .zero) - backgroundColor = VoipTheme.voip_translucent_popup_background - - let centerView = UIView() - centerView.backgroundColor = VoipTheme.dark_grey_color.withAlphaComponent(0.8) - centerView.layer.cornerRadius = center_corner_radius - centerView.clipsToBounds = true - addSubview(centerView) - - title.numberOfLines = 0 - centerView.addSubview(title) - title.alignParentTop(withMargin:title_margin_top).matchParentSideBorders(insetedByDx: title_margin_sides).done() - title.text = message - - let buttonsView = UIStackView() - buttonsView.axis = .horizontal - buttonsView.spacing = button_spacing - - var buttons = givenButtons - - if (buttons == nil) { // assuming info popup, just putting an ok button - let ok = ButtonAttributes(text:VoipTexts.ok, action: {}, isDestructive:false) - buttons = [ok] - } - - buttons?.forEach { - let b = ButtonWithStateBackgrounds(backgroundStateColors: $0.isDestructive ? VoipTheme.primary_colors_background_gray : VoipTheme.primary_colors_background) - b.setTitle($0.text, for: .normal) - b.layer.cornerRadius = button_radius - b.clipsToBounds = true - buttonsView.addArrangedSubview(b) - b.applyTitleStyle(VoipTheme.form_button_bold) - let action = $0.action - b.onClick { - self.removeFromSuperview() - action() - } - b.size(w: button_width,h: button_height).done() - } - centerView.addSubview(buttonsView) - buttonsView.alignUnder(view:title,withMargin:button_margin).alignParentBottom(withMargin:button_margin).centerX().done() - - - - centerView.matchParentSideBorders(insetedByDx: center_view_sides_margin).center().done() - } - - func show() { - VoipDialog.rootVC()?.view.addSubview(self) - matchParentDimmensions().done() - } - - private static func rootVC() -> UIViewController? { - return PhoneMainView.instance().mainViewController - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - static var toastQueue: [String] = [] - - static func toast(message:String, timeout:CGFloat = 1.5) { - if (toastQueue.count > 0) { - toastQueue.append(message) - return - } - let alert = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) - rootVC()?.present(alert, animated: true) - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + timeout) { - alert.dismiss(animated: true) - if (toastQueue.count > 0) { - let message = toastQueue.first - toastQueue.remove(at: 0) - self.toast(message: message!) - } - } - } - -} - -struct ButtonAttributes { - let text:String - let action: (()->Void) - let isDestructive: Bool -} diff --git a/Classes/Swift/Voip/VoipDialog_LOCAL_884.swift b/Classes/Swift/Voip/VoipDialog_LOCAL_884.swift deleted file mode 100644 index 84231fc65..000000000 --- a/Classes/Swift/Voip/VoipDialog_LOCAL_884.swift +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -class VoipDialog : UIView{ - - // Layout constants - let center_corner_radius = 7.0 - let title_margin_top = 20 - let title_margin_sides = 10.0 - let button_margin = 20.0 - let button_width = 135.0 - let button_height = 40.0 - let button_radius = 3.0 - let button_spacing = 15.0 - let center_view_sides_margin = 13.0 - - - let title = StyledLabel(VoipTheme.basic_popup_title) - - init(message:String, givenButtons:[ButtonAttributes]? = nil) { - - super.init(frame: .zero) - backgroundColor = VoipTheme.voip_translucent_popup_background - - let centerView = UIView() - centerView.backgroundColor = VoipTheme.dark_grey_color.withAlphaComponent(0.8) - centerView.layer.cornerRadius = center_corner_radius - centerView.clipsToBounds = true - addSubview(centerView) - - title.numberOfLines = 0 - centerView.addSubview(title) - title.alignParentTop(withMargin:title_margin_top).matchParentSideBorders(insetedByDx: title_margin_sides).done() - title.text = message - - let buttonsView = UIStackView() - buttonsView.axis = .horizontal - buttonsView.spacing = button_spacing - - var buttons = givenButtons - - if (buttons == nil) { // assuming info popup, just putting an ok button - let ok = ButtonAttributes(text:VoipTexts.ok, action: {}, isDestructive:false) - buttons = [ok] - } - - buttons?.forEach { - let b = ButtonWithStateBackgrounds(backgroundStateColors: $0.isDestructive ? VoipTheme.primary_colors_background_gray : VoipTheme.primary_colors_background) - b.setTitle($0.text, for: .normal) - b.layer.cornerRadius = button_radius - b.clipsToBounds = true - buttonsView.addArrangedSubview(b) - b.applyTitleStyle(VoipTheme.form_button_bold) - let action = $0.action - b.onClick { - self.removeFromSuperview() - action() - } - b.size(w: button_width,h: button_height).done() - } - centerView.addSubview(buttonsView) - buttonsView.alignUnder(view:title,withMargin:button_margin).alignParentBottom(withMargin:button_margin).centerX().done() - - - - centerView.matchParentSideBorders(insetedByDx: center_view_sides_margin).center().done() - } - - func show() { - VoipDialog.rootVC()?.view.addSubview(self) - matchParentDimmensions().done() - } - - private static func rootVC() -> UIViewController? { - return PhoneMainView.instance().mainViewController - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - static var toastQueue: [String] = [] - - static func toast(message:String, timeout:CGFloat = 1.5) { - if (toastQueue.count > 0) { - toastQueue.append(message) - return - } - let alert = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) - rootVC()?.present(alert, animated: true) - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + timeout) { - alert.dismiss(animated: true) - if (toastQueue.count > 0) { - let message = toastQueue.first - toastQueue.remove(at: 0) - self.toast(message: message!) - } - } - } - -} - -struct ButtonAttributes { - let text:String - let action: (()->Void) - let isDestructive: Bool -} diff --git a/Classes/Swift/Voip/VoipDialog_LOCAL_973.swift b/Classes/Swift/Voip/VoipDialog_LOCAL_973.swift deleted file mode 100644 index 84231fc65..000000000 --- a/Classes/Swift/Voip/VoipDialog_LOCAL_973.swift +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -class VoipDialog : UIView{ - - // Layout constants - let center_corner_radius = 7.0 - let title_margin_top = 20 - let title_margin_sides = 10.0 - let button_margin = 20.0 - let button_width = 135.0 - let button_height = 40.0 - let button_radius = 3.0 - let button_spacing = 15.0 - let center_view_sides_margin = 13.0 - - - let title = StyledLabel(VoipTheme.basic_popup_title) - - init(message:String, givenButtons:[ButtonAttributes]? = nil) { - - super.init(frame: .zero) - backgroundColor = VoipTheme.voip_translucent_popup_background - - let centerView = UIView() - centerView.backgroundColor = VoipTheme.dark_grey_color.withAlphaComponent(0.8) - centerView.layer.cornerRadius = center_corner_radius - centerView.clipsToBounds = true - addSubview(centerView) - - title.numberOfLines = 0 - centerView.addSubview(title) - title.alignParentTop(withMargin:title_margin_top).matchParentSideBorders(insetedByDx: title_margin_sides).done() - title.text = message - - let buttonsView = UIStackView() - buttonsView.axis = .horizontal - buttonsView.spacing = button_spacing - - var buttons = givenButtons - - if (buttons == nil) { // assuming info popup, just putting an ok button - let ok = ButtonAttributes(text:VoipTexts.ok, action: {}, isDestructive:false) - buttons = [ok] - } - - buttons?.forEach { - let b = ButtonWithStateBackgrounds(backgroundStateColors: $0.isDestructive ? VoipTheme.primary_colors_background_gray : VoipTheme.primary_colors_background) - b.setTitle($0.text, for: .normal) - b.layer.cornerRadius = button_radius - b.clipsToBounds = true - buttonsView.addArrangedSubview(b) - b.applyTitleStyle(VoipTheme.form_button_bold) - let action = $0.action - b.onClick { - self.removeFromSuperview() - action() - } - b.size(w: button_width,h: button_height).done() - } - centerView.addSubview(buttonsView) - buttonsView.alignUnder(view:title,withMargin:button_margin).alignParentBottom(withMargin:button_margin).centerX().done() - - - - centerView.matchParentSideBorders(insetedByDx: center_view_sides_margin).center().done() - } - - func show() { - VoipDialog.rootVC()?.view.addSubview(self) - matchParentDimmensions().done() - } - - private static func rootVC() -> UIViewController? { - return PhoneMainView.instance().mainViewController - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - static var toastQueue: [String] = [] - - static func toast(message:String, timeout:CGFloat = 1.5) { - if (toastQueue.count > 0) { - toastQueue.append(message) - return - } - let alert = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) - rootVC()?.present(alert, animated: true) - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + timeout) { - alert.dismiss(animated: true) - if (toastQueue.count > 0) { - let message = toastQueue.first - toastQueue.remove(at: 0) - self.toast(message: message!) - } - } - } - -} - -struct ButtonAttributes { - let text:String - let action: (()->Void) - let isDestructive: Bool -} diff --git a/Classes/Swift/Voip/VoipDialog_REMOTE_1064.swift b/Classes/Swift/Voip/VoipDialog_REMOTE_1064.swift deleted file mode 100644 index 1ab6afcc4..000000000 --- a/Classes/Swift/Voip/VoipDialog_REMOTE_1064.swift +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -class VoipDialog : UIView{ - - // Layout constants - let center_corner_radius = 7.0 - let title_margin_top = 20 - let title_side_margin = 10 - let button_margin = 20.0 - let button_width = 135.0 - let button_height = 40.0 - let button_radius = 3.0 - let button_spacing = 15.0 - - let center_view_sides_margin = 13.0 - - - let title = StyledLabel(VoipTheme.basic_popup_title) - - init(message:String, givenButtons:[ButtonAttributes]? = nil) { - - super.init(frame: .zero) - backgroundColor = VoipTheme.voip_translucent_popup_background - - let centerView = UIView() - centerView.backgroundColor = VoipTheme.dark_grey_color.withAlphaComponent(0.8) - centerView.layer.cornerRadius = center_corner_radius - centerView.clipsToBounds = true - addSubview(centerView) - - title.numberOfLines = 0 - centerView.addSubview(title) - title.alignParentTop(withMargin:title_margin_top).matchParentSideBorders(insetedByDx: CGFloat(title_side_margin)).done() - title.text = message - - let buttonsView = UIStackView() - buttonsView.axis = .horizontal - buttonsView.spacing = button_spacing - - var buttons = givenButtons - - if (buttons == nil) { // assuming info popup, just putting an ok button - let ok = ButtonAttributes(text:VoipTexts.ok, action: {}, isDestructive:false) - buttons = [ok] - } - - buttons?.forEach { - let b = ButtonWithStateBackgrounds(backgroundStateColors: $0.isDestructive ? VoipTheme.primary_colors_background_gray : VoipTheme.primary_colors_background) - b.setTitle($0.text, for: .normal) - b.layer.cornerRadius = button_radius - b.clipsToBounds = true - buttonsView.addArrangedSubview(b) - b.applyTitleStyle(VoipTheme.form_button_bold) - let action = $0.action - b.onClick { - self.removeFromSuperview() - action() - } - b.size(w: button_width,h: button_height).done() - } - centerView.addSubview(buttonsView) - buttonsView.alignUnder(view:title,withMargin:button_margin).alignParentBottom(withMargin:button_margin).centerX().done() - - - - centerView.matchParentSideBorders(insetedByDx: center_view_sides_margin).center().done() - } - - func show() { - VoipDialog.rootVC()?.view.addSubview(self) - matchParentDimmensions().done() - } - - private static func rootVC() -> UIViewController? { - return PhoneMainView.instance().mainViewController - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - static var toastQueue: [String] = [] - - static func toast(message:String, timeout:CGFloat = 1.5) { - if (toastQueue.count > 0) { - toastQueue.append(message) - return - } - let alert = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) - rootVC()?.present(alert, animated: true) - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + timeout) { - alert.dismiss(animated: true) - if (toastQueue.count > 0) { - let message = toastQueue.first - toastQueue.remove(at: 0) - self.toast(message: message!) - } - } - } - -} - -struct ButtonAttributes { - let text:String - let action: (()->Void) - let isDestructive: Bool -} diff --git a/Classes/Swift/Voip/VoipDialog_REMOTE_1156.swift b/Classes/Swift/Voip/VoipDialog_REMOTE_1156.swift deleted file mode 100644 index 1ab6afcc4..000000000 --- a/Classes/Swift/Voip/VoipDialog_REMOTE_1156.swift +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -class VoipDialog : UIView{ - - // Layout constants - let center_corner_radius = 7.0 - let title_margin_top = 20 - let title_side_margin = 10 - let button_margin = 20.0 - let button_width = 135.0 - let button_height = 40.0 - let button_radius = 3.0 - let button_spacing = 15.0 - - let center_view_sides_margin = 13.0 - - - let title = StyledLabel(VoipTheme.basic_popup_title) - - init(message:String, givenButtons:[ButtonAttributes]? = nil) { - - super.init(frame: .zero) - backgroundColor = VoipTheme.voip_translucent_popup_background - - let centerView = UIView() - centerView.backgroundColor = VoipTheme.dark_grey_color.withAlphaComponent(0.8) - centerView.layer.cornerRadius = center_corner_radius - centerView.clipsToBounds = true - addSubview(centerView) - - title.numberOfLines = 0 - centerView.addSubview(title) - title.alignParentTop(withMargin:title_margin_top).matchParentSideBorders(insetedByDx: CGFloat(title_side_margin)).done() - title.text = message - - let buttonsView = UIStackView() - buttonsView.axis = .horizontal - buttonsView.spacing = button_spacing - - var buttons = givenButtons - - if (buttons == nil) { // assuming info popup, just putting an ok button - let ok = ButtonAttributes(text:VoipTexts.ok, action: {}, isDestructive:false) - buttons = [ok] - } - - buttons?.forEach { - let b = ButtonWithStateBackgrounds(backgroundStateColors: $0.isDestructive ? VoipTheme.primary_colors_background_gray : VoipTheme.primary_colors_background) - b.setTitle($0.text, for: .normal) - b.layer.cornerRadius = button_radius - b.clipsToBounds = true - buttonsView.addArrangedSubview(b) - b.applyTitleStyle(VoipTheme.form_button_bold) - let action = $0.action - b.onClick { - self.removeFromSuperview() - action() - } - b.size(w: button_width,h: button_height).done() - } - centerView.addSubview(buttonsView) - buttonsView.alignUnder(view:title,withMargin:button_margin).alignParentBottom(withMargin:button_margin).centerX().done() - - - - centerView.matchParentSideBorders(insetedByDx: center_view_sides_margin).center().done() - } - - func show() { - VoipDialog.rootVC()?.view.addSubview(self) - matchParentDimmensions().done() - } - - private static func rootVC() -> UIViewController? { - return PhoneMainView.instance().mainViewController - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - static var toastQueue: [String] = [] - - static func toast(message:String, timeout:CGFloat = 1.5) { - if (toastQueue.count > 0) { - toastQueue.append(message) - return - } - let alert = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) - rootVC()?.present(alert, animated: true) - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + timeout) { - alert.dismiss(animated: true) - if (toastQueue.count > 0) { - let message = toastQueue.first - toastQueue.remove(at: 0) - self.toast(message: message!) - } - } - } - -} - -struct ButtonAttributes { - let text:String - let action: (()->Void) - let isDestructive: Bool -} diff --git a/Classes/Swift/Voip/VoipDialog_REMOTE_884.swift b/Classes/Swift/Voip/VoipDialog_REMOTE_884.swift deleted file mode 100644 index 1ab6afcc4..000000000 --- a/Classes/Swift/Voip/VoipDialog_REMOTE_884.swift +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -class VoipDialog : UIView{ - - // Layout constants - let center_corner_radius = 7.0 - let title_margin_top = 20 - let title_side_margin = 10 - let button_margin = 20.0 - let button_width = 135.0 - let button_height = 40.0 - let button_radius = 3.0 - let button_spacing = 15.0 - - let center_view_sides_margin = 13.0 - - - let title = StyledLabel(VoipTheme.basic_popup_title) - - init(message:String, givenButtons:[ButtonAttributes]? = nil) { - - super.init(frame: .zero) - backgroundColor = VoipTheme.voip_translucent_popup_background - - let centerView = UIView() - centerView.backgroundColor = VoipTheme.dark_grey_color.withAlphaComponent(0.8) - centerView.layer.cornerRadius = center_corner_radius - centerView.clipsToBounds = true - addSubview(centerView) - - title.numberOfLines = 0 - centerView.addSubview(title) - title.alignParentTop(withMargin:title_margin_top).matchParentSideBorders(insetedByDx: CGFloat(title_side_margin)).done() - title.text = message - - let buttonsView = UIStackView() - buttonsView.axis = .horizontal - buttonsView.spacing = button_spacing - - var buttons = givenButtons - - if (buttons == nil) { // assuming info popup, just putting an ok button - let ok = ButtonAttributes(text:VoipTexts.ok, action: {}, isDestructive:false) - buttons = [ok] - } - - buttons?.forEach { - let b = ButtonWithStateBackgrounds(backgroundStateColors: $0.isDestructive ? VoipTheme.primary_colors_background_gray : VoipTheme.primary_colors_background) - b.setTitle($0.text, for: .normal) - b.layer.cornerRadius = button_radius - b.clipsToBounds = true - buttonsView.addArrangedSubview(b) - b.applyTitleStyle(VoipTheme.form_button_bold) - let action = $0.action - b.onClick { - self.removeFromSuperview() - action() - } - b.size(w: button_width,h: button_height).done() - } - centerView.addSubview(buttonsView) - buttonsView.alignUnder(view:title,withMargin:button_margin).alignParentBottom(withMargin:button_margin).centerX().done() - - - - centerView.matchParentSideBorders(insetedByDx: center_view_sides_margin).center().done() - } - - func show() { - VoipDialog.rootVC()?.view.addSubview(self) - matchParentDimmensions().done() - } - - private static func rootVC() -> UIViewController? { - return PhoneMainView.instance().mainViewController - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - static var toastQueue: [String] = [] - - static func toast(message:String, timeout:CGFloat = 1.5) { - if (toastQueue.count > 0) { - toastQueue.append(message) - return - } - let alert = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) - rootVC()?.present(alert, animated: true) - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + timeout) { - alert.dismiss(animated: true) - if (toastQueue.count > 0) { - let message = toastQueue.first - toastQueue.remove(at: 0) - self.toast(message: message!) - } - } - } - -} - -struct ButtonAttributes { - let text:String - let action: (()->Void) - let isDestructive: Bool -} diff --git a/Classes/Swift/Voip/VoipDialog_REMOTE_973.swift b/Classes/Swift/Voip/VoipDialog_REMOTE_973.swift deleted file mode 100644 index 1ab6afcc4..000000000 --- a/Classes/Swift/Voip/VoipDialog_REMOTE_973.swift +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -class VoipDialog : UIView{ - - // Layout constants - let center_corner_radius = 7.0 - let title_margin_top = 20 - let title_side_margin = 10 - let button_margin = 20.0 - let button_width = 135.0 - let button_height = 40.0 - let button_radius = 3.0 - let button_spacing = 15.0 - - let center_view_sides_margin = 13.0 - - - let title = StyledLabel(VoipTheme.basic_popup_title) - - init(message:String, givenButtons:[ButtonAttributes]? = nil) { - - super.init(frame: .zero) - backgroundColor = VoipTheme.voip_translucent_popup_background - - let centerView = UIView() - centerView.backgroundColor = VoipTheme.dark_grey_color.withAlphaComponent(0.8) - centerView.layer.cornerRadius = center_corner_radius - centerView.clipsToBounds = true - addSubview(centerView) - - title.numberOfLines = 0 - centerView.addSubview(title) - title.alignParentTop(withMargin:title_margin_top).matchParentSideBorders(insetedByDx: CGFloat(title_side_margin)).done() - title.text = message - - let buttonsView = UIStackView() - buttonsView.axis = .horizontal - buttonsView.spacing = button_spacing - - var buttons = givenButtons - - if (buttons == nil) { // assuming info popup, just putting an ok button - let ok = ButtonAttributes(text:VoipTexts.ok, action: {}, isDestructive:false) - buttons = [ok] - } - - buttons?.forEach { - let b = ButtonWithStateBackgrounds(backgroundStateColors: $0.isDestructive ? VoipTheme.primary_colors_background_gray : VoipTheme.primary_colors_background) - b.setTitle($0.text, for: .normal) - b.layer.cornerRadius = button_radius - b.clipsToBounds = true - buttonsView.addArrangedSubview(b) - b.applyTitleStyle(VoipTheme.form_button_bold) - let action = $0.action - b.onClick { - self.removeFromSuperview() - action() - } - b.size(w: button_width,h: button_height).done() - } - centerView.addSubview(buttonsView) - buttonsView.alignUnder(view:title,withMargin:button_margin).alignParentBottom(withMargin:button_margin).centerX().done() - - - - centerView.matchParentSideBorders(insetedByDx: center_view_sides_margin).center().done() - } - - func show() { - VoipDialog.rootVC()?.view.addSubview(self) - matchParentDimmensions().done() - } - - private static func rootVC() -> UIViewController? { - return PhoneMainView.instance().mainViewController - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - static var toastQueue: [String] = [] - - static func toast(message:String, timeout:CGFloat = 1.5) { - if (toastQueue.count > 0) { - toastQueue.append(message) - return - } - let alert = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) - rootVC()?.present(alert, animated: true) - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + timeout) { - alert.dismiss(animated: true) - if (toastQueue.count > 0) { - let message = toastQueue.first - toastQueue.remove(at: 0) - self.toast(message: message!) - } - } - } - -} - -struct ButtonAttributes { - let text:String - let action: (()->Void) - let isDestructive: Bool -} diff --git a/Classes/Swift/Voip/Widgets/Avatar.swift b/Classes/Swift/Voip/Widgets/Avatar.swift deleted file mode 100644 index 65ab908eb..000000000 --- a/Classes/Swift/Voip/Widgets/Avatar.swift +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import linphonesw -import SnapKit - -class Avatar : UIView { - - static let diameter_for_call_views = 191 - static let diameter_for_call_views_land = 130 - static let groupAvatar = UIImage(named:"voip_multiple_contacts_avatar") - static let singleAvatar = UIImage(named:"avatar") - - var friend: [Friend] = [] - var friendDelegate: [FriendDelegate] = [] - - required init?(coder: NSCoder) { - initialsLabel = StyledLabel(VoipTheme.call_generated_avatar_large) - super.init(coder: coder) - } - - let initialsLabel: StyledLabel - let iconImageView = UIImageView() - - init (color:LightDarkColor,textStyle:TextStyle) { - initialsLabel = StyledLabel(textStyle) - super.init(frame: .zero) - clipsToBounds = false - self.backgroundColor = color.get() - addSubview(initialsLabel) - addSubview(iconImageView) - iconImageView.backgroundColor = .white - initialsLabel.matchParentSideBorders().matchParentHeight().done() - iconImageView.matchParentDimmensions().done() - UIDeviceBridge.displayModeSwitched.observe { _ in - self.initialsLabel.applyStyle(textStyle) - self.backgroundColor = color.get() - } - } - - - func fillFromAddress(address:Address, isGroup:Bool = false, withPresence:Bool = false) { - if (isGroup) { - iconImageView.image = Avatar.groupAvatar - iconImageView.isHidden = false - initialsLabel.isHidden = true - } else if let image = address.contact()?.avatar() { - iconImageView.image = image - initialsLabel.isHidden = true - iconImageView.isHidden = false - } else { - if (Core.get().defaultAccount != nil && address.username != nil && Core.get().defaultAccount!.isPhoneNumber(username: address.username!) == true) { - iconImageView.image = Avatar.singleAvatar - initialsLabel.isHidden = true - iconImageView.isHidden = false - } else { - initialsLabel.text = address.initials() - initialsLabel.isHidden = false - iconImageView.isHidden = true - } - } - - if withPresence { - imageWithPresence(address: address) - } - } - - func imageWithPresence(address:Address){ - var iconPresenceView = UIImageView() - if (address.contact() != nil) { - - addDelegate(contactAddress: address.contact()!) - - iconPresenceView = updatePresenceImage(contact: address.contact()!) - - addSubview(iconPresenceView) - - iconPresenceView.alignParentBottom().alignParentRight().size(w: 8, h: 8).done() - - bringSubviewToFront(iconPresenceView) - } - } - - func updatePresenceImage(contact:Contact) -> UIImageView { - - let friend = Friend.getSwiftObject(cObject: contact.friend) - - var presenceModel : PresenceModel? - var hasPresence : Bool? = false - - var imageName = ""; - - if friend.address?.asStringUriOnly() != nil { - presenceModel = friend.getPresenceModelForUriOrTel(uriOrTel: (friend.address?.asStringUriOnly())!) - hasPresence = presenceModel != nil && presenceModel!.basicStatus == PresenceBasicStatus.Open - } - - if (hasPresence! && presenceModel?.consolidatedPresence == ConsolidatedPresence.Online) { - imageName = "led_connected"; - } else if (hasPresence! && presenceModel?.consolidatedPresence == ConsolidatedPresence.Busy){ - imageName = "led_inprogress"; - } else { - imageName = ""; - } - - return UIImageView(image: UIImage(named:imageName)) - } - - func showAsAvatarIcon() { - iconImageView.image = Avatar.singleAvatar - initialsLabel.isHidden = true - iconImageView.isHidden = false - } - - override func layoutSubviews() { - super.layoutSubviews() - layer.cornerRadius = self.frame.width / 2.0 - - initialsLabel.layer.cornerRadius = self.frame.width / 2.0 - iconImageView.layer.cornerRadius = self.frame.width / 2.0 - iconImageView.clipsToBounds = true - } - - func addDelegate(contactAddress: Contact){ - var delegatePresence = false - - friend.forEach { friendForEach in - if friendForEach.address?.asStringUriOnly() == Friend.getSwiftObject(cObject: (contactAddress.friend)!).address?.asStringUriOnly() { - delegatePresence = true - } - } - if delegatePresence == false { - if contactAddress.friend != nil { - friend.append(Friend.getSwiftObject(cObject: (contactAddress.friend)!)) - let newFriendDelegate = FriendDelegateStub( - onPresenceReceived: { (linphoneFriend: Friend) -> Void in - if (linphoneFriend.address?.asStringUriOnly()) != nil { - let presenceModel = linphoneFriend.getPresenceModelForUriOrTel(uriOrTel: (linphoneFriend.address?.asStringUriOnly())!) - if(presenceModel != nil && presenceModel?.consolidatedPresence != nil){ - NotificationCenter.default.post(name: Notification.Name("LinphoneFriendPresenceUpdate"), object: nil, userInfo: ["friend": linphoneFriend.address?.asStringUriOnly() ?? "", "isOnline": presenceModel!.consolidatedPresence.rawValue == LinphoneConsolidatedPresenceOnline.rawValue]) - } - } - } - ) - friendDelegate.append(newFriendDelegate) - friend.last?.addDelegate(delegate: friendDelegate.last!) - } - } - } - - func removeAllDelegate(){ - var i = 0 - self.friend.forEach { friendForEach in - self.friend[i].removeDelegate(delegate: self.friendDelegate[i]) - i += 1; - } - - self.friendDelegate = [] - self.friend = [] - } -} - - -@objc class AvatarBridge : NSObject { // Ugly work around to tap into the swift Avatars, until rest of the app is reworked in Swift. - static var shared : Avatar? = nil - static let size = 50.0 - - @objc static func prepareIt() { - if (shared != nil) { - shared?.removeFromSuperview() - } - shared = Avatar(color:VoipTheme.primaryTextColor, textStyle: VoipTheme.call_generated_avatar_small) - PhoneMainView.instance().mainViewController.view.addSubview(shared!) - PhoneMainView.instance().mainViewController.view.sendSubviewToBack(shared!) - shared?.bounds.size = CGSize(width: size, height: size) - } - - @objc static func imageForAddress(address:OpaquePointer) -> UIImage? { - if (shared == nil) { - prepareIt() - } - let sAddr = Address.getSwiftObject(cObject: address) - shared?.fillFromAddress(address: sAddr) - - let avatarWithPresence = UIView(frame: CGRect(x: 0, y: 0, width: size, height: size)) - let avatarImageWihtoutPresence = UIImageView(image: shared?.toImage()) - let contactAddress = Address.getSwiftObject(cObject: address).contact() - var iconPresenceView = UIImageView() - if (contactAddress != nil) { - shared?.addDelegate(contactAddress: contactAddress!) - iconPresenceView = updatePresenceImage(contact: contactAddress!) - avatarWithPresence.addSubview(avatarImageWihtoutPresence) - avatarWithPresence.addSubview(iconPresenceView) - iconPresenceView.frame = CGRect(x: 36, y: 36, width: 14, height: 14) - }else{ - avatarWithPresence.addSubview(avatarImageWihtoutPresence) - } - return avatarWithPresence.toImage() - } - - @objc static func imageForInitials(contact:Contact, displayName:String) -> UIImage? { - if (shared == nil) { - prepareIt() - } - if (displayName.replacingOccurrences(of: " ", with: "").count == 0) { - return Avatar.singleAvatar - } - shared?.initialsLabel.text = Address.initials(displayName: displayName) - shared?.initialsLabel.isHidden = false - shared?.iconImageView.isHidden = true - - let avatarWithPresence = UIView(frame: CGRect(x: 0, y: 0, width: size, height: size)) - let avatarImageWihtoutPresence = UIImageView(image: shared?.toImage()) - - avatarWithPresence.addSubview(avatarImageWihtoutPresence) - - return avatarWithPresence.toImage() - } - - @objc static func updatePresenceImage(contact:Contact) -> UIImageView { - if contact.friend != nil { - let friend = Friend.getSwiftObject(cObject: contact.friend) - - var presenceModel : PresenceModel? - var hasPresence : Bool? = false - - var imageName = ""; - - if friend.address?.asStringUriOnly() != nil { - presenceModel = friend.getPresenceModelForUriOrTel(uriOrTel: (friend.address?.asStringUriOnly())!) - hasPresence = presenceModel != nil && presenceModel!.basicStatus == PresenceBasicStatus.Open - } - - if (hasPresence! && presenceModel?.consolidatedPresence == ConsolidatedPresence.Online) { - imageName = "led_connected"; - } else if (hasPresence! && presenceModel?.consolidatedPresence == ConsolidatedPresence.Busy){ - imageName = "led_inprogress"; - } else { - imageName = ""; - } - - return UIImageView(image: UIImage(named:imageName)) - } else { - return UIImageView(image: UIImage(named:"")) - } - - } - - @objc static func clearFriends(){ - if shared != nil { - shared!.friend = [] - shared!.friendDelegate = [] - } - } - - @objc static func removeAllObserver(){ - if shared != nil { - shared!.removeAllDelegate() - } - } -} diff --git a/Classes/Swift/Voip/Widgets/BouncingCounter.swift b/Classes/Swift/Voip/Widgets/BouncingCounter.swift deleted file mode 100644 index a07f5124b..000000000 --- a/Classes/Swift/Voip/Widgets/BouncingCounter.swift +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import Foundation -import UIKit -import SwiftUI - -class BouncingCounter : UIBouncingView { - - // Layout constants - let size = 20.0 - let center_offset = 20 - - let owningButton : UIButton - let label : StyledLabel - - var dataSource : MutableLiveData? { - didSet { - if let dataSource = dataSource { - self.size(w:self.size,h:self.size).matchCenterXOf(view: self.owningButton, withDx: self.center_offset).matchCenterYOf(view: self.owningButton, withDy: -self.center_offset).done() - dataSource.readCurrentAndObserve { (value) in - if (value! > 0) { - self.label.text = value! < 100 ? String(value!) : "99+" - self.isHidden = true // to force legacy startAnimating to unhide and animate - self.startAnimating(true) - } else { - self.isHidden = false // to force legacy startAnimating to hide and animate - self.stopAnimating(true) - } - } - } else { - self.isHidden = false - self.stopAnimating(true) - } - } - } - - - init (inButton:UIButton) { - owningButton = inButton - label = StyledLabel(VoipTheme.unread_count_font) - super.init(frame:.zero) - addSubview(label) - label.matchParentDimmensions().done() - backgroundColor = VoipTheme.primary_color - layer.masksToBounds = true - layer.cornerRadius = size/2 - self.isHidden = true - } - - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - - -} diff --git a/Classes/Swift/Voip/Widgets/ButtonWithStateBackgrounds.swift b/Classes/Swift/Voip/Widgets/ButtonWithStateBackgrounds.swift deleted file mode 100644 index 5e0221c15..000000000 --- a/Classes/Swift/Voip/Widgets/ButtonWithStateBackgrounds.swift +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import Foundation -import UIKit -import SwiftUI - -class ButtonWithStateBackgrounds : UIButton { - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - init (backgroundStateColors: [UInt: LightDarkColor], iconName:String? = nil) { - super.init(frame: .zero) - backgroundStateColors.keys.forEach { (stateRawValue) in - setBackgroundColor(color: backgroundStateColors[stateRawValue]!.get(), forState: UIButton.State(rawValue: stateRawValue)) - } - iconName.map { setImage(UIImage(named: $0), for: .normal) } - } - - func setBackgroundColor(color: UIColor, forState: UIControl.State) { - UIGraphicsBeginImageContext(CGSize(width: 1, height: 1)) - UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor) - UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1)) - let colorImage = UIGraphicsGetImageFromCurrentImageContext() - UIGraphicsEndImageContext() - self.setBackgroundImage(colorImage, for: forState) - } - - - -} diff --git a/Classes/Swift/Voip/Widgets/CallControlButton.swift b/Classes/Swift/Voip/Widgets/CallControlButton.swift deleted file mode 100644 index 595a4a548..000000000 --- a/Classes/Swift/Voip/Widgets/CallControlButton.swift +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import Foundation -import UIKit -import SwiftUI - -class CallControlButton : ButtonWithStateBackgrounds { - - // Layout constants - static let default_size = 50 - static let hungup_width = 65 - - var showActivityIndicatorDataSource : MutableLiveData? = nil { - didSet { - if let showActivityIndicatorDataSource = self.showActivityIndicatorDataSource { - let spinner = UIActivityIndicatorView(style: .white) - spinner.color = VoipTheme.primary_color - self.addSubview(spinner) - spinner.matchParentDimmensions().center().done() - - showActivityIndicatorDataSource.readCurrentAndObserve { (show) in - if (show == true) { - spinner.startAnimating() - spinner.isHidden = false - self.isEnabled = false - } else { - spinner.stopAnimating() - spinner.isHidden = true - self.isEnabled = true - } - } - } - } - } - - var onClickAction : (()->Void)? = nil - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - init (width:Int = CallControlButton.default_size, height:Int = CallControlButton.default_size, imageInset:UIEdgeInsets = UIEdgeInsets(top: 2, left: 2, bottom: 2, right: 2), buttonTheme: ButtonTheme, onClickAction : (()->Void)? = nil ) { - super.init(backgroundStateColors: buttonTheme.backgroundStateColors) - - layer.cornerRadius = CGFloat(height/2) - clipsToBounds = true - contentMode = .scaleAspectFit - - applyTintedIcons(tintedIcons: buttonTheme.tintableStateIcons) - - imageView?.contentMode = .scaleAspectFit - - imageEdgeInsets = imageInset - - size(w: CGFloat(width), h: CGFloat(height)).done() - - self.onClickAction = onClickAction - onClick { - self.onClickAction?() - } - UIDeviceBridge.displayModeSwitched.observe { _ in - self.applyTintedIcons(tintedIcons: buttonTheme.tintableStateIcons) - } - - } - - - - -} diff --git a/Classes/Swift/Voip/Widgets/FormButton.swift b/Classes/Swift/Voip/Widgets/FormButton.swift deleted file mode 100644 index 65a63f7b8..000000000 --- a/Classes/Swift/Voip/Widgets/FormButton.swift +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import Foundation -import UIKit -import SwiftUI - -class FormButton : ButtonWithStateBackgrounds { - - let button_radius = 3.0 - let button_height = 40.0 - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - var title: String? { - didSet { - setTitle(title, for: .normal) - addSidePadding() - } - } - - init (backgroundStateColors: [UInt: LightDarkColor], bold:Bool = true) { - super.init(backgroundStateColors: backgroundStateColors) - layer.cornerRadius = button_radius - clipsToBounds = true - height(button_height).done() - addSidePadding() - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - self.applyTitleStyle(bold ? VoipTheme.form_button_bold : VoipTheme.form_button_light) - } - } - - convenience init (title:String, backgroundStateColors: [UInt: LightDarkColor], bold:Bool = true, fixedSize:Bool = true) { - self.init(backgroundStateColors: backgroundStateColors,bold:bold) - self.title = title - setTitle(title, for: .normal) - if (!fixedSize) { - addSidePadding() - } - } - - -} diff --git a/Classes/Swift/Voip/Widgets/RotatingSpinner.swift b/Classes/Swift/Voip/Widgets/RotatingSpinner.swift deleted file mode 100644 index 72c262d8b..000000000 --- a/Classes/Swift/Voip/Widgets/RotatingSpinner.swift +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation - -class RotatingSpinner : UIImageView { - - init (color:UIColor = .white) { - super.init(frame: .zero) - self.image = UIImage(named: "voip_spinner") - self.tint(color) - self.contentMode = .scaleAspectFit - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - func startRotation() { - let rotation : CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z") - rotation.toValue = NSNumber(value: Double.pi * 2) - rotation.duration = 2.2 - rotation.isCumulative = true - rotation.repeatCount = Float.greatestFiniteMagnitude - self.layer.add(rotation, forKey: "rotationAnimation") - } - - func stopRotation() { - self.layer.removeAllAnimations() - } -} - diff --git a/Classes/Swift/Voip/Widgets/StyledCheckBox.swift b/Classes/Swift/Voip/Widgets/StyledCheckBox.swift deleted file mode 100644 index dd1f2a7a7..000000000 --- a/Classes/Swift/Voip/Widgets/StyledCheckBox.swift +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit -import DropDown - - -class StyledCheckBox: UIButton { - - // layout constants - let button_size = 25.0 - - var liveValue : MutableLiveData? = nil { - didSet { - liveValue?.readCurrentAndObserve { (value) in - self.isSelected = value! - } - } - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - init () { - super.init(frame: .zero) - setBackgroundImage(UIImage(named:"voip_checkbox_unchecked")/*?.tinted(with: VoipTheme.light_grey_color)*/,for: .normal) // tinting not working with those icons - setBackgroundImage(UIImage(named:"voip_checkbox_checked")/*?.tinted(with: VoipTheme.primary_color)*/,for: .selected) - onClick { - self.liveValue?.value = self.liveValue?.value != true - self.isSelected = self.liveValue?.value == true - } - size(w: button_size,h: button_size).done() - } - - -} diff --git a/Classes/Swift/Voip/Widgets/StyledDatePicker.swift b/Classes/Swift/Voip/Widgets/StyledDatePicker.swift deleted file mode 100644 index 4ad0b2e1e..000000000 --- a/Classes/Swift/Voip/Widgets/StyledDatePicker.swift +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -class StyledDatePicker: UIView { - - // layout constants - let chevron_margin = 10 - let form_input_height = 38.0 - - let datePicker = UIDatePicker() - - var liveValue:MutableLiveData? { - didSet { - if let liveValue = liveValue?.value { - datePicker.date = liveValue - self.valueChanged(datePicker: datePicker) - } else { - formattedLabel.text = nil - datePicker.date = pickerMode == .date ? Date() : Calendar.current.startOfDay(for: Date()) - } - } - - } - let formattedLabel = StyledLabel(VoipTheme.conference_scheduling_font) - var pickerMode:UIDatePicker.Mode = .date - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - init (liveValue:MutableLiveData? = nil, pickerMode:UIDatePicker.Mode, readOnly:Bool = false) { - super.init(frame: .zero) - self.pickerMode = pickerMode - - if #available(iOS 14.0, *) { - addSubview(datePicker) - datePicker.datePickerMode = pickerMode - datePicker.addTarget(self, action: #selector(valueChanged), for: .valueChanged) - datePicker.matchParentDimmensions().done() - datePicker.preferredDatePickerStyle = .compact - onClick { - self.valueChanged(datePicker: self.datePicker) - } - } else { - onClick { - self.showPickerPreIOS14() - } - } - - formattedLabel.isUserInteractionEnabled = false - addSubview(formattedLabel) - formattedLabel.matchParentDimmensions().done() - - let chevron = UIImageView() - - - addSubview(chevron) - chevron.alignParentRight(withMargin: chevron_margin).centerY().done() - chevron.isHidden = readOnly - - height(form_input_height).done() - - isUserInteractionEnabled = !readOnly - self.liveValue = liveValue - - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - self.setFormInputBackground(readOnly:readOnly) - self.formattedLabel.backgroundColor = VoipTheme.voipFormBackgroundColor.get() - chevron.image = UIImage(named: "chevron_list_close")?.tinted(with: VoipTheme.voipDrawableColor.get()) - if (readOnly) { - self.formattedLabel.textColor = self.formattedLabel.textColor.withAlphaComponent(0.5) - } - } - - } - - - @objc func valueChanged(datePicker: UIDatePicker) { - liveValue!.value = datePicker.date - formattedLabel.text = " "+(pickerMode == .date ? TimestampUtils.dateToString(date: datePicker.date) : TimestampUtils.timeToString(date: datePicker.date)) - } - - - func showPickerPreIOS14() { - let alertController = UIAlertController(title: "", message: nil, preferredStyle: .alert) - alertController.view.height(200).done() - let picker = UIDatePicker() - if #available(iOS 13.4, *) { - picker.preferredDatePickerStyle = .wheels - } - liveValue?.value.map {picker.date = $0} - picker.datePickerMode = pickerMode - alertController.view.addSubview(picker) - picker.matchParentDimmensions(insetedBy: UIEdgeInsets(top: 30, left: 50, bottom: 30, right: 50)).done() - let ok = UIAlertAction(title: VoipTexts.ok, style: .default, handler: { (action) -> Void in - self.valueChanged(datePicker: picker) - }) - let cancel = UIAlertAction(title: VoipTexts.cancel, style: .cancel) { (action) -> Void in - } - - alertController.addAction(cancel) - alertController.addAction(ok) - - alertController.popoverPresentationController?.sourceView = PhoneMainView.instance().mainViewController.statusBarView - PhoneMainView.instance().mainViewController.present(alertController, animated: true) - } - -} diff --git a/Classes/Swift/Voip/Widgets/StyledLabel.swift b/Classes/Swift/Voip/Widgets/StyledLabel.swift deleted file mode 100644 index 634af1e42..000000000 --- a/Classes/Swift/Voip/Widgets/StyledLabel.swift +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation - -class StyledLabel: UILabel { - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - init (_ style:TextStyle, _ text:String? = nil) { - super.init(frame: .zero) - self.text = text - applyStyle(style) - UIDeviceBridge.displayModeSwitched.observe { _ in - self.applyStyleColors(style) - } - } - -} diff --git a/Classes/Swift/Voip/Widgets/StyledSwitch.swift b/Classes/Swift/Voip/Widgets/StyledSwitch.swift deleted file mode 100644 index cc96c80d9..000000000 --- a/Classes/Swift/Voip/Widgets/StyledSwitch.swift +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit - -class StyledSwitch: UISwitch { - - var liveValue:MutableLiveData? - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - init (liveValue:MutableLiveData) { - super.init(frame: .zero) - self.liveValue = liveValue - tintColor = VoipTheme.light_grey_color - onTintColor = VoipTheme.green_color - addTarget(self, action: #selector(valueChanged), for: .valueChanged) - liveValue.readCurrentAndObserve { (value) in - self.isOn = value == true - } - transform = CGAffineTransform(scaleX: 0.75, y: 0.75) - } - - @objc func valueChanged(mySwitch: UISwitch) { - liveValue!.value = mySwitch.isOn - } -} diff --git a/Classes/Swift/Voip/Widgets/StyledTextView.swift b/Classes/Swift/Voip/Widgets/StyledTextView.swift deleted file mode 100644 index cd2888166..000000000 --- a/Classes/Swift/Voip/Widgets/StyledTextView.swift +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation - -class StyledTextView: UITextView, UITextViewDelegate { - - var placeholder:String? - var style:TextStyle? - var liveValue: MutableLiveData? = nil - var maxLines:Int - var isEditing = false - - required init?(coder: NSCoder) { - maxLines = 0 - super.init(coder: coder) - } - - override var text: String?{ - didSet{ - textColor = text?.count ?? 0 > 0 && text != placeholder ? style?.fgColor.get().withAlphaComponent(1.0) : style?.fgColor.get().withAlphaComponent(0.5) - if !isEditing && text == "" { - showPlaceHolder() - } - } - } - - init (_ style:TextStyle, placeHolder:String? = nil, liveValue: MutableLiveData, readOnly:Bool = false, maxLines:Int = 999) { - self.maxLines = maxLines - self.style = style - self.liveValue = liveValue - super.init(frame:.zero, textContainer: nil) - textContainer.maximumNumberOfLines = maxLines - applyStyle(style) - placeHolder.map { - self.placeholder = $0 - } - delegate = self - liveValue.readCurrentAndObserve { (value) in - self.text = value - if (value == nil || value?.count == 0) { - self.showPlaceHolder() - self.resignFirstResponder() - } - } - if (readOnly) { - textColor = textColor?.withAlphaComponent(0.5) - } - isUserInteractionEnabled = !readOnly - - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - self.applyStyleColors(style) - self.setFormInputBackground(readOnly:readOnly) - } - } - - func textViewDidBeginEditing(_ textView: UITextView) { - isEditing = true - if text == placeholder { - placeholder = textView.text - text = "" - textColor = style?.fgColor.get().withAlphaComponent(1.0) - } - } - - func textViewDidEndEditing(_ textView: UITextView) { - isEditing = false - if text == "" { - showPlaceHolder() - } - } - - private func showPlaceHolder() { - text = placeholder - textColor = style?.fgColor.get().withAlphaComponent(0.5) - } - - func textViewDidChange(_ textView: UITextView) { - textView.removeTextUntilSatisfying(maxNumberOfLines: self.maxLines) - liveValue?.value = textView.text - } - - func setPlaceHolder(phText:String) { - if text == "" || text == placeholder { - self.placeholder = phText - showPlaceHolder() - } else { - self.placeholder = phText - } - } - -} diff --git a/Classes/Swift/Voip/Widgets/StyledValuePicker.swift b/Classes/Swift/Voip/Widgets/StyledValuePicker.swift deleted file mode 100644 index 4a498c187..000000000 --- a/Classes/Swift/Voip/Widgets/StyledValuePicker.swift +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import UIKit -import DropDown - - -class StyledValuePicker: UIView { - - // layout constants - let chevron_margin = 10.0 - let form_input_height = 38.0 - let dropdown_width = 250.0 - let dropDown = DropDown() - - - let formattedLabel = StyledLabel(VoipTheme.conference_scheduling_font) - var pickerMode:UIDatePicker.Mode = .date - var options : [String] - - required init?(coder: NSCoder) { - self.options = [] - super.init(coder: coder) - } - - init (liveIndex:MutableLiveData, options:[String], readOnly:Bool = false) { - self.options = options - super.init(frame: .zero) - - formattedLabel.isUserInteractionEnabled = false - liveIndex.value.map { formattedLabel.text = " "+options[$0] } - - if (readOnly) { - formattedLabel.textColor = formattedLabel.textColor.withAlphaComponent(0.5) - } - - addSubview(formattedLabel) - formattedLabel.alignParentLeft().alignParentRight(withMargin: (readOnly ? chevron_margin : form_input_height)).matchParentHeight().done() - - let chevron = UIImageView() - - addSubview(chevron) - chevron.alignParentRight(withMargin: chevron_margin).centerY().done() - chevron.isHidden = readOnly - - - - dropDown.textFont = formattedLabel.font - dropDown.cellHeight = form_input_height - - dropDown.anchorView = self - dropDown.bottomOffset = CGPoint(x: 0, y:(dropDown.anchorView?.plainView.bounds.height)!) - dropDown.dataSource = options - dropDown.width = dropdown_width - - dropDown.selectionAction = { [unowned self] (index: Int, item: String) in - liveIndex.value = index - dropDown.selectRow(at: index) - formattedLabel.text = " "+options[liveIndex.value!] - dropDown.hide() - } - - onClick { - self.dropDown.anchorView = self.superview - self.dropDown.tableView.scrollToRow(at: IndexPath(row: liveIndex.value!, section: 0), at: .top, animated: true) // Change visibility to public instead of fileprivate in DropDown.swift - self.dropDown.show() - } - - height(form_input_height).done() - - liveIndex.readCurrentAndObserve { (value) in - self.dropDown.selectRow(value!) - } - isUserInteractionEnabled = !readOnly - - UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in - chevron.image = UIImage(named: "chevron_list_close")?.tinted(with: VoipTheme.voipDrawableColor.get()) - self.formattedLabel.backgroundColor = VoipTheme.voipFormBackgroundColor.get() - self.dropDown.textColor = VoipTheme.conference_scheduling_font.fgColor.get() - self.dropDown.selectedTextColor = VoipTheme.conference_scheduling_font.fgColor.get() - self.dropDown.backgroundColor = VoipTheme.voipFormBackgroundColor.get() - self.dropDown.selectionBackgroundColor = VoipTheme.backgroundWhiteBlack.get() - self.dropDown.backgroundColor = VoipTheme.backgroundWhiteBlack.get() - self.setFormInputBackground(readOnly:readOnly) - } - - } - - func setIndex(index: Int) { - self.dropDown.selectRow(index) - formattedLabel.text = " "+options[index] - } - -} diff --git a/Classes/Swift/Voip/Widgets/UICallTimer.swift b/Classes/Swift/Voip/Widgets/UICallTimer.swift deleted file mode 100644 index 9dc683f1f..000000000 --- a/Classes/Swift/Voip/Widgets/UICallTimer.swift +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import linphonesw - -class CallTimer : StyledLabel { - - let min_width = 50.0 - - let formatter = DateComponentsFormatter() - var startDate = Date() - var call:Call? = nil { - didSet { - self.format() - } - } - - var conference:Conference? = nil { - didSet { - self.format() - } - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - init (_ text:String?, _ style:TextStyle, _ call:Call? = nil) { - super.init(style,text) - self.call = call - formatter.unitsStyle = .positional - formatter.allowedUnits = [.minute, .second ] - formatter.zeroFormattingBehavior = [ .pad ] - Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in - var elapsedTime: TimeInterval = 0 - if (self.call != nil || self.conference != nil) { - elapsedTime = Date().timeIntervalSince(self.startDate) - } - self.formatter.string(from: elapsedTime).map { - self.text = $0.hasPrefix("0:") ? "0" + $0 : $0 - } - } - minWidth(min_width).done() - - } - - - func format() { - guard let duration = self.call != nil ? self.call!.duration : self.conference != nil ? self.conference!.duration: nil else { - return - } - startDate = Date().advanced(by: -TimeInterval(duration)) - } -} diff --git a/Classes/Swift/Voip/Widgets/VoipExtraButton.swift b/Classes/Swift/Voip/Widgets/VoipExtraButton.swift deleted file mode 100644 index 67fce96c1..000000000 --- a/Classes/Swift/Voip/Widgets/VoipExtraButton.swift +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -import Foundation -import UIKit -import SwiftUI - -class VoipExtraButton : UIButton { - - // Layout constants - let width = 60.0 - let image_size = 50.0 - let bouncing_label_size = 17.0 - - var boucingCounter : BouncingCounter? = nil - - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - init ( text:String, buttonTheme: ButtonTheme, withbBoucinCounterDataSource:MutableLiveData? = nil, onClickAction : @escaping ()->Void ) { - super.init(frame: .zero) - - - contentMode = .scaleToFill - - buttonTheme.tintableStateIcons.keys.forEach { (stateRawValue) in - let tintedIcon = buttonTheme.tintableStateIcons[stateRawValue]! - UIImage(named:tintedIcon.name).map { - setImage($0.tinted(with: tintedIcon.tintColor?.get()),for: UIButton.State(rawValue: stateRawValue)) - } - setTitleColor(tintedIcon.tintColor?.get(), for: UIButton.State(rawValue: stateRawValue)) - } - imageView?.contentMode = .scaleAspectFit - imageView?.size(w: image_size,h: image_size).centerX().alignParentTop().done() - titleLabel?.alignUnder(view: imageView!).centerX().done() - - - size(w: width,h: image_size).done() - setTitle(text, for: .normal) - applyTitleStyle(VoipTheme.voip_extra_button) - - onClick { - ControlsViewModel.shared.hideExtraButtons.value = true - onClickAction() - } - - if (withbBoucinCounterDataSource != nil) { - boucingCounter = BouncingCounter(inButton:self) - addSubview(boucingCounter!) - boucingCounter?.dataSource = withbBoucinCounterDataSource - } - - } - - -} diff --git a/Classes/Utils/CAAnimationBlocks/CAAnimation+Blocks.h b/Classes/Utils/CAAnimationBlocks/CAAnimation+Blocks.h deleted file mode 100755 index 47fc08713..000000000 --- a/Classes/Utils/CAAnimationBlocks/CAAnimation+Blocks.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// CAAnimation+Blocks.h -// CAAnimationBlocks -// -// Created by xissburg on 7/7/11. -// Copyright 2011 xissburg. All rights reserved. -// - -#import -#import - - -@interface CAAnimation (BlocksAddition) - -@property (nonatomic, copy) void (^completion)(BOOL finished); -@property (nonatomic, copy) void (^start)(void); - -- (void)setCompletion:(void (^)(BOOL finished))completion; // Forces auto-complete of setCompletion: to add the name 'finished' in the block parameter - -@end diff --git a/Classes/Utils/CAAnimationBlocks/CAAnimation+Blocks.m b/Classes/Utils/CAAnimationBlocks/CAAnimation+Blocks.m deleted file mode 100755 index 34ee9cfb9..000000000 --- a/Classes/Utils/CAAnimationBlocks/CAAnimation+Blocks.m +++ /dev/null @@ -1,99 +0,0 @@ -// -// CAAnimation+Blocks.m -// CAAnimationBlocks -// -// Created by xissburg on 7/7/11. -// Copyright 2011 xissburg. All rights reserved. -// - -#import "CAAnimation+Blocks.h" - - -@interface CAAnimationDelegate : NSObject - -@property (nonatomic, copy) void (^completion)(BOOL); -@property (nonatomic, copy) void (^start)(void); - -- (void)animationDidStart:(CAAnimation *)anim; -- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag; - -@end - -@implementation CAAnimationDelegate - -@synthesize completion=_completion; -@synthesize start=_start; - -- (id)init -{ - self = [super init]; - if (self) { - self.completion = nil; - self.start = nil; - } - return self; -} - - -- (void)animationDidStart:(CAAnimation *)anim -{ - if (self.start != nil) { - self.start(); - } -} - -- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag -{ - if (self.completion != nil) { - self.completion(flag); - } -} - -@end - - -@implementation CAAnimation (BlocksAddition) - -- (void)setCompletion:(void (^)(BOOL))completion -{ - if ([self.delegate isKindOfClass:[CAAnimationDelegate class]]) { - ((CAAnimationDelegate *)self.delegate).completion = completion; - } - else { - CAAnimationDelegate *delegate = [[CAAnimationDelegate alloc] init]; - delegate.completion = completion; -#if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_10_0 - self.delegate = delegate; -#else - self.delegate = (id)delegate; -#endif - } -} - -- (void (^)(BOOL))completion -{ - return [self.delegate isKindOfClass:[CAAnimationDelegate class]]? ((CAAnimationDelegate *)self.delegate).completion: nil; -} - -- (void)setStart:(void (^)(void))start -{ - if ([self.delegate isKindOfClass:[CAAnimationDelegate class]]) { - ((CAAnimationDelegate *)self.delegate).start = start; - } - else { - CAAnimationDelegate *delegate = [[CAAnimationDelegate alloc] init]; - delegate.start = start; -#if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_10_0 - self.delegate = delegate; -#else - self.delegate = (id)delegate; -#endif - } -} - -- (void (^)(void))start -{ - return [self.delegate isKindOfClass:[CAAnimationDelegate class]]? ((CAAnimationDelegate *)self.delegate).start: nil; -} - -@end diff --git a/Classes/Utils/ColorSpaceUtilites.m b/Classes/Utils/ColorSpaceUtilites.m deleted file mode 100644 index b6370e731..000000000 --- a/Classes/Utils/ColorSpaceUtilites.m +++ /dev/null @@ -1,135 +0,0 @@ -/* - ColorConverter - - you can use it to convert color from RGB space to HSL space and back. - - HSL2RGB copied from GLPaint Apple sample: - http://developer.apple.com/library/ios/#samplecode/GLPaint/Introduction/Intro.html - - RGB2HSL translated from http://www.geekymonkey.com/Programming/CSharp/RGB2HSL_HSL2RGB.htm - - From: https://github.com/alessani/ColorConverter - */ - -void HSL2RGB(float h, float s, float l, float *outR, float *outG, float *outB) { - float temp1, temp2; - float temp[3]; - int i; - - // Check for saturation. If there isn't any just return the luminance value for each, which results in gray. - if (s == 0.0) { - if (outR) - *outR = l; - if (outG) - *outG = l; - if (outB) - *outB = l; - return; - } - - // Test for luminance and compute temporary values based on luminance and saturation - if (l < 0.5) - temp2 = l * (1.0 + s); - else - temp2 = l + s - l * s; - temp1 = 2.0 * l - temp2; - - // Compute intermediate values based on hue - temp[0] = h + 1.0 / 3.0; - temp[1] = h; - temp[2] = h - 1.0 / 3.0; - - for (i = 0; i < 3; ++i) { - - // Adjust the range - if (temp[i] < 0.0) - temp[i] += 1.0; - if (temp[i] > 1.0) - temp[i] -= 1.0; - - if (6.0 * temp[i] < 1.0) - temp[i] = temp1 + (temp2 - temp1) * 6.0 * temp[i]; - else { - if (2.0 * temp[i] < 1.0) - temp[i] = temp2; - else { - if (3.0 * temp[i] < 2.0) - temp[i] = temp1 + (temp2 - temp1) * ((2.0 / 3.0) - temp[i]) * 6.0; - else - temp[i] = temp1; - } - } - } - - // Assign temporary values to R, G, B - if (outR) - *outR = temp[0]; - if (outG) - *outG = temp[1]; - if (outB) - *outB = temp[2]; -} - -void RGB2HSL(float r, float g, float b, float *outH, float *outS, float *outL) { - /*r = r/255.0f; - g = g/255.0f; - b = b/255.0f;*/ - - float h, s, l, v, m, vm, r2, g2, b2; - - h = 0; - s = 0; - - v = MAX(r, g); - v = MAX(v, b); - m = MIN(r, g); - m = MIN(m, b); - - l = (m + v) / 2.0f; - - if (l <= 0.0) { - if (outH) - *outH = h; - if (outS) - *outS = s; - if (outL) - *outL = l; - return; - } - - vm = v - m; - s = vm; - - if (s > 0.0f) { - s /= (l <= 0.5f) ? (v + m) : (2.0 - v - m); - } else { - if (outH) - *outH = h; - if (outS) - *outS = s; - if (outL) - *outL = l; - return; - } - - r2 = (v - r) / vm; - g2 = (v - g) / vm; - b2 = (v - b) / vm; - - if (r == v) { - h = (g == m ? 5.0f + b2 : 1.0f - g2); - } else if (g == v) { - h = (b == m ? 1.0f + r2 : 3.0 - b2); - } else { - h = (r == m ? 3.0f + g2 : 5.0f - r2); - } - - h /= 6.0f; - - if (outH) - *outH = h; - if (outS) - *outS = s; - if (outL) - *outL = l; -} \ No newline at end of file diff --git a/Classes/Utils/ColorSpaceUtilities.h b/Classes/Utils/ColorSpaceUtilities.h deleted file mode 100644 index 7f2ff1b70..000000000 --- a/Classes/Utils/ColorSpaceUtilities.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - ColorConverter - - you can use it to convert color from RGB space to HSL space and back. - - HSL2RGB copied from GLPaint Apple sample: http://developer.apple.com/library/ios/#samplecode/GLPaint/Introduction/Intro.html - - RGB2HSL translated from http://www.geekymonkey.com/Programming/CSharp/RGB2HSL_HSL2RGB.htm - - From: https://github.com/alessani/ColorConverter -*/ - -void HSL2RGB(float h, float s, float l, float* outR, float* outG, float* outB); -void RGB2HSL(float r, float g, float b, float* outH, float* outS, float* outL); \ No newline at end of file diff --git a/Classes/Utils/DCRoundSwitch/DCRoundSwitch.h b/Classes/Utils/DCRoundSwitch/DCRoundSwitch.h deleted file mode 100755 index 8c3aa100c..000000000 --- a/Classes/Utils/DCRoundSwitch/DCRoundSwitch.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// DCRoundSwitch.h -// -// Created by Patrick Richards on 28/06/11. -// MIT License. -// -// http://twitter.com/patr -// http://domesticcat.com.au/projects -// http://github.com/domesticcatsoftware/DCRoundSwitch -// - -#import -#import - -@class DCRoundSwitchToggleLayer; -@class DCRoundSwitchOutlineLayer; -@class DCRoundSwitchKnobLayer; - -@interface DCRoundSwitch : UIControl - -@property(nonatomic, strong) UIColor *onTintColor; // default: blue (matches normal UISwitch) -@property (nonatomic, getter=isOn) BOOL on; // default: NO -@property (nonatomic, copy) NSString *onText; // default: 'ON' - automatically localized -@property (nonatomic, copy) NSString *offText; // default: 'OFF' - automatically localized - -+ (Class)knobLayerClass; -+ (Class)outlineLayerClass; -+ (Class)toggleLayerClass; - -- (void)setOn:(BOOL)newOn animated:(BOOL)animated; -- (void)setOn:(BOOL)newOn animated:(BOOL)animated ignoreControlEvents:(BOOL)ignoreControlEvents; - -@end diff --git a/Classes/Utils/DCRoundSwitch/DCRoundSwitch.m b/Classes/Utils/DCRoundSwitch/DCRoundSwitch.m deleted file mode 100755 index 556d8150c..000000000 --- a/Classes/Utils/DCRoundSwitch/DCRoundSwitch.m +++ /dev/null @@ -1,453 +0,0 @@ -// -// DCRoundSwitch.m -// -// Created by Patrick Richards on 28/06/11. -// MIT License. -// -// http://twitter.com/patr -// http://domesticcat.com.au/projects -// http://github.com/domesticcatsoftware/DCRoundSwitch -// - -#import "DCRoundSwitch.h" -#import "DCRoundSwitchToggleLayer.h" -#import "DCRoundSwitchOutlineLayer.h" -#import "DCRoundSwitchKnobLayer.h" - -@interface DCRoundSwitch () - -@property(nonatomic, strong) DCRoundSwitchOutlineLayer *outlineLayer; -@property(nonatomic, strong) DCRoundSwitchToggleLayer *toggleLayer; -@property(nonatomic, strong) DCRoundSwitchKnobLayer *knobLayer; -@property(nonatomic, strong) CAShapeLayer *clipLayer; -@property (nonatomic, assign) BOOL ignoreTap; - -- (void)setup; -- (void)useLayerMasking; -- (void)removeLayerMask; -- (void)positionLayersAndMask; - -@end - -@implementation DCRoundSwitch -@synthesize outlineLayer, toggleLayer, knobLayer, clipLayer, ignoreTap; -@synthesize on, onText, offText; -@synthesize onTintColor; - -#pragma mark - -#pragma mark Init & Memory Managment - - -- (id)init -{ - if ((self = [super init])) - { - self.frame = CGRectMake(0, 0, 77, 27); - [self setup]; - } - - return self; -} - -- (id)initWithCoder:(NSCoder *)aDecoder -{ - if ((self = [super initWithCoder:aDecoder])) - { - [self setup]; - } - - return self; -} - -- (id)initWithFrame:(CGRect)frame -{ - if ((self = [super initWithFrame:frame])) - { - [self setup]; - } - - return self; -} - -+ (Class)knobLayerClass { - return [DCRoundSwitchKnobLayer class]; -} - -+ (Class)outlineLayerClass { - return [DCRoundSwitchOutlineLayer class]; -} - -+ (Class)toggleLayerClass { - return [DCRoundSwitchToggleLayer class]; -} - -- (void)setup -{ - // this way you can set the background color to black or something similar so it can be seen in IB - self.backgroundColor = [UIColor clearColor]; - - // remove the flexible width/height autoresizing masks if they have been set - UIViewAutoresizing mask = (int)self.autoresizingMask; - if (mask & UIViewAutoresizingFlexibleHeight) - self.autoresizingMask ^= UIViewAutoresizingFlexibleHeight; - - if (mask & UIViewAutoresizingFlexibleWidth) - self.autoresizingMask ^= UIViewAutoresizingFlexibleWidth; - - // setup default texts - NSBundle *uiKitBundle = [NSBundle bundleWithIdentifier:@"com.apple.UIKit"]; - self.onText = uiKitBundle ? [uiKitBundle localizedStringForKey:@"ON" value:nil table:nil] : @"ON"; - self.offText = uiKitBundle ? [uiKitBundle localizedStringForKey:@"OFF" value:nil table:nil] : @"OFF"; - - // the switch has three layers, (ordered from bottom to top): - // - // * toggleLayer * (bottom of the layer stack) - // this layer contains the onTintColor (blue by default), the text, and the shadown for the knob. the knob shadow is - // on this layer because it needs to go under the outlineLayer so it doesn't bleed out over the edge of the control. - // this layer moves when the switch moves - - // * outlineLayer * (middle of the layer stack) - // this is the outline of the control, it's inner shadow, and the inner gloss. the inner shadow is on this layer - // because it must stay still while the switch animates. the inner gloss is also here because it doesn't move, and also - // because it needs to go uner the knobLayer. - // this layer appears to always stay in the same spot. - - // * knobLayer * (top of the layer stack) - // this is the knob, and sits on top of the layer stack. note that the knob shadow is NOT drawn here, it is drawn on the - // toggleLayer so it doesn't bleed out over the outlineLayer. - - self.toggleLayer = [[[[self class] toggleLayerClass] alloc] - initWithOnString:self.onText - offString:self.offText - onTintColor:[UIColor colorWithRed:0.000 green:0.478 blue:0.882 alpha:1.0]]; - self.toggleLayer.drawOnTint = NO; - self.toggleLayer.clip = YES; - [self.layer addSublayer:self.toggleLayer]; - [self.toggleLayer setNeedsDisplay]; - - self.outlineLayer = [[[self class] outlineLayerClass] layer]; - [self.toggleLayer addSublayer:self.outlineLayer]; - [self.outlineLayer setNeedsDisplay]; - - self.knobLayer = [[[self class] knobLayerClass] layer]; - [self.layer addSublayer:self.knobLayer]; - [self.knobLayer setNeedsDisplay]; - - self.toggleLayer.contentsScale = self.outlineLayer.contentsScale = self.knobLayer.contentsScale = [[UIScreen mainScreen] scale]; - - // tap gesture for toggling the switch - UITapGestureRecognizer *tapGestureRecognizer = - [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)]; - [tapGestureRecognizer setDelegate:self]; - [self addGestureRecognizer:tapGestureRecognizer]; - - // pan gesture for moving the switch knob manually - UIPanGestureRecognizer *panGestureRecognizer = - [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(toggleDragged:)]; - [panGestureRecognizer setDelegate:self]; - [self addGestureRecognizer:panGestureRecognizer]; - - [self setNeedsLayout]; - - // setup the layer positions - [self positionLayersAndMask]; -} - -#pragma mark - -#pragma mark Setup Frame/Layout - -- (void)sizeToFit -{ - [super sizeToFit]; - - NSString *onString = self.toggleLayer.onString; - NSString *offString = self.toggleLayer.offString; - - CGFloat width = [onString sizeWithFont:self.toggleLayer.labelFont].width; - CGFloat offWidth = [offString sizeWithFont:self.toggleLayer.labelFont].width; - - if(offWidth > width) - width = offWidth; - - width += self.toggleLayer.bounds.size.width * 2.;//add 2x the knob for padding - - CGRect newFrame = self.frame; - CGFloat currentWidth = newFrame.size.width; - newFrame.size.width = width; - newFrame.origin.x += currentWidth - width; - self.frame = newFrame; - - //old values for sizeToFit; keep these around for reference -// newFrame.size.width = 77.0; -// newFrame.size.height = 27.0; -} - -- (void)useLayerMasking -{ - // turn of the manual clipping (done in toggleLayer's drawInContext:) - self.toggleLayer.clip = NO; - self.toggleLayer.drawOnTint = YES; - [self.toggleLayer setNeedsDisplay]; - - // create the layer mask and add that to the toggleLayer - self.clipLayer = [CAShapeLayer layer]; - UIBezierPath *clipPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds - cornerRadius:self.bounds.size.height / 2.0]; - self.clipLayer.path = clipPath.CGPath; - self.toggleLayer.mask = self.clipLayer; -} - -- (void)removeLayerMask -{ - // turn off the animations so the user doesn't see the changing of mask/clipping - [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; - - // remove the layer mask (put on in useLayerMasking) - self.toggleLayer.mask = nil; - - // renable manual clipping (done in toggleLayer's drawInContext:) - self.toggleLayer.clip = YES; - self.toggleLayer.drawOnTint = self.on; - [self.toggleLayer setNeedsDisplay]; -} - -- (void)positionLayersAndMask -{ - // repositions the underlying toggle and the layer mask, plus the knob - self.toggleLayer.mask.position = CGPointMake(-self.toggleLayer.frame.origin.x, 0.0); - self.outlineLayer.frame = CGRectMake(-self.toggleLayer.frame.origin.x, 0, self.bounds.size.width, self.bounds.size.height); - self.knobLayer.frame = CGRectMake(self.toggleLayer.frame.origin.x + self.toggleLayer.frame.size.width / 2.0 - self.knobLayer.frame.size.width / 2.0, - -1, - self.knobLayer.frame.size.width, - self.knobLayer.frame.size.height); -} - -#pragma mark - -#pragma mark Interaction - -- (void)tapped:(UITapGestureRecognizer *)gesture -{ - if (self.ignoreTap) return; - - if (gesture.state == UIGestureRecognizerStateEnded) - [self setOn:!self.on animated:YES]; -} - -- (void)toggleDragged:(UIPanGestureRecognizer *)gesture -{ - CGFloat minToggleX = -self.toggleLayer.frame.size.width / 2.0 + self.toggleLayer.frame.size.height / 2.0; - CGFloat maxToggleX = -1; - - if (gesture.state == UIGestureRecognizerStateBegan) - { - // setup by turning off the manual clipping of the toggleLayer and setting up a layer mask. - [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; - [self useLayerMasking]; - [self positionLayersAndMask]; - self.knobLayer.gripped = YES; - } - else if (gesture.state == UIGestureRecognizerStateChanged) - { - CGPoint translation = [gesture translationInView:self]; - - // disable the animations before moving the layers - [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; - - // darken the knob - if (!self.knobLayer.gripped) - self.knobLayer.gripped = YES; - - // move the toggleLayer using the translation of the gesture, keeping it inside the outline. - CGFloat newX = self.toggleLayer.frame.origin.x + translation.x; - if (newX < minToggleX) newX = minToggleX; - if (newX > maxToggleX) newX = maxToggleX; - self.toggleLayer.frame = CGRectMake(newX, - self.toggleLayer.frame.origin.y, - self.toggleLayer.frame.size.width, - self.toggleLayer.frame.size.height); - - // this will re-position the layer mask and knob - [self positionLayersAndMask]; - - [gesture setTranslation:CGPointZero inView:self]; - } - else if (gesture.state == UIGestureRecognizerStateEnded) - { - // flip the switch to on or off depending on which half it ends at - CGFloat toggleCenter = CGRectGetMidX(self.toggleLayer.frame); - [self setOn:(toggleCenter > CGRectGetMidX(self.bounds)) animated:YES]; - } - - // send off the appropriate actions (not fully tested yet) - CGPoint locationOfTouch = [gesture locationInView:self]; - if (CGRectContainsPoint(self.bounds, locationOfTouch)) - [self sendActionsForControlEvents:UIControlEventTouchDragInside]; - else - [self sendActionsForControlEvents:UIControlEventTouchDragOutside]; -} - -- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event -{ - if (self.ignoreTap) return; - - [super touchesBegan:touches withEvent:event]; - - self.knobLayer.gripped = YES; - [self sendActionsForControlEvents:UIControlEventTouchDown]; -} - -- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event -{ - [super touchesEnded:touches withEvent:event]; - - [self sendActionsForControlEvents:UIControlEventTouchUpInside]; -} - -- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event -{ - [super touchesCancelled:touches withEvent:event]; - - [self sendActionsForControlEvents:UIControlEventTouchUpOutside]; -} - -#pragma mark UIGestureRecognizerDelegate - -- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer; -{ - return !self.ignoreTap; -} - -#pragma mark Setters/Getters - -- (void)setOn:(BOOL)newOn -{ - [self setOn:newOn animated:NO]; -} - -- (void)setOn:(BOOL)newOn animated:(BOOL)animated -{ - [self setOn:newOn animated:animated ignoreControlEvents:NO]; -} - -- (void)setOn:(BOOL)newOn animated:(BOOL)animated ignoreControlEvents:(BOOL)ignoreControlEvents -{ - BOOL previousOn = self.on; - on = newOn; - self.ignoreTap = YES; - - [CATransaction setAnimationDuration:0.014]; - self.knobLayer.gripped = YES; - - // setup by turning off the manual clipping of the toggleLayer and setting up a layer mask. - [self useLayerMasking]; - [self positionLayersAndMask]; - - // retain all our targets so they don't disappear before the actions get sent at the end of the animation - - [CATransaction setCompletionBlock:^{ - [CATransaction begin]; - if (!animated) - [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; - else - [CATransaction setValue:(id)kCFBooleanFalse forKey:kCATransactionDisableActions]; - - CGFloat minToggleX = -self.toggleLayer.frame.size.width / 2.0 + self.toggleLayer.frame.size.height / 2.0; - CGFloat maxToggleX = -1; - - - if (self.on) - { - self.toggleLayer.frame = CGRectMake(maxToggleX, - self.toggleLayer.frame.origin.y, - self.toggleLayer.frame.size.width, - self.toggleLayer.frame.size.height); - } - else - { - self.toggleLayer.frame = CGRectMake(minToggleX, - self.toggleLayer.frame.origin.y, - self.toggleLayer.frame.size.width, - self.toggleLayer.frame.size.height); - } - - if (!self.toggleLayer.mask) - { - [self useLayerMasking]; - [self.toggleLayer setNeedsDisplay]; - } - - [self positionLayersAndMask]; - - self.knobLayer.gripped = NO; - - [CATransaction setCompletionBlock:^{ - [self removeLayerMask]; - self.ignoreTap = NO; - - // send the action here so it get's sent at the end of the animations - if (previousOn != on && !ignoreControlEvents) - [self sendActionsForControlEvents:UIControlEventValueChanged]; - - }]; - - [CATransaction commit]; - }]; -} - -- (void)setOnTintColor:(UIColor *)anOnTintColor -{ - if (anOnTintColor != onTintColor) - { - onTintColor = anOnTintColor; - self.toggleLayer.onTintColor = anOnTintColor; - [self.toggleLayer setNeedsDisplay]; - } -} - -- (void)layoutSubviews; -{ - CGFloat knobRadius = self.bounds.size.height + 2.0; - self.knobLayer.frame = CGRectMake(0, 0, knobRadius, knobRadius); - CGSize toggleSize = CGSizeMake(self.bounds.size.width * 2 - (knobRadius - 4), self.bounds.size.height); - CGFloat minToggleX = -toggleSize.width / 2.0 + knobRadius / 2.0 - 1; - CGFloat maxToggleX = -1; - - if (self.on) - { - self.toggleLayer.frame = CGRectMake(maxToggleX, - self.toggleLayer.frame.origin.y, - toggleSize.width, - toggleSize.height); - } - else - { - self.toggleLayer.frame = CGRectMake(minToggleX, - self.toggleLayer.frame.origin.y, - toggleSize.width, - toggleSize.height); - } - - [self positionLayersAndMask]; -} - -- (void)setOnText:(NSString *)newOnText -{ - if (newOnText != onText) - { - onText = [newOnText copy]; - self.toggleLayer.onString = onText; - [self.toggleLayer setNeedsDisplay]; - } -} - -- (void)setOffText:(NSString *)newOffText -{ - if (newOffText != offText) - { - offText = [newOffText copy]; - self.toggleLayer.offString = offText; - [self.toggleLayer setNeedsDisplay]; - } -} - -@end diff --git a/Classes/Utils/DCRoundSwitch/DCRoundSwitchKnobLayer.h b/Classes/Utils/DCRoundSwitch/DCRoundSwitchKnobLayer.h deleted file mode 100755 index 55141f72e..000000000 --- a/Classes/Utils/DCRoundSwitch/DCRoundSwitchKnobLayer.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// DCRoundSwitchKnobLayer.h -// -// Created by Patrick Richards on 29/06/11. -// MIT License. -// -// http://twitter.com/patr -// http://domesticcat.com.au/projects -// http://github.com/domesticcatsoftware/DCRoundSwitch -// - -#import - -@interface DCRoundSwitchKnobLayer : CALayer - -@property (nonatomic) BOOL gripped; - -@end diff --git a/Classes/Utils/DCRoundSwitch/DCRoundSwitchKnobLayer.m b/Classes/Utils/DCRoundSwitch/DCRoundSwitchKnobLayer.m deleted file mode 100755 index d64f2f468..000000000 --- a/Classes/Utils/DCRoundSwitch/DCRoundSwitchKnobLayer.m +++ /dev/null @@ -1,69 +0,0 @@ -// -// DCRoundSwitchKnobLayer.m -// -// Created by Patrick Richards on 29/06/11. -// MIT License. -// -// http://twitter.com/patr -// http://domesticcat.com.au/projects -// http://github.com/domesticcatsoftware/DCRoundSwitch -// - -#import "DCRoundSwitchKnobLayer.h" - -CGGradientRef CreateGradientRefWithColors(CGColorSpaceRef colorSpace, CGColorRef startColor, CGColorRef endColor); - -@implementation DCRoundSwitchKnobLayer -@synthesize gripped; - -- (void)drawInContext:(CGContextRef)context -{ - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); - CGRect knobRect = CGRectInset(self.bounds, 2, 2); - CGFloat knobRadius = self.bounds.size.height - 2; - - // knob outline (shadow is drawn in the toggle layer) - CGContextSetStrokeColorWithColor(context, [UIColor colorWithWhite:0.62 alpha:1.0].CGColor); - CGContextSetLineWidth(context, 1.5); - CGContextStrokeEllipseInRect(context, knobRect); - CGContextSetShadowWithColor(context, CGSizeMake(0, 0), 0, NULL); - - // knob inner gradient - CGContextAddEllipseInRect(context, knobRect); - CGContextClip(context); - CGColorRef knobStartColor = [UIColor colorWithWhite:0.82 alpha:1.0].CGColor; - CGColorRef knobEndColor = (self.gripped) ? [UIColor colorWithWhite:0.894 alpha:1.0].CGColor : [UIColor colorWithWhite:0.996 alpha:1.0].CGColor; - CGPoint topPoint = CGPointMake(0, 0); - CGPoint bottomPoint = CGPointMake(0, knobRadius + 2); - CGGradientRef knobGradient = CreateGradientRefWithColors(colorSpace, knobStartColor, knobEndColor); - CGContextDrawLinearGradient(context, knobGradient, topPoint, bottomPoint, 0); - CGGradientRelease(knobGradient); - - // knob inner highlight - CGContextAddEllipseInRect(context, CGRectInset(knobRect, 0.5, 0.5)); - CGContextAddEllipseInRect(context, CGRectInset(knobRect, 1.5, 1.5)); - CGContextEOClip(context); - CGGradientRef knobHighlightGradient = CreateGradientRefWithColors(colorSpace, [UIColor whiteColor].CGColor, [UIColor colorWithWhite:1.0 alpha:0.5].CGColor); - CGContextDrawLinearGradient(context, knobHighlightGradient, topPoint, bottomPoint, 0); - CGGradientRelease(knobHighlightGradient); - - CGColorSpaceRelease(colorSpace); -} - -CGGradientRef CreateGradientRefWithColors(CGColorSpaceRef colorSpace, CGColorRef startColor, CGColorRef endColor) -{ - CGFloat colorStops[2] = {0.0, 1.0}; - CGColorRef colors[] = {startColor, endColor}; - CFArrayRef colorsArray = CFArrayCreate(NULL, (const void**)colors, sizeof(colors) / sizeof(CGColorRef), &kCFTypeArrayCallBacks); - CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, colorsArray, colorStops); - CFRelease(colorsArray); - return gradient; -} - -- (void)setGripped:(BOOL)newGripped -{ - gripped = newGripped; - [self setNeedsDisplay]; -} - -@end diff --git a/Classes/Utils/DCRoundSwitch/DCRoundSwitchOutlineLayer.h b/Classes/Utils/DCRoundSwitch/DCRoundSwitchOutlineLayer.h deleted file mode 100755 index e9e82bf3f..000000000 --- a/Classes/Utils/DCRoundSwitch/DCRoundSwitchOutlineLayer.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// DCRoundSwitchOutlineLayer.h -// -// Created by Patrick Richards on 29/06/11. -// MIT License. -// -// http://twitter.com/patr -// http://domesticcat.com.au/projects -// http://github.com/domesticcatsoftware/DCRoundSwitch -// - -#import - -@interface DCRoundSwitchOutlineLayer : CALayer - -@end diff --git a/Classes/Utils/DCRoundSwitch/DCRoundSwitchOutlineLayer.m b/Classes/Utils/DCRoundSwitch/DCRoundSwitchOutlineLayer.m deleted file mode 100755 index 4cbb658e6..000000000 --- a/Classes/Utils/DCRoundSwitch/DCRoundSwitchOutlineLayer.m +++ /dev/null @@ -1,66 +0,0 @@ -// -// DCRoundSwitchOutlineLayer.m -// -// Created by Patrick Richards on 29/06/11. -// MIT License. -// -// http://twitter.com/patr -// http://domesticcat.com.au/projects -// http://github.com/domesticcatsoftware/DCRoundSwitch -// - -#import "DCRoundSwitchOutlineLayer.h" - -@implementation DCRoundSwitchOutlineLayer - -- (void)drawInContext:(CGContextRef)context -{ - // calculate the outline clip - CGContextSaveGState(context); - UIBezierPath *switchOutline = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:self.bounds.size.height / 2.0]; - CGContextAddPath(context, switchOutline.CGPath); - CGContextClip(context); - - // inner gloss - CGContextSaveGState(context); - CGRect innerGlossPathRect = CGRectMake(self.frame.size.width * 0.05, - self.frame.size.height / 2.0, - self.bounds.size.width - (self.frame.size.width * 0.1), - self.bounds.size.height / 2.0); - UIBezierPath *innerGlossPath = [UIBezierPath bezierPathWithRoundedRect:innerGlossPathRect - byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight - cornerRadii:CGSizeMake(self.bounds.size.height * 0.3, self.bounds.size.height * 0.3)]; - CGContextAddPath(context, innerGlossPath.CGPath); - CGContextClip(context); - - CGFloat colorStops[2] = {0.0, 1.0}; - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); - CGFloat innerGlossStartColorComponents[] = {1.0, 1.0, 1.0, 0.14}; - CGFloat innerGlossEndColorComponents[] = {1.0, 1.0, 1.0, 0.50}; - CGColorRef topColor = CGColorCreate(colorSpace, innerGlossStartColorComponents); - CGColorRef bottomColor = CGColorCreate(colorSpace, innerGlossEndColorComponents); - CGColorRef colors[] = { topColor, bottomColor }; - CFArrayRef colorsArray = CFArrayCreate(NULL, (const void**)colors, sizeof(colors) / sizeof(CGColorRef), &kCFTypeArrayCallBacks); - CGGradientRef innerGlossGradient = CGGradientCreateWithColors(colorSpace, colorsArray, colorStops); - CFRelease(colorsArray); - - CGContextDrawLinearGradient(context, innerGlossGradient, CGPointMake(0, CGRectGetMinY(innerGlossPathRect)), CGPointMake(0, CGRectGetMaxY(innerGlossPathRect)), 0); - CGContextRestoreGState(context); - CGColorSpaceRelease(colorSpace); - CGColorRelease(topColor); - CGColorRelease(bottomColor); - CGGradientRelease(innerGlossGradient); - - // outline and inner shadow - CGContextSetShadowWithColor(context, CGSizeMake(0.0, 1), 2.0, [UIColor colorWithRed:0.1 green:0.1 blue:0.1 alpha:1.0].CGColor); - CGContextSetLineWidth(context, 0.5); - UIBezierPath *outlinePath = [UIBezierPath bezierPathWithRoundedRect:CGRectOffset(self.bounds, -0.5, 0.0) cornerRadius:self.bounds.size.height / 2.0]; - CGContextAddPath(context, outlinePath.CGPath); - CGContextSetStrokeColorWithColor(context, [UIColor colorWithWhite:0.60 alpha:1.0].CGColor); - CGContextStrokePath(context); - - CGContextAddPath(context, outlinePath.CGPath); - CGContextStrokePath(context); -} - -@end diff --git a/Classes/Utils/DCRoundSwitch/DCRoundSwitchToggleLayer.h b/Classes/Utils/DCRoundSwitch/DCRoundSwitchToggleLayer.h deleted file mode 100755 index a04f171ca..000000000 --- a/Classes/Utils/DCRoundSwitch/DCRoundSwitchToggleLayer.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// DCRoundSwitchToggleLayer.h -// -// Created by Patrick Richards on 29/06/11. -// MIT License. -// -// http://twitter.com/patr -// http://domesticcat.com.au/projects -// http://github.com/domesticcatsoftware/DCRoundSwitch -// - -#import -#import - -@interface DCRoundSwitchToggleLayer : CALayer - -@property(nonatomic, strong) UIColor *onTintColor; -@property(nonatomic, strong) NSString *onString; -@property(nonatomic, strong) NSString *offString; -@property(weak, nonatomic, readonly) UIFont *labelFont; -@property (nonatomic) BOOL drawOnTint; -@property (nonatomic) BOOL clip; - -- (id)initWithOnString:(NSString *)anOnString offString:(NSString *)anOffString onTintColor:(UIColor *)anOnTintColor; - -@end diff --git a/Classes/Utils/DCRoundSwitch/DCRoundSwitchToggleLayer.m b/Classes/Utils/DCRoundSwitch/DCRoundSwitchToggleLayer.m deleted file mode 100755 index 4c884b6f6..000000000 --- a/Classes/Utils/DCRoundSwitch/DCRoundSwitchToggleLayer.m +++ /dev/null @@ -1,94 +0,0 @@ -// -// DCRoundSwitchToggleLayer.m -// -// Created by Patrick Richards on 29/06/11. -// MIT License. -// -// http://twitter.com/patr -// http://domesticcat.com.au/projects -// http://github.com/domesticcatsoftware/DCRoundSwitch -// - -#import "DCRoundSwitchToggleLayer.h" - -@implementation DCRoundSwitchToggleLayer -@synthesize onString, offString, onTintColor; -@synthesize drawOnTint; -@synthesize clip; -@synthesize labelFont; - - -- (id)initWithOnString:(NSString *)anOnString offString:(NSString *)anOffString onTintColor:(UIColor *)anOnTintColor -{ - if ((self = [super init])) - { - self.onString = anOnString; - self.offString = anOffString; - self.onTintColor = anOnTintColor; - } - - return self; -} - -- (UIFont *)labelFont -{ - return [UIFont boldSystemFontOfSize:ceilf(self.bounds.size.height * .6)]; -} - -- (void)drawInContext:(CGContextRef)context -{ - CGFloat knobRadius = self.bounds.size.height - 2.0; - CGFloat knobCenter = self.bounds.size.width / 2.0; - CGRect knobRect = CGRectMake(knobCenter - knobRadius / 2.0, 1.0, knobRadius, knobRadius); - - if (self.clip) - { - UIBezierPath *bezierPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(-self.frame.origin.x + 0.5, 0, self.bounds.size.width / 2.0 + self.bounds.size.height / 2.0 - 1.5, self.bounds.size.height) cornerRadius:self.bounds.size.height / 2.0]; - CGContextAddPath(context, bezierPath.CGPath); - CGContextClip(context); - } - - // on tint color - if (self.drawOnTint) - { - CGContextSetFillColorWithColor(context, self.onTintColor.CGColor); - CGContextFillRect(context, CGRectMake(0, 0, knobCenter, self.bounds.size.height)); - } - - // off tint color (white) - CGContextSetFillColorWithColor(context, [UIColor colorWithWhite:0.963 alpha:1.0].CGColor); - CGContextFillRect(context, CGRectMake(knobCenter, 0, self.bounds.size.width - knobCenter, self.bounds.size.height)); - - // knob shadow - CGContextSetShadowWithColor(context, CGSizeMake(0, 0), 1.5, [UIColor colorWithWhite:0.2 alpha:1.0].CGColor); - CGContextSetStrokeColorWithColor(context, [UIColor colorWithWhite:0.42 alpha:1.0].CGColor); - CGContextSetLineWidth(context, 1.0); - CGContextStrokeEllipseInRect(context, knobRect); - CGContextSetShadowWithColor(context, CGSizeMake(0, 0), 0, NULL); - - - // strings - CGFloat textSpaceWidth = (self.bounds.size.width / 2) - (knobRadius / 2); - - UIGraphicsPushContext(context); - - // 'ON' state label (self.onString) - CGSize onTextSize = [self.onString sizeWithFont:self.labelFont]; - CGPoint onTextPoint = CGPointMake((textSpaceWidth - onTextSize.width) / 2.0 + knobRadius * .15, floorf((self.bounds.size.height - onTextSize.height) / 2.0) + 1.0); - [[UIColor colorWithWhite:0.45 alpha:1.0] set]; // .2 & .4 - [self.onString drawAtPoint:CGPointMake(onTextPoint.x, onTextPoint.y - 1.0) withFont:self.labelFont]; - [[UIColor whiteColor] set]; - [self.onString drawAtPoint:onTextPoint withFont:self.labelFont]; - - // 'OFF' state label (self.offString) - CGSize offTextSize = [self.offString sizeWithFont:self.labelFont]; - CGPoint offTextPoint = CGPointMake(textSpaceWidth + (textSpaceWidth - offTextSize.width) / 2.0 + knobRadius * .86, floorf((self.bounds.size.height - offTextSize.height) / 2.0) + 1.0); - [[UIColor whiteColor] set]; - [self.offString drawAtPoint:CGPointMake(offTextPoint.x, offTextPoint.y + 1.0) withFont:self.labelFont]; - [[UIColor colorWithWhite:0.52 alpha:1.0] set]; - [self.offString drawAtPoint:offTextPoint withFont:self.labelFont]; - - UIGraphicsPopContext(); -} - -@end diff --git a/Classes/Utils/DTFoundation/DTActionSheet.h b/Classes/Utils/DTFoundation/DTActionSheet.h deleted file mode 100755 index b08744656..000000000 --- a/Classes/Utils/DTFoundation/DTActionSheet.h +++ /dev/null @@ -1,68 +0,0 @@ -// -// DTActionSheet.h -// DTFoundation -// -// Created by Oliver Drobnik on 08.06.12. -// Copyright (c) 2012 Cocoanetics. All rights reserved. -// - -#import "DTWeakSupport.h" - -// the block to execute when an option button is tapped -typedef void (^DTActionSheetBlock)(void); - -/** - Extends UIActionSheet with support for blocks. - */ - -@interface DTActionSheet : UIActionSheet - -/** - Initializes the action sheet using the specified title. - @param title The title - */ -- (instancetype)initWithTitle:(NSString *)title; - -/** - Adds a custom button to the action sheet. - @param title The title of the new button. - @param block The block to execute when the button is tapped. - @returns The index of the new button. Button indices start at 0 and increase in the order they are added. - */ -- (NSInteger)addButtonWithTitle:(NSString *)title block:(DTActionSheetBlock)block; - -/** - Adds a custom destructive button to the action sheet. - - Since there can only be one destructive button a previously marked destructive button becomes a normal button. - @param title The title of the new button. - @param block The block to execute when the button is tapped. - @returns The index of the new button. Button indices start at 0 and increase in the order they are added. - */ -- (NSInteger)addDestructiveButtonWithTitle:(NSString *)title block:(DTActionSheetBlock)block; - -/** - Adds a custom cancel button to the action sheet. - - Since there can only be one cancel button a previously marked cancel button becomes a normal button. - @param title The title of the new button. - @param block The block to execute when the button is tapped. - @returns The index of the new button. Button indices start at 0 and increase in the order they are added. - */ -- (NSInteger)addCancelButtonWithTitle:(NSString *)title block:(DTActionSheetBlock)block; - -/** - Adds a custom cancel button to the action sheet. - - Since there can only be one cancel button a previously marked cancel button becomes a normal button. - @param title The title of the new button. - @returns The index of the new button. Button indices start at 0 and increase in the order they are added. - */ -- (NSInteger)addCancelButtonWithTitle:(NSString *)title; - -/** - * Use the actionSheetDelegate when you want to to receive UIActionSheetDelegate messages. - */ -@property (nonatomic, DT_WEAK_PROPERTY) id actionSheetDelegate; - -@end \ No newline at end of file diff --git a/Classes/Utils/DTFoundation/DTActionSheet.m b/Classes/Utils/DTFoundation/DTActionSheet.m deleted file mode 100755 index 48124e36b..000000000 --- a/Classes/Utils/DTFoundation/DTActionSheet.m +++ /dev/null @@ -1,179 +0,0 @@ -// -// DTActionSheet.m -// DTFoundation -// -// Created by Oliver Drobnik on 08.06.12. -// Copyright (c) 2012 Cocoanetics. All rights reserved. -// - -#import "DTActionSheet.h" -#import "DTWeakSupport.h" - -@interface DTActionSheet () - -@end - -@implementation DTActionSheet -{ - NSMutableDictionary *_actionsPerIndex; -} - -// designated initializer -- (instancetype)init -{ - self = [super init]; - if (self) - { - _actionsPerIndex = [[NSMutableDictionary alloc] init]; - [super setDelegate:self]; - - } - return self; -} - -- (instancetype)initWithTitle:(NSString *)title -{ - return [self initWithTitle:title delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil]; -} - -- (instancetype)initWithTitle:(NSString *)title delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle destructiveButtonTitle:(NSString *)destructiveButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ... -{ - self = [self init]; - if (self) - { - self.title = title; - - if (otherButtonTitles != nil) { - [self addButtonWithTitle:otherButtonTitles]; - va_list args; - va_start(args, otherButtonTitles); - NSString *title = nil; - while( (title = va_arg(args, NSString *)) ) { - [self addButtonWithTitle:title]; - } - va_end(args); - } - - if (destructiveButtonTitle) { - [self addDestructiveButtonWithTitle:destructiveButtonTitle block:nil]; - } - if (cancelButtonTitle) { - [self addCancelButtonWithTitle:cancelButtonTitle block:nil]; - } - - self.actionSheetDelegate = delegate; - } - - return self; -} - -- (void)dealloc -{ - [super setDelegate:nil]; - self.actionSheetDelegate = nil; -} - -- (NSInteger)addButtonWithTitle:(NSString *)title block:(DTActionSheetBlock)block -{ - NSInteger retIndex = [self addButtonWithTitle:title]; - - if (block) - { - NSNumber *key = [NSNumber numberWithInteger:retIndex]; - [_actionsPerIndex setObject:[block copy] forKey:key]; - } - - return retIndex; -} - -- (NSInteger)addDestructiveButtonWithTitle:(NSString *)title block:(DTActionSheetBlock)block -{ - NSInteger retIndex = [self addButtonWithTitle:title block:block]; - [self setDestructiveButtonIndex:retIndex]; - - return retIndex; -} - -- (NSInteger)addCancelButtonWithTitle:(NSString *)title -{ - return [self addCancelButtonWithTitle:title block:nil]; -} - -- (NSInteger)addCancelButtonWithTitle:(NSString *)title block:(DTActionSheetBlock)block -{ - NSInteger retIndex = [self addButtonWithTitle:title block:block]; - [self setCancelButtonIndex:retIndex]; - - return retIndex; -} - -#pragma mark - UIActionSheetDelegate (forwarded) - -- (void)actionSheetCancel:(UIActionSheet *)actionSheet -{ - if ([self.actionSheetDelegate respondsToSelector:@selector(actionSheetCancel:)]) - { - [self.actionSheetDelegate actionSheetCancel:actionSheet]; - } -} - -- (void)willPresentActionSheet:(UIActionSheet *)actionSheet -{ - if ([self.actionSheetDelegate respondsToSelector:@selector(willPresentActionSheet:)]) - { - [self.actionSheetDelegate willPresentActionSheet:actionSheet]; - } -} - -- (void)didPresentActionSheet:(UIActionSheet *)actionSheet -{ - if ([self.actionSheetDelegate respondsToSelector:@selector(didPresentActionSheet:)]) - { - [self.actionSheetDelegate didPresentActionSheet:actionSheet]; - } -} - -- (void)actionSheet:(UIActionSheet *)actionSheet willDismissWithButtonIndex:(NSInteger)buttonIndex -{ - if ([self.actionSheetDelegate respondsToSelector:@selector(actionSheet:willDismissWithButtonIndex:)]) - { - [self.actionSheetDelegate actionSheet:actionSheet willDismissWithButtonIndex:buttonIndex]; - } -} - -- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex -{ - if ([self.actionSheetDelegate respondsToSelector:@selector(actionSheet:didDismissWithButtonIndex:)]) - { - [self.actionSheetDelegate actionSheet:actionSheet didDismissWithButtonIndex:buttonIndex]; - } -} - -- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex -{ - NSNumber *key = [NSNumber numberWithInteger:buttonIndex]; - - DTActionSheetBlock block = [_actionsPerIndex objectForKey:key]; - - if (block) - { - block(); - } - - if ([self.actionSheetDelegate respondsToSelector:@selector(actionSheet:clickedButtonAtIndex:)]) - { - [self.actionSheetDelegate actionSheet:actionSheet clickedButtonAtIndex:buttonIndex]; - } -} - -#pragma mark - Properties - -- (void)setDelegate:(id )delegate -{ - if (delegate) - { - NSLog(@"Calling setDelegate is not supported! Use setActionSheetDelegate instead"); - } -} - -@end diff --git a/Classes/Utils/DTFoundation/DTAlertView.h b/Classes/Utils/DTFoundation/DTAlertView.h deleted file mode 100644 index 69a4461c1..000000000 --- a/Classes/Utils/DTFoundation/DTAlertView.h +++ /dev/null @@ -1,57 +0,0 @@ -// -// DTAlertView.h -// DTFoundation -// -// Created by Oliver Drobnik on 11/22/12. -// Copyright (c) 2012 Cocoanetics. All rights reserved. -// - -#import "DTWeakSupport.h" - - -// the block to execute when an alert button is tapped -typedef void (^DTAlertViewBlock)(void); - -/** - Extends UIAlertView with support for blocks. - */ - -@interface DTAlertView : UIAlertView - -/** -* Initializes the alert view. Add buttons and their blocks afterwards. - @param title The alert title - @param message The alert message -*/ -- (id)initWithTitle:(NSString *)title message:(NSString *)message; - -/** - Adds a button to the alert view - - @param title The title of the new button. - @param block The block to execute when the button is tapped. - @returns The index of the new button. Button indices start at 0 and increase in the order they are added. - */ -- (NSInteger)addButtonWithTitle:(NSString *)title block:(DTAlertViewBlock)block; - -/** - Same as above, but for a cancel button. - @param title The title of the cancel button. - @param block The block to execute when the button is tapped. - @returns The index of the new button. Button indices start at 0 and increase in the order they are added. - */ -- (NSInteger)addCancelButtonWithTitle:(NSString *)title block:(DTAlertViewBlock)block; - -/** - Set a block to be run on alertViewCancel:. - @param block The block to execute. - */ -- (void)setCancelBlock:(DTAlertViewBlock)block; - - -/** - * Use the alertViewDelegate when you want to to receive UIAlertViewDelegate messages. - */ -@property (nonatomic, DT_WEAK_PROPERTY) id alertViewDelegate; - -@end diff --git a/Classes/Utils/DTFoundation/DTAlertView.m b/Classes/Utils/DTFoundation/DTAlertView.m deleted file mode 100644 index 9bf0211f1..000000000 --- a/Classes/Utils/DTFoundation/DTAlertView.m +++ /dev/null @@ -1,183 +0,0 @@ -// -// DTAlertView.m -// DTFoundation -// -// Created by Oliver Drobnik on 11/22/12. -// Copyright (c) 2012 Cocoanetics. All rights reserved. -// - -#import "DTAlertView.h" - -@interface DTAlertView() - -@end - -@implementation DTAlertView -{ - NSMutableDictionary *_actionsPerIndex; - - DTAlertViewBlock _cancelBlock; -} - -- (void)dealloc -{ - [super setDelegate:nil]; - self.alertViewDelegate = nil; -} - -// designated initializer -- (id)init -{ - self = [super init]; - if (self) - { - _actionsPerIndex = [[NSMutableDictionary alloc] init]; - [super setDelegate:self]; - } - return self; -} - -- (id)initWithTitle:(NSString *)title message:(NSString *)message -{ - return [self initWithTitle:title message:message delegate:nil cancelButtonTitle:nil otherButtonTitles:nil]; -} - -- (id)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ... -{ - self = [self init]; - if (self) - { - self.title = title; - self.message = message; - - if (otherButtonTitles != nil) { - [self addButtonWithTitle:otherButtonTitles]; - va_list args; - va_start(args, otherButtonTitles); - NSString *title = nil; - while( (title = va_arg(args, NSString *)) ) { - [self addButtonWithTitle:title]; - } - va_end(args); - } - if (cancelButtonTitle) { - [self addCancelButtonWithTitle:cancelButtonTitle block:nil]; - } - - self.alertViewDelegate = delegate; - } - return self; -} - -- (NSInteger)addButtonWithTitle:(NSString *)title block:(DTAlertViewBlock)block -{ - NSInteger retIndex = [self addButtonWithTitle:title]; - - if (block) - { - NSNumber *key = [NSNumber numberWithInteger:retIndex]; - [_actionsPerIndex setObject:[block copy] forKey:key]; - } - - return retIndex; -} - -- (NSInteger)addCancelButtonWithTitle:(NSString *)title block:(DTAlertViewBlock)block -{ - NSInteger retIndex = [self addButtonWithTitle:title block:block]; - [self setCancelButtonIndex:retIndex]; - - return retIndex; -} - -- (void)setCancelBlock:(DTAlertViewBlock)block -{ - _cancelBlock = block; -} - -# pragma mark - UIAlertViewDelegate - -- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex -{ - NSNumber *key = [NSNumber numberWithInteger:buttonIndex]; - - DTAlertViewBlock block = [_actionsPerIndex objectForKey:key]; - if (block) - { - block(); - } - - if ([self.alertViewDelegate respondsToSelector:@selector(alertView:clickedButtonAtIndex:)]) - { - [self.alertViewDelegate alertView:self clickedButtonAtIndex:buttonIndex]; - } -} - -- (void)alertViewCancel:(UIAlertView *)alertView -{ - if (_cancelBlock) - { - _cancelBlock(); - } - - if ([self.alertViewDelegate respondsToSelector:@selector(alertViewCancel:)]) - { - [self.alertViewDelegate alertViewCancel:self]; - } -} - -- (void)willPresentAlertView:(UIAlertView *)alertView -{ - if ([self.alertViewDelegate respondsToSelector:@selector(willPresentAlertView:)]) - { - [self.alertViewDelegate willPresentAlertView:self]; - } -} - -- (void)didPresentAlertView:(UIAlertView *)alertView -{ - if ([self.alertViewDelegate respondsToSelector:@selector(didPresentAlertView:)]) - { - [self.alertViewDelegate didPresentAlertView:self]; - } -} - -- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex -{ - if ([self.alertViewDelegate respondsToSelector:@selector(alertView:willDismissWithButtonIndex:)]) - { - [self.alertViewDelegate alertView:self willDismissWithButtonIndex:buttonIndex]; - } -} - -- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex -{ - if ([self.alertViewDelegate respondsToSelector:@selector(alertView:didDismissWithButtonIndex:)]) - { - [self.alertViewDelegate alertView:self didDismissWithButtonIndex:buttonIndex]; - } -} - -- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView -{ - if ([self.alertViewDelegate respondsToSelector:@selector(alertViewShouldEnableFirstOtherButton:)]) - { - return [self.alertViewDelegate alertViewShouldEnableFirstOtherButton:self]; - } - - return YES; -} - - -#pragma mark - Properties - - -- (void)setDelegate:(id )delegate -{ - if (delegate) - { - NSLog(@"Calling setDelegate is not supported! Use setAlertViewDelegate instead"); - } -} - -@end diff --git a/Classes/Utils/DTFoundation/DTWeakSupport.h b/Classes/Utils/DTFoundation/DTWeakSupport.h deleted file mode 100644 index a74444baf..000000000 --- a/Classes/Utils/DTFoundation/DTWeakSupport.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// DTWeakSupport.h -// DTFoundation -// -// Created by Oliver Drobnik on 6/3/13. -// Copyright (c) 2013 Cocoanetics. All rights reserved. -// - -/** - Useful defines for building code the compiles with zeroing weak references if the deployment target allows it. This is possible from minimum supported iOS 5.0 and OS X 10.7 and above. Note that on OS X 10.7 some AppKit classes do not support having a weak ref, e.g. NSWindowController or NSViewController. - */ - -#import - -#if __has_feature(objc_arc_weak) - -// zeroing weak refs are supported for ivars and properties -#define DT_WEAK_VARIABLE __weak -#define DT_WEAK_PROPERTY weak - -#elif __has_feature(objc_arc) - -/// zeroing weak refs not supported, fall back to unsafe unretained and assigning -#define DT_WEAK_VARIABLE __unsafe_unretained -#define DT_WEAK_PROPERTY assign - -#else - -// define something, as this header might be included in a non-ARC project for using compiled code from an ARC static lib -#define DT_WEAK_VARIABLE -#define DT_WEAK_PROPERTY assign - -#endif \ No newline at end of file diff --git a/Classes/Utils/FastAddressBook.h b/Classes/Utils/FastAddressBook.h deleted file mode 100644 index a51d824ae..000000000 --- a/Classes/Utils/FastAddressBook.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import - -#include "linphone/linphonecore.h" -#include "Contact.h" - -@interface FastAddressBook : NSObject - -@property(readonly, nonatomic) NSMutableDictionary *addressBookMap; -@property BOOL needToUpdate; - -- (void)fetchContactsInBackGroundThread; -- (BOOL)deleteContact:(Contact *)contact; -- (BOOL)deleteCNContact:(CNContact *)CNContact; -- (BOOL)deleteAllContacts; -- (BOOL)saveContact:(Contact *)contact; -- (BOOL)saveCNContact:(CNContact *)CNContact contact:(Contact *)Contact; -- (void)reloadFriends; -- (void)clearFriends; - -- (void)dumpContactsDisplayNamesToUserDefaults; -- (void)removeContactFromUserDefaults:(Contact *)contact; - -+ (BOOL)isAuthorized; - -// TOOLS - -+ (Contact *)getContactWithAddress:(const LinphoneAddress *)address; -- (CNContact *)getCNContactFromContact:(Contact *)acontact; - -+ (UIImage *)imageForContact:(Contact *)contact; -+ (UIImage *)imageForAddress:(const LinphoneAddress *)addr; -+ (UIImage *)imageForSecurityLevel:(LinphoneChatRoomSecurityLevel)level; - -+ (BOOL)contactHasValidSipDomain:(Contact *)person; -+ (BOOL)isSipURIValid:(NSString*)addr; - -+ (NSString *)displayNameForContact:(Contact *)person; -+ (NSString *)ogrganizationForContact:(Contact *)person; -+ (NSString *)displayNameForAddress:(const LinphoneAddress *)addr; - -+ (BOOL)isSipURI:(NSString *)address; -+ (BOOL)isSipAddress:(CNLabeledValue *)sipAddr; -+ (NSString *)normalizeSipURI:(NSString *)address use_prefix:(BOOL)use_prefix; - -+ (NSString *)localizedLabel:(NSString *)label; -- (void)registerAddrsFor:(Contact *)contact; - -@end diff --git a/Classes/Utils/FastAddressBook.m b/Classes/Utils/FastAddressBook.m deleted file mode 100644 index 1fc2639d5..000000000 --- a/Classes/Utils/FastAddressBook.m +++ /dev/null @@ -1,650 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifdef __IPHONE_9_0 -#import -#endif -#import "FastAddressBook.h" -#import "LinphoneManager.h" -#import "ContactsListView.h" -#import "Utils.h" -#import "linphoneapp-Swift.h" - -@implementation FastAddressBook { - CNContactStore* store; -} - -+ (UIImage *)imageForContact:(Contact *)contact { - @synchronized(LinphoneManager.instance.fastAddressBook.addressBookMap) { - UIImage *retImage = nil; - if (retImage == nil) { - retImage = contact.friend && linphone_friend_get_addresses(contact.friend) ? - [AvatarBridge imageForAddressWithAddress:linphone_friend_get_addresses(contact.friend)->data] : - [AvatarBridge imageForInitialsWithContact:contact displayName:[contact displayName]]; - } - if (retImage.size.width != retImage.size.height) { - retImage = [retImage squareCrop]; - } - return retImage; - } -} - -+ (UIImage *)imageForAddress:(const LinphoneAddress *)addr { - if ([LinphoneManager isMyself:addr] && [LinphoneUtils hasSelfAvatar]) { - return [LinphoneUtils selfAvatar]; - } - return [AvatarBridge imageForAddressWithAddress:addr]; -} - -+ (UIImage *)imageForSecurityLevel:(LinphoneChatRoomSecurityLevel)level { - switch (level) { - case LinphoneChatRoomSecurityLevelUnsafe: - return [UIImage imageNamed:@"security_alert_indicator.png"]; - case LinphoneChatRoomSecurityLevelEncrypted: - return [UIImage imageNamed:@"security_1_indicator.png.png"]; - case LinphoneChatRoomSecurityLevelSafe: - return [UIImage imageNamed:@"security_2_indicator.png.png"]; - - default: - return nil; - } -} - -+ (Contact *)getContact:(NSString *)address { - if (LinphoneManager.instance.fastAddressBook != nil) { - @synchronized(LinphoneManager.instance.fastAddressBook.addressBookMap) { - return [LinphoneManager.instance.fastAddressBook.addressBookMap objectForKey:address]; - } - } - return nil; -} - -+ (Contact *)getContactWithAddress:(const LinphoneAddress *)address { - Contact *contact = nil; - if (address) { - char *uri = linphone_address_as_string_uri_only(address); - NSString *normalizedSipAddress = [FastAddressBook normalizeSipURI:[NSString stringWithUTF8String:uri] use_prefix:TRUE]; - contact = [FastAddressBook getContact:normalizedSipAddress]; - ms_free(uri); - - if (!contact) { - LinphoneFriend *friend = linphone_core_find_friend(LC, address); - bctbx_list_t *number_list = linphone_friend_get_phone_numbers(friend); - bctbx_list_t *it; - for (it = number_list ; it != NULL; it = it->next) { - NSString *phone = [NSString stringWithUTF8String:it->data]; - LinphoneAccount *account = linphone_core_get_default_account(LC); - - if (account) { - char *normvalue = linphone_account_normalize_phone_number(account, phone.UTF8String); - LinphoneAddress *addr = linphone_account_normalize_sip_uri(account, normvalue); - char *phone_addr = linphone_address_as_string_uri_only(addr); - contact = [FastAddressBook getContact:[NSString stringWithUTF8String:phone_addr]]; - ms_free(phone_addr); - linphone_address_unref(addr); - bctbx_free(normvalue); - } else { - contact = [FastAddressBook getContact:phone]; - } - - if (contact) { - break; - } - } - bctbx_list_free(number_list); - } - } - - return contact; -} - -+ (BOOL)isSipURI:(NSString *)address { - return [address hasPrefix:@"sip:"] || [address hasPrefix:@"sips:"]; -} - -+ (BOOL)isSipAddress:(CNLabeledValue *)sipAddr { - NSString *username = sipAddr.value.username; - NSString *service = sipAddr.value.service; - LOGI(@"Parsing contact with username : %@ and service : %@", username, service); - if (!username || [username isEqualToString:@""]) - return FALSE; - - if (!service || [service isEqualToString:@""]) - return [FastAddressBook isSipURI:username]; - - // use caseInsensitiveCompare, because ios13 saves "SIP" by "Sip" - if ([service caseInsensitiveCompare:LinphoneManager.instance.contactSipField] == NSOrderedSame) - return TRUE; - - return FALSE; -} - -+ (NSString *)normalizeSipURI:(NSString *)address use_prefix:(BOOL)use_prefix { - // replace all whitespaces (non-breakable, utf8 nbsp etc.) by the "classical" whitespace - NSString *normalizedSipAddress = nil; - LinphoneAddress *addr = linphone_core_interpret_url_2(LC, [address UTF8String], use_prefix); - if (addr != NULL) { - linphone_address_clean(addr); - char *tmp = linphone_address_as_string(addr); - normalizedSipAddress = [NSString stringWithUTF8String:tmp]; - ms_free(tmp); - linphone_address_destroy(addr); - return normalizedSipAddress; - }else { - normalizedSipAddress = [[address componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] componentsJoinedByString:@" "]; - return normalizedSipAddress; - } -} - -+ (BOOL)isAuthorized { - return ![LinphoneManager.instance lpConfigBoolForKey:@"enable_native_address_book"] || [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts] == CNAuthorizationStatusAuthorized; -} - -- (FastAddressBook *)init { - if ((self = [super init]) != nil) { - store = [[CNContactStore alloc] init]; - _addressBookMap = [NSMutableDictionary dictionary]; - - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(onPresenceChanged:) - name:kLinphoneNotifyPresenceReceivedForUriOrTel - object:nil]; - } - self.needToUpdate = FALSE; - if (floor(NSFoundationVersionNumber) >= NSFoundationVersionNumber_iOS_9_x_Max) { - if ([CNContactStore class]) { - // ios9 or later - if (store == NULL) - store = [[CNContactStore alloc] init]; - [self fetchContactsInBackGroundThread]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateAddressBook:) name:CNContactStoreDidChangeNotification object:nil]; - } - } - return self; -} - -- (void) loadLinphoneFriends { - // load Linphone friends - const MSList *lists = linphone_core_get_friends_lists(LC); - while (lists) { - LinphoneFriendList *fl = lists->data; - const MSList *friends = linphone_friend_list_get_friends(fl); - while (friends) { - LinphoneFriend *f = friends->data; - // only append friends that are not native contacts (already added - // above) - if (linphone_friend_get_ref_key(f) == NULL) { - Contact *contact = [[Contact alloc] initWithFriend:f]; - contact.createdFromLdapOrProvisioning = true; - [self registerAddrsFor:contact]; - } - friends = friends->next; - } - linphone_friend_list_update_subscriptions(fl); - lists = lists->next; - } - [self dumpContactsDisplayNamesToUserDefaults]; - - [NSNotificationCenter.defaultCenter - postNotificationName:kLinphoneAddressBookUpdate - object:self]; -} - -- (void) fetchContactsInBackGroundThread{ - [_addressBookMap removeAllObjects]; - _addressBookMap = [NSMutableDictionary dictionary]; - - if ([LinphoneManager.instance lpConfigBoolForKey:@"enable_native_address_book"]) { - CNEntityType entityType = CNEntityTypeContacts; - [store requestAccessForEntityType:entityType completionHandler:^(BOOL granted, NSError *_Nullable error) { - BOOL success = FALSE; - if(granted){ - LOGD(@"CNContactStore authorization granted"); - - NSError *contactError; - CNContactStore* store = [[CNContactStore alloc] init]; - [store containersMatchingPredicate:[CNContainer predicateForContainersWithIdentifiers:@[ store.defaultContainerIdentifier]] error:&contactError]; - NSArray *keysToFetch = @[ - CNContactEmailAddressesKey, CNContactPhoneNumbersKey, - CNContactFamilyNameKey, CNContactGivenNameKey, CNContactNicknameKey, - CNContactPostalAddressesKey, CNContactIdentifierKey, - CNInstantMessageAddressUsernameKey, CNContactInstantMessageAddressesKey, - CNInstantMessageAddressUsernameKey, CNContactImageDataKey, CNContactOrganizationNameKey - ]; - CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:keysToFetch]; - - success = [store enumerateContactsWithFetchRequest:request error:&contactError usingBlock:^(CNContact *__nonnull contact, BOOL *__nonnull stop) { - if (contactError) { - NSLog(@"error fetching contacts %@", - contactError); - } else { - Contact *newContact = [[Contact alloc] initWithCNContact:contact]; - [self registerAddrsFor:newContact]; - } - }]; - } - [self loadLinphoneFriends]; - }]; - } else { - [self loadLinphoneFriends]; - } - - -} - --(void) updateAddressBook:(NSNotification*) notif { - LOGD(@"address book has changed"); - self.needToUpdate = TRUE; -} - -- (void)registerAddrsFor:(Contact *)contact { - if (!contact) - return; - - Contact* mContact = contact; - if (!_addressBookMap) - return; - - LinphoneAccount *account = linphone_core_get_default_account(LC); - - for (NSString *phone in mContact.phones) { - char *normalizedPhone = account? linphone_account_normalize_phone_number(account, phone.UTF8String) : nil; - NSString *name = [FastAddressBook normalizeSipURI:(normalizedPhone ? [NSString stringWithUTF8String:normalizedPhone] : phone) use_prefix:TRUE]; - if (phone != NULL) - [_addressBookMap setObject:mContact forKey:(name ?: [FastAddressBook localizedLabel:phone])]; - - if (normalizedPhone) - ms_free(normalizedPhone); - } - - for (NSString *sip in mContact.sipAddresses) - [_addressBookMap setObject:mContact forKey:([FastAddressBook normalizeSipURI:sip use_prefix:TRUE] ?: sip)]; -} - -#pragma mark - Tools - -+ (NSString *)localizedLabel:(NSString *)label { - if (label) - return [CNLabeledValue localizedStringForLabel:label]; - - return @""; -} - -+ (BOOL)contactHasValidSipDomain:(Contact *)contact { - if (!contact) - return NO; - - // Check if one of the contact' sip URI matches the expected SIP filter - NSString *domain = LinphoneManager.instance.contactFilter; - - for (NSString *sip in contact.sipAddresses) { - // check domain - LinphoneAddress *address = linphone_core_interpret_url_2(LC, sip.UTF8String, true); - if (address) { - const char *dom = linphone_address_get_domain(address); - BOOL match = false; - if (dom != NULL) { - NSString *contactDomain = [NSString stringWithCString:dom encoding:[NSString defaultCStringEncoding]]; - match = (([domain compare:@"*" options:NSCaseInsensitiveSearch] == NSOrderedSame) || - ([domain compare:contactDomain options:NSCaseInsensitiveSearch] == NSOrderedSame)); - } - linphone_address_destroy(address); - if (match) - return YES; - } - } - return NO; -} - -+ (BOOL) isSipURIValid:(NSString*)addr { - NSString *domain = LinphoneManager.instance.contactFilter; - LinphoneAddress* address = linphone_core_interpret_url_2(LC, addr.UTF8String, true); - if (address) { - const char *dom = linphone_address_get_domain(address); - BOOL match = false; - if (dom != NULL) { - NSString *contactDomain = [NSString stringWithCString:dom encoding:[NSString defaultCStringEncoding]]; - match = (([domain compare:@"*" options:NSCaseInsensitiveSearch] == NSOrderedSame) || - ([domain compare:contactDomain options:NSCaseInsensitiveSearch] == NSOrderedSame)); - } - linphone_address_destroy(address); - if (match) { - return YES; - } - } - return NO; -} - -+ (NSString *)displayNameForContact:(Contact *)contact { - return contact.displayName; -} -+ (NSString *)ogrganizationForContact:(Contact *)contact { - return contact.organizationName; -} - -+ (NSString *)displayNameForAddress:(const LinphoneAddress *)addr { - Contact *contact = [FastAddressBook getContactWithAddress:addr]; - if (contact && ![contact.displayName isEqualToString:NSLocalizedString(@"Unknown", nil)]) - return [FastAddressBook displayNameForContact:contact]; - - LinphoneFriend *friend = linphone_core_find_friend(LC, addr); - if (friend) - return [NSString stringWithUTF8String:linphone_friend_get_name(friend)]; - - const char *displayName = linphone_address_get_display_name(addr); - if (displayName) - return [NSString stringWithUTF8String:displayName]; - - const char *userName = linphone_address_get_username(addr); - if (userName) - return [NSString stringWithUTF8String:userName]; - - return NSLocalizedString(@"Unknown", nil); -} - - -- (CNContact *)getCNContactFromContact:(Contact *)acontact { - NSArray *keysToFetch = @[ - CNContactEmailAddressesKey, CNContactPhoneNumbersKey, - CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPostalAddressesKey, - CNContactIdentifierKey, CNContactInstantMessageAddressesKey, - CNInstantMessageAddressUsernameKey, CNContactImageDataKey, CNContactOrganizationNameKey - ]; - CNMutableContact *mCNContact = - [[store unifiedContactWithIdentifier:acontact.identifier - keysToFetch:keysToFetch - error:nil] mutableCopy]; - return mCNContact; -} - -- (BOOL)deleteCNContact:(CNContact *)contact { - return TRUE;//[self deleteContact:] ; -} - -- (BOOL)deleteContact:(Contact *)contact { - [self removeContactFromUserDefaults:contact]; - - CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init]; - NSArray *keysToFetch = @[ - CNContactEmailAddressesKey, CNContactPhoneNumbersKey, - CNContactInstantMessageAddressesKey, CNInstantMessageAddressUsernameKey, - CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPostalAddressesKey, - CNContactIdentifierKey, CNContactImageDataKey, CNContactNicknameKey - ]; - CNMutableContact *mCNContact = - [[store unifiedContactWithIdentifier:contact.identifier - keysToFetch:keysToFetch - error:nil] mutableCopy]; - if(mCNContact != nil){ - [saveRequest deleteContact:mCNContact]; - @try { - [self removeFriend:contact ]; - [LinphoneManager.instance setContactsUpdated:TRUE]; - if([contact.sipAddresses count] > 0){ - for (NSString *sip in contact.sipAddresses) { - [_addressBookMap removeObjectForKey:([FastAddressBook normalizeSipURI:sip use_prefix:TRUE] ?: sip)]; - } - } - if([contact.phones count] > 0){ - for (NSString *phone in contact.phones) { - [_addressBookMap removeObjectForKey:([FastAddressBook normalizeSipURI:phone use_prefix:TRUE] ?: phone)]; - } - } - BOOL success = [store executeSaveRequest:saveRequest error:nil]; - NSLog(@"Success %d", success); - } @catch (NSException *exception) { - NSLog(@"description = %@", [exception description]); - return FALSE; - } - } - return TRUE; -} - - -- (BOOL)deleteAllContacts { - NSArray *keys = @[ CNContactPhoneNumbersKey ]; - NSString *containerId = store.defaultContainerIdentifier; - NSPredicate *predicate = [CNContact predicateForContactsInContainerWithIdentifier:containerId]; - NSError *error; - NSArray *cnContacts = [store unifiedContactsMatchingPredicate:predicate - keysToFetch:keys - error:&error]; - if (error) { - NSLog(@"error fetching contacts %@", error); - return FALSE; - } else { - CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init]; - for (CNContact *contact in cnContacts) { - [saveRequest deleteContact:[contact mutableCopy]]; - } - @try { - NSLog(@"Success %d", [store executeSaveRequest:saveRequest error:nil]); - } @catch (NSException *exception) { - NSLog(@"description = %@", [exception description]); - return FALSE; - } - NSLog(@"Deleted contacts %lu", (unsigned long)cnContacts.count); - } - return TRUE; -} - -- (BOOL)saveContact:(Contact *)contact { - return [self saveCNContact:contact.person contact:contact]; -} - -- (BOOL)saveCNContact:(CNContact *)cNContact contact:(Contact *)contact { - CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init]; - NSArray *keysToFetch = @[ - CNContactEmailAddressesKey, CNContactPhoneNumbersKey, - CNContactInstantMessageAddressesKey, CNInstantMessageAddressUsernameKey, - CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPostalAddressesKey, - CNContactIdentifierKey, CNContactImageDataKey, CNContactNicknameKey, CNContactOrganizationNameKey - ]; - CNMutableContact *mCNContact = - [[store unifiedContactWithIdentifier:contact.identifier - keysToFetch:keysToFetch - error:nil] mutableCopy]; - if(mCNContact == NULL){ - [saveRequest addContact:[cNContact mutableCopy] toContainerWithIdentifier:nil]; - }else{ - [mCNContact setGivenName:contact.firstName]; - [mCNContact setFamilyName:contact.lastName]; - [mCNContact setNickname:contact.displayName]; - [mCNContact setOrganizationName:contact.organizationName]; - [mCNContact setPhoneNumbers:contact.person.phoneNumbers]; - [mCNContact setEmailAddresses:contact.person.emailAddresses]; - [mCNContact setInstantMessageAddresses:contact.person.instantMessageAddresses]; - [mCNContact setImageData:UIImageJPEGRepresentation(contact.avatar, 0.9f)]; - - [saveRequest updateContact:mCNContact]; - } - NSError *saveError; - @try { - [self updateFriend:contact]; - [LinphoneManager.instance setContactsUpdated:TRUE]; - NSLog(@"Success %d", [store executeSaveRequest:saveRequest error:&saveError]); - } @catch (NSException *exception) { - NSLog(@"=====>>>>> CNContact SaveRequest failed : description = %@", [exception description]); - return FALSE; - } - [self fetchContactsInBackGroundThread]; - return TRUE; -} - --(void)updateFriend:(Contact*) contact{ - bctbx_list_t *phonesList = linphone_friend_get_phone_numbers(contact.friend); - for (NSString *phone in contact.phones) { - if(!(bctbx_list_find(phonesList, [phone UTF8String]))){ - linphone_friend_edit(contact.friend); - linphone_friend_add_phone_number(contact.friend, [phone UTF8String]); - linphone_friend_enable_subscribes(contact.friend, TRUE); - linphone_friend_done(contact.friend); - } - } - - BOOL enabled = [LinphoneManager.instance lpConfigBoolForKey:@"use_rls_presence"]; - const MSList *lists = linphone_core_get_friends_lists(LC); - while (lists) { - linphone_friend_list_enable_subscriptions(lists->data, FALSE); - linphone_friend_list_enable_subscriptions(lists->data, enabled); - linphone_friend_list_update_subscriptions(lists->data); - lists = lists->next; - } -} - --(void)removeFriend:(Contact*) contact{ - BOOL enabled = [LinphoneManager.instance lpConfigBoolForKey:@"use_rls_presence"]; - const MSList *lists = linphone_core_get_friends_lists(LC); - while (lists) { - linphone_friend_list_remove_friend(lists->data, contact.friend); - linphone_friend_list_enable_subscriptions(lists->data, FALSE); - linphone_friend_list_enable_subscriptions(lists->data, enabled); - linphone_friend_list_update_subscriptions(lists->data); - lists = lists->next; - } -} - -- (void)reloadFriends { - dispatch_async(dispatch_get_main_queue(), ^{ - [_addressBookMap enumerateKeysAndObjectsUsingBlock:^(NSString *name, Contact *contact, BOOL *stop) { - [contact reloadFriend]; - }]; - }); -} - -- (void)clearFriends { - [_addressBookMap enumerateKeysAndObjectsUsingBlock:^(NSString *name, Contact *contact, BOOL *stop) { - [contact clearFriend]; - }]; -} - -- (void)dumpContactsDisplayNamesToUserDefaults { - LOGD(@"dumpContactsDisplayNamesToUserDefaults"); - NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:kLinphoneMsgNotificationAppGroupId]; - __block NSDictionary *oldDisplayNames = [defaults dictionaryForKey:@"addressBook"]; - LinphoneAccount *account = linphone_core_get_default_account(LC); - - __block NSMutableDictionary *displayNames = [[NSMutableDictionary dictionary] init]; - [_addressBookMap enumerateKeysAndObjectsUsingBlock:^(NSString *name, Contact *contact, BOOL *stop) { - if ([FastAddressBook isSipURIValid:name]) { - NSString *key = name; - LinphoneAddress *addr = linphone_address_new(name.UTF8String); - - if (addr && linphone_account_is_phone_number(account, linphone_address_get_username(addr))) { - if (oldDisplayNames[name] != nil && [FastAddressBook isSipURI:oldDisplayNames[name]]) { - NSString *addrForTel = [NSString stringWithString:oldDisplayNames[name]]; - /* we keep the link between tel number and sip addr to have the information quickly. - If we don't do that, between the startup and presence callback we don't have the dispay name for this address */ - LOGD(@"add %s -> %s link to userdefaults", name.UTF8String, addrForTel.UTF8String); - [displayNames setObject:addrForTel forKey:name]; - key = addrForTel; - } - } - LOGD(@"add %s to userdefaults", key.UTF8String); - [displayNames setObject:[contact displayName] forKey:key]; - linphone_address_unref(addr); - } else { - LOGD(@"cannot add %s to userdefaults: bad sip address", name.UTF8String); - } - }]; - - [defaults setObject:displayNames forKey:@"addressBook"]; -} - -- (void)removeContactFromUserDefaults:(Contact *)contact { - LOGD(@"removeContactFromUserDefaults contact: [%p]", contact); - NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:kLinphoneMsgNotificationAppGroupId]; - NSMutableDictionary *displayNames = [[NSMutableDictionary alloc] initWithDictionary:[defaults dictionaryForKey:@"addressBook"]]; - if (displayNames == nil) return; - - - LinphoneAccount *account = linphone_core_get_default_account(LC); - for (NSString *phone in contact.phones) { - char *normalizedPhone = account? linphone_account_normalize_phone_number(account, phone.UTF8String) : nil; - NSString *name = [FastAddressBook normalizeSipURI:(normalizedPhone ? [NSString stringWithUTF8String:normalizedPhone] : phone) use_prefix:TRUE]; - if (phone != NULL) { - if ([FastAddressBook isSipURI:displayNames[name]]) { - LOGD(@"removed %s from userdefaults addressBook", ((NSString *)displayNames[name]).UTF8String); - [displayNames removeObjectForKey:displayNames[name]]; - } - [displayNames removeObjectForKey:name]; - LOGD(@"removed %s from userdefaults addressBook", ((NSString *)name).UTF8String); - } - - if (normalizedPhone) - ms_free(normalizedPhone); - } - - NSMutableArray *addresses = contact.sipAddresses; - for (id addr in addresses) { - [displayNames removeObjectForKey:addr]; - LOGD(@"removed %s from userdefaults addressBook", ((NSString *)addr).UTF8String); - } - - [defaults setObject:displayNames forKey:@"addressBook"]; -} - -- (void)onPresenceChanged:(NSNotification *)k { - NSString *uri = [NSString stringWithUTF8String:[[k.userInfo valueForKey:@"uri"] pointerValue]]; - NSString *telAddr; - - if ([FastAddressBook isSipURI:uri]) { - LinphoneAddress *addr = linphone_address_new(uri.UTF8String); - if (linphone_account_is_phone_number(linphone_core_get_default_account(LC), linphone_address_get_username(addr))) { - telAddr = uri; - } - linphone_address_unref(addr); - } else { - telAddr = [FastAddressBook normalizeSipURI:uri use_prefix:TRUE]; - } - - if (telAddr) { - LOGD(@"presence changed for tel [%s]", telAddr.UTF8String); - - NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:kLinphoneMsgNotificationAppGroupId]; - NSMutableDictionary *displayNames = [[NSMutableDictionary alloc] initWithDictionary:[defaults dictionaryForKey:@"addressBook"]]; - if (displayNames == nil) return; - - id displayName = [displayNames objectForKey:telAddr]; - if (displayName == nil) return; - - const LinphonePresenceModel *m = [[k.userInfo valueForKey:@"presence_model"] pointerValue]; - char *str = linphone_presence_model_get_contact(m); - if (str == nil) { - return; - } - - NSString *contact = [NSString stringWithUTF8String:str]; - ms_free(str); - NSString *sipAddr = [FastAddressBook normalizeSipURI:contact use_prefix:TRUE]; - - if (sipAddr != nil && [displayNames objectForKey:sipAddr] == nil) { - [displayNames setObject:displayName forKey:sipAddr]; - [displayNames removeObjectForKey:telAddr]; - [displayNames setObject:sipAddr forKey:telAddr]; - LOGD(@"add %s -> %s link to userdefaults", telAddr.UTF8String, sipAddr.UTF8String); - /* we keep the link between tel number and sip addr to have the information on the next startup. - If we don't do that, between the startup and this callback we don't have the dispay name for this address */ - LOGD(@"Replaced %s by %s in userdefaults addressBook", telAddr.UTF8String, sipAddr.UTF8String); - [defaults setObject:displayNames forKey:@"addressBook"]; - } - } -} - -@end diff --git a/Classes/Utils/FileTransferDelegate.h b/Classes/Utils/FileTransferDelegate.h deleted file mode 100644 index a3823f947..000000000 --- a/Classes/Utils/FileTransferDelegate.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "LinphoneManager.h" -#import "ChatConversationView.h" - -@interface FileTransferDelegate : NSObject - -- (void)uploadFileContent: (FileContext *)context forChatRoom:(LinphoneChatRoom *)chatRoom rootMessage:(LinphoneChatMessage *)rootMessage; -- (void)uploadFileContentForSwift: (NSArray*)context urlList:(NSArray*)urls forChatRoom:(LinphoneChatRoom *)chatRoom rootMessage:(LinphoneChatMessage *)rootMessage; -- (void)uploadData:(NSData *)data forChatRoom:(LinphoneChatRoom *)chatRoom type:(NSString *)type subtype:(NSString *)subtype name:(NSString *)name key:(NSString *)key rootMessage:(LinphoneChatMessage *)rootMessage; -- (void)uploadImage:(UIImage *)image forChatRoom:(LinphoneChatRoom *)chatRoom withQuality:(float)quality; -- (void)uploadFile:(NSData *)data forChatRoom:(LinphoneChatRoom *)chatRoom withName:(NSString *)name rootMessage:(LinphoneChatMessage *)rootMessage; -- (void)cancel; -- (BOOL)download:(LinphoneChatMessage *)message; -- (void)stopAndDestroy; -- (void)stopAndDestroyAndRemove:(BOOL)remove; -+ (FileTransferDelegate *)messageDelegate:(LinphoneChatMessage *)message; - -@property() LinphoneChatMessage *message; -@property() NSString *text; -@end diff --git a/Classes/Utils/FileTransferDelegate.m b/Classes/Utils/FileTransferDelegate.m deleted file mode 100644 index c5c2fe0ea..000000000 --- a/Classes/Utils/FileTransferDelegate.m +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "linphoneapp-Swift.h" -#import "FileTransferDelegate.h" -#import "LinphoneManager.h" -#import "PhoneMainView.h" -#import "Utils.h" -#import "linphoneapp-Swift.h" - -@interface FileTransferDelegate () -@property(strong) NSMutableData *data; -@end - -@implementation FileTransferDelegate - -- (void)dealloc { - if (_message != nil) { - [self cancel]; - } -} - -+ (FileTransferDelegate *)messageDelegate:(LinphoneChatMessage *)message { - for (FileTransferDelegate *ftd in [LinphoneManager.instance fileTransferDelegates]) { - if (ftd.message == message) { - return ftd; - } - } - return nil; -} - -static void file_transfer_progress_indication_recv(LinphoneChatMessage *message, LinphoneContent* content, size_t offset, size_t total) { - FileTransferDelegate *thiz = [FileTransferDelegate messageDelegate:message]; - - if (offset == total) { - NSString *name = [NSString stringWithUTF8String: linphone_content_get_name(content) ? : ""]; - LOGI(@"Transfer of %@ (%d bytes): download finished", name, total); - NSString *fileType = [NSString stringWithUTF8String:linphone_content_get_type(content)]; - NSString *key = [ChatConversationViewSwift getKeyFromFileType:fileType fileName:name]; - - dispatch_async(dispatch_get_main_queue(), ^{ - [LinphoneManager setValueInMessageAppData:name - forKey:key - inMessage:message]; - dispatch_async(dispatch_get_main_queue(), ^{ - if (![VFSUtil vfsEnabledWithGroupName:kLinphoneMsgNotificationAppGroupId] && [ConfigManager.instance lpConfigBoolForKeyWithKey:@"auto_write_to_gallery_preference"]) { - [ChatConversationViewSwift writeMediaToGalleryFromName:name fileType:fileType]; - } - }); - }); - } else { - LOGD(@"Transfer of %s (%d bytes): already %ld recv", linphone_content_get_name(content), - total, offset); - [NSNotificationCenter.defaultCenter - postNotificationName:kLinphoneFileTransferRecvUpdate - object:thiz - userInfo:@{ - @"state" : @(linphone_chat_message_get_state(message)), - @"progress" : @(offset * 1.f / total), - }]; - } -} - -static void file_transfer_progress_indication_send(LinphoneChatMessage *message, LinphoneContent* content, size_t offset, size_t total) { - FileTransferDelegate *thiz = [FileTransferDelegate messageDelegate:message]; - if (total) { - size_t remaining = total - offset; - - NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:@{ - @"state" : @(linphone_chat_message_get_state(message)), - @"progress" : @(offset * 1.f / total), - }]; - LOGD(@"Transfer of %s (%d bytes): already sent %ld (%f%%), remaining %ld", linphone_content_get_name(content), - total, offset, offset * 100.f / total, remaining); - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneFileTransferSendUpdate - object:thiz - userInfo:dict]; - // this is the last time we will be notified, so destroy ourselve - if (offset == total) { - LOGI(@"Upload ended"); - - thiz.message = NULL; - [thiz stopAndDestroy]; - } - } else { - LOGE(@"Transfer of %s (%d bytes): %d Error - no upload data in progress!", linphone_content_get_name(content), - total, offset); - } -} - -- (void)uploadData:(NSData *)data forChatRoom:(LinphoneChatRoom *)chatRoom type:(NSString *)type subtype:(NSString *)subtype name:(NSString *)name key:(NSString *)key rootMessage:(LinphoneChatMessage *)rootMessage{ - if ([[LinphoneManager.instance fileTransferDelegates] containsObject:self]) { - LOGW(@"fileTransferDelegates has already added %p", self); - return; - } - [LinphoneManager.instance.fileTransferDelegates addObject:self]; - [ChatConversationViewSwift writeFileInImagesDirectory:data name:name]; - - LinphoneContent *content = linphone_core_create_content(linphone_chat_room_get_core(chatRoom)); - linphone_content_set_type(content, [type UTF8String]); - linphone_content_set_subtype(content, [subtype UTF8String]); - linphone_content_set_name(content, [name UTF8String]); - linphone_content_set_file_path(content, [[LinphoneManager imagesDirectory] stringByAppendingPathComponent:name].UTF8String); - _message = rootMessage? : linphone_chat_room_create_empty_message(chatRoom); - linphone_chat_message_add_file_content(_message, content); - const LinphoneAccountParams *params = linphone_account_get_params(linphone_core_get_default_account(LC)); - BOOL cpimEnabled = linphone_account_params_cpim_in_basic_chat_room_enabled(params); - BOOL basic = [ChatConversationViewSwift isBasicChatRoom:linphone_chat_message_get_chat_room(_message)]; - - if ((!basic || cpimEnabled) && (_text!=nil && ![_text isEqualToString:@""])) - linphone_chat_message_add_utf8_text_content(_message, [_text UTF8String]); - linphone_content_unref(content); - - linphone_chat_message_cbs_set_file_transfer_progress_indication(linphone_chat_message_get_callbacks(_message), file_transfer_progress_indication_send); - - [LinphoneManager setValueInMessageAppData:name forKey:key inMessage:_message]; - - - - LOGI(@"%p Uploading content from message %p", self, _message); - linphone_chat_message_send(_message); - if (basic && !cpimEnabled && (_text!=nil && ![_text isEqualToString:@""])) { - linphone_chat_message_send(linphone_chat_room_create_message_from_utf8(linphone_chat_message_get_chat_room(rootMessage), _text.UTF8String)); - } -} - -- (void)uploadFileContent: (FileContext *)context forChatRoom:(LinphoneChatRoom *)chatRoom rootMessage:(LinphoneChatMessage *)rootMessage{ - [LinphoneManager.instance.fileTransferDelegates addObject:self]; - - _message = rootMessage; - NSMutableArray *names = [[NSMutableArray alloc] init]; - NSMutableArray *types = [[NSMutableArray alloc] init]; - - int i = 0; - for (i = 0; i < [context count]; ++i) { - LinphoneContent *content = linphone_core_create_content(linphone_chat_room_get_core(chatRoom)); - NSString *type = [context.typesArray objectAtIndex:i]; - NSString *name = [context.namesArray objectAtIndex:i]; - NSData *data = [context.datasArray objectAtIndex:i]; - - [ChatConversationView writeFileInImagesDirectory:data name:name]; - - linphone_content_set_type(content, [type UTF8String]); - - linphone_content_set_subtype(content, [name.pathExtension UTF8String]); - linphone_content_set_name(content, [name UTF8String]); - linphone_content_set_file_path(content, [[LinphoneManager imagesDirectory] stringByAppendingPathComponent:name].UTF8String); - [names addObject:name]; - [types addObject:type]; - linphone_chat_message_add_file_content(_message, content); - linphone_content_unref(content); - } - - BOOL basic = [ChatConversationViewSwift isBasicChatRoom:linphone_chat_message_get_chat_room(rootMessage)]; - const LinphoneAccountParams *params = linphone_account_get_params(linphone_core_get_default_account(LC)); - BOOL cpimEnabled = linphone_account_params_cpim_in_basic_chat_room_enabled(params); - - if ((!basic || cpimEnabled) && _text!=nil && ![_text isEqualToString:@""]) - linphone_chat_message_add_utf8_text_content(_message, [_text UTF8String]); - - // todo indication progress - [LinphoneManager setValueInMessageAppData:names forKey:@"multiparts" inMessage:_message]; - [LinphoneManager setValueInMessageAppData:types forKey:@"multipartstypes" inMessage:_message]; - - LOGI(@"%p Uploading content from message %p", self, _message); - linphone_chat_message_send(_message); - if (basic && !cpimEnabled && _text!=nil && ![_text isEqualToString:@""]) { - linphone_chat_message_send(linphone_chat_room_create_message_from_utf8(linphone_chat_message_get_chat_room(rootMessage), _text.UTF8String)); - } -} - -- (void)uploadFileContentForSwift: (NSArray*)context urlList:(NSArray*)urls forChatRoom:(LinphoneChatRoom *)chatRoom rootMessage:(LinphoneChatMessage *)rootMessage{ - [LinphoneManager.instance.fileTransferDelegates addObject:self]; - - _message = rootMessage; - NSMutableArray *names = [[NSMutableArray alloc] init]; - NSMutableArray *types = [[NSMutableArray alloc] init]; - - int i = 0; - for (i = 0; i < [context count]; ++i) { - LinphoneContent *content = linphone_core_create_content(linphone_chat_room_get_core(chatRoom)); - //NSString *type = @"image";//[urls objectAtIndex:i].pathExtension; - - NSString *type = [self getTypeForFileTransferDelegate:[urls objectAtIndex:i].pathExtension.localizedLowercaseString]; - NSString *name = [urls objectAtIndex:i].lastPathComponent; - NSData *data = [context objectAtIndex:i]; - [ChatConversationViewSwift writeFileInImagesDirectory:data name:name]; - - linphone_content_set_type(content, [type UTF8String]); - linphone_content_set_subtype(content, [name.pathExtension UTF8String]); - linphone_content_set_name(content, [name UTF8String]); - linphone_content_set_file_path(content, [[LinphoneManager imagesDirectory] stringByAppendingPathComponent:name].UTF8String); - [names addObject:name]; - [types addObject:type]; - linphone_chat_message_add_file_content(_message, content); - linphone_content_unref(content); - } - - BOOL basic = [ChatConversationViewSwift isBasicChatRoom:linphone_chat_message_get_chat_room(rootMessage)]; - const LinphoneAccountParams *params = linphone_account_get_params(linphone_core_get_default_account(LC)); - BOOL cpimEnabled = linphone_account_params_cpim_in_basic_chat_room_enabled(params); - - if ((!basic || cpimEnabled) && _text!=nil && ![_text isEqualToString:@""]) - linphone_chat_message_add_utf8_text_content(_message, [_text UTF8String]); - - // todo indication progress - [LinphoneManager setValueInMessageAppData:names forKey:@"multiparts" inMessage:_message]; - [LinphoneManager setValueInMessageAppData:types forKey:@"multipartstypes" inMessage:_message]; - - LOGI(@"%p Uploading content from message %p", self, _message); - linphone_chat_message_send(_message); - if (basic && !cpimEnabled && _text!=nil && ![_text isEqualToString:@""]) { - linphone_chat_message_send(linphone_chat_room_create_message_from_utf8(linphone_chat_message_get_chat_room(rootMessage), _text.UTF8String)); - } -} - -- (NSString*)getTypeForFileTransferDelegate:(NSString *)type { - if([type isEqual:@"png"] || [type isEqual:@"jpg"] || [type isEqual:@"jpeg"] || [type isEqual:@"bmp"] || [type isEqual:@"heic"] || [type isEqual:@"file_picture_default"]){ - return @"image"; - }else if([type isEqual:@"mkv"] || [type isEqual:@"avi"] || [type isEqual:@"mov"] || [type isEqual:@"mp4"] || [type isEqual:@"file_video_default"]){ - return @"video"; - }else{ - return @"file"; - } -} - - -- (void)uploadImage:(UIImage *)image forChatRoom:(LinphoneChatRoom *)chatRoom withQuality:(float)quality { - NSString *name = [NSString stringWithFormat:@"%li-%f.jpg", (long)image.hash, [NSDate timeIntervalSinceReferenceDate]]; - NSData *data = UIImageJPEGRepresentation(image, quality); - [self uploadData:data forChatRoom:chatRoom type:@"image" subtype:@"jpg" name:name key:@"localimage" rootMessage:nil]; -} - - -- (void)uploadFile:(NSData *)data forChatRoom:(LinphoneChatRoom *)chatRoom withName:(NSString *)name rootMessage:(LinphoneChatMessage *)rootMessage { - NSURL *url = [ChatConversationViewSwift getFileUrl:name]; - - AVAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil]; - - NSString *extensionFile = [[name lowercaseString] componentsSeparatedByString:@"."].lastObject; - NSString *fileType = @""; - if ([extensionFile containsString:@"png"] || [extensionFile containsString:@"jpg"] || [extensionFile containsString:@"jpeg"] || [extensionFile containsString:@"bmp"] || [extensionFile containsString:@"heic"]) { - fileType = @"image"; - } else { - fileType = [[asset tracksWithMediaType:AVMediaTypeVideo] count] > 0 ? @"video" : @"file"; - } - - NSString *key = [ChatConversationViewSwift getKeyFromFileType:fileType fileName:name]; - - [self uploadData:data forChatRoom:chatRoom type:fileType subtype:name.pathExtension name:name key:key rootMessage:rootMessage]; -} - -- (BOOL)download:(LinphoneChatMessage *)message { - if ([[LinphoneManager.instance fileTransferDelegates] containsObject:self]) { - LOGW(@"fileTransferDelegates has already added %p", self); - return FALSE; - } - [[LinphoneManager.instance fileTransferDelegates] addObject:self]; - - _message = message; - - LinphoneContent *content = linphone_chat_message_get_file_transfer_information(_message); - if (content == nil) return FALSE; - - LOGI(@"%p Downloading content in %p ", self, message); - - linphone_chat_message_cbs_set_file_transfer_progress_indication(linphone_chat_message_get_callbacks(_message), file_transfer_progress_indication_recv); - linphone_content_set_file_path(content, [[LinphoneManager imagesDirectory] stringByAppendingPathComponent:[NSString stringWithUTF8String:linphone_content_get_name(content)]].UTF8String); - linphone_chat_message_download_content(_message, content); - - return TRUE; -} - -- (void)stopAndDestroy { - [self stopAndDestroyAndRemove:TRUE]; -} - -- (void)stopAndDestroyAndRemove:(BOOL)remove { - if (remove) - [[LinphoneManager.instance fileTransferDelegates] removeObject:self]; - - if (_message != NULL) { - LinphoneChatMessage *msg = _message; - _message = NULL; - LOGI(@"%p Cancelling transfer from %p", self, msg); - linphone_chat_message_cbs_set_file_transfer_progress_indication(linphone_chat_message_get_callbacks(msg), NULL); - // when we cancel file transfer, this will automatically trigger NotDelivered callback... recalling ourself a - // second time so we have to unset message BEFORE calling this - linphone_chat_message_cancel_file_transfer(msg); - } - _data = nil; - LOGD(@"%p Destroying", self); -} - -- (void)cancel { - [self stopAndDestroy]; -} - -@end diff --git a/Classes/Utils/HPGrowingTextView/HPGrowingTextView.h b/Classes/Utils/HPGrowingTextView/HPGrowingTextView.h deleted file mode 100755 index aea96e69b..000000000 --- a/Classes/Utils/HPGrowingTextView/HPGrowingTextView.h +++ /dev/null @@ -1,124 +0,0 @@ -// -// HPTextView.h -// -// Created by Hans Pinckaers on 29-06-10. -// -// MIT License -// -// Copyright (c) 2011 Hans Pinckaers -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#import - -#if __IPHONE_OS_VERSION_MAX_ALLOWED < 60000 -// UITextAlignment is deprecated in iOS 6.0+, use NSTextAlignment instead. -// Reference: -// https://developer.apple.com/library/ios/documentation/uikit/reference/NSString_UIKit_Additions/Reference/Reference.html -#define NSTextAlignment UITextAlignment -#endif - -@class HPGrowingTextView; -@class HPTextViewInternal; - -@protocol HPGrowingTextViewDelegate - -@optional -- (BOOL)growingTextViewShouldBeginEditing:(HPGrowingTextView *)growingTextView; -- (BOOL)growingTextViewShouldEndEditing:(HPGrowingTextView *)growingTextView; - -- (void)growingTextViewDidBeginEditing:(HPGrowingTextView *)growingTextView; -- (void)growingTextViewDidEndEditing:(HPGrowingTextView *)growingTextView; - -- (void)growingTextChanged:(HPGrowingTextView *)growingTextView text:(NSString *)text; - -- (BOOL)growingTextView:(HPGrowingTextView *)growingTextView -shouldChangeTextInRange:(NSRange)range - replacementText:(NSString *)text; -- (void)growingTextViewDidChange:(HPGrowingTextView *)growingTextView; - -- (void)growingTextView:(HPGrowingTextView *)growingTextView willChangeHeight:(float)height; -- (void)growingTextView:(HPGrowingTextView *)growingTextView didChangeHeight:(float)height; - -- (void)growingTextViewDidChangeSelection:(HPGrowingTextView *)growingTextView; -- (BOOL)growingTextViewShouldReturn:(HPGrowingTextView *)growingTextView; -@end - -@interface HPGrowingTextView : UIView { - HPTextViewInternal *internalTextView; - - int minHeight; - int maxHeight; - - // class properties - int maxNumberOfLines; - int minNumberOfLines; - - BOOL animateHeightChange; - NSTimeInterval animationDuration; - - // uitextview properties - NSObject *__unsafe_unretained delegate; - NSTextAlignment textAlignment; - NSRange selectedRange; - BOOL editable; - UIDataDetectorTypes dataDetectorTypes; - UIReturnKeyType returnKeyType; - - UIEdgeInsets contentInset; -} - -// real class properties -@property int maxNumberOfLines; -@property int minNumberOfLines; -@property(nonatomic) int maxHeight; -@property(nonatomic) int minHeight; -@property BOOL animateHeightChange; -@property NSTimeInterval animationDuration; -@property(nonatomic, strong) NSString *placeholder; -@property(nonatomic, strong) UIColor *placeholderColor; -@property(nonatomic, strong) UITextView *internalTextView; - -// uitextview properties -@property(unsafe_unretained) NSObject *delegate; -@property(nonatomic, strong) NSString *text; -@property(nonatomic, strong) UIFont *font; -@property(nonatomic, strong) UIColor *textColor; -@property(nonatomic) NSTextAlignment textAlignment; // default is NSTextAlignmentLeft -@property(nonatomic) NSRange selectedRange; // only ranges of length 0 are supported -@property(nonatomic, getter=isEditable) BOOL editable; -@property(nonatomic) UIDataDetectorTypes dataDetectorTypes __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_3_0); -@property(nonatomic) UIReturnKeyType returnKeyType; -@property(assign) UIEdgeInsets contentInset; -@property(nonatomic) BOOL isScrollable; -@property(nonatomic) BOOL enablesReturnKeyAutomatically; - -// uitextview methods -// need others? use .internalTextView -- (BOOL)becomeFirstResponder; -- (BOOL)resignFirstResponder; -- (BOOL)isFirstResponder; - -- (BOOL)hasText; -- (void)scrollRangeToVisible:(NSRange)range; - -// call to force a height change (e.g. after you change max/min lines) -- (void)refreshHeight; - -@end diff --git a/Classes/Utils/HPGrowingTextView/HPGrowingTextView.m b/Classes/Utils/HPGrowingTextView/HPGrowingTextView.m deleted file mode 100755 index 21e69560c..000000000 --- a/Classes/Utils/HPGrowingTextView/HPGrowingTextView.m +++ /dev/null @@ -1,602 +0,0 @@ -// -// HPTextView.m -// -// Created by Hans Pinckaers on 29-06-10. -// -// MIT License -// -// Copyright (c) 2011 Hans Pinckaers -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#import "HPGrowingTextView.h" -#import "HPTextViewInternal.h" - -@interface HPGrowingTextView (private) -- (void)commonInitialiser; -- (void)resizeTextView:(NSInteger)newSizeH; -- (void)growDidStop; -@end - -@implementation HPGrowingTextView -@synthesize internalTextView; -@synthesize delegate; -@synthesize maxHeight; -@synthesize minHeight; -@synthesize font; -@synthesize textColor; -@synthesize textAlignment; -@synthesize selectedRange; -@synthesize editable; -@synthesize dataDetectorTypes; -@synthesize animateHeightChange; -@synthesize animationDuration; -@synthesize returnKeyType; -@dynamic placeholder; -@dynamic placeholderColor; - -// having initwithcoder allows us to use HPGrowingTextView in a Nib. -- aob, 9/2011 -- (id)initWithCoder:(NSCoder *)aDecoder { - if ((self = [super initWithCoder:aDecoder])) { - [self commonInitialiser]; - } - return self; -} - -- (id)initWithFrame:(CGRect)frame { - if ((self = [super initWithFrame:frame])) { - [self commonInitialiser]; - } - return self; -} - -- (void)commonInitialiser { - // Initialization code - CGRect r = self.frame; - r.origin.y = 0; - r.origin.x = 0; - internalTextView = [[HPTextViewInternal alloc] initWithFrame:r]; - internalTextView.delegate = self; - internalTextView.scrollEnabled = NO; - internalTextView.font = [UIFont systemFontOfSize:13]; - internalTextView.contentInset = UIEdgeInsetsZero; - internalTextView.showsHorizontalScrollIndicator = NO; - internalTextView.text = @"-"; - [self addSubview:internalTextView]; - - minHeight = internalTextView.frame.size.height; - minNumberOfLines = 1; - - animateHeightChange = YES; - animationDuration = 0.1f; - - internalTextView.text = @""; - - [self setMaxNumberOfLines:3]; - - [self setPlaceholderColor:[UIColor lightGrayColor]]; - internalTextView.displayPlaceHolder = YES; -} - -- (CGSize)sizeThatFits:(CGSize)size { - if (self.text.length == 0) { - size.height = minHeight; - } - return size; -} - -- (void)layoutSubviews { - [super layoutSubviews]; - - CGRect r = self.bounds; - r.origin.y = 0; - r.origin.x = contentInset.left; - r.size.width -= contentInset.left + contentInset.right; - - internalTextView.frame = r; -} - -- (void)setContentInset:(UIEdgeInsets)inset { - contentInset = inset; - - CGRect r = self.frame; - r.origin.y = inset.top - inset.bottom; - r.origin.x = inset.left; - r.size.width -= inset.left + inset.right; - - internalTextView.frame = r; - - [self setMaxNumberOfLines:maxNumberOfLines]; - [self setMinNumberOfLines:minNumberOfLines]; -} - -- (UIEdgeInsets)contentInset { - return contentInset; -} - -- (void)setMaxNumberOfLines:(int)n { - if (n == 0 && maxHeight > 0) - return; // the user specified a maxHeight themselves. - - // Use internalTextView for height calculations, thanks to Gwynne - NSString *saveText = internalTextView.text, *newText = @"-"; - - internalTextView.delegate = nil; - internalTextView.hidden = YES; - - for (int i = 1; i < n; ++i) - newText = [newText stringByAppendingString:@"\n|W|"]; - - internalTextView.text = newText; - - maxHeight = [self measureHeight]; - - internalTextView.text = saveText; - internalTextView.hidden = NO; - internalTextView.delegate = self; - - [self sizeToFit]; - - maxNumberOfLines = n; -} - -- (int)maxNumberOfLines { - return maxNumberOfLines; -} - -- (void)setMaxHeight:(int)height { - maxHeight = height; - maxNumberOfLines = 0; -} - -- (void)setMinNumberOfLines:(int)m { - if (m == 0 && minHeight > 0) - return; // the user specified a minHeight themselves. - - // Use internalTextView for height calculations, thanks to Gwynne - NSString *saveText = internalTextView.text, *newText = @"-"; - - internalTextView.delegate = nil; - internalTextView.hidden = YES; - - for (int i = 1; i < m; ++i) - newText = [newText stringByAppendingString:@"\n|W|"]; - - internalTextView.text = newText; - - minHeight = [self measureHeight]; - - internalTextView.text = saveText; - internalTextView.hidden = NO; - internalTextView.delegate = self; - - [self sizeToFit]; - - minNumberOfLines = m; -} - -- (int)minNumberOfLines { - return minNumberOfLines; -} - -- (void)setMinHeight:(int)height { - minHeight = height; - minNumberOfLines = 0; -} - -- (NSString *)placeholder { - return internalTextView.placeholder; -} - -- (void)setPlaceholder:(NSString *)placeholder { - [internalTextView setPlaceholder:placeholder]; -} - -- (UIColor *)placeholderColor { - return internalTextView.placeholderColor; -} - -- (void)setPlaceholderColor:(UIColor *)placeholderColor { - [internalTextView setPlaceholderColor:placeholderColor]; -} - -- (void)textViewDidChange:(UITextView *)textView { - [self refreshHeight]; - if ([delegate respondsToSelector:@selector(growingTextChanged:text:)]) - [delegate growingTextChanged:self text:[textView text]]; -} - -- (void)refreshHeight { - // size of content, so we can set the frame of self - NSInteger newSizeH = [self measureHeight]; - if (newSizeH < minHeight || !internalTextView.hasText) - newSizeH = minHeight; // not smalles than minHeight - if (internalTextView.frame.size.height > maxHeight) - newSizeH = maxHeight; // not taller than maxHeight - - if (internalTextView.frame.size.height != newSizeH) { - // [fixed] Pasting too much text into the view failed to fire the height change, - // thanks to Gwynne - - if (newSizeH > maxHeight && internalTextView.frame.size.height <= maxHeight) { - newSizeH = maxHeight; - } - - if (newSizeH <= maxHeight) { - if (animateHeightChange) { - - if ([UIView resolveClassMethod:@selector(animateWithDuration:animations:)]) { -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000 - [UIView animateWithDuration:animationDuration - delay:0 - options:(UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionBeginFromCurrentState) - animations:^(void) { - [self resizeTextView:newSizeH]; - } - completion:^(BOOL finished) { - if ([delegate respondsToSelector:@selector(growingTextView:didChangeHeight:)]) { - [delegate growingTextView:self didChangeHeight:newSizeH]; - } - }]; -#endif - } else { - [UIView beginAnimations:@"" context:nil]; - [UIView setAnimationDuration:animationDuration]; - [UIView setAnimationDelegate:self]; - [UIView setAnimationDidStopSelector:@selector(growDidStop)]; - [UIView setAnimationBeginsFromCurrentState:YES]; - [self resizeTextView:newSizeH]; - [UIView commitAnimations]; - } - } else { - [self resizeTextView:newSizeH]; - // [fixed] The growingTextView:didChangeHeight: delegate method was not called at all when not animating - // height changes. - // thanks to Gwynne - - if ([delegate respondsToSelector:@selector(growingTextView:didChangeHeight:)]) { - [delegate growingTextView:self didChangeHeight:newSizeH]; - } - } - } - - // if our new height is greater than the maxHeight - // sets not set the height or move things - // around and enable scrolling - if (newSizeH >= maxHeight) { - if (!internalTextView.scrollEnabled) { - internalTextView.scrollEnabled = YES; - [internalTextView flashScrollIndicators]; - } - - } else { - internalTextView.scrollEnabled = NO; - } - - // scroll to caret (needed on iOS7) - if ([self respondsToSelector:@selector(snapshotViewAfterScreenUpdates:)]) { - CGRect r = [internalTextView caretRectForPosition:internalTextView.selectedTextRange.end]; - CGFloat caretY = MAX(r.origin.y - internalTextView.frame.size.height + r.size.height + 8, 0); - if (internalTextView.contentOffset.y < caretY && r.origin.y != INFINITY) - internalTextView.contentOffset = CGPointMake(0, MIN(caretY, internalTextView.contentSize.height)); - } - } - // Display (or not) the placeholder string - - BOOL wasDisplayingPlaceholder = internalTextView.displayPlaceHolder; - internalTextView.displayPlaceHolder = self.internalTextView.text.length == 0; - - if (wasDisplayingPlaceholder != internalTextView.displayPlaceHolder) { - [internalTextView setNeedsDisplay]; - } - - // Tell the delegate that the text view changed - - if ([delegate respondsToSelector:@selector(growingTextViewDidChange:)]) { - [delegate growingTextViewDidChange:self]; - } -} - -// Code from apple developer forum - @Steve Krulewitz, @Mark Marszal, @Eric Silverberg -- (CGFloat)measureHeight { -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 - if ([self respondsToSelector:@selector(snapshotViewAfterScreenUpdates:)]) { - CGRect frame = internalTextView.bounds; - CGSize fudgeFactor; - // The padding added around the text on iOS6 and iOS7 is different. - fudgeFactor = CGSizeMake(10.0, 16.0); - - frame.size.height -= fudgeFactor.height; - frame.size.width -= fudgeFactor.width; - - NSMutableAttributedString *textToMeasure; - if (internalTextView.attributedText && internalTextView.attributedText.length > 0) { - textToMeasure = - [[NSMutableAttributedString alloc] initWithAttributedString:internalTextView.attributedText]; - } else { - textToMeasure = [[NSMutableAttributedString alloc] initWithString:internalTextView.text]; - [textToMeasure addAttribute:NSFontAttributeName - value:internalTextView.font - range:NSMakeRange(0, textToMeasure.length)]; - } - - if ([textToMeasure.string hasSuffix:@"\n"]) { - [textToMeasure appendAttributedString:[[NSAttributedString alloc] - initWithString:@"-" - attributes:@{NSFontAttributeName : internalTextView.font}]]; - } - - // NSAttributedString class method: boundingRectWithSize:options:context is - // available only on ios7.0 sdk. - CGRect size = [textToMeasure boundingRectWithSize:CGSizeMake(CGRectGetWidth(frame), MAXFLOAT) - options:NSStringDrawingUsesLineFragmentOrigin - context:nil]; - - return ceil(CGRectGetHeight(size) + fudgeFactor.height); - } else { - return self.internalTextView.contentSize.height; - } -#else - return self.internalTextView.contentSize.height; -#endif -} - -- (void)resizeTextView:(NSInteger)newSizeH { - if ([delegate respondsToSelector:@selector(growingTextView:willChangeHeight:)]) { - [delegate growingTextView:self willChangeHeight:newSizeH]; - } - - CGRect internalTextViewFrame = self.frame; - internalTextViewFrame.size.height = newSizeH; // + padding - self.frame = internalTextViewFrame; - - internalTextViewFrame.origin.y = contentInset.top - contentInset.bottom; - internalTextViewFrame.origin.x = contentInset.left; - internalTextViewFrame.size.width = internalTextView.contentSize.width; - - if (!CGRectEqualToRect(internalTextView.frame, internalTextViewFrame)) - internalTextView.frame = internalTextViewFrame; -} - -- (void)growDidStop { - if ([delegate respondsToSelector:@selector(growingTextView:didChangeHeight:)]) { - [delegate growingTextView:self didChangeHeight:self.frame.size.height]; - } -} - -- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { - [internalTextView becomeFirstResponder]; -} - -- (BOOL)becomeFirstResponder { - [super becomeFirstResponder]; - return [self.internalTextView becomeFirstResponder]; -} - -- (BOOL)resignFirstResponder { - [super resignFirstResponder]; - return [internalTextView resignFirstResponder]; -} - -- (BOOL)isFirstResponder { - return [self.internalTextView isFirstResponder]; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark UITextView properties -/////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)setText:(NSString *)newText { - internalTextView.text = newText; - - // include this line to analyze the height of the textview. - // fix from Ankit Thakur - [self performSelector:@selector(textViewDidChange:) withObject:internalTextView]; -} - -- (NSString *)text { - return internalTextView.text; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)setFont:(UIFont *)afont { - internalTextView.font = afont; - - [self setMaxNumberOfLines:maxNumberOfLines]; - [self setMinNumberOfLines:minNumberOfLines]; -} - -- (UIFont *)font { - return internalTextView.font; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)setTextColor:(UIColor *)color { - internalTextView.textColor = color; -} - -- (UIColor *)textColor { - return internalTextView.textColor; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)setBackgroundColor:(UIColor *)backgroundColor { - [super setBackgroundColor:backgroundColor]; - internalTextView.backgroundColor = backgroundColor; -} - -- (UIColor *)backgroundColor { - return internalTextView.backgroundColor; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)setTextAlignment:(NSTextAlignment)aligment { - internalTextView.textAlignment = aligment; -} - -- (NSTextAlignment)textAlignment { - return internalTextView.textAlignment; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)setSelectedRange:(NSRange)range { - internalTextView.selectedRange = range; -} - -- (NSRange)selectedRange { - return internalTextView.selectedRange; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)setIsScrollable:(BOOL)isScrollable { - internalTextView.scrollEnabled = isScrollable; -} - -- (BOOL)isScrollable { - return internalTextView.scrollEnabled; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)setEditable:(BOOL)beditable { - internalTextView.editable = beditable; -} - -- (BOOL)isEditable { - return internalTextView.editable; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)setReturnKeyType:(UIReturnKeyType)keyType { - internalTextView.returnKeyType = keyType; -} - -- (UIReturnKeyType)returnKeyType { - return internalTextView.returnKeyType; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)setEnablesReturnKeyAutomatically:(BOOL)enablesReturnKeyAutomatically { - internalTextView.enablesReturnKeyAutomatically = enablesReturnKeyAutomatically; -} - -- (BOOL)enablesReturnKeyAutomatically { - return internalTextView.enablesReturnKeyAutomatically; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)setDataDetectorTypes:(UIDataDetectorTypes)datadetector { - internalTextView.dataDetectorTypes = datadetector; -} - -- (UIDataDetectorTypes)dataDetectorTypes { - return internalTextView.dataDetectorTypes; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// - -- (BOOL)hasText { - return [internalTextView hasText]; -} - -- (void)scrollRangeToVisible:(NSRange)range { - [internalTextView scrollRangeToVisible:range]; -} - -///////////////////////////////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -#pragma mark UITextViewDelegate - -/////////////////////////////////////////////////////////////////////////////////////////////////// -- (BOOL)textViewShouldBeginEditing:(UITextView *)textView { - if ([delegate respondsToSelector:@selector(growingTextViewShouldBeginEditing:)]) { - return [delegate growingTextViewShouldBeginEditing:self]; - - } else { - return YES; - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// -- (BOOL)textViewShouldEndEditing:(UITextView *)textView { - if ([delegate respondsToSelector:@selector(growingTextViewShouldEndEditing:)]) { - return [delegate growingTextViewShouldEndEditing:self]; - - } else { - return YES; - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// -- (void)textViewDidBeginEditing:(UITextView *)textView { - if ([delegate respondsToSelector:@selector(growingTextViewDidBeginEditing:)]) { - [delegate growingTextViewDidBeginEditing:self]; - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// -- (void)textViewDidEndEditing:(UITextView *)textView { - if ([delegate respondsToSelector:@selector(growingTextViewDidEndEditing:)]) { - [delegate growingTextViewDidEndEditing:self]; - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// -- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)atext { - - // weird 1 pixel bug when clicking backspace when textView is empty - if (![textView hasText] && [atext isEqualToString:@""]) - return NO; - - // Added by bretdabaker: sometimes we want to handle this ourselves - if ([delegate respondsToSelector:@selector(growingTextView:shouldChangeTextInRange:replacementText:)]) - return [delegate growingTextView:self shouldChangeTextInRange:range replacementText:atext]; - - if ([atext isEqualToString:@"\n"]) { - if ([delegate respondsToSelector:@selector(growingTextViewShouldReturn:)]) { - if (![delegate performSelector:@selector(growingTextViewShouldReturn:) withObject:self]) { - return YES; - } else { - [textView resignFirstResponder]; - return NO; - } - } - } - - return YES; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// -- (void)textViewDidChangeSelection:(UITextView *)textView { - if ([delegate respondsToSelector:@selector(growingTextViewDidChangeSelection:)]) { - [delegate growingTextViewDidChangeSelection:self]; - } -} - -@end diff --git a/Classes/Utils/HPGrowingTextView/HPTextViewInternal.h b/Classes/Utils/HPGrowingTextView/HPTextViewInternal.h deleted file mode 100755 index 712265f06..000000000 --- a/Classes/Utils/HPGrowingTextView/HPTextViewInternal.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// HPTextViewInternal.h -// -// Created by Hans Pinckaers on 29-06-10. -// -// MIT License -// -// Copyright (c) 2011 Hans Pinckaers -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#import - -@interface HPTextViewInternal : UITextView - -@property(nonatomic, strong) NSString *placeholder; -@property(nonatomic, strong) UIColor *placeholderColor; -@property(nonatomic) BOOL displayPlaceHolder; - -@end diff --git a/Classes/Utils/HPGrowingTextView/HPTextViewInternal.m b/Classes/Utils/HPGrowingTextView/HPTextViewInternal.m deleted file mode 100755 index 70366b87c..000000000 --- a/Classes/Utils/HPGrowingTextView/HPTextViewInternal.m +++ /dev/null @@ -1,105 +0,0 @@ -// -// HPTextViewInternal.m -// -// Created by Hans Pinckaers on 29-06-10. -// -// MIT License -// -// Copyright (c) 2011 Hans Pinckaers -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#import "HPTextViewInternal.h" - -@implementation HPTextViewInternal - -@synthesize placeholder; -@synthesize placeholderColor; -@synthesize displayPlaceHolder; - -- (void)setText:(NSString *)text { - BOOL originalValue = self.scrollEnabled; - // If one of GrowingTextView's superviews is a scrollView, and self.scrollEnabled == NO, - // setting the text programatically will cause UIKit to search upwards until it finds a scrollView with - // scrollEnabled==yes - // then scroll it erratically. Setting scrollEnabled temporarily to YES prevents this. - [self setScrollEnabled:YES]; - [super setText:text]; - [self setScrollEnabled:originalValue]; -} - -- (void)setScrollable:(BOOL)isScrollable { - [super setScrollEnabled:isScrollable]; -} - -- (void)setContentOffset:(CGPoint)s { - if (self.tracking || self.decelerating) { - // initiated by user... - - UIEdgeInsets insets = self.contentInset; - insets.bottom = 0; - insets.top = 0; - self.contentInset = insets; - - } else { - - float bottomOffset = (self.contentSize.height - self.frame.size.height + self.contentInset.bottom); - if (s.y < bottomOffset && self.scrollEnabled) { - UIEdgeInsets insets = self.contentInset; - insets.bottom = 8; - insets.top = 0; - self.contentInset = insets; - } - } - - [super setContentOffset:s]; -} - -- (void)setContentInset:(UIEdgeInsets)s { - UIEdgeInsets insets = s; - - if (s.bottom > 8) - insets.bottom = 0; - insets.top = 0; - - [super setContentInset:insets]; -} - -- (void)setContentSize:(CGSize)contentSize { - // is this an iOS5 bug? Need testing! - if (self.contentSize.height > contentSize.height) { - UIEdgeInsets insets = self.contentInset; - insets.bottom = 0; - insets.top = 0; - self.contentInset = insets; - } - - [super setContentSize:contentSize]; -} - -- (void)drawRect:(CGRect)rect { - [super drawRect:rect]; - if (displayPlaceHolder && placeholder && placeholderColor) { - [placeholderColor set]; - [placeholder drawInRect:CGRectMake(8.0f, 8.0f, self.frame.size.width - 16.0f, self.frame.size.height - 16.0f) - withFont:self.font]; - } -} - -@end diff --git a/Classes/Utils/InAppSettingsKit/Controllers/IASKAppSettingsViewController.h b/Classes/Utils/InAppSettingsKit/Controllers/IASKAppSettingsViewController.h deleted file mode 100755 index 961a92bcb..000000000 --- a/Classes/Utils/InAppSettingsKit/Controllers/IASKAppSettingsViewController.h +++ /dev/null @@ -1,89 +0,0 @@ -// -// IASKAppSettingsViewController.h -// http://www.inappsettingskit.com -// -// Copyright (c) 2009: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import -#import - -#import "IASKSettingsStore.h" -#import "IASKViewController.h" - -@class IASKSettingsReader; -@class IASKAppSettingsViewController; -@class IASKSpecifier; - -@protocol IASKSettingsDelegate -- (void)settingsViewControllerDidEnd:(IASKAppSettingsViewController*)sender; -- (void)settingsViewControllerWillAppear:(IASKAppSettingsViewController *)sender; - -@optional -#pragma mark - UITableView header customization -- (CGFloat) settingsViewController:(id)settingsViewController - tableView:(UITableView *)tableView - heightForHeaderForSection:(NSInteger)section; -- (UIView *) settingsViewController:(id)settingsViewController - tableView:(UITableView *)tableView - viewForHeaderForSection:(NSInteger)section; - -#pragma mark - UITableView cell customization -- (CGFloat)tableView:(UITableView*)tableView heightForSpecifier:(IASKSpecifier*)specifier; -- (UITableViewCell*)tableView:(UITableView*)tableView cellForSpecifier:(IASKSpecifier*)specifier; - -#pragma mark - mail composing customization -- (NSString*) settingsViewController:(id)settingsViewController - mailComposeBodyForSpecifier:(IASKSpecifier*) specifier; - -- (UIViewController*) settingsViewController:(id)settingsViewController - viewControllerForMailComposeViewForSpecifier:(IASKSpecifier*) specifier; - -- (void) settingsViewController:(id) settingsViewController - mailComposeController:(MFMailComposeViewController*)controller - didFinishWithResult:(MFMailComposeResult)result - error:(NSError*)error; - -#pragma mark - respond to button taps -- (void)settingsViewController:(IASKAppSettingsViewController*)sender buttonTappedForKey:(NSString*)key __attribute__((deprecated)); // use the method below with specifier instead -- (void)settingsViewController:(IASKAppSettingsViewController*)sender buttonTappedForSpecifier:(IASKSpecifier*)specifier; -- (void)settingsViewController:(IASKAppSettingsViewController*)sender tableView:(UITableView *)tableView didSelectCustomViewSpecifier:(IASKSpecifier*)specifier; -@end - - -@interface IASKAppSettingsViewController : UITableViewController { - id __weak _delegate; - - NSMutableArray *_viewList; - - IASKSettingsReader *_settingsReader; - id _settingsStore; - NSString *_file; - - id _currentFirstResponder; - - BOOL _showCreditsFooter; - BOOL _showDoneButton; - - NSSet *_hiddenKeys; -} - -@property(nonatomic, weak) IBOutlet id delegate; -@property (nonatomic, copy) NSString *file; -@property (nonatomic, assign) BOOL showCreditsFooter; -@property (nonatomic, assign) BOOL showDoneButton; -@property(nonatomic, strong) NSSet *hiddenKeys; - -- (void)synchronizeSettings; -- (void)dismiss:(id)sender; -- (void)setHiddenKeys:(NSSet*)hiddenKeys animated:(BOOL)animated; -@end diff --git a/Classes/Utils/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m b/Classes/Utils/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m deleted file mode 100755 index 84c780265..000000000 --- a/Classes/Utils/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m +++ /dev/null @@ -1,914 +0,0 @@ -// -// IASKAppSettingsViewController.m -// http://www.inappsettingskit.com -// -// Copyright (c) 2009-2010: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#pragma deploymate push "ignored-api-availability" - -#import "IASKAppSettingsViewController.h" -#import "IASKSettingsReader.h" -#import "IASKSettingsStoreUserDefaults.h" -#import "IASKPSSliderSpecifierViewCell.h" -#import "IASKPSTextFieldSpecifierViewCell.h" -#import "IASKSwitch.h" -#import "IASKSlider.h" -#import "IASKSpecifier.h" -#import "IASKSpecifierValuesViewController.h" -#import "IASKTextField.h" - -//static const CGFloat KEYBOARD_ANIMATION_DURATION = 0.3; -//static const CGFloat MINIMUM_SCROLL_FRACTION = 0.2; -//static const CGFloat MAXIMUM_SCROLL_FRACTION = 0.8; - -static NSString *kIASKCredits = @"Powered by InAppSettingsKit"; // Leave this as-is!!! - -#define kIASKSpecifierValuesViewControllerIndex 0 -#define kIASKSpecifierChildViewControllerIndex 1 - -#define kIASKCreditsViewWidth 285 - -CGRect IASKCGRectSwap(CGRect rect); - -@interface IASKAppSettingsViewController () -@property(nonatomic, strong) NSMutableArray *viewList; -@property(nonatomic, strong) id currentFirstResponder; - -- (void)_textChanged:(id)sender; -- (void)synchronizeSettings; -- (void)userDefaultsDidChange; -- (void)reload; -@end - -@implementation IASKAppSettingsViewController - -@synthesize delegate = _delegate; -@synthesize viewList = _viewList; -@synthesize settingsReader = _settingsReader; -@synthesize file = _file; -@synthesize currentFirstResponder = _currentFirstResponder; -@synthesize showCreditsFooter = _showCreditsFooter; -@synthesize showDoneButton = _showDoneButton; -@synthesize settingsStore = _settingsStore; -@synthesize hiddenKeys = _hiddenKeys; - -#pragma mark accessors -- (IASKSettingsReader*)settingsReader { - if (!_settingsReader) { - _settingsReader = [[IASKSettingsReader alloc] initWithFile:self.file]; - } - return _settingsReader; -} - -- (id)settingsStore { - if (!_settingsStore) { - _settingsStore = [[IASKSettingsStoreUserDefaults alloc] init]; - } - return _settingsStore; -} - -- (NSString*)file { - if (!_file) { - return @"Root"; - } - return _file; -} - -- (void)setFile:(NSString *)file { - if (file != _file) { - - _file = [file copy]; - } - - self.tableView.contentOffset = CGPointMake(0, 0); - self.settingsReader = nil; // automatically initializes itself - _hiddenKeys = nil; - [self.tableView reloadData]; -} - -- (BOOL)isPad { - BOOL isPad = NO; -#if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 30200) - isPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; -#endif - return isPad; -} - -#pragma mark standard view controller methods -- (id)init { - return [self initWithStyle:UITableViewStyleGrouped]; -} - -- (id)initWithStyle:(UITableViewStyle)style -{ - if (style != UITableViewStyleGrouped) { - NSLog(@"only UITableViewStyleGrouped style is supported, forcing it."); - } - self = [super initWithStyle:UITableViewStyleGrouped]; - if (self) { - self.tableView.delegate = self; - self.tableView.dataSource = self; - _showDoneButton = YES; - // If set to YES, will display credits for InAppSettingsKit creators - _showCreditsFooter = YES; - } - return self; -} - -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil -{ - if (!nibNameOrNil) { - return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - } - NSLog (@"%@ is now deprecated, we are moving away from nibs.", NSStringFromSelector(_cmd)); - return [self initWithStyle:UITableViewStyleGrouped]; -} - -- (id)initWithCoder:(NSCoder *)aDecoder { - self = [super initWithCoder:aDecoder]; - if (self) { - if (!(self = [self initWithStyle:UITableViewStyleGrouped])) - return nil; - } - return self; -} - -- (NSMutableArray *)viewList { - if (!_viewList) { - _viewList = [[NSMutableArray alloc] init]; - [_viewList addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"IASKSpecifierValuesView", @"ViewName",nil]]; - [_viewList addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"IASKAppSettingsView", @"ViewName",nil]]; - } - return _viewList; -} - -- (void) viewDidLoad { - [super viewDidLoad]; - if ([self isPad]) { - // patch for iOS7 from https://github.com/futuretap/InAppSettingsKit/commit/66d95030cfac84f17f800056140523742b49957e -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 - if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) // don't use etched style on iOS 7 -#endif - self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLineEtched; - } - UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapToEndEdit:)]; - tapGesture.cancelsTouchesInView = NO; - [self.tableView addGestureRecognizer:tapGesture]; - self.tableView.cellLayoutMarginsFollowReadableWidth = NO; -} - -- (void)viewDidUnload { - [super viewDidUnload]; - - // Release any retained subviews of the main view. - // e.g. self.myOutlet = nil; - self.view = nil; - self.viewList = nil; -} - -- (void)viewWillAppear:(BOOL)animated { - // if there's something selected, the value might have changed - // so reload that row - NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow]; - if(selectedIndexPath) { - [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:selectedIndexPath] - withRowAnimation:UITableViewRowAnimationNone]; - // and reselect it, so we get the nice default deselect animation from UITableViewController - [self.tableView selectRowAtIndexPath:selectedIndexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; - } - - self.navigationItem.rightBarButtonItem = nil; - if (_showDoneButton) { - UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone - target:self - action:@selector(dismiss:)]; - self.navigationItem.rightBarButtonItem = buttonItem; - } - if (!self.title) { - self.title = NSLocalizedString(@"Settings", @""); - } - - if ([self.settingsStore isKindOfClass:[IASKSettingsStoreUserDefaults class]]) { - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(userDefaultsDidChange) - name:NSUserDefaultsDidChangeNotification - object:[NSUserDefaults standardUserDefaults]]; - [self userDefaultsDidChange]; // force update in case of changes while we were hidden - } - - // hack gautier: be notified when changing page - if (self.delegate && [self.delegate conformsToProtocol:@protocol(IASKSettingsDelegate)]) { - [self.delegate settingsViewControllerWillAppear:self]; - } - - [super viewWillAppear:animated]; -} - -- (CGSize)contentSizeForViewInPopover { - return [[self view] sizeThatFits:CGSizeMake(320, 2000)]; -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - - NSNotificationCenter *dc = [NSNotificationCenter defaultCenter]; - IASK_IF_IOS4_OR_GREATER([dc addObserver:self selector:@selector(synchronizeSettings) name:UIApplicationWillResignActiveNotification object:[UIApplication sharedApplication]];); - IASK_IF_IOS4_OR_GREATER([dc addObserver:self selector:@selector(reload) name:UIApplicationWillEnterForegroundNotification object:[UIApplication sharedApplication]];); - [dc addObserver:self selector:@selector(synchronizeSettings) name:UIApplicationWillTerminateNotification object:[UIApplication sharedApplication]]; -} - -- (void)viewWillDisappear:(BOOL)animated { - [NSObject cancelPreviousPerformRequestsWithTarget:self]; - [super viewWillDisappear:animated]; -} - -- (void)viewDidDisappear:(BOOL)animated { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillTerminateNotification object:[UIApplication sharedApplication]]; - - // hide the keyboard - [self.currentFirstResponder resignFirstResponder]; - - [super viewDidDisappear:animated]; -} - -- (BOOL)shouldAutorotate { - return YES; -} - -- (void)didReceiveMemoryWarning { - // Releases the view if it doesn't have a superview. - [super didReceiveMemoryWarning]; - - // Release any cached data, images, etc that aren't in use. -} - -- (void)setHiddenKeys:(NSSet *)theHiddenKeys { - [self setHiddenKeys:theHiddenKeys animated:NO]; -} - - -- (void)setHiddenKeys:(NSSet*)theHiddenKeys animated:(BOOL)animated { - if (_hiddenKeys != theHiddenKeys) { - NSSet *oldHiddenKeys = _hiddenKeys; - _hiddenKeys = theHiddenKeys; - - if (animated) { - [self.tableView beginUpdates]; - - NSMutableSet *showKeys = [NSMutableSet setWithSet:oldHiddenKeys]; - [showKeys minusSet:theHiddenKeys]; - - NSMutableSet *hideKeys = [NSMutableSet setWithSet:theHiddenKeys]; - [hideKeys minusSet:oldHiddenKeys]; - - // calculate rows to be deleted - NSMutableArray *hideIndexPaths = [NSMutableArray array]; - for (NSString *key in hideKeys) { - NSIndexPath *indexPath = [self.settingsReader indexPathForKey:key]; - if (indexPath) { - [hideIndexPaths addObject:indexPath]; - } - } - - // calculate sections to be deleted - NSMutableIndexSet *hideSections = [NSMutableIndexSet indexSet]; - for (NSInteger section = 0; section < [self numberOfSectionsInTableView:self.tableView ]; section++) { - NSUInteger rowsInSection = 0; - for (NSIndexPath *indexPath in hideIndexPaths) { - if (indexPath.section == section) { - rowsInSection++; - } - } - if (rowsInSection >= [self.settingsReader numberOfRowsForSection:section]) { - [hideSections addIndex:section]; - } - } - - // set the datasource - self.settingsReader.hiddenKeys = theHiddenKeys; - - - // calculate rows to be inserted - NSMutableArray *showIndexPaths = [NSMutableArray array]; - for (NSString *key in showKeys) { - NSIndexPath *indexPath = [self.settingsReader indexPathForKey:key]; - if (indexPath) { - [showIndexPaths addObject:indexPath]; - } - } - - // calculate sections to be inserted - NSMutableIndexSet *showSections = [NSMutableIndexSet indexSet]; - for (NSInteger section = 0; section < [self.settingsReader numberOfSections]; section++) { - NSUInteger rowsInSection = 0; - for (NSIndexPath *indexPath in showIndexPaths) { - if (indexPath.section == section) { - rowsInSection++; - } - } - if (rowsInSection >= [self.settingsReader numberOfRowsForSection:section]) { - [showSections addIndex:section]; - } - } - - UITableViewRowAnimation animation = animated ? UITableViewRowAnimationTop : UITableViewRowAnimationNone; - [self.tableView deleteSections:hideSections withRowAnimation:animation]; - [self.tableView deleteRowsAtIndexPaths:hideIndexPaths withRowAnimation:animation]; - [self.tableView insertSections:showSections withRowAnimation:animation]; - [self.tableView insertRowsAtIndexPaths:showIndexPaths withRowAnimation:animation]; - [self.tableView endUpdates]; - } else { - self.settingsReader.hiddenKeys = theHiddenKeys; - [self.tableView reloadData]; - } - - IASKAppSettingsViewController *targetViewController = [[self.viewList objectAtIndex:kIASKSpecifierChildViewControllerIndex] objectForKey:@"viewController"]; - if(targetViewController != nil) { - [targetViewController setHiddenKeys:theHiddenKeys animated:animated]; - } - } -} - - -- (void)dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - _viewList = nil; - _file = nil; - _currentFirstResponder = nil; - _settingsReader = nil; - _settingsStore = nil; - _hiddenKeys = nil; - - _delegate = nil; - -} - - -#pragma mark - -#pragma mark Actions - -- (void)dismiss:(id)sender { - [self.settingsStore synchronize]; - - if (self.delegate && [self.delegate conformsToProtocol:@protocol(IASKSettingsDelegate)]) { - [self.delegate settingsViewControllerDidEnd:self]; - } -} - -- (void)toggledValue:(id)sender { - IASKSwitch *toggle = (IASKSwitch *)sender; - IASKSpecifier *spec = [_settingsReader specifierForKey:[toggle key]]; - - if ([toggle isOn]) { - if ([spec trueValue] != nil) { - [self.settingsStore setObject:[spec trueValue] forKey:[toggle key]]; - } - else { - [self.settingsStore setBool:YES forKey:[toggle key]]; - } - } - else { - if ([spec falseValue] != nil) { - [self.settingsStore setObject:[spec falseValue] forKey:[toggle key]]; - } - else { - [self.settingsStore setBool:NO forKey:[toggle key]]; - } - } - [[NSNotificationCenter defaultCenter] postNotificationName:kIASKAppSettingChanged - object:[toggle key] - userInfo:[NSDictionary dictionaryWithObject:[self.settingsStore objectForKey:[toggle key]] - forKey:[toggle key]]]; -} - -- (void)sliderChangedValue:(id)sender { - IASKSlider *slider = (IASKSlider *)sender; - [self.settingsStore setFloat:[slider value] forKey:[slider key]]; - [[NSNotificationCenter defaultCenter] - postNotificationName:kIASKAppSettingChanged - object:[slider key] - userInfo:[NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:[slider value]] - forKey:[slider key]]]; -} - - -#pragma mark - -#pragma mark UITableView Functions - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return [self.settingsReader numberOfSections]; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return [self.settingsReader numberOfRowsForSection:section]; -} - -- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { - IASKSpecifier *specifier = [self.settingsReader specifierForIndexPath:indexPath]; - if ([[specifier type] isEqualToString:kIASKCustomViewSpecifier]) { - if ([self.delegate respondsToSelector:@selector(tableView:heightForSpecifier:)]) { - return [self.delegate tableView:tableView heightForSpecifier:specifier]; - } else { - return 0; - } - } - return tableView.rowHeight; -} - -- (NSString *)tableView:(UITableView*)tableView titleForHeaderInSection:(NSInteger)section { - NSString *header = [self.settingsReader titleForSection:section]; - if (0 == header.length) { - return nil; - } - return header; -} - -- (UIView *)tableView:(UITableView*)tableView viewForHeaderInSection:(NSInteger)section { - if ([self.delegate respondsToSelector:@selector(settingsViewController:tableView:viewForHeaderForSection:)]) { - return [self.delegate settingsViewController:self tableView:tableView viewForHeaderForSection:section]; - } else { - return nil; - } -} - -- (CGFloat)tableView:(UITableView*)tableView heightForHeaderInSection:(NSInteger)section { - if ([self tableView:tableView viewForHeaderInSection:section] && [self.delegate respondsToSelector:@selector(settingsViewController:tableView:heightForHeaderForSection:)]) { - CGFloat result; - if ((result = [self.delegate settingsViewController:self tableView:tableView heightForHeaderForSection:section])) { - return result; - } - - } - NSString *title; - if ((title = [self tableView:tableView titleForHeaderInSection:section])) { - CGSize size = [title sizeWithFont:[UIFont boldSystemFontOfSize:[UIFont labelFontSize]] - constrainedToSize:CGSizeMake(tableView.frame.size.width - 2*kIASKHorizontalPaddingGroupTitles, INFINITY) - lineBreakMode:NSLineBreakByWordWrapping]; - return size.height+kIASKVerticalPaddingGroupTitles; - } - return 0; -} - -- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section -{ - NSString *footerText = [self.settingsReader footerTextForSection:section]; - if (_showCreditsFooter && (section == [self.settingsReader numberOfSections]-1)) { - // show credits since this is the last section - if ((footerText == nil) || ([footerText length] == 0)) { - // show the credits on their own - return kIASKCredits; - } else { - // show the credits below the app's FooterText - return [NSString stringWithFormat:@"%@\n\n%@", footerText, kIASKCredits]; - } - } else { - if ([footerText length] == 0) { - return nil; - } - return [self.settingsReader footerTextForSection:section]; - } -} - -- (UITableViewCell*)newCellForIdentifier:(NSString*)identifier { - UITableViewCell *cell = nil; - if ([identifier isEqualToString:kIASKPSToggleSwitchSpecifier]) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kIASKPSToggleSwitchSpecifier]; - cell.accessoryView = [[IASKSwitch alloc] initWithFrame:CGRectMake(0, 0, 79, 27)]; - [((IASKSwitch*)cell.accessoryView) addTarget:self action:@selector(toggledValue:) forControlEvents:UIControlEventValueChanged]; - cell.selectionStyle = UITableViewCellSelectionStyleNone; - } - else if ([identifier isEqualToString:kIASKPSMultiValueSpecifier] || [identifier isEqualToString:kIASKPSTitleValueSpecifier]) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier]; - cell.accessoryType = [identifier isEqualToString:kIASKPSMultiValueSpecifier] ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone; - } - else if ([identifier isEqualToString:kIASKPSTextFieldSpecifier]) { - cell = [[IASKPSTextFieldSpecifierViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kIASKPSTextFieldSpecifier]; - [((IASKPSTextFieldSpecifierViewCell*)cell).textField addTarget:self action:@selector(_textChanged:) forControlEvents:UIControlEventEditingChanged]; - } - else if ([identifier isEqualToString:kIASKPSSliderSpecifier]) { - cell = [[IASKPSSliderSpecifierViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kIASKPSSliderSpecifier]; - } else if ([identifier isEqualToString:kIASKPSChildPaneSpecifier]) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier]; - cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; - } else if ([identifier isEqualToString:kIASKMailComposeSpecifier]) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier]; - [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; - } else { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; - } - cell.textLabel.minimumFontSize = kIASKMinimumFontSize; - cell.detailTextLabel.minimumFontSize = kIASKMinimumFontSize; - return cell; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - IASKSpecifier *specifier = [self.settingsReader specifierForIndexPath:indexPath]; - if ([specifier.type isEqualToString:kIASKCustomViewSpecifier] && [self.delegate respondsToSelector:@selector(tableView:cellForSpecifier:)]) { - UITableViewCell* cell = [self.delegate tableView:tableView cellForSpecifier:specifier]; - assert(nil != cell && "delegate must return a UITableViewCell for custom cell types"); - return cell; - } - - UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:specifier.type]; - if(nil == cell) { - cell = [self newCellForIdentifier:specifier.type]; - } - - if ([specifier.type isEqualToString:kIASKPSToggleSwitchSpecifier]) { - cell.textLabel.text = specifier.title; - - id currentValue = [self.settingsStore objectForKey:specifier.key]; - BOOL toggleState; - if (currentValue) { - if ([currentValue isEqual:specifier.trueValue]) { - toggleState = YES; - } else if ([currentValue isEqual:specifier.falseValue]) { - toggleState = NO; - } else { - toggleState = [currentValue boolValue]; - } - } else { - toggleState = specifier.defaultBoolValue; - } - IASKSwitch *toggle = (IASKSwitch*)cell.accessoryView; - toggle.on = toggleState; - toggle.key = specifier.key; - } - else if ([specifier.type isEqualToString:kIASKPSMultiValueSpecifier]) { - cell.textLabel.text = specifier.title; - cell.detailTextLabel.text = [[specifier titleForCurrentValue:[self.settingsStore objectForKey:specifier.key] != nil ? - [self.settingsStore objectForKey:specifier.key] : specifier.defaultValue] description]; - } - else if ([specifier.type isEqualToString:kIASKPSTitleValueSpecifier]) { - cell.textLabel.text = specifier.title; - id value = [self.settingsStore objectForKey:specifier.key] ? : specifier.defaultValue; - - NSString *stringValue; - if (specifier.multipleValues || specifier.multipleTitles) { - stringValue = [specifier titleForCurrentValue:value]; - } else { - stringValue = [value description]; - } - - cell.detailTextLabel.text = stringValue; - cell.userInteractionEnabled = NO; - } - else if ([specifier.type isEqualToString:kIASKPSTextFieldSpecifier]) { - cell.textLabel.text = specifier.title; - - NSString *textValue = [self.settingsStore objectForKey:specifier.key] != nil ? [self.settingsStore objectForKey:specifier.key] : specifier.defaultStringValue; - if (textValue && ![textValue isMemberOfClass:[NSString class]]) { - textValue = [NSString stringWithFormat:@"%@", textValue]; - } - IASKTextField *textField = ((IASKPSTextFieldSpecifierViewCell*)cell).textField; - textField.text = textValue; - textField.key = specifier.key; - textField.delegate = self; - textField.secureTextEntry = [specifier isSecure]; - textField.keyboardType = specifier.keyboardType; - textField.autocapitalizationType = specifier.autocapitalizationType; - if([specifier isSecure]){ - textField.autocorrectionType = UITextAutocorrectionTypeNo; - } else { - textField.autocorrectionType = specifier.autoCorrectionType; - } - textField.textAlignment = (NSTextAlignment)specifier.textAlignment; - textField.adjustsFontSizeToFitWidth = specifier.adjustsFontSizeToFitWidth; - } - else if ([specifier.type isEqualToString:kIASKPSSliderSpecifier]) { - if (specifier.minimumValueImage.length > 0) { - ((IASKPSSliderSpecifierViewCell*)cell).minImage.image = [UIImage imageWithContentsOfFile:[_settingsReader pathForImageNamed:specifier.minimumValueImage]]; - } - - if (specifier.maximumValueImage.length > 0) { - ((IASKPSSliderSpecifierViewCell*)cell).maxImage.image = [UIImage imageWithContentsOfFile:[_settingsReader pathForImageNamed:specifier.maximumValueImage]]; - } - - IASKSlider *slider = ((IASKPSSliderSpecifierViewCell*)cell).slider; - slider.minimumValue = specifier.minimumValue; - slider.maximumValue = specifier.maximumValue; - slider.value = [self.settingsStore objectForKey:specifier.key] != nil ? [[self.settingsStore objectForKey:specifier.key] floatValue] : [specifier.defaultValue floatValue]; - [slider addTarget:self action:@selector(sliderChangedValue:) forControlEvents:UIControlEventValueChanged]; - slider.key = specifier.key; - [cell setNeedsLayout]; - } - else if ([specifier.type isEqualToString:kIASKPSChildPaneSpecifier]) { - cell.textLabel.text = specifier.title; - } else if ([specifier.type isEqualToString:kIASKOpenURLSpecifier] || [specifier.type isEqualToString:kIASKMailComposeSpecifier]) { - cell.textLabel.text = specifier.title; - cell.detailTextLabel.text = [specifier.defaultValue description]; - } else if ([specifier.type isEqualToString:kIASKButtonSpecifier]) { - NSString *value = [self.settingsStore objectForKey:specifier.key]; - cell.textLabel.text = [value isKindOfClass:[NSString class]] ? [self.settingsReader titleForStringId:value] : specifier.title; - } else { - cell.textLabel.text = specifier.title; - } - - cell.imageView.image = specifier.cellImage; - cell.imageView.highlightedImage = specifier.highlightedCellImage; - - if (![specifier.type isEqualToString:kIASKPSMultiValueSpecifier] && ![specifier.type isEqualToString:kIASKPSTitleValueSpecifier] && ![specifier.type isEqualToString:kIASKPSTextFieldSpecifier]) { - cell.textLabel.textAlignment = (NSTextAlignment)specifier.textAlignment; - } - cell.detailTextLabel.textAlignment = (NSTextAlignment)specifier.textAlignment; - cell.textLabel.adjustsFontSizeToFitWidth = specifier.adjustsFontSizeToFitWidth; - cell.detailTextLabel.adjustsFontSizeToFitWidth = specifier.adjustsFontSizeToFitWidth; - return cell; -} - -- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { - //create a set of specifier types that can't be selected - static NSSet* noSelectionTypes = nil; - if(nil == noSelectionTypes) { - noSelectionTypes = [NSSet setWithObjects:kIASKPSToggleSwitchSpecifier, kIASKPSSliderSpecifier, nil]; - } - - IASKSpecifier *specifier = [self.settingsReader specifierForIndexPath:indexPath]; - if([noSelectionTypes containsObject:specifier.type]) { - return nil; - } else { - return indexPath; - } -} - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - IASKSpecifier *specifier = [self.settingsReader specifierForIndexPath:indexPath]; - - //switches and sliders can't be selected (should be captured by tableView:willSelectRowAtIndexPath: delegate method) - assert(![[specifier type] isEqualToString:kIASKPSToggleSwitchSpecifier]); - assert(![[specifier type] isEqualToString:kIASKPSSliderSpecifier]); - - if ([[specifier type] isEqualToString:kIASKPSMultiValueSpecifier]) { - IASKSpecifierValuesViewController *targetViewController = [[self.viewList objectAtIndex:kIASKSpecifierValuesViewControllerIndex] objectForKey:@"viewController"]; - - if (targetViewController == nil) { - // the view controller has not been created yet, create it and set it to our viewList array - // create a new dictionary with the new view controller - NSMutableDictionary *newItemDict = [NSMutableDictionary dictionaryWithCapacity:3]; - [newItemDict addEntriesFromDictionary: [self.viewList objectAtIndex:kIASKSpecifierValuesViewControllerIndex]]; // copy the title and explain strings - - targetViewController = [[IASKSpecifierValuesViewController alloc] init]; - // add the new view controller to the dictionary and then to the 'viewList' array - [newItemDict setObject:targetViewController forKey:@"viewController"]; - [self.viewList replaceObjectAtIndex:kIASKSpecifierValuesViewControllerIndex withObject:newItemDict]; - - // load the view controll back in to push it - targetViewController = [[self.viewList objectAtIndex:kIASKSpecifierValuesViewControllerIndex] objectForKey:@"viewController"]; - } - [targetViewController setCurrentSpecifier:specifier]; - targetViewController.settingsReader = self.settingsReader; - targetViewController.settingsStore = self.settingsStore; - [[self navigationController] pushViewController:targetViewController animated:YES]; - } - else if ([[specifier type] isEqualToString:kIASKPSTextFieldSpecifier]) { - IASKPSTextFieldSpecifierViewCell *textFieldCell = (id)[tableView cellForRowAtIndexPath:indexPath]; - [textFieldCell.textField becomeFirstResponder]; - } - else if ([[specifier type] isEqualToString:kIASKPSChildPaneSpecifier]) { - - - Class vcClass = [specifier viewControllerClass]; - if (vcClass) { - SEL initSelector = [specifier viewControllerSelector]; - if (!initSelector) { - initSelector = @selector(init); - } - UIViewController *vc = [vcClass alloc]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" - vc = [vc performSelector:initSelector withObject:[specifier file] withObject:specifier]; -#pragma clang diagnostic pop - if ([vc respondsToSelector:@selector(setDelegate:)]) { - [vc performSelector:@selector(setDelegate:) withObject:self.delegate]; - } - if ([vc respondsToSelector:@selector(setSettingsStore:)]) { - [vc performSelector:@selector(setSettingsStore:) withObject:self.settingsStore]; - } - [self.navigationController pushViewController:vc animated:YES]; - return; - } - - if (nil == [specifier file]) { - [tableView deselectRowAtIndexPath:indexPath animated:YES]; - return; - } - - IASKAppSettingsViewController *targetViewController = [[self.viewList objectAtIndex:kIASKSpecifierChildViewControllerIndex] objectForKey:@"viewController"]; - - if (targetViewController == nil) { - // the view controller has not been created yet, create it and set it to our viewList array - // create a new dictionary with the new view controller - NSMutableDictionary *newItemDict = [NSMutableDictionary dictionaryWithCapacity:3]; - [newItemDict addEntriesFromDictionary: [self.viewList objectAtIndex:kIASKSpecifierChildViewControllerIndex]]; // copy the title and explain strings - - targetViewController = [[[self class] alloc] init]; - targetViewController.showDoneButton = NO; - targetViewController.settingsStore = self.settingsStore; - targetViewController.delegate = self.delegate; - - // add the new view controller to the dictionary and then to the 'viewList' array - [newItemDict setObject:targetViewController forKey:@"viewController"]; - [self.viewList replaceObjectAtIndex:kIASKSpecifierChildViewControllerIndex withObject:newItemDict]; - - // load the view controll back in to push it - targetViewController = [[self.viewList objectAtIndex:kIASKSpecifierChildViewControllerIndex] objectForKey:@"viewController"]; - } - targetViewController.file = specifier.file; - targetViewController.hiddenKeys = self.hiddenKeys; - targetViewController.title = specifier.title; - targetViewController.showCreditsFooter = NO; - [[self navigationController] pushViewController:targetViewController animated:YES]; - } else if ([[specifier type] isEqualToString:kIASKOpenURLSpecifier]) { - [tableView deselectRowAtIndexPath:indexPath animated:YES]; - [[UIApplication sharedApplication] openURL:[NSURL URLWithString:specifier.file]]; - } else if ([[specifier type] isEqualToString:kIASKButtonSpecifier]) { - [tableView deselectRowAtIndexPath:indexPath animated:YES]; - if ([self.delegate respondsToSelector:@selector(settingsViewController:buttonTappedForSpecifier:)]) { - [self.delegate settingsViewController:self buttonTappedForSpecifier:specifier]; - } else if ([self.delegate respondsToSelector:@selector(settingsViewController:buttonTappedForKey:)]) { - // deprecated, provided for backward compatibility - NSLog(@"InAppSettingsKit Warning: -settingsViewController:buttonTappedForKey: is deprecated. Please use -settingsViewController:buttonTappedForSpecifier:"); - [self.delegate settingsViewController:self buttonTappedForKey:[specifier key]]; - } else { - // legacy code, provided for backward compatibility - // the delegate mechanism above is much cleaner and doesn't leak - Class buttonClass = [specifier buttonClass]; - SEL buttonAction = [specifier buttonAction]; - if ([buttonClass respondsToSelector:buttonAction]) { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" - [buttonClass performSelector:buttonAction withObject:self withObject:[specifier key]]; -#pragma clang diagnostic pop - NSLog(@"InAppSettingsKit Warning: Using IASKButtonSpecifier without implementing the delegate method is deprecated"); - } - } - } else if ([[specifier type] isEqualToString:kIASKMailComposeSpecifier]) { - [tableView deselectRowAtIndexPath:indexPath animated:YES]; - if ([MFMailComposeViewController canSendMail]) { - MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init]; - mailViewController.navigationBar.barStyle = self.navigationController.navigationBar.barStyle; - mailViewController.navigationBar.tintColor = self.navigationController.navigationBar.tintColor; - - if ([specifier localizedObjectForKey:kIASKMailComposeSubject]) { - [mailViewController setSubject:[specifier localizedObjectForKey:kIASKMailComposeSubject]]; - } - if ([[specifier specifierDict] objectForKey:kIASKMailComposeToRecipents]) { - [mailViewController setToRecipients:[[specifier specifierDict] objectForKey:kIASKMailComposeToRecipents]]; - } - if ([[specifier specifierDict] objectForKey:kIASKMailComposeCcRecipents]) { - [mailViewController setCcRecipients:[[specifier specifierDict] objectForKey:kIASKMailComposeCcRecipents]]; - } - if ([[specifier specifierDict] objectForKey:kIASKMailComposeBccRecipents]) { - [mailViewController setBccRecipients:[[specifier specifierDict] objectForKey:kIASKMailComposeBccRecipents]]; - } - if ([specifier localizedObjectForKey:kIASKMailComposeBody]) { - BOOL isHTML = NO; - if ([[specifier specifierDict] objectForKey:kIASKMailComposeBodyIsHTML]) { - isHTML = [[[specifier specifierDict] objectForKey:kIASKMailComposeBodyIsHTML] boolValue]; - } - - if ([self.delegate respondsToSelector:@selector(settingsViewController:mailComposeBodyForSpecifier:)]) { - [mailViewController setMessageBody:[self.delegate settingsViewController:self - mailComposeBodyForSpecifier:specifier] isHTML:isHTML]; - } - else { - [mailViewController setMessageBody:[specifier localizedObjectForKey:kIASKMailComposeBody] isHTML:isHTML]; - } - } - - UIViewController *vc = nil; - - if ([self.delegate respondsToSelector:@selector(settingsViewController:viewControllerForMailComposeViewForSpecifier:)]) { - vc = [self.delegate settingsViewController:self viewControllerForMailComposeViewForSpecifier:specifier]; - } - - if (vc == nil) { - vc = self; - } - - mailViewController.mailComposeDelegate = vc; - [vc presentModalViewController:mailViewController animated:YES]; - } else { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Mail not configured", @"InAppSettingKit") - message:NSLocalizedString(@"This device is not configured for sending Email. Please configure the Mail settings in the Settings app.", @"InAppSettingsKit") - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", @"InAppSettingsKit") - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [self presentViewController:errView animated:YES completion:nil]; - } - - } else if ([[specifier type] isEqualToString:kIASKCustomViewSpecifier] && [self.delegate respondsToSelector:@selector(settingsViewController:tableView:didSelectCustomViewSpecifier:)]) { - [self.delegate settingsViewController:self tableView:tableView didSelectCustomViewSpecifier:specifier]; - } else { - [tableView deselectRowAtIndexPath:indexPath animated:NO]; - } -} - - -#pragma mark - -#pragma mark MFMailComposeViewControllerDelegate Function - --(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error { - - // Forward the mail compose delegate - if ([self.delegate respondsToSelector:@selector(settingsViewController:mailComposeController:didFinishWithResult:error:)]) { - [self.delegate settingsViewController:self - mailComposeController:controller - didFinishWithResult:result - error:error]; - } - - // NOTE: No error handling is done here - [self dismissModalViewControllerAnimated:YES]; -} - -#pragma mark - -#pragma mark UITextFieldDelegate Functions - -- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { - self.currentFirstResponder = textField; - return YES; -} - -- (void)_textChanged:(id)sender { - IASKTextField *text = (IASKTextField *)sender; - [_settingsStore setObject:[text text] forKey:[text key]]; - [[NSNotificationCenter defaultCenter] - postNotificationName:kIASKAppSettingChanged - object:[text key] - userInfo:[NSDictionary dictionaryWithObject:[text text] forKey:[text key]]]; -} - -- (BOOL)textFieldShouldReturn:(UITextField *)textField{ - [textField resignFirstResponder]; - self.currentFirstResponder = nil; - return YES; -} - -- (void)singleTapToEndEdit:(UIGestureRecognizer *)sender { - [self.tableView endEditing:NO]; -} - -#pragma mark Notifications - -- (void)synchronizeSettings { - [_settingsStore synchronize]; -} - -static NSDictionary *oldUserDefaults = nil; -- (void)userDefaultsDidChange { - NSDictionary *currentDict = [NSUserDefaults standardUserDefaults].dictionaryRepresentation; - NSMutableArray *indexPathsToUpdate = [NSMutableArray array]; - for (NSString *key in currentDict.allKeys) { - if (![[oldUserDefaults valueForKey:key] isEqual:[currentDict valueForKey:key]]) { - NSIndexPath *path = [self.settingsReader indexPathForKey:key]; - if (path && ![[self.settingsReader specifierForKey:key].type isEqualToString:kIASKCustomViewSpecifier]) { - [indexPathsToUpdate addObject:path]; - } - } - } - oldUserDefaults = currentDict; - - for (UITableViewCell *cell in self.tableView.visibleCells) { - if ([cell isKindOfClass:[IASKPSTextFieldSpecifierViewCell class]] && [((IASKPSTextFieldSpecifierViewCell*)cell).textField isFirstResponder]) { - [indexPathsToUpdate removeObject:[self.tableView indexPathForCell:cell]]; - } - } - if (indexPathsToUpdate.count) { - [self.tableView reloadRowsAtIndexPaths:indexPathsToUpdate withRowAnimation:UITableViewRowAnimationNone]; - } -} - -- (void)reload { - // wait 0.5 sec until UI is available after applicationWillEnterForeground - [self.tableView performSelector:@selector(reloadData) withObject:nil afterDelay:0.5]; -} - -#pragma mark CGRect Utility function -CGRect IASKCGRectSwap(CGRect rect) { - CGRect newRect; - newRect.origin.x = rect.origin.y; - newRect.origin.y = rect.origin.x; - newRect.size.width = rect.size.height; - newRect.size.height = rect.size.width; - return newRect; -} -@end - -#pragma deploymate pop diff --git a/Classes/Utils/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.h b/Classes/Utils/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.h deleted file mode 100755 index 99b2ef14d..000000000 --- a/Classes/Utils/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// IASKSpecifierValuesViewController.h -// http://www.inappsettingskit.com -// -// Copyright (c) 2009: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import -#import "IASKSettingsStore.h" -#import "IASKViewController.h" -@class IASKSpecifier; -@class IASKSettingsReader; - -@interface IASKSpecifierValuesViewController : UIViewController { - UITableView *_tableView; - - IASKSpecifier *_currentSpecifier; - NSIndexPath *_checkedItem; - IASKSettingsReader *_settingsReader; - id _settingsStore; -} - -@property(nonatomic, strong) UITableView *tableView; -@property(nonatomic, strong) NSIndexPath *checkedItem; -@property(nonatomic, strong) IASKSpecifier *currentSpecifier; - -@end diff --git a/Classes/Utils/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m b/Classes/Utils/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m deleted file mode 100755 index 309ce30e6..000000000 --- a/Classes/Utils/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m +++ /dev/null @@ -1,200 +0,0 @@ -// -// IASKSpecifierValuesViewController.m -// http://www.inappsettingskit.com -// -// Copyright (c) 2009: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKSpecifierValuesViewController.h" -#import "IASKSpecifier.h" -#import "IASKSettingsReader.h" -#import "IASKSettingsStoreUserDefaults.h" - -#define kCellValue @"kCellValue" - -@interface IASKSpecifierValuesViewController() -- (void)userDefaultsDidChange; -@end - -@implementation IASKSpecifierValuesViewController - -@synthesize tableView=_tableView; -@synthesize currentSpecifier=_currentSpecifier; -@synthesize checkedItem=_checkedItem; -@synthesize settingsReader = _settingsReader; -@synthesize settingsStore = _settingsStore; - -- (void) updateCheckedItem { - NSInteger index; - - // Find the currently checked item - if([self.settingsStore objectForKey:[_currentSpecifier key]]) { - index = [[_currentSpecifier multipleValues] indexOfObject:[self.settingsStore objectForKey:[_currentSpecifier key]]]; - } else { - index = [[_currentSpecifier multipleValues] indexOfObject:[_currentSpecifier defaultValue]]; - } - [self setCheckedItem:[NSIndexPath indexPathForRow:index inSection:0]]; -} - -- (id)settingsStore { - if(_settingsStore == nil) { - _settingsStore = [[IASKSettingsStoreUserDefaults alloc] init]; - } - return _settingsStore; -} - -- (void)loadView -{ - _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped]; - _tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | - UIViewAutoresizingFlexibleHeight; - _tableView.delegate = self; - _tableView.dataSource = self; - - self.view = _tableView; -} - -- (void)viewWillAppear:(BOOL)animated { - if (_currentSpecifier) { - [self setTitle:[_currentSpecifier title]]; - [self updateCheckedItem]; - } - - if (_tableView) { - [_tableView reloadData]; - - // Make sure the currently checked item is visible - [_tableView scrollToRowAtIndexPath:[self checkedItem] atScrollPosition:UITableViewScrollPositionMiddle animated:NO]; - } - [super viewWillAppear:animated]; -} - -- (void)viewDidAppear:(BOOL)animated { - [_tableView flashScrollIndicators]; - [super viewDidAppear:animated]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(userDefaultsDidChange) - name:NSUserDefaultsDidChangeNotification - object:[NSUserDefaults standardUserDefaults]]; -} - -- (void)viewDidDisappear:(BOOL)animated { - [[NSNotificationCenter defaultCenter] removeObserver:self name:NSUserDefaultsDidChangeNotification object:nil]; - [super viewDidDisappear:animated]; -} - - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - return YES; -} - -- (void)dealloc { - _currentSpecifier = nil; - _checkedItem = nil; - _settingsReader = nil; - _settingsStore = nil; - _tableView = nil; -} - - -#pragma mark - -#pragma mark UITableView delegates - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 1; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return [_currentSpecifier multipleValuesCount]; -} - -- (void)selectCell:(UITableViewCell *)cell { - [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; - [[cell textLabel] setTextColor:kIASKgrayBlueColor]; -} - -- (void)deselectCell:(UITableViewCell *)cell { - [cell setAccessoryType:UITableViewCellAccessoryNone]; - if (@available(iOS 13.0, *)) { - [[cell textLabel] setTextColor:[UIColor labelColor]]; - } else { - [[cell textLabel] setTextColor:[UIColor darkGrayColor]]; - } -} - -- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section { - return [_currentSpecifier footerText]; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellValue]; - NSArray *titles = [_currentSpecifier multipleTitles]; - - if (!cell) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellValue]; - } - - if ([indexPath isEqual:[self checkedItem]]) { - [self selectCell:cell]; - } else { - [self deselectCell:cell]; - } - - @try { - [[cell textLabel] setText:[self.settingsReader titleForStringId:[titles objectAtIndex:indexPath.row]]]; - } - @catch (NSException * e) {} - return cell; -} - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - - if (indexPath == [self checkedItem]) { - [tableView deselectRowAtIndexPath:indexPath animated:YES]; - return; - } - - NSArray *values = [_currentSpecifier multipleValues]; - - [tableView deselectRowAtIndexPath:indexPath animated:YES]; - [self deselectCell:[tableView cellForRowAtIndexPath:[self checkedItem]]]; - [self selectCell:[tableView cellForRowAtIndexPath:indexPath]]; - [self setCheckedItem:indexPath]; - - [self.settingsStore setObject:[values objectAtIndex:indexPath.row] forKey:[_currentSpecifier key]]; - [self.settingsStore synchronize]; - [[NSNotificationCenter defaultCenter] postNotificationName:kIASKAppSettingChanged - object:[_currentSpecifier key] - userInfo:[NSDictionary dictionaryWithObject:[values objectAtIndex:indexPath.row] - forKey:[_currentSpecifier key]]]; -} - -- (CGSize)contentSizeForViewInPopover { - return [[self view] sizeThatFits:CGSizeMake(320, 2000)]; -} - - -#pragma mark Notifications - -- (void)userDefaultsDidChange { - NSIndexPath *oldCheckedItem = self.checkedItem; - if(_currentSpecifier) { - [self updateCheckedItem]; - } - - // only reload the table if it had changed; prevents animation cancellation - if (![self.checkedItem isEqual:oldCheckedItem]) { - [_tableView reloadData]; - } -} - -@end diff --git a/Classes/Utils/InAppSettingsKit/Controllers/IASKViewController.h b/Classes/Utils/InAppSettingsKit/Controllers/IASKViewController.h deleted file mode 100755 index 40e450415..000000000 --- a/Classes/Utils/InAppSettingsKit/Controllers/IASKViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// IASKAppSettingsViewController.h -// http://www.inappsettingskit.com -// -// Copyright (c) 2009: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -@class IASKSettingsReader; -@protocol IASKSettingsStore; - -// protocol all IASK view controllers implement -@protocol IASKViewController - -@property (nonatomic, retain) IASKSettingsReader* settingsReader; -@property (nonatomic, retain) id settingsStore; - -@end diff --git a/Classes/Utils/InAppSettingsKit/Models/IASKSettingsReader.h b/Classes/Utils/InAppSettingsKit/Models/IASKSettingsReader.h deleted file mode 100755 index 628320900..000000000 --- a/Classes/Utils/InAppSettingsKit/Models/IASKSettingsReader.h +++ /dev/null @@ -1,162 +0,0 @@ -// -// IASKSettingsReader.h -// http://www.inappsettingskit.com -// -// Copyright (c) 2009: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import - -#define kIASKPreferenceSpecifiers @"PreferenceSpecifiers" -#define kIASKCellImage @"IASKCellImage" - -#define kIASKType @"Type" -#define kIASKTitle @"Title" -#define kIASKFooterText @"FooterText" -#define kIASKKey @"Key" -#define kIASKFile @"File" -#define kIASKDefaultValue @"DefaultValue" -#define kIASKMinimumValue @"MinimumValue" -#define kIASKMaximumValue @"MaximumValue" -#define kIASKTrueValue @"TrueValue" -#define kIASKFalseValue @"FalseValue" -#define kIASKIsSecure @"IsSecure" -#define KIASKKeyboardType @"KeyboardType" -#define kIASKAutocapitalizationType @"AutocapitalizationType" -#define kIASKAutoCorrectionType @"AutocorrectionType" -#define kIASKValues @"Values" -#define kIASKTitles @"Titles" -#define kIASKViewControllerClass @"IASKViewControllerClass" -#define kIASKViewControllerSelector @"IASKViewControllerSelector" -#define kIASKButtonClass @"IASKButtonClass" -#define kIASKButtonAction @"IASKButtonAction" -#define kIASKMailComposeToRecipents @"IASKMailComposeToRecipents" -#define kIASKMailComposeCcRecipents @"IASKMailComposeCcRecipents" -#define kIASKMailComposeBccRecipents @"IASKMailComposeBccRecipents" -#define kIASKMailComposeSubject @"IASKMailComposeSubject" -#define kIASKMailComposeBody @"IASKMailComposeBody" -#define kIASKMailComposeBodyIsHTML @"IASKMailComposeBodyIsHTML" -#define kIASKKeyboardAlphabet @"Alphabet" -#define kIASKKeyboardNumbersAndPunctuation @"NumbersAndPunctuation" -#define kIASKKeyboardNumberPad @"NumberPad" -#define kIASKKeyboardDecimalPad @"DecimalPad" - -#define KIASKKeyboardURL @"URL" -#define kIASKKeyboardEmailAddress @"EmailAddress" -#define kIASKAutoCapNone @"None" -#define kIASKAutoCapSentences @"Sentences" -#define kIASKAutoCapWords @"Words" -#define kIASKAutoCapAllCharacters @"AllCharacters" -#define kIASKAutoCorrDefault @"Default" -#define kIASKAutoCorrNo @"No" -#define kIASKAutoCorrYes @"Yes" -#define kIASKMinimumValueImage @"MinimumValueImage" -#define kIASKMaximumValueImage @"MaximumValueImage" -#define kIASKAdjustsFontSizeToFitWidth @"IASKAdjustsFontSizeToFitWidth" -#define kIASKTextLabelAlignment @"IASKTextAlignment" -#define kIASKTextLabelAlignmentLeft @"IASKUITextAlignmentLeft" -#define kIASKTextLabelAlignmentCenter @"IASKUITextAlignmentCenter" -#define kIASKTextLabelAlignmentRight @"IASKUITextAlignmentRight" - -#define kIASKPSGroupSpecifier @"PSGroupSpecifier" -#define kIASKPSToggleSwitchSpecifier @"PSToggleSwitchSpecifier" -#define kIASKPSMultiValueSpecifier @"PSMultiValueSpecifier" -#define kIASKPSSliderSpecifier @"PSSliderSpecifier" -#define kIASKPSTitleValueSpecifier @"PSTitleValueSpecifier" -#define kIASKPSTextFieldSpecifier @"PSTextFieldSpecifier" -#define kIASKPSChildPaneSpecifier @"PSChildPaneSpecifier" -#define kIASKOpenURLSpecifier @"IASKOpenURLSpecifier" -#define kIASKButtonSpecifier @"IASKButtonSpecifier" -#define kIASKMailComposeSpecifier @"IASKMailComposeSpecifier" -#define kIASKCustomViewSpecifier @"IASKCustomViewSpecifier" - -#define kIASKBundleFolder @"Settings.bundle" -#define kIASKBundleFolderAlt @"InAppSettings.bundle" -#define kIASKBundleFilename @"Root.plist" -#define KIASKBundleLocaleFolderExtension @".lproj" - -#define kIASKAppSettingChanged @"kAppSettingChanged" - -#define kIASKSectionHeaderIndex 0 - -#define kIASKSliderNoImagesPadding 11 -#define kIASKSliderImagesPadding 43 - - -#define kIASKTableWidth 320 -#define kIASKSpacing 5 -#define kIASKMinLabelWidth 97 -#define kIASKMaxLabelWidth 240 -#define kIASKMinValueWidth 35 - -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 - #define kIASKPaddingLeft (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1 ? 14 : 9) -#else - #define kIASKPaddingLeft 9 -#endif - -#define kIASKPaddingRight 10 -#define kIASKHorizontalPaddingGroupTitles 19 -#define kIASKVerticalPaddingGroupTitles 15 - -#define kIASKLabelFontSize 17 -#define kIASKgrayBlueColor [UIColor colorWithRed:0.318 green:0.4 blue:0.569 alpha:1.0] - -#define kIASKMinimumFontSize 12.0f - -#ifndef kCFCoreFoundationVersionNumber_iPhoneOS_4_0 -#define kCFCoreFoundationVersionNumber_iPhoneOS_4_0 550.32 -#endif - -#ifndef kCFCoreFoundationVersionNumber_iPhoneOS_4_1 -#define kCFCoreFoundationVersionNumber_iPhoneOS_4_1 550.38 -#endif - - -#define IASK_IF_IOS4_OR_GREATER(...) \ -if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_4_0) \ -{ \ -__VA_ARGS__ \ -} - -@class IASKSpecifier; - -@interface IASKSettingsReader : NSObject { - NSString *_path; - NSString *_localizationTable; - NSString *_bundlePath; - NSDictionary *_settingsBundle; - NSArray *_dataSource; - NSBundle *_bundle; - NSSet *_hiddenKeys; -} - -- (id)initWithFile:(NSString*)file; -- (NSInteger)numberOfSections; -- (NSInteger)numberOfRowsForSection:(NSInteger)section; -- (IASKSpecifier*)specifierForIndexPath:(NSIndexPath*)indexPath; -- (NSIndexPath*)indexPathForKey:(NSString*)key; -- (IASKSpecifier*)specifierForKey:(NSString*)key; -- (NSString*)titleForSection:(NSInteger)section; -- (NSString*)keyForSection:(NSInteger)section; -- (NSString*)footerTextForSection:(NSInteger)section; -- (NSString*)titleForStringId:(NSString*)stringId; -- (NSString*)pathForImageNamed:(NSString*)image; - -@property(nonatomic, strong) NSString *path; -@property(nonatomic, strong) NSString *localizationTable; -@property(nonatomic, strong) NSString *bundlePath; -@property(nonatomic, strong) NSDictionary *settingsBundle; -@property(nonatomic, strong) NSArray *dataSource; -@property(nonatomic, strong) NSSet *hiddenKeys; - -@end diff --git a/Classes/Utils/InAppSettingsKit/Models/IASKSettingsReader.m b/Classes/Utils/InAppSettingsKit/Models/IASKSettingsReader.m deleted file mode 100755 index 028ef72bc..000000000 --- a/Classes/Utils/InAppSettingsKit/Models/IASKSettingsReader.m +++ /dev/null @@ -1,282 +0,0 @@ -// -// IASKSettingsReader.m -// http://www.inappsettingskit.com -// -// Copyright (c) 2009: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKSettingsReader.h" -#import "IASKSpecifier.h" - -@interface IASKSettingsReader (private) -- (void)_reinterpretBundle:(NSDictionary*)settingsBundle; -- (BOOL)_sectionHasHeading:(NSInteger)section; -- (NSString *)platformSuffix; -- (NSString *)locateSettingsFile:(NSString *)file; - -@end - -@implementation IASKSettingsReader - -@synthesize path=_path, -localizationTable=_localizationTable, -bundlePath=_bundlePath, -settingsBundle=_settingsBundle, -dataSource=_dataSource, -hiddenKeys = _hiddenKeys; - -- (id)init { - return [self initWithFile:@"Root"]; -} - -- (id)initWithFile:(NSString*)file { - if ((self=[super init])) { - - - self.path = [self locateSettingsFile: file]; - [self setSettingsBundle:[NSDictionary dictionaryWithContentsOfFile:self.path]]; - self.bundlePath = [self.path stringByDeletingLastPathComponent]; - _bundle = [NSBundle bundleWithPath:[self bundlePath]]; - - // Look for localization file - self.localizationTable = [self.settingsBundle objectForKey:@"StringsTable"]; - if (!self.localizationTable) - { - // Look for localization file using filename - self.localizationTable = [[[[self.path stringByDeletingPathExtension] // removes '.plist' - stringByDeletingPathExtension] // removes potential '.inApp' - lastPathComponent] // strip absolute path - stringByReplacingOccurrencesOfString:[self platformSuffix] withString:@""]; // removes potential '~device' (~ipad, ~iphone) - if([_bundle pathForResource:self.localizationTable ofType:@"strings"] == nil){ - // Could not find the specified localization: use default - self.localizationTable = @"Root"; - } - } - - if (_settingsBundle) { - [self _reinterpretBundle:_settingsBundle]; - } - } - return self; -} - -- (void)dealloc { - _path = nil; - _localizationTable = nil; - _bundlePath = nil; - _settingsBundle = nil; - _dataSource = nil; - _bundle = nil; - _hiddenKeys = nil; -} - - -- (void)setHiddenKeys:(NSSet *)anHiddenKeys { - if (_hiddenKeys != anHiddenKeys) { - _hiddenKeys = anHiddenKeys; - - if (_settingsBundle) { - [self _reinterpretBundle:_settingsBundle]; - } - } -} - - -- (void)_reinterpretBundle:(NSDictionary*)settingsBundle { - NSArray *preferenceSpecifiers = [settingsBundle objectForKey:kIASKPreferenceSpecifiers]; - NSInteger sectionCount = -1; - NSMutableArray *dataSource = [[NSMutableArray alloc] init]; - - for (NSDictionary *specifier in preferenceSpecifiers) { - if ([self.hiddenKeys containsObject:[specifier objectForKey:kIASKKey]]) { - continue; - } - if ([(NSString*)[specifier objectForKey:kIASKType] isEqualToString:kIASKPSGroupSpecifier]) { - NSMutableArray *newArray = [[NSMutableArray alloc] init]; - - [newArray addObject:specifier]; - [dataSource addObject:newArray]; - sectionCount++; - } - else { - if (sectionCount == -1) { - NSMutableArray *newArray = [[NSMutableArray alloc] init]; - [dataSource addObject:newArray]; - sectionCount++; - } - - IASKSpecifier *newSpecifier = [[IASKSpecifier alloc] initWithSpecifier:specifier]; - [(NSMutableArray*)[dataSource objectAtIndex:sectionCount] addObject:newSpecifier]; - } - } - [self setDataSource:dataSource]; -} - -- (BOOL)_sectionHasHeading:(NSInteger)section { - return [[[[self dataSource] objectAtIndex:section] objectAtIndex:0] isKindOfClass:[NSDictionary class]]; -} - -- (NSInteger)numberOfSections { - return [[self dataSource] count]; -} - -- (NSInteger)numberOfRowsForSection:(NSInteger)section { - int headingCorrection = [self _sectionHasHeading:section] ? 1 : 0; - return [(NSArray*)[[self dataSource] objectAtIndex:section] count] - headingCorrection; -} - -- (IASKSpecifier*)specifierForIndexPath:(NSIndexPath*)indexPath { - int headingCorrection = [self _sectionHasHeading:indexPath.section] ? 1 : 0; - - IASKSpecifier *specifier = [[[self dataSource] objectAtIndex:indexPath.section] objectAtIndex:(indexPath.row+headingCorrection)]; - specifier.settingsReader = self; - return specifier; -} - -- (NSIndexPath*)indexPathForKey:(NSString *)key { - for (NSUInteger sectionIndex = 0; sectionIndex < self.dataSource.count; sectionIndex++) { - NSArray *section = [self.dataSource objectAtIndex:sectionIndex]; - for (NSUInteger rowIndex = 0; rowIndex < section.count; rowIndex++) { - IASKSpecifier *specifier = (IASKSpecifier*)[section objectAtIndex:rowIndex]; - if ([specifier isKindOfClass:[IASKSpecifier class]] && [specifier.key isEqualToString:key]) { - NSUInteger correctedRowIndex = rowIndex - [self _sectionHasHeading:sectionIndex]; - return [NSIndexPath indexPathForRow:correctedRowIndex inSection:sectionIndex]; - } - } - } - return nil; -} - -- (IASKSpecifier*)specifierForKey:(NSString*)key { - for (NSArray *specifiers in _dataSource) { - for (id sp in specifiers) { - if ([sp isKindOfClass:[IASKSpecifier class]]) { - if ([[(IASKSpecifier*)sp key] isEqualToString:key]) { - return sp; - } - } - } - } - return nil; -} - -- (NSString*)titleForSection:(NSInteger)section { - if ([self _sectionHasHeading:section]) { - NSDictionary *dict = [[[self dataSource] objectAtIndex:section] objectAtIndex:kIASKSectionHeaderIndex]; - return [self titleForStringId:[dict objectForKey:kIASKTitle]]; - } - return nil; -} - -- (NSString*)keyForSection:(NSInteger)section { - if ([self _sectionHasHeading:section]) { - return [[[[self dataSource] objectAtIndex:section] objectAtIndex:kIASKSectionHeaderIndex] objectForKey:kIASKKey]; - } - return nil; -} - -- (NSString*)footerTextForSection:(NSInteger)section { - if ([self _sectionHasHeading:section]) { - NSDictionary *dict = [[[self dataSource] objectAtIndex:section] objectAtIndex:kIASKSectionHeaderIndex]; - return [self titleForStringId:[dict objectForKey:kIASKFooterText]]; - } - return nil; -} - -- (NSString*)titleForStringId:(NSString*)stringId { - return [_bundle localizedStringForKey:stringId value:stringId table:self.localizationTable]; -} - -- (NSString*)pathForImageNamed:(NSString*)image { - return [[self bundlePath] stringByAppendingPathComponent:image]; -} - -- (NSString *)platformSuffix { - BOOL isPad = NO; -#if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 30200) - isPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; -#endif - return isPad ? @"~ipad" : @"~iphone"; -} - -- (NSString *)file:(NSString *)file - withBundle:(NSString *)bundle - suffix:(NSString *)suffix - extension:(NSString *)extension { - - NSString *appBundle = [[NSBundle mainBundle] bundlePath]; - bundle = [appBundle stringByAppendingPathComponent:bundle]; - file = [file stringByAppendingFormat:@"%@%@", suffix, extension]; - return [bundle stringByAppendingPathComponent:file]; - -} - -- (NSString *)locateSettingsFile: (NSString *)file { - - // The file is searched in the following order: - // - // InAppSettings.bundle/FILE~DEVICE.inApp.plist - // InAppSettings.bundle/FILE.inApp.plist - // InAppSettings.bundle/FILE~DEVICE.plist - // InAppSettings.bundle/FILE.plist - // Settings.bundle/FILE~DEVICE.inApp.plist - // Settings.bundle/FILE.inApp.plist - // Settings.bundle/FILE~DEVICE.plist - // Settings.bundle/FILE.plist - // - // where DEVICE is either "iphone" or "ipad" depending on the current - // interface idiom. - // - // Settings.app uses the ~DEVICE suffixes since iOS 4.0. There are some - // differences from this implementation: - // - For an iPhone-only app running on iPad, Settings.app will not use the - // ~iphone suffix. There is no point in using these suffixes outside - // of universal apps anyway. - // - This implementation uses the device suffixes on iOS 3.x as well. - // - also check current locale (short only) - - NSArray *bundles = - [NSArray arrayWithObjects:kIASKBundleFolderAlt, kIASKBundleFolder, nil]; - - NSArray *extensions = - [NSArray arrayWithObjects:@".inApp.plist", @".plist", nil]; - - NSArray *suffixes = - [NSArray arrayWithObjects:[self platformSuffix], @"", nil]; - - NSArray *languages = - [NSArray arrayWithObjects:[[[NSLocale preferredLanguages] objectAtIndex:0] stringByAppendingString:KIASKBundleLocaleFolderExtension], @"", nil]; - - NSString *path = nil; - NSFileManager *fileManager = [NSFileManager defaultManager]; - - for (NSString *bundle in bundles) { - for (NSString *extension in extensions) { - for (NSString *suffix in suffixes) { - for (NSString *language in languages) { - path = [self file:file - withBundle:[bundle stringByAppendingPathComponent:language] - suffix:suffix - extension:extension]; - if ([fileManager fileExistsAtPath:path]) { - goto exitFromNestedLoop; - } - } - } - } - } - -exitFromNestedLoop: - return path; -} - -@end diff --git a/Classes/Utils/InAppSettingsKit/Models/IASKSettingsStore.h b/Classes/Utils/InAppSettingsKit/Models/IASKSettingsStore.h deleted file mode 100755 index c1b53ba2b..000000000 --- a/Classes/Utils/InAppSettingsKit/Models/IASKSettingsStore.h +++ /dev/null @@ -1,39 +0,0 @@ -// -// IASKSettingsStore.h -// http://www.inappsettingskit.com -// -// Copyright (c) 2010: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import - -@protocol IASKSettingsStore -@required -- (void)setBool:(BOOL)value forKey:(NSString*)key; -- (void)setFloat:(float)value forKey:(NSString*)key; -- (void)setDouble:(double)value forKey:(NSString*)key; -- (void)setInteger:(int)value forKey:(NSString*)key; -- (void)setObject:(id)value forKey:(NSString*)key; -- (BOOL)boolForKey:(NSString*)key; -- (float)floatForKey:(NSString*)key; -- (double)doubleForKey:(NSString*)key; -- (int)integerForKey:(NSString*)key; -- (id)objectForKey:(NSString*)key; -- (BOOL)synchronize; // Write settings to a permanant storage. Returns YES on success, NO otherwise -@end - - -@interface IASKAbstractSettingsStore : NSObject { -} - -@end diff --git a/Classes/Utils/InAppSettingsKit/Models/IASKSettingsStore.m b/Classes/Utils/InAppSettingsKit/Models/IASKSettingsStore.m deleted file mode 100755 index db858fa7c..000000000 --- a/Classes/Utils/InAppSettingsKit/Models/IASKSettingsStore.m +++ /dev/null @@ -1,68 +0,0 @@ -// -// IASKSettingsStore.m -// http://www.inappsettingskit.com -// -// Copyright (c) 2010: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKSettingsStore.h" - -@implementation IASKAbstractSettingsStore - -- (void)setObject:(id)value forKey:(NSString*)key { - [NSException raise:@"Unimplemented" - format:@"setObject:forKey: must be implemented in subclasses of IASKAbstractSettingsStore"]; -} - -- (id)objectForKey:(NSString*)key { - [NSException raise:@"Unimplemented" - format:@"objectForKey: must be implemented in subclasses of IASKAbstractSettingsStore"]; - return nil; -} - -- (void)setBool:(BOOL)value forKey:(NSString*)key { - [self setObject:[NSNumber numberWithBool:value] forKey:key]; -} - -- (void)setFloat:(float)value forKey:(NSString*)key { - [self setObject:[NSNumber numberWithFloat:value] forKey:key]; -} - -- (void)setInteger:(int)value forKey:(NSString*)key { - [self setObject:[NSNumber numberWithInt:value] forKey:key]; -} - -- (void)setDouble:(double)value forKey:(NSString*)key { - [self setObject:[NSNumber numberWithDouble:value] forKey:key]; -} - -- (BOOL)boolForKey:(NSString*)key { - return [[self objectForKey:key] boolValue]; -} - -- (float)floatForKey:(NSString*)key { - return [[self objectForKey:key] floatValue]; -} -- (int)integerForKey:(NSString*)key { - return [[self objectForKey:key] intValue]; -} - -- (double)doubleForKey:(NSString*)key { - return [[self objectForKey:key] doubleValue]; -} - -- (BOOL)synchronize { - return NO; -} - -@end diff --git a/Classes/Utils/InAppSettingsKit/Models/IASKSettingsStoreFile.h b/Classes/Utils/InAppSettingsKit/Models/IASKSettingsStoreFile.h deleted file mode 100755 index 6d4fe2993..000000000 --- a/Classes/Utils/InAppSettingsKit/Models/IASKSettingsStoreFile.h +++ /dev/null @@ -1,28 +0,0 @@ -// -// IASKSettingsStoreFile.h -// http://www.inappsettingskit.com -// -// Copyright (c) 2010: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import -#import "IASKSettingsStore.h" - -@interface IASKSettingsStoreFile : IASKAbstractSettingsStore { - NSString * _filePath; - NSMutableDictionary * _dict; -} - -- (id)initWithPath:(NSString*)path; - -@end diff --git a/Classes/Utils/InAppSettingsKit/Models/IASKSettingsStoreFile.m b/Classes/Utils/InAppSettingsKit/Models/IASKSettingsStoreFile.m deleted file mode 100755 index a5fc41933..000000000 --- a/Classes/Utils/InAppSettingsKit/Models/IASKSettingsStoreFile.m +++ /dev/null @@ -1,52 +0,0 @@ -// -// IASKSettingsStoreFile.m -// http://www.inappsettingskit.com -// -// Copyright (c) 2010: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKSettingsStoreFile.h" - - -@implementation IASKSettingsStoreFile - -- (id)initWithPath:(NSString*)path { - if((self = [super init])) { - _filePath = path; - _dict = [[NSMutableDictionary alloc] initWithContentsOfFile:path]; - if (_dict == nil) { - _dict = [[NSMutableDictionary alloc] init]; - } - } - return self; -} - -- (void)dealloc { - _dict = nil; - _filePath = nil; -} - - -- (void)setObject:(id)value forKey:(NSString *)key { - [_dict setObject:value forKey:key]; -} - -- (id)objectForKey:(NSString *)key { - return [_dict objectForKey:key]; -} - -- (BOOL)synchronize { - return [_dict writeToFile:_filePath atomically:YES]; -} - -@end diff --git a/Classes/Utils/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.h b/Classes/Utils/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.h deleted file mode 100755 index 3731f5e3b..000000000 --- a/Classes/Utils/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.h +++ /dev/null @@ -1,25 +0,0 @@ -// -// IASKSettingsStoreUserDefaults.h -// http://www.inappsettingskit.com -// -// Copyright (c) 2010: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import -#import "IASKSettingsStore.h" - -@interface IASKSettingsStoreUserDefaults : IASKAbstractSettingsStore { - -} - -@end diff --git a/Classes/Utils/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.m b/Classes/Utils/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.m deleted file mode 100755 index 8b85b3cc2..000000000 --- a/Classes/Utils/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.m +++ /dev/null @@ -1,67 +0,0 @@ -// -// IASKSettingsStoreUserDefaults.m -// http://www.inappsettingskit.com -// -// Copyright (c) 2010: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKSettingsStoreUserDefaults.h" - - -@implementation IASKSettingsStoreUserDefaults - -- (void)setBool:(BOOL)value forKey:(NSString*)key { - [[NSUserDefaults standardUserDefaults] setBool:value forKey:key]; -} - -- (void)setFloat:(float)value forKey:(NSString*)key { - [[NSUserDefaults standardUserDefaults] setFloat:value forKey:key]; -} - -- (void)setDouble:(double)value forKey:(NSString*)key { - [[NSUserDefaults standardUserDefaults] setDouble:value forKey:key]; -} - -- (void)setInteger:(int)value forKey:(NSString*)key { - [[NSUserDefaults standardUserDefaults] setInteger:value forKey:key]; -} - -- (void)setObject:(id)value forKey:(NSString*)key { - [[NSUserDefaults standardUserDefaults] setObject:value forKey:key]; -} - -- (BOOL)boolForKey:(NSString*)key { - return [[NSUserDefaults standardUserDefaults] boolForKey:key]; -} - -- (float)floatForKey:(NSString*)key { - return [[NSUserDefaults standardUserDefaults] floatForKey:key]; -} - -- (double)doubleForKey:(NSString*)key { - return [[NSUserDefaults standardUserDefaults] doubleForKey:key]; -} - -- (int)integerForKey:(NSString*)key { - return (int)[[NSUserDefaults standardUserDefaults] integerForKey:key]; -} - -- (id)objectForKey:(NSString*)key { - return [[NSUserDefaults standardUserDefaults] objectForKey:key]; -} - -- (BOOL)synchronize { - return [[NSUserDefaults standardUserDefaults] synchronize]; -} - -@end diff --git a/Classes/Utils/InAppSettingsKit/Models/IASKSpecifier.h b/Classes/Utils/InAppSettingsKit/Models/IASKSpecifier.h deleted file mode 100755 index cec727d9f..000000000 --- a/Classes/Utils/InAppSettingsKit/Models/IASKSpecifier.h +++ /dev/null @@ -1,62 +0,0 @@ -// -// IASKSpecifier.h -// http://www.inappsettingskit.com -// -// Copyright (c) 2009: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import -#import - -@class IASKSettingsReader; - -@interface IASKSpecifier : NSObject { - NSDictionary *_specifierDict; - NSDictionary *_multipleValuesDict; - IASKSettingsReader *__weak _settingsReader; -} -@property(nonatomic, strong) NSDictionary *specifierDict; -@property(nonatomic, weak) IASKSettingsReader *settingsReader; - -- (id)initWithSpecifier:(NSDictionary*)specifier; -- (NSString*)localizedObjectForKey:(NSString*)key; -- (NSString*)title; -- (NSString*)key; -- (NSString*)type; -- (NSString*)titleForCurrentValue:(id)currentValue; -- (NSInteger)multipleValuesCount; -- (NSArray*)multipleValues; -- (NSArray*)multipleTitles; -- (NSString*)file; -- (id)defaultValue; -- (id)defaultStringValue; -- (BOOL)defaultBoolValue; -- (id)trueValue; -- (id)falseValue; -- (float)minimumValue; -- (float)maximumValue; -- (NSString*)minimumValueImage; -- (NSString*)maximumValueImage; -- (BOOL)isSecure; -- (UIKeyboardType)keyboardType; -- (UITextAutocapitalizationType)autocapitalizationType; -- (UITextAutocorrectionType)autoCorrectionType; -- (NSString*)footerText; -- (Class)viewControllerClass; -- (SEL)viewControllerSelector; --(Class)buttonClass; --(SEL)buttonAction; -- (UIImage *)cellImage; -- (UIImage *)highlightedCellImage; -- (BOOL)adjustsFontSizeToFitWidth; -- (NSTextAlignment)textAlignment; -@end diff --git a/Classes/Utils/InAppSettingsKit/Models/IASKSpecifier.m b/Classes/Utils/InAppSettingsKit/Models/IASKSpecifier.m deleted file mode 100755 index 503b71a8b..000000000 --- a/Classes/Utils/InAppSettingsKit/Models/IASKSpecifier.m +++ /dev/null @@ -1,269 +0,0 @@ -// -// IASKSpecifier.m -// http://www.inappsettingskit.com -// -// Copyright (c) 2009: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKSpecifier.h" -#import "IASKSettingsReader.h" - -@interface IASKSpecifier () -@property(nonatomic, strong) NSDictionary *multipleValuesDict; -- (void)_reinterpretValues:(NSDictionary*)specifierDict; -@end - -@implementation IASKSpecifier - -@synthesize specifierDict=_specifierDict; -@synthesize multipleValuesDict=_multipleValuesDict; -@synthesize settingsReader = _settingsReader; - -- (id)initWithSpecifier:(NSDictionary*)specifier { - if ((self = [super init])) { - [self setSpecifierDict:specifier]; - - if ([[self type] isEqualToString:kIASKPSMultiValueSpecifier] || - [[self type] isEqualToString:kIASKPSTitleValueSpecifier]) { - [self _reinterpretValues:[self specifierDict]]; - } - } - return self; -} - -- (void)dealloc { - _specifierDict = nil; - _multipleValuesDict = nil; - - _settingsReader = nil; - -} - -- (void)_reinterpretValues:(NSDictionary*)specifierDict { - NSArray *values = [_specifierDict objectForKey:kIASKValues]; - NSArray *titles = [_specifierDict objectForKey:kIASKTitles]; - - NSMutableDictionary *multipleValuesDict = [[NSMutableDictionary alloc] init]; - - if (values) { - [multipleValuesDict setObject:values forKey:kIASKValues]; - } - - if (titles) { - [multipleValuesDict setObject:titles forKey:kIASKTitles]; - } - - [self setMultipleValuesDict:multipleValuesDict]; -} -- (NSString*)localizedObjectForKey:(NSString*)key { - return [self.settingsReader titleForStringId:[_specifierDict objectForKey:key]]; -} - -- (NSString*)title { - return [self localizedObjectForKey:kIASKTitle]; -} - -- (NSString*)footerText { - return [self localizedObjectForKey:kIASKFooterText]; -} - --(Class) viewControllerClass { - return NSClassFromString([_specifierDict objectForKey:kIASKViewControllerClass]); -} - --(SEL) viewControllerSelector { - return NSSelectorFromString([_specifierDict objectForKey:kIASKViewControllerSelector]); -} - --(Class)buttonClass { - return NSClassFromString([_specifierDict objectForKey:kIASKButtonClass]); -} - --(SEL)buttonAction { - return NSSelectorFromString([_specifierDict objectForKey:kIASKButtonAction]); -} - -- (NSString*)key { - return [_specifierDict objectForKey:kIASKKey]; -} - -- (NSString*)type { - return [_specifierDict objectForKey:kIASKType]; -} - -- (NSString*)titleForCurrentValue:(id)currentValue { - NSArray *values = [self multipleValues]; - NSArray *titles = [self multipleTitles]; - if (values.count != titles.count) { - return nil; - } - NSInteger keyIndex = [values indexOfObject:currentValue]; - if (keyIndex == NSNotFound) { - return nil; - } - @try { - return [self.settingsReader titleForStringId:[titles objectAtIndex:keyIndex]]; - } - @catch (NSException * e) {} - return nil; -} - -- (NSInteger)multipleValuesCount { - return [[_multipleValuesDict objectForKey:kIASKValues] count]; -} - -- (NSArray*)multipleValues { - return [_multipleValuesDict objectForKey:kIASKValues]; -} - -- (NSArray*)multipleTitles { - return [_multipleValuesDict objectForKey:kIASKTitles]; -} - -- (NSString*)file { - return [_specifierDict objectForKey:kIASKFile]; -} - -- (id)defaultValue { - return [_specifierDict objectForKey:kIASKDefaultValue]; -} - -- (id)defaultStringValue { - return [[_specifierDict objectForKey:kIASKDefaultValue] description]; -} - -- (BOOL)defaultBoolValue { - id defaultValue = [self defaultValue]; - if ([defaultValue isEqual:[self trueValue]]) { - return YES; - } - if ([defaultValue isEqual:[self falseValue]]) { - return NO; - } - return [defaultValue boolValue]; -} - -- (id)trueValue { - return [_specifierDict objectForKey:kIASKTrueValue]; -} - -- (id)falseValue { - return [_specifierDict objectForKey:kIASKFalseValue]; -} - -- (float)minimumValue { - return [[_specifierDict objectForKey:kIASKMinimumValue] floatValue]; -} - -- (float)maximumValue { - return [[_specifierDict objectForKey:kIASKMaximumValue] floatValue]; -} - -- (NSString*)minimumValueImage { - return [_specifierDict objectForKey:kIASKMinimumValueImage]; -} - -- (NSString*)maximumValueImage { - return [_specifierDict objectForKey:kIASKMaximumValueImage]; -} - -- (BOOL)isSecure { - return [[_specifierDict objectForKey:kIASKIsSecure] boolValue]; -} - -- (UIKeyboardType)keyboardType { - if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardAlphabet]) { - return UIKeyboardTypeDefault; - } - else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardNumbersAndPunctuation]) { - return UIKeyboardTypeNumbersAndPunctuation; - } - else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardNumberPad]) { - return UIKeyboardTypeNumberPad; - } - else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardDecimalPad]) { - if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_4_1) { - return UIKeyboardTypeDecimalPad; - } - else { - return UIKeyboardTypeNumbersAndPunctuation; - } - } - else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:KIASKKeyboardURL]) { - return UIKeyboardTypeURL; - } - else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardEmailAddress]) { - return UIKeyboardTypeEmailAddress; - } - return UIKeyboardTypeDefault; -} - -- (UITextAutocapitalizationType)autocapitalizationType { - if ([[_specifierDict objectForKey:kIASKAutocapitalizationType] isEqualToString:kIASKAutoCapNone]) { - return UITextAutocapitalizationTypeNone; - } - else if ([[_specifierDict objectForKey:kIASKAutocapitalizationType] isEqualToString:kIASKAutoCapSentences]) { - return UITextAutocapitalizationTypeSentences; - } - else if ([[_specifierDict objectForKey:kIASKAutocapitalizationType] isEqualToString:kIASKAutoCapWords]) { - return UITextAutocapitalizationTypeWords; - } - else if ([[_specifierDict objectForKey:kIASKAutocapitalizationType] isEqualToString:kIASKAutoCapAllCharacters]) { - return UITextAutocapitalizationTypeAllCharacters; - } - return UITextAutocapitalizationTypeNone; -} - -- (UITextAutocorrectionType)autoCorrectionType { - if ([[_specifierDict objectForKey:kIASKAutoCorrectionType] isEqualToString:kIASKAutoCorrDefault]) { - return UITextAutocorrectionTypeDefault; - } - else if ([[_specifierDict objectForKey:kIASKAutoCorrectionType] isEqualToString:kIASKAutoCorrNo]) { - return UITextAutocorrectionTypeNo; - } - else if ([[_specifierDict objectForKey:kIASKAutoCorrectionType] isEqualToString:kIASKAutoCorrYes]) { - return UITextAutocorrectionTypeYes; - } - return UITextAutocorrectionTypeDefault; -} - -- (UIImage *)cellImage -{ - return [UIImage imageNamed:[_specifierDict objectForKey:kIASKCellImage]]; -} - -- (UIImage *)highlightedCellImage -{ - return [UIImage imageNamed:[[_specifierDict objectForKey:kIASKCellImage ] stringByAppendingString:@"Highlighted"]]; -} - -- (BOOL)adjustsFontSizeToFitWidth { - NSNumber *boxedResult = [_specifierDict objectForKey:kIASKAdjustsFontSizeToFitWidth]; - return !boxedResult || [boxedResult boolValue]; -} - -- (NSTextAlignment)textAlignment { - if ([[_specifierDict objectForKey:kIASKTextLabelAlignment] isEqualToString:kIASKTextLabelAlignmentLeft]) { - return NSTextAlignmentLeft; - } else if ([[_specifierDict objectForKey:kIASKTextLabelAlignment] isEqualToString:kIASKTextLabelAlignmentCenter]) { - return NSTextAlignmentCenter; - } else if ([[_specifierDict objectForKey:kIASKTextLabelAlignment] isEqualToString:kIASKTextLabelAlignmentRight]) { - return NSTextAlignmentRight; - } - if ([self.type isEqualToString:kIASKButtonSpecifier] && !self.cellImage) { - return NSTextAlignmentCenter; - } else if ([self.type isEqualToString:kIASKPSMultiValueSpecifier] || [self.type isEqualToString:kIASKPSTitleValueSpecifier]) { - return NSTextAlignmentRight; - } - return NSTextAlignmentLeft; -} -@end diff --git a/Classes/Utils/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.h b/Classes/Utils/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.h deleted file mode 100755 index ed2f606a6..000000000 --- a/Classes/Utils/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.h +++ /dev/null @@ -1,27 +0,0 @@ -// -// IASKPSSliderSpecifierViewCell.h -// http://www.inappsettingskit.com -// -// Copyright (c) 2009: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import - -@class IASKSlider; - -@interface IASKPSSliderSpecifierViewCell : UITableViewCell - -@property(nonatomic, strong) IASKSlider *slider; -@property(nonatomic, strong) UIImageView *minImage; -@property(nonatomic, strong) UIImageView *maxImage; - -@end diff --git a/Classes/Utils/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.m b/Classes/Utils/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.m deleted file mode 100755 index cf320dfaa..000000000 --- a/Classes/Utils/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.m +++ /dev/null @@ -1,92 +0,0 @@ -// -// IASKPSSliderSpecifierViewCell.m -// http://www.inappsettingskit.com -// -// Copyright (c) 2009-2010: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKPSSliderSpecifierViewCell.h" -#import "IASKSlider.h" -#import "IASKSettingsReader.h" - -@implementation IASKPSSliderSpecifierViewCell -- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier -{ - self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; - if (self) { - // Setting only frame data that will not be overwritten by layoutSubviews - // Slider - _slider = [[IASKSlider alloc] initWithFrame:CGRectMake(0, 0, 0, 23)]; - _slider.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleWidth; - _slider.continuous = NO; - [self.contentView addSubview:_slider]; - - // MinImage - _minImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 21, 21)]; - _minImage.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin; - [self.contentView addSubview:_minImage]; - - // MaxImage - _maxImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 21, 21)]; - _maxImage.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleBottomMargin; - [self.contentView addSubview:_maxImage]; - - self.selectionStyle = UITableViewCellSelectionStyleNone; - } - return self; -} - -- (void)layoutSubviews { - [super layoutSubviews]; - CGRect sliderBounds = _slider.bounds; - CGPoint sliderCenter = _slider.center; - const double superViewWidth = _slider.superview.frame.size.width; - - sliderCenter.x = superViewWidth / 2; - sliderCenter.y = self.contentView.center.y; - sliderBounds.size.width = superViewWidth - kIASKSliderNoImagesPadding * 2; - _minImage.hidden = YES; - _maxImage.hidden = YES; - - // Check if there are min and max images. If so, change the layout accordingly. - if (_minImage.image) { - // Min image - _minImage.hidden = NO; - sliderCenter.x += (kIASKSliderImagesPadding - kIASKSliderNoImagesPadding) / 2; - sliderBounds.size.width -= (kIASKSliderImagesPadding - kIASKSliderNoImagesPadding); - _minImage.center = CGPointMake(_minImage.frame.size.width / 2 + kIASKPaddingLeft, - self.contentView.center.y); - } - if (_maxImage.image) { - // Max image - _maxImage.hidden = NO; - sliderCenter.x -= (kIASKSliderImagesPadding - kIASKSliderNoImagesPadding) / 2; - sliderBounds.size.width -= (kIASKSliderImagesPadding - kIASKSliderNoImagesPadding); - _maxImage.center = CGPointMake(self.contentView.bounds.size.width - _maxImage.frame.size.width / 2 - kIASKPaddingRight, - self.contentView.center.y); - } - - _slider.bounds = sliderBounds; - _slider.center = sliderCenter; -} - -- (void)dealloc { - _minImage.image = nil; - _maxImage.image = nil; -} - -- (void)prepareForReuse { - [super prepareForReuse]; - _minImage.image = nil; - _maxImage.image = nil; -} -@end diff --git a/Classes/Utils/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.h b/Classes/Utils/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.h deleted file mode 100755 index 8958ee26a..000000000 --- a/Classes/Utils/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.h +++ /dev/null @@ -1,25 +0,0 @@ -// -// IASKPSTextFieldSpecifierViewCell.h -// http://www.inappsettingskit.com -// -// Copyright (c) 2009: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import - -@class IASKTextField; - -@interface IASKPSTextFieldSpecifierViewCell : UITableViewCell - -@property(nonatomic, strong) IASKTextField *textField; - -@end diff --git a/Classes/Utils/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m b/Classes/Utils/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m deleted file mode 100755 index 63b8ab43a..000000000 --- a/Classes/Utils/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m +++ /dev/null @@ -1,72 +0,0 @@ -// -// IASKPSTextFieldSpecifierViewCell.m -// http://www.inappsettingskit.com -// -// Copyright (c) 2009-2010: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#pragma deploymate push "ignored-api-availability" -#import "IASKPSTextFieldSpecifierViewCell.h" -#import "IASKTextField.h" -#import "IASKSettingsReader.h" - -@implementation IASKPSTextFieldSpecifierViewCell - -@synthesize textField=_textField; - -- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier -{ - self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; - if (self) { - self.textLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin; - - // TextField - _textField = [[IASKTextField alloc] initWithFrame:CGRectMake(0, 0, 200, 21)]; - _textField.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin | - UIViewAutoresizingFlexibleLeftMargin; - _textField.font = [UIFont systemFontOfSize:17.0f]; - _textField.minimumFontSize = kIASKMinimumFontSize; - _textField.textColor = [UIColor colorWithRed:0.275 green:0.376 blue:0.522 alpha:1.000]; - [self.contentView addSubview:_textField]; - - self.selectionStyle = UITableViewCellSelectionStyleNone; - } - return self; -} - -- (void)layoutSubviews { - [super layoutSubviews]; - - // Label - CGFloat imageOffset = self.imageView.image ? self.imageView.bounds.size.width + kIASKPaddingLeft : 0; - CGSize labelSize = [self.textLabel sizeThatFits:CGSizeZero]; - labelSize.width = MAX(labelSize.width, kIASKMinLabelWidth - imageOffset); - self.textLabel.frame = (CGRect){self.textLabel.frame.origin, {MIN(kIASKMaxLabelWidth, labelSize.width), self.textLabel.frame.size.height}} ; - - // TextField - _textField.center = CGPointMake(_textField.center.x, self.contentView.center.y); - CGRect textFieldFrame = _textField.frame; - textFieldFrame.origin.x = self.textLabel.frame.origin.x + MAX(kIASKMinLabelWidth - imageOffset, self.textLabel.frame.size.width) + kIASKSpacing; - textFieldFrame.size.width = _textField.superview.frame.size.width - textFieldFrame.origin.x - kIASKPaddingRight; - - if (!self.textLabel.text.length) { - textFieldFrame.origin.x = kIASKPaddingLeft + imageOffset; - textFieldFrame.size.width = self.contentView.bounds.size.width - 2* kIASKPaddingLeft - imageOffset; - } else if (_textField.textAlignment == UITextAlignmentRight) { - textFieldFrame.origin.x = self.textLabel.frame.origin.x + labelSize.width + kIASKSpacing; - textFieldFrame.size.width = _textField.superview.frame.size.width - textFieldFrame.origin.x - kIASKPaddingRight; - } - _textField.frame = textFieldFrame; -} -#pragma deploymate pop - -@end diff --git a/Classes/Utils/InAppSettingsKit/Views/IASKSlider.h b/Classes/Utils/InAppSettingsKit/Views/IASKSlider.h deleted file mode 100755 index ddaa5c4df..000000000 --- a/Classes/Utils/InAppSettingsKit/Views/IASKSlider.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// IASKSlider.h -// http://www.inappsettingskit.com -// -// Copyright (c) 2009: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import - - -@interface IASKSlider : UISlider { - NSString *_key; -} - -@property(nonatomic, strong) NSString *key; - -@end diff --git a/Classes/Utils/InAppSettingsKit/Views/IASKSlider.m b/Classes/Utils/InAppSettingsKit/Views/IASKSlider.m deleted file mode 100755 index 3c4ca4567..000000000 --- a/Classes/Utils/InAppSettingsKit/Views/IASKSlider.m +++ /dev/null @@ -1,28 +0,0 @@ -// -// IASKSlider.m -// http://www.inappsettingskit.com -// -// Copyright (c) 2009: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKSlider.h" - - -@implementation IASKSlider - -@synthesize key=_key; - -- (void)dealloc { - _key = nil; -} - -@end diff --git a/Classes/Utils/InAppSettingsKit/Views/IASKSwitch.h b/Classes/Utils/InAppSettingsKit/Views/IASKSwitch.h deleted file mode 100755 index 7124c2ec8..000000000 --- a/Classes/Utils/InAppSettingsKit/Views/IASKSwitch.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// IASKSwitch.h -// http://www.inappsettingskit.com -// -// Copyright (c) 2009: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import - - -@interface IASKSwitch : UISwitch { - NSString *_key; -} - -@property(nonatomic, strong) NSString *key; - -@end diff --git a/Classes/Utils/InAppSettingsKit/Views/IASKSwitch.m b/Classes/Utils/InAppSettingsKit/Views/IASKSwitch.m deleted file mode 100755 index 2a0ce5f21..000000000 --- a/Classes/Utils/InAppSettingsKit/Views/IASKSwitch.m +++ /dev/null @@ -1,29 +0,0 @@ -// -// IASKSwitch.m -// http://www.inappsettingskit.com -// -// Copyright (c) 2009: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKSwitch.h" - - -@implementation IASKSwitch - -@synthesize key=_key; - -- (void)dealloc { - _key = nil; -} - - -@end diff --git a/Classes/Utils/InAppSettingsKit/Views/IASKTextField.h b/Classes/Utils/InAppSettingsKit/Views/IASKTextField.h deleted file mode 100755 index 7fb2467d2..000000000 --- a/Classes/Utils/InAppSettingsKit/Views/IASKTextField.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// IASKTextField.h -// http://www.inappsettingskit.com -// -// Copyright (c) 2009: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import - - -@interface IASKTextField : UITextField { - NSString *_key; -} - -@property(nonatomic, strong) NSString *key; - -@end diff --git a/Classes/Utils/InAppSettingsKit/Views/IASKTextField.m b/Classes/Utils/InAppSettingsKit/Views/IASKTextField.m deleted file mode 100755 index b4792b6b4..000000000 --- a/Classes/Utils/InAppSettingsKit/Views/IASKTextField.m +++ /dev/null @@ -1,28 +0,0 @@ -// -// IASKTextField.m -// http://www.inappsettingskit.com -// -// Copyright (c) 2009: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKTextField.h" - - -@implementation IASKTextField - -@synthesize key=_key; - -- (void)dealloc { - _key = nil; -} - -@end diff --git a/Classes/Utils/Log.m b/Classes/Utils/Log.m deleted file mode 100644 index a156f66fb..000000000 --- a/Classes/Utils/Log.m +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "Log.h" -#import -#import - -#ifdef USE_CRASHLYTICS -@import FirebaseCrashlytics; -#endif - -@implementation Log - -#define FILE_SIZE 17 -#define DOMAIN_SIZE 3 - - -+ (void)log:(OrtpLogLevel)severity file:(const char *)file line:(int)line format:(NSString *)format, ... { - va_list args; - va_start(args, format); - NSString *str = [[NSString alloc] initWithFormat:format arguments:args]; - const char *utf8str = [str cStringUsingEncoding:NSString.defaultCStringEncoding]; - const char *filename = strchr(file, '/') ? strrchr(file, '/') + 1 : file; - ortp_log(severity, "(%*s:%-4d) %s", FILE_SIZE, filename + MAX((int)strlen(filename) - FILE_SIZE, 0), line, utf8str); - va_end(args); -} - -+ (void)enableLogs:(OrtpLogLevel)level { - BOOL enabled = (level >= ORTP_DEBUG && level < ORTP_ERROR); - static BOOL stderrInUse = NO; - if (!stderrInUse) { - asl_add_log_file(NULL, STDERR_FILENO); - stderrInUse = YES; - } - LinphoneFactory *factory = linphone_factory_get(); - linphone_core_set_log_collection_path(linphone_factory_get_data_dir(factory, kLinphoneMsgNotificationAppGroupId.UTF8String)); - linphone_core_set_log_handler(linphone_iphone_log_handler); - linphone_core_enable_log_collection(enabled); - if (level == 0) { - linphone_core_set_log_level(ORTP_FATAL); - ortp_set_log_level("ios", ORTP_FATAL); - NSLog(@"I/%s/Disabling all logs", ORTP_LOG_DOMAIN); - } else { - NSLog(@"I/%s/Enabling %s logs", ORTP_LOG_DOMAIN, (enabled ? "all" : "application only")); - linphone_core_set_log_level(level); - ortp_set_log_level("ios", level == ORTP_DEBUG ? ORTP_DEBUG : ORTP_MESSAGE); - } -} - -+ (void)directLog:(OrtpLogLevel)level text:(NSString *)text { - bctbx_log(BCTBX_LOG_DOMAIN, level, "%s", [text cStringUsingEncoding:NSUTF8StringEncoding]); -} - -+(void)d:(NSString *)text { - [Log directLog:BCTBX_LOG_DEBUG text:text]; -} -+(void)i:(NSString *)text { - [Log directLog:BCTBX_LOG_MESSAGE text:text]; -} -+(void)w:(NSString *)text { - [Log directLog:BCTBX_LOG_WARNING text:text]; -} -+(void)e:(NSString *)text { - [Log directLog:BCTBX_LOG_ERROR text:text]; -} -+(void)f:(NSString *)text { - [Log directLog:BCTBX_LOG_FATAL text:text]; -} - -#pragma mark - Logs Functions callbacks - -void linphone_iphone_log_handler(const char *domain, OrtpLogLevel lev, const char *fmt, va_list args) { - NSString *format = [[NSString alloc] initWithUTF8String:fmt]; - NSString *formatedString = [[NSString alloc] initWithFormat:format arguments:args]; - NSString *lvl; - - if (!domain) - domain = "lib"; - // since \r are interpreted like \n, avoid double new lines when logging network packets (belle-sip) - // output format is like: I/ios/some logs. We truncate domain to **exactly** DOMAIN_SIZE characters to have - // fixed-length aligned logs - switch (lev) { - case ORTP_FATAL: - lvl = @"Fatal"; - break; - case ORTP_ERROR: - lvl = @"Error"; - break; - case ORTP_WARNING: - lvl = @"Warning"; - break; - case ORTP_MESSAGE: - lvl = @"Message"; - break; - case ORTP_DEBUG: - lvl = @"Debug"; - break; - case ORTP_TRACE: - lvl = @"Trace"; - break; - case ORTP_LOGLEV_END: - return; - } - if ([formatedString containsString:@"\n"]) { - NSArray *myWords = [[formatedString stringByReplacingOccurrencesOfString:@"\r\n" withString:@"\n"] - componentsSeparatedByString:@"\n"]; - for (int i = 0; i < myWords.count; i++) { - NSString *tab = i > 0 ? @"\t" : @""; - if (((NSString *)myWords[i]).length > 0) { -#ifdef USE_CRASHLYTICS - [[FIRCrashlytics crashlytics] logWithFormat:@"[%@] %@%@", lvl, tab, (NSString *)myWords[i]]; -#endif - NSLog(@"[%@] %@%@", lvl, tab, (NSString *)myWords[i]); - } - } - } else { -#ifdef USE_CRASHLYTICS - [[FIRCrashlytics crashlytics] logWithFormat:@"[%@] %@", lvl, [formatedString stringByReplacingOccurrencesOfString:@"\r\n" withString:@"\n"]]; -#endif - NSLog(@"[%@] %@", lvl, [formatedString stringByReplacingOccurrencesOfString:@"\r\n" withString:@"\n"]); - } -} - -@end diff --git a/Classes/Utils/OrderedDictionary.h b/Classes/Utils/OrderedDictionary.h deleted file mode 100644 index 2a3ecaa9d..000000000 --- a/Classes/Utils/OrderedDictionary.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// OrderedDictionary.h -// OrderedDictionary -// -// Created by Matt Gallagher on 19/12/08. -// Copyright 2008 Matt Gallagher. All rights reserved. -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. Permission is granted to anyone to -// use this software for any purpose, including commercial applications, and to -// alter it and redistribute it freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source -// distribution. -// - -@interface OrderedDictionary : NSMutableDictionary -{ - NSMutableDictionary *dictionary; - NSMutableArray *array; -} - -- (void)insertObject:(id)anObject forKey:(id)aKey atIndex:(NSUInteger)anIndex; -// Added by Diorcet Yann -- (void)insertObject:(id)anObject forKey:(id)aKey selector:(SEL) sel; -// -- (id)keyAtIndex:(NSUInteger)anIndex; -- (NSEnumerator *)reverseKeyEnumerator; - -@end diff --git a/Classes/Utils/OrderedDictionary.m b/Classes/Utils/OrderedDictionary.m deleted file mode 100644 index d644d0001..000000000 --- a/Classes/Utils/OrderedDictionary.m +++ /dev/null @@ -1,142 +0,0 @@ -// -// OrderedDictionary.m -// OrderedDictionary -// -// Created by Matt Gallagher on 19/12/08. -// Copyright 2008 Matt Gallagher. All rights reserved. -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. Permission is granted to anyone to -// use this software for any purpose, including commercial applications, and to -// alter it and redistribute it freely, subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source -// distribution. -// - -#import "OrderedDictionary.h" - -NSString *DescriptionForObject(NSObject *object, id locale, NSUInteger indent) { - NSString *objectString; - if ([object isKindOfClass:[NSString class]]) { - objectString = (NSString *)object; - } else if ([object respondsToSelector:@selector(descriptionWithLocale:indent:)]) { - objectString = [(NSDictionary *)object descriptionWithLocale:locale indent:indent]; - } else if ([object respondsToSelector:@selector(descriptionWithLocale:)]) { - objectString = [(NSSet *)object descriptionWithLocale:locale]; - } else { - objectString = [object description]; - } - return objectString; -} - -@implementation OrderedDictionary - -- (void)initObjectsWithCapacity:(NSUInteger)capacity { - if (self != nil) { - dictionary = [[NSMutableDictionary alloc] initWithCapacity:capacity]; - array = [[NSMutableArray alloc] initWithCapacity:capacity]; - } -} - -- (id)init { - self = [super init]; - [self initObjectsWithCapacity:0]; - return self; -} - -- (id)initWithCapacity:(NSUInteger)capacity { - self = [super init]; - [self initObjectsWithCapacity:0]; - return self; -} - -- (id)copy { - return [self mutableCopy]; -} - -- (void)setObject:(id)anObject forKey:(id)aKey { - if (![dictionary objectForKey:aKey]) { - [array addObject:aKey]; - } - [dictionary setObject:anObject forKey:aKey]; -} - -- (void)removeObjectForKey:(id)aKey { - [dictionary removeObjectForKey:aKey]; - [array removeObject:aKey]; -} - -- (NSUInteger)count { - return [dictionary count]; -} - -- (id)objectForKey:(id)aKey { - return [dictionary objectForKey:aKey]; -} - -- (NSEnumerator *)keyEnumerator { - return [array objectEnumerator]; -} - -- (NSEnumerator *)reverseKeyEnumerator { - return [array reverseObjectEnumerator]; -} - -// Added by Diorcet Yann -- (void)insertObject:(id)anObject forKey:(id)aKey selector:(SEL)comparator { - if ([dictionary objectForKey:aKey]) { - [self removeObjectForKey:aKey]; - } - NSUInteger anIndex; - IMP imp = [aKey methodForSelector:comparator]; - NSComparisonResult (*func)(id, SEL, id) = (void *)imp; - - for (anIndex = 0; anIndex < [array count]; ++anIndex) { - NSComparisonResult result = (NSComparisonResult)func(aKey, comparator, [array objectAtIndex:anIndex]); - if (result <= 0) { - break; - } - } - [array insertObject:aKey atIndex:anIndex]; - [dictionary setObject:anObject forKey:aKey]; -} -// - -- (void)insertObject:(id)anObject forKey:(id)aKey atIndex:(NSUInteger)anIndex { - if ([dictionary objectForKey:aKey]) { - [self removeObjectForKey:aKey]; - } - [array insertObject:aKey atIndex:anIndex]; - [dictionary setObject:anObject forKey:aKey]; -} - -- (id)keyAtIndex:(NSUInteger)anIndex { - return [array objectAtIndex:anIndex]; -} - -- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level { - NSMutableString *indentString = [NSMutableString string]; - NSUInteger i, count = level; - for (i = 0; i < count; i++) { - [indentString appendFormat:@" "]; - } - - NSMutableString *description = [NSMutableString string]; - [description appendFormat:@"%@{\n", indentString]; - for (NSObject *key in self) { - [description appendFormat:@"%@ %@ = %@;\n", indentString, DescriptionForObject(key, locale, level), - DescriptionForObject([self objectForKey:key], locale, level)]; - } - [description appendFormat:@"%@}\n", indentString]; - return description; -} - -@end diff --git a/Classes/Utils/TPKeyboardAvoiding/LICENSE.txt b/Classes/Utils/TPKeyboardAvoiding/LICENSE.txt deleted file mode 100755 index b2071e3e3..000000000 --- a/Classes/Utils/TPKeyboardAvoiding/LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2013 Michael Tyson - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - -3. This notice may not be removed or altered from any source - distribution. \ No newline at end of file diff --git a/Classes/Utils/TPKeyboardAvoiding/TPKeyboardAvoidingCollectionView.h b/Classes/Utils/TPKeyboardAvoiding/TPKeyboardAvoidingCollectionView.h deleted file mode 100755 index b870e97fd..000000000 --- a/Classes/Utils/TPKeyboardAvoiding/TPKeyboardAvoidingCollectionView.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// TPKeyboardAvoidingCollectionView.h -// -// Created by Michael Tyson on 30/09/2013. -// Copyright 2013 A Tasty Pixel & The CocoaBots. All rights reserved. -// - -#import -#import "UIScrollView+TPKeyboardAvoidingAdditions.h" - -@interface TPKeyboardAvoidingCollectionView : UICollectionView -- (BOOL)focusNextTextField; -- (void)scrollToActiveTextField; -@end diff --git a/Classes/Utils/TPKeyboardAvoiding/TPKeyboardAvoidingCollectionView.m b/Classes/Utils/TPKeyboardAvoiding/TPKeyboardAvoidingCollectionView.m deleted file mode 100755 index 59cfffe62..000000000 --- a/Classes/Utils/TPKeyboardAvoiding/TPKeyboardAvoidingCollectionView.m +++ /dev/null @@ -1,109 +0,0 @@ -// -// TPKeyboardAvoidingCollectionView.m -// -// Created by Michael Tyson on 30/09/2013. -// Copyright 2013 A Tasty Pixel & The CocoaBots. All rights reserved. -// - -#import "TPKeyboardAvoidingCollectionView.h" - -@interface TPKeyboardAvoidingCollectionView () -@end - -@implementation TPKeyboardAvoidingCollectionView - -#pragma mark - Setup/Teardown - -- (void)setup { - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(TPKeyboardAvoiding_keyboardWillShow:) - name:UIKeyboardWillShowNotification - object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(TPKeyboardAvoiding_keyboardWillHide:) - name:UIKeyboardWillHideNotification - object:nil]; -} - -- (id)initWithFrame:(CGRect)frame { - if (!(self = [super initWithFrame:frame])) - return nil; - [self setup]; - return self; -} - -- (id)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout { - if (!(self = [super initWithFrame:frame collectionViewLayout:layout])) - return nil; - [self setup]; - return self; -} - -- (void)awakeFromNib { - [super awakeFromNib]; - [self setup]; -} - -- (void)dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; -#if !__has_feature(objc_arc) - [super dealloc]; -#endif -} - -- (void)setFrame:(CGRect)frame { - [super setFrame:frame]; - [self TPKeyboardAvoiding_updateContentInset]; -} - -- (void)setContentSize:(CGSize)contentSize { - if (CGSizeEqualToSize(contentSize, self.contentSize)) { - // Prevent triggering contentSize when it's already the same that - // cause weird infinte scrolling and locking bug - return; - } - [super setContentSize:contentSize]; - [self TPKeyboardAvoiding_updateContentInset]; -} - -- (BOOL)focusNextTextField { - return [self TPKeyboardAvoiding_focusNextTextField]; -} -- (void)scrollToActiveTextField { - return [self TPKeyboardAvoiding_scrollToActiveTextField]; -} - -#pragma mark - Responders, events - -- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { - [[self TPKeyboardAvoiding_findFirstResponderBeneathView:self] resignFirstResponder]; - [super touchesEnded:touches withEvent:event]; -} - -- (BOOL)textFieldShouldReturn:(UITextField *)textField { - if (![self focusNextTextField]) { - [textField resignFirstResponder]; - } - return YES; -} - -- (void)textFieldDidBeginEditing:(UITextField *)textField { - [self scrollToActiveTextField]; -} - -- (void)textViewDidBeginEditing:(UITextView *)textView { - [self scrollToActiveTextField]; -} - -- (void)layoutSubviews { - [super layoutSubviews]; - [NSObject - cancelPreviousPerformRequestsWithTarget:self - selector:@selector(TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView:) - object:self]; - [self performSelector:@selector(TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView:) - withObject:self - afterDelay:0.1]; -} - -@end diff --git a/Classes/Utils/TPKeyboardAvoiding/TPKeyboardAvoidingScrollView.h b/Classes/Utils/TPKeyboardAvoiding/TPKeyboardAvoidingScrollView.h deleted file mode 100755 index 4d38de93c..000000000 --- a/Classes/Utils/TPKeyboardAvoiding/TPKeyboardAvoidingScrollView.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// TPKeyboardAvoidingScrollView.h -// -// Created by Michael Tyson on 30/09/2013. -// Copyright 2013 A Tasty Pixel. All rights reserved. -// - -#import -#import "UIScrollView+TPKeyboardAvoidingAdditions.h" - -@interface TPKeyboardAvoidingScrollView : UIScrollView -- (void)contentSizeToFit; -- (BOOL)focusNextTextField; -- (void)scrollToActiveTextField; -@end diff --git a/Classes/Utils/TPKeyboardAvoiding/TPKeyboardAvoidingScrollView.m b/Classes/Utils/TPKeyboardAvoiding/TPKeyboardAvoidingScrollView.m deleted file mode 100755 index 7b1f3fc37..000000000 --- a/Classes/Utils/TPKeyboardAvoiding/TPKeyboardAvoidingScrollView.m +++ /dev/null @@ -1,101 +0,0 @@ -// -// TPKeyboardAvoidingScrollView.m -// -// Created by Michael Tyson on 30/09/2013. -// Copyright 2013 A Tasty Pixel. All rights reserved. -// - -#import "TPKeyboardAvoidingScrollView.h" - -@interface TPKeyboardAvoidingScrollView () -@end - -@implementation TPKeyboardAvoidingScrollView - -#pragma mark - Setup/Teardown - -- (void)setup { - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(TPKeyboardAvoiding_keyboardWillShow:) - name:UIKeyboardWillShowNotification - object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(TPKeyboardAvoiding_keyboardWillHide:) - name:UIKeyboardWillHideNotification - object:nil]; -} - -- (id)initWithFrame:(CGRect)frame { - if (!(self = [super initWithFrame:frame])) - return nil; - [self setup]; - return self; -} - -- (void)awakeFromNib { - [super awakeFromNib]; - [self setup]; -} - -- (void)dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; -#if !__has_feature(objc_arc) - [super dealloc]; -#endif -} - -- (void)setFrame:(CGRect)frame { - [super setFrame:frame]; - [self TPKeyboardAvoiding_updateContentInset]; -} - -- (void)setContentSize:(CGSize)contentSize { - [super setContentSize:contentSize]; - [self TPKeyboardAvoiding_updateFromContentSizeChange]; -} - -- (void)contentSizeToFit { - self.contentSize = [self TPKeyboardAvoiding_calculatedContentSizeFromSubviewFrames]; -} - -- (BOOL)focusNextTextField { - return [self TPKeyboardAvoiding_focusNextTextField]; -} -- (void)scrollToActiveTextField { - return [self TPKeyboardAvoiding_scrollToActiveTextField]; -} - -#pragma mark - Responders, events - -- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { - [[self TPKeyboardAvoiding_findFirstResponderBeneathView:self] resignFirstResponder]; - [super touchesEnded:touches withEvent:event]; -} - -- (BOOL)textFieldShouldReturn:(UITextField *)textField { - if (![self focusNextTextField]) { - [textField resignFirstResponder]; - } - return YES; -} - -- (void)textFieldDidBeginEditing:(UITextField *)textField { - [self scrollToActiveTextField]; -} - -- (void)textViewDidBeginEditing:(UITextView *)textView { - [self scrollToActiveTextField]; -} - -- (void)layoutSubviews { - [super layoutSubviews]; - [NSObject - cancelPreviousPerformRequestsWithTarget:self - selector:@selector(TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView:) - object:self]; - [self performSelector:@selector(TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView:) - withObject:self - afterDelay:0.1]; -} - -@end diff --git a/Classes/Utils/TPKeyboardAvoiding/TPKeyboardAvoidingTableView.h b/Classes/Utils/TPKeyboardAvoiding/TPKeyboardAvoidingTableView.h deleted file mode 100755 index 83cde3204..000000000 --- a/Classes/Utils/TPKeyboardAvoiding/TPKeyboardAvoidingTableView.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// TPKeyboardAvoidingTableView.h -// -// Created by Michael Tyson on 30/09/2013. -// Copyright 2013 A Tasty Pixel. All rights reserved. -// - -#import -#import "UIScrollView+TPKeyboardAvoidingAdditions.h" - -@interface TPKeyboardAvoidingTableView : UITableView -- (BOOL)focusNextTextField; -- (void)scrollToActiveTextField; -@end diff --git a/Classes/Utils/TPKeyboardAvoiding/TPKeyboardAvoidingTableView.m b/Classes/Utils/TPKeyboardAvoiding/TPKeyboardAvoidingTableView.m deleted file mode 100755 index 3f2777018..000000000 --- a/Classes/Utils/TPKeyboardAvoiding/TPKeyboardAvoidingTableView.m +++ /dev/null @@ -1,104 +0,0 @@ -// -// TPKeyboardAvoidingTableView.m -// -// Created by Michael Tyson on 30/09/2013. -// Copyright 2013 A Tasty Pixel. All rights reserved. -// - -#import "TPKeyboardAvoidingTableView.h" - -@interface TPKeyboardAvoidingTableView () -@end - -@implementation TPKeyboardAvoidingTableView - -#pragma mark - Setup/Teardown - -- (void)setup { - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(TPKeyboardAvoiding_keyboardWillShow:) - name:UIKeyboardWillShowNotification - object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(TPKeyboardAvoiding_keyboardWillHide:) - name:UIKeyboardWillHideNotification - object:nil]; -} - -- (id)initWithFrame:(CGRect)frame { - if (!(self = [super initWithFrame:frame])) - return nil; - [self setup]; - return self; -} - -- (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)withStyle { - if (!(self = [super initWithFrame:frame style:withStyle])) - return nil; - [self setup]; - return self; -} - -- (void)awakeFromNib { - [super awakeFromNib]; - [self setup]; -} - -- (void)dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; -#if !__has_feature(objc_arc) - [super dealloc]; -#endif -} - -- (void)setFrame:(CGRect)frame { - [super setFrame:frame]; - [self TPKeyboardAvoiding_updateContentInset]; -} - -- (void)setContentSize:(CGSize)contentSize { - [super setContentSize:contentSize]; - [self TPKeyboardAvoiding_updateContentInset]; -} - -- (BOOL)focusNextTextField { - return [self TPKeyboardAvoiding_focusNextTextField]; -} -- (void)scrollToActiveTextField { - return [self TPKeyboardAvoiding_scrollToActiveTextField]; -} - -#pragma mark - Responders, events - -- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { - [[self TPKeyboardAvoiding_findFirstResponderBeneathView:self] resignFirstResponder]; - [super touchesEnded:touches withEvent:event]; -} - -- (BOOL)textFieldShouldReturn:(UITextField *)textField { - if (![self focusNextTextField]) { - [textField resignFirstResponder]; - } - return YES; -} - -- (void)textFieldDidBeginEditing:(UITextField *)textField { - [self scrollToActiveTextField]; -} - -- (void)textViewDidBeginEditing:(UITextView *)textView { - [self scrollToActiveTextField]; -} - -- (void)layoutSubviews { - [super layoutSubviews]; - [NSObject - cancelPreviousPerformRequestsWithTarget:self - selector:@selector(TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView:) - object:self]; - [self performSelector:@selector(TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView:) - withObject:self - afterDelay:0.1]; -} - -@end diff --git a/Classes/Utils/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.h b/Classes/Utils/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.h deleted file mode 100755 index 103b5cb25..000000000 --- a/Classes/Utils/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// UIScrollView+TPKeyboardAvoidingAdditions.h -// TPKeyboardAvoidingSample -// -// Created by Michael Tyson on 30/09/2013. -// Copyright 2013 A Tasty Pixel. All rights reserved. -// - -#import - -@interface UIScrollView (TPKeyboardAvoidingAdditions) -- (BOOL)TPKeyboardAvoiding_focusNextTextField; -- (void)TPKeyboardAvoiding_scrollToActiveTextField; - -- (void)TPKeyboardAvoiding_keyboardWillShow:(NSNotification *)notification; -- (void)TPKeyboardAvoiding_keyboardWillHide:(NSNotification *)notification; -- (void)TPKeyboardAvoiding_updateContentInset; -- (void)TPKeyboardAvoiding_updateFromContentSizeChange; -- (void)TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView:(UIView *)view; -- (UIView *)TPKeyboardAvoiding_findFirstResponderBeneathView:(UIView *)view; -- (CGSize)TPKeyboardAvoiding_calculatedContentSizeFromSubviewFrames; -@end diff --git a/Classes/Utils/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m b/Classes/Utils/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m deleted file mode 100755 index de9279d55..000000000 --- a/Classes/Utils/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m +++ /dev/null @@ -1,301 +0,0 @@ -// -// UIScrollView+TPKeyboardAvoidingAdditions.m -// TPKeyboardAvoidingSample -// -// Created by Michael Tyson on 30/09/2013. -// Copyright 2013 A Tasty Pixel. All rights reserved. -// - -#import "UIScrollView+TPKeyboardAvoidingAdditions.h" -#import "TPKeyboardAvoidingScrollView.h" -#import - -static const CGFloat kCalculatedContentPadding = 10; -static const CGFloat kMinimumScrollOffsetPadding = 20; - -static const int kStateKey; - -#define _UIKeyboardFrameEndUserInfoKey \ - (&UIKeyboardFrameEndUserInfoKey != NULL ? UIKeyboardFrameEndUserInfoKey : @"UIKeyboardBoundsUserInfoKey") - -@interface TPKeyboardAvoidingState : NSObject -@property(nonatomic, assign) UIEdgeInsets priorInset; -@property(nonatomic, assign) UIEdgeInsets priorScrollIndicatorInsets; -@property(nonatomic, assign) BOOL keyboardVisible; -@property(nonatomic, assign) CGRect keyboardRect; -@property(nonatomic, assign) CGSize priorContentSize; -@end - -@implementation UIScrollView (TPKeyboardAvoidingAdditions) - -- (TPKeyboardAvoidingState *)keyboardAvoidingState { - TPKeyboardAvoidingState *state = objc_getAssociatedObject(self, &kStateKey); - if (!state) { - state = [[TPKeyboardAvoidingState alloc] init]; - objc_setAssociatedObject(self, &kStateKey, state, OBJC_ASSOCIATION_RETAIN_NONATOMIC); -#if !__has_feature(objc_arc) - [state release]; -#endif - } - return state; -} - -- (void)TPKeyboardAvoiding_keyboardWillShow:(NSNotification *)notification { - TPKeyboardAvoidingState *state = self.keyboardAvoidingState; - - if (state.keyboardVisible) { - return; - } - - UIView *firstResponder = [self TPKeyboardAvoiding_findFirstResponderBeneathView:self]; - - state.keyboardRect = - [self convertRect:[[[notification userInfo] objectForKey:_UIKeyboardFrameEndUserInfoKey] CGRectValue] - fromView:nil]; - state.keyboardVisible = YES; - state.priorInset = self.contentInset; - state.priorScrollIndicatorInsets = self.scrollIndicatorInsets; - - if ([self isKindOfClass:[TPKeyboardAvoidingScrollView class]]) { - state.priorContentSize = self.contentSize; - - if (CGSizeEqualToSize(self.contentSize, CGSizeZero)) { - // Set the content size, if it's not set. Do not set content size explicitly if auto-layout - // is being used to manage subviews - self.contentSize = [self TPKeyboardAvoiding_calculatedContentSizeFromSubviewFrames]; - } - } - - // Shrink view's inset by the keyboard's height, and scroll to show the text field/view being edited - [UIView beginAnimations:nil context:NULL]; - [UIView setAnimationCurve:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]]; - [UIView setAnimationDuration:[[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] - floatValue]]; - - self.contentInset = [self TPKeyboardAvoiding_contentInsetForKeyboard]; - - if (firstResponder) { - CGFloat viewableHeight = self.bounds.size.height - self.contentInset.top - self.contentInset.bottom; - [self setContentOffset:CGPointMake(self.contentOffset.x, - [self TPKeyboardAvoiding_idealOffsetForView:firstResponder - withViewingAreaHeight:viewableHeight]) - animated:NO]; - } - - self.scrollIndicatorInsets = self.contentInset; - - [UIView commitAnimations]; -} - -- (void)TPKeyboardAvoiding_keyboardWillHide:(NSNotification *)notification { - TPKeyboardAvoidingState *state = self.keyboardAvoidingState; - - if (!state.keyboardVisible) { - return; - } - - state.keyboardRect = CGRectZero; - state.keyboardVisible = NO; - - // Restore dimensions to prior size - [UIView beginAnimations:nil context:NULL]; - [UIView setAnimationCurve:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]]; - [UIView setAnimationDuration:[[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] - floatValue]]; - - if ([self isKindOfClass:[TPKeyboardAvoidingScrollView class]]) { - self.contentSize = state.priorContentSize; - } - - self.contentInset = state.priorInset; - self.scrollIndicatorInsets = state.priorScrollIndicatorInsets; - [UIView commitAnimations]; -} - -- (void)TPKeyboardAvoiding_updateContentInset { - TPKeyboardAvoidingState *state = self.keyboardAvoidingState; - if (state.keyboardVisible) { - self.contentInset = [self TPKeyboardAvoiding_contentInsetForKeyboard]; - } -} - -- (void)TPKeyboardAvoiding_updateFromContentSizeChange { - TPKeyboardAvoidingState *state = self.keyboardAvoidingState; - if (state.keyboardVisible) { - state.priorContentSize = self.contentSize; - self.contentInset = [self TPKeyboardAvoiding_contentInsetForKeyboard]; - } -} - -#pragma mark - Utilities - -- (BOOL)TPKeyboardAvoiding_focusNextTextField { - UIView *firstResponder = [self TPKeyboardAvoiding_findFirstResponderBeneathView:self]; - if (!firstResponder) { - return NO; - } - - CGFloat minY = CGFLOAT_MAX; - UIView *view = nil; - [self TPKeyboardAvoiding_findTextFieldAfterTextField:firstResponder beneathView:self minY:&minY foundView:&view]; - - if (view) { - [view performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0]; - return YES; - } - - return NO; -} - -- (void)TPKeyboardAvoiding_scrollToActiveTextField { - TPKeyboardAvoidingState *state = self.keyboardAvoidingState; - - if (!state.keyboardVisible) - return; - - CGFloat visibleSpace = self.bounds.size.height - self.contentInset.top - self.contentInset.bottom; - - CGPoint idealOffset = CGPointMake( - 0, [self TPKeyboardAvoiding_idealOffsetForView:[self TPKeyboardAvoiding_findFirstResponderBeneathView:self] - withViewingAreaHeight:visibleSpace]); - - // Ordinarily we'd use -setContentOffset:animated:YES here, but it does not appear to - // scroll to the desired content offset. So we wrap in our own animation block. - [UIView animateWithDuration:0.25 - animations:^{ - [self setContentOffset:idealOffset animated:NO]; - }]; -} - -#pragma mark - Helpers - -- (UIView *)TPKeyboardAvoiding_findFirstResponderBeneathView:(UIView *)view { - // Search recursively for first responder - for (UIView *childView in view.subviews) { - if ([childView respondsToSelector:@selector(isFirstResponder)] && [childView isFirstResponder]) - return childView; - UIView *result = [self TPKeyboardAvoiding_findFirstResponderBeneathView:childView]; - if (result) - return result; - } - return nil; -} - -- (void)TPKeyboardAvoiding_findTextFieldAfterTextField:(UIView *)priorTextField - beneathView:(UIView *)view - minY:(CGFloat *)minY - foundView:(UIView **)foundView { - // Search recursively for text field or text view below priorTextField - CGFloat priorFieldOffset = CGRectGetMinY([self convertRect:priorTextField.frame fromView:priorTextField.superview]); - for (UIView *childView in view.subviews) { - if (childView.hidden) - continue; - if (([childView isKindOfClass:[UITextField class]] || [childView isKindOfClass:[UITextView class]]) && - childView.isUserInteractionEnabled) { - CGRect frame = [self convertRect:childView.frame fromView:view]; - if (childView != priorTextField && CGRectGetMinY(frame) >= priorFieldOffset && - CGRectGetMinY(frame) < *minY && - !(frame.origin.y == priorTextField.frame.origin.y && frame.origin.x < priorTextField.frame.origin.x)) { - *minY = CGRectGetMinY(frame); - *foundView = childView; - } - } else { - [self TPKeyboardAvoiding_findTextFieldAfterTextField:priorTextField - beneathView:childView - minY:minY - foundView:foundView]; - } - } -} - -- (void)TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView:(UIView *)view { - for (UIView *childView in view.subviews) { - if (([childView isKindOfClass:[UITextField class]] || [childView isKindOfClass:[UITextView class]])) { - [self TPKeyboardAvoiding_initializeView:childView]; - } else { - [self TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView:childView]; - } - } -} - -- (CGSize)TPKeyboardAvoiding_calculatedContentSizeFromSubviewFrames { - - BOOL wasShowingVerticalScrollIndicator = self.showsVerticalScrollIndicator; - BOOL wasShowingHorizontalScrollIndicator = self.showsHorizontalScrollIndicator; - - self.showsVerticalScrollIndicator = NO; - self.showsHorizontalScrollIndicator = NO; - - CGRect rect = CGRectZero; - for (UIView *view in self.subviews) { - rect = CGRectUnion(rect, view.frame); - } - rect.size.height += kCalculatedContentPadding; - - self.showsVerticalScrollIndicator = wasShowingVerticalScrollIndicator; - self.showsHorizontalScrollIndicator = wasShowingHorizontalScrollIndicator; - - return rect.size; -} - -- (UIEdgeInsets)TPKeyboardAvoiding_contentInsetForKeyboard { - TPKeyboardAvoidingState *state = self.keyboardAvoidingState; - UIEdgeInsets newInset = self.contentInset; - CGRect keyboardRect = state.keyboardRect; - newInset.bottom = keyboardRect.size.height - (CGRectGetMaxY(keyboardRect) - CGRectGetMaxY(self.bounds)); - return newInset; -} - -- (CGFloat)TPKeyboardAvoiding_idealOffsetForView:(UIView *)view withViewingAreaHeight:(CGFloat)viewAreaHeight { - CGSize contentSize = self.contentSize; - CGFloat offset = 0.0; - - CGRect subviewRect = [view convertRect:view.bounds toView:self]; - - // Attempt to center the subview in the visible space, but if that means there will be less than - // kMinimumScrollOffsetPadding - // pixels above the view, then substitute kMinimumScrollOffsetPadding - CGFloat padding = (viewAreaHeight - subviewRect.size.height) / 2; - if (padding < kMinimumScrollOffsetPadding) { - padding = kMinimumScrollOffsetPadding; - } - - // Ideal offset places the subview rectangle origin "padding" points from the top of the scrollview. - // If there is a top contentInset, also compensate for this so that subviewRect will not be placed under - // things like navigation bars. - offset = subviewRect.origin.y - padding - self.contentInset.top; - - // Constrain the new contentOffset so we can't scroll past the bottom. Note that we don't take the bottom - // inset into account, as this is manipulated to make space for the keyboard. - if (offset > (contentSize.height - viewAreaHeight)) { - offset = contentSize.height - viewAreaHeight; - } - - // Constrain the new contentOffset so we can't scroll past the top, taking contentInsets into account - if (offset < -self.contentInset.top) { - offset = -self.contentInset.top; - } - - return offset; -} - -- (void)TPKeyboardAvoiding_initializeView:(UIView *)view { - if ([view isKindOfClass:[UITextField class]] && ((UITextField *)view).returnKeyType == UIReturnKeyDefault && - (![(id)view delegate] || [(UIScrollView *)view delegate] == (id)self)) { - [(UIScrollView *)view setDelegate:(id)self]; - UIView *otherView = nil; - CGFloat minY = CGFLOAT_MAX; - [self TPKeyboardAvoiding_findTextFieldAfterTextField:view beneathView:self minY:&minY foundView:&otherView]; - - if (otherView) { - ((UITextField *)view).returnKeyType = UIReturnKeyNext; - } else { - ((UITextField *)view).returnKeyType = UIReturnKeyDone; - } - } -} - -@end - -@implementation TPKeyboardAvoidingState -@end diff --git a/Classes/Utils/TPMultiLayoutViewController/TPMultiLayoutViewController.h b/Classes/Utils/TPMultiLayoutViewController/TPMultiLayoutViewController.h deleted file mode 100755 index acce76b5a..000000000 --- a/Classes/Utils/TPMultiLayoutViewController/TPMultiLayoutViewController.h +++ /dev/null @@ -1,27 +0,0 @@ -// -// TPMultiLayoutViewController.h -// -// Created by Michael Tyson on 14/08/2011. -// Copyright 2011 A Tasty Pixel. All rights reserved. -// - -#import - -@interface TPMultiLayoutViewController : UIViewController { - UIView *portraitView; - UIView *landscapeView; - - @private - NSDictionary *portraitAttributes; - NSDictionary *landscapeAttributes; - BOOL viewIsCurrentlyPortrait; -} - -// Call directly to use with custom animation (override willRotateToInterfaceOrientation to disable the switch there) -- (void)applyLayoutForInterfaceOrientation:(UIInterfaceOrientation)newOrientation; - -@property(nonatomic, strong) IBOutlet UIView *landscapeView; -@property(nonatomic, strong) IBOutlet UIView *portraitView; -@property (assign) BOOL viewIsCurrentlyPortrait; - -@end diff --git a/Classes/Utils/TPMultiLayoutViewController/TPMultiLayoutViewController.m b/Classes/Utils/TPMultiLayoutViewController/TPMultiLayoutViewController.m deleted file mode 100755 index 90c966ba7..000000000 --- a/Classes/Utils/TPMultiLayoutViewController/TPMultiLayoutViewController.m +++ /dev/null @@ -1,227 +0,0 @@ -// -// TPMultiLayoutViewController.m -// -// Created by Michael Tyson on 14/08/2011. -// Copyright 2011 A Tasty Pixel. All rights reserved. -// - -#import "TPMultiLayoutViewController.h" - -#define VERBOSE_MATCH_FAIL 1 // Comment this out to be less verbose when associated views can't be found - -@interface TPMultiLayoutViewController () -- (NSDictionary*)attributeTableForViewHierarchy:(UIView*)rootView associateWithViewHierarchy:(UIView*)associatedRootView; -- (void)addAttributesForSubviewHierarchy:(UIView*)view associatedWithSubviewHierarchy:(UIView*)associatedView toTable:(NSMutableDictionary*)table; -- (UIView*)findAssociatedViewForView:(UIView*)view amongViews:(NSArray*)views; -- (void)applyAttributeTable:(NSDictionary*)table toViewHierarchy:(UIView*)view; -- (NSDictionary*)attributesForView:(UIView*)view; -- (void)applyAttributes:(NSDictionary*)attributes toView:(UIView*)view; -- (BOOL)shouldDescendIntoSubviewsOfView:(UIView*)view; -@end - -@implementation TPMultiLayoutViewController -@synthesize portraitView, landscapeView, viewIsCurrentlyPortrait; - -#pragma mark - View lifecycle - -- (void)viewDidLoad { - [super viewDidLoad]; - - // Construct attribute tables - portraitAttributes = [self attributeTableForViewHierarchy:portraitView associateWithViewHierarchy:self.view]; - landscapeAttributes = [self attributeTableForViewHierarchy:landscapeView associateWithViewHierarchy:self.view]; - viewIsCurrentlyPortrait = (self.view == portraitView); - - // Don't need to retain the original template view hierarchies any more - self.portraitView = nil; - self.landscapeView = nil; -} - -- (void)dealloc { - portraitAttributes = nil; - landscapeAttributes = nil; - -} - -- (void)viewWillAppear:(BOOL)animated { - // Display correct layout for orientation - /*if ( (UIInterfaceOrientationIsPortrait(self.interfaceOrientation) && !viewIsCurrentlyPortrait) || - (UIInterfaceOrientationIsLandscape(self.interfaceOrientation) && viewIsCurrentlyPortrait) ) { - [self applyLayoutForInterfaceOrientation:self.interfaceOrientation]; - }*/ - [super viewWillAppear:animated]; -} - -#pragma mark - Rotation - -- (void)applyLayoutForInterfaceOrientation:(UIInterfaceOrientation)newOrientation { - NSDictionary *table = UIInterfaceOrientationIsPortrait(newOrientation) ? portraitAttributes : landscapeAttributes; - [self applyAttributeTable:table toViewHierarchy:self.view]; - viewIsCurrentlyPortrait = UIInterfaceOrientationIsPortrait(newOrientation); -} - -- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { - [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; - //if ( (UIInterfaceOrientationIsPortrait(toInterfaceOrientation) && !viewIsCurrentlyPortrait) || - // (UIInterfaceOrientationIsLandscape(toInterfaceOrientation) && viewIsCurrentlyPortrait) ) { - [self applyLayoutForInterfaceOrientation:toInterfaceOrientation]; - //} -} - -#pragma mark - Helpers - -- (NSDictionary*)attributeTableForViewHierarchy:(UIView*)rootView associateWithViewHierarchy:(UIView*)associatedRootView { - NSMutableDictionary *table = [NSMutableDictionary dictionary]; - [self addAttributesForSubviewHierarchy:rootView associatedWithSubviewHierarchy:associatedRootView toTable:table]; - return table; -} - -- (void)addAttributesForSubviewHierarchy:(UIView*)view associatedWithSubviewHierarchy:(UIView*)associatedView toTable:(NSMutableDictionary*)table { - [table setObject:[self attributesForView:view] - forKey:[NSValue valueWithPointer:(__bridge const void *)(associatedView)]]; - - if (![self shouldDescendIntoSubviewsOfView:view]) - return; - - for (UIView *subview in view.subviews) { - UIView *associatedSubView = (view == associatedView ? subview : [self findAssociatedViewForView:subview amongViews:associatedView.subviews]); - if ( associatedSubView ) { - [self addAttributesForSubviewHierarchy:subview associatedWithSubviewHierarchy:associatedSubView toTable:table]; - } - } -} - -- (UIView*)findAssociatedViewForView:(UIView*)view amongViews:(NSArray*)views { - // First try to match tag - if ( view.tag != 0 ) { - UIView *associatedView = [[views filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"tag = %d", view.tag]] lastObject]; - if ( associatedView ) return associatedView; - } - - // Next, try to match class, targets and actions, if it's a control - if ( [view isKindOfClass:[UIControl class]] && [[(UIControl*)view allTargets] count] > 0 ) { - for ( UIView *otherView in views ) { - if ( [otherView isKindOfClass:[view class]] - && [[(UIControl*)otherView allTargets] isEqualToSet:[(UIControl*)view allTargets]] - && [(UIControl*)otherView allControlEvents] == [(UIControl*)view allControlEvents] ) { - // Try to match all actions and targets for each associated control event - BOOL allActionsMatch = YES; - UIControlEvents controlEvents = [(UIControl*)otherView allControlEvents]; - for ( id target in [(UIControl*)otherView allTargets] ) { - // Iterate over each bit in the UIControlEvents bitfield - for ( NSInteger i=0; i ", NSStringFromClass([v class])] atIndex:0]; - } - NSLog(@"Couldn't find match for %@%@", path, NSStringFromClass([view class])); - -#endif - - return nil; -} - -- (void)applyAttributeTable:(NSDictionary*)table toViewHierarchy:(UIView*)view { - NSDictionary *attributes = [table objectForKey:[NSValue valueWithPointer:(__bridge const void *)(view)]]; - if (attributes) { - [self applyAttributes:attributes toView:view]; - } - - //if ( view.hidden ) return; - - if ( ![self shouldDescendIntoSubviewsOfView:view] ) return; - - for ( UIView *subview in view.subviews ) { - [self applyAttributeTable:table toViewHierarchy:subview]; - } -} - -- (NSDictionary*)attributesForView:(UIView*)view { - NSMutableDictionary *attributes = [NSMutableDictionary dictionary]; - - [attributes setObject:[NSValue valueWithCGRect:view.frame] forKey:@"frame"]; - [attributes setObject:[NSValue valueWithCGRect:view.bounds] forKey:@"bounds"]; - [attributes setObject:[NSNumber numberWithBool:view.hidden] forKey:@"hidden"]; - [attributes setObject:[NSNumber numberWithInteger:view.autoresizingMask] forKey:@"autoresizingMask"]; - - return attributes; -} - -- (void)applyAttributes:(NSDictionary*)attributes toView:(UIView*)view { - view.frame = [[attributes objectForKey:@"frame"] CGRectValue]; - view.bounds = [[attributes objectForKey:@"bounds"] CGRectValue]; - view.hidden = [[attributes objectForKey:@"hidden"] boolValue]; - view.autoresizingMask = [[attributes objectForKey:@"autoresizingMask"] integerValue]; -} - -- (BOOL)shouldDescendIntoSubviewsOfView:(UIView*)view { - if ( [view isKindOfClass:[UISlider class]] || - [view isKindOfClass:[UISwitch class]] || - [view isKindOfClass:[UITextField class]] || - [view isKindOfClass:[UITableView class]] || - [view isKindOfClass:[UIPickerView class]] || - [view isKindOfClass:[UIDatePicker class]] || - [view isKindOfClass:[UITextView class]] || - [view isKindOfClass:[UIProgressView class]] || - [view isKindOfClass:[UISegmentedControl class]] ) return NO; - return YES; -} - -@end \ No newline at end of file diff --git a/Classes/Utils/UIAlertView+Blocks/UIAlertView+Blocks.h b/Classes/Utils/UIAlertView+Blocks/UIAlertView+Blocks.h deleted file mode 100644 index 63f5d0e45..000000000 --- a/Classes/Utils/UIAlertView+Blocks/UIAlertView+Blocks.h +++ /dev/null @@ -1,59 +0,0 @@ -// -// UIAlertView+Blocks.h -// UIAlertViewBlocks -// -// Created by Ryan Maxwell on 29/08/13. -// -// The MIT License (MIT) -// -// Copyright (c) 2013 Ryan Maxwell -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - -#import - -typedef void (^UIAlertViewBlock)(UIAlertView *alertView); -typedef void (^UIAlertViewCompletionBlock)(UIAlertView *alertView, NSInteger buttonIndex); - -@interface UIAlertView (Blocks) - -+ (instancetype)showWithTitle:(NSString *)title - message:(NSString *)message - style:(UIAlertViewStyle)style - cancelButtonTitle:(NSString *)cancelButtonTitle - otherButtonTitles:(NSArray *)otherButtonTitles - tapBlock:(UIAlertViewCompletionBlock)tapBlock; - -+ (instancetype)showWithTitle:(NSString *)title - message:(NSString *)message - cancelButtonTitle:(NSString *)cancelButtonTitle - otherButtonTitles:(NSArray *)otherButtonTitles - tapBlock:(UIAlertViewCompletionBlock)tapBlock; - -@property(copy, nonatomic) UIAlertViewCompletionBlock tapBlock; -@property(copy, nonatomic) UIAlertViewCompletionBlock willDismissBlock; -@property(copy, nonatomic) UIAlertViewCompletionBlock didDismissBlock; - -@property(copy, nonatomic) UIAlertViewBlock willPresentBlock; -@property(copy, nonatomic) UIAlertViewBlock didPresentBlock; -@property(copy, nonatomic) UIAlertViewBlock cancelBlock; - -@property(copy, nonatomic) BOOL (^shouldEnableFirstOtherButtonBlock)(UIAlertView *alertView); - -@end diff --git a/Classes/Utils/UIAlertView+Blocks/UIAlertView+Blocks.m b/Classes/Utils/UIAlertView+Blocks/UIAlertView+Blocks.m deleted file mode 100644 index 1a0041b83..000000000 --- a/Classes/Utils/UIAlertView+Blocks/UIAlertView+Blocks.m +++ /dev/null @@ -1,264 +0,0 @@ -// -// UIAlertView+Blocks.m -// UIAlertViewBlocks -// -// Created by Ryan Maxwell on 29/08/13. -// -// The MIT License (MIT) -// -// Copyright (c) 2013 Ryan Maxwell -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - -#import "UIAlertView+Blocks.h" - -#import - -static const void *UIAlertViewOriginalDelegateKey = &UIAlertViewOriginalDelegateKey; - -static const void *UIAlertViewTapBlockKey = &UIAlertViewTapBlockKey; -static const void *UIAlertViewWillPresentBlockKey = &UIAlertViewWillPresentBlockKey; -static const void *UIAlertViewDidPresentBlockKey = &UIAlertViewDidPresentBlockKey; -static const void *UIAlertViewWillDismissBlockKey = &UIAlertViewWillDismissBlockKey; -static const void *UIAlertViewDidDismissBlockKey = &UIAlertViewDidDismissBlockKey; -static const void *UIAlertViewCancelBlockKey = &UIAlertViewCancelBlockKey; -static const void *UIAlertViewShouldEnableFirstOtherButtonBlockKey = &UIAlertViewShouldEnableFirstOtherButtonBlockKey; - -@implementation UIAlertView (Blocks) - -+ (instancetype)showWithTitle:(NSString *)title - message:(NSString *)message - style:(UIAlertViewStyle)style - cancelButtonTitle:(NSString *)cancelButtonTitle - otherButtonTitles:(NSArray *)otherButtonTitles - tapBlock:(UIAlertViewCompletionBlock)tapBlock { - - NSString *firstObject = otherButtonTitles.count ? otherButtonTitles[0] : nil; - - UIAlertView *alertView = [[self alloc] initWithTitle:title - message:message - delegate:nil - cancelButtonTitle:cancelButtonTitle - otherButtonTitles:firstObject, nil]; - - alertView.alertViewStyle = style; - - if (otherButtonTitles.count > 1) { - for (NSString *buttonTitle in - [otherButtonTitles subarrayWithRange:NSMakeRange(1, otherButtonTitles.count - 1)]) { - [alertView addButtonWithTitle:buttonTitle]; - } - } - - if (tapBlock) { - alertView.tapBlock = tapBlock; - } - - [alertView show]; - -#if !__has_feature(objc_arc) - return [alertView autorelease]; -#else - return alertView; -#endif -} - -+ (instancetype)showWithTitle:(NSString *)title - message:(NSString *)message - cancelButtonTitle:(NSString *)cancelButtonTitle - otherButtonTitles:(NSArray *)otherButtonTitles - tapBlock:(UIAlertViewCompletionBlock)tapBlock { - - return [self showWithTitle:title - message:message - style:UIAlertViewStyleDefault - cancelButtonTitle:cancelButtonTitle - otherButtonTitles:otherButtonTitles - tapBlock:tapBlock]; -} - -#pragma mark - - -- (void)_checkAlertViewDelegate { - if (self.delegate != (id)self) { - objc_setAssociatedObject(self, UIAlertViewOriginalDelegateKey, self.delegate, OBJC_ASSOCIATION_ASSIGN); - self.delegate = (id)self; - } -} - -- (UIAlertViewCompletionBlock)tapBlock { - return objc_getAssociatedObject(self, UIAlertViewTapBlockKey); -} - -- (void)setTapBlock:(UIAlertViewCompletionBlock)tapBlock { - [self _checkAlertViewDelegate]; - objc_setAssociatedObject(self, UIAlertViewTapBlockKey, tapBlock, OBJC_ASSOCIATION_COPY); -} - -- (UIAlertViewCompletionBlock)willDismissBlock { - return objc_getAssociatedObject(self, UIAlertViewWillDismissBlockKey); -} - -- (void)setWillDismissBlock:(UIAlertViewCompletionBlock)willDismissBlock { - [self _checkAlertViewDelegate]; - objc_setAssociatedObject(self, UIAlertViewWillDismissBlockKey, willDismissBlock, OBJC_ASSOCIATION_COPY); -} - -- (UIAlertViewCompletionBlock)didDismissBlock { - return objc_getAssociatedObject(self, UIAlertViewDidDismissBlockKey); -} - -- (void)setDidDismissBlock:(UIAlertViewCompletionBlock)didDismissBlock { - [self _checkAlertViewDelegate]; - objc_setAssociatedObject(self, UIAlertViewDidDismissBlockKey, didDismissBlock, OBJC_ASSOCIATION_COPY); -} - -- (UIAlertViewBlock)willPresentBlock { - return objc_getAssociatedObject(self, UIAlertViewWillPresentBlockKey); -} - -- (void)setWillPresentBlock:(UIAlertViewBlock)willPresentBlock { - [self _checkAlertViewDelegate]; - objc_setAssociatedObject(self, UIAlertViewWillPresentBlockKey, willPresentBlock, OBJC_ASSOCIATION_COPY); -} - -- (UIAlertViewBlock)didPresentBlock { - return objc_getAssociatedObject(self, UIAlertViewDidPresentBlockKey); -} - -- (void)setDidPresentBlock:(UIAlertViewBlock)didPresentBlock { - [self _checkAlertViewDelegate]; - objc_setAssociatedObject(self, UIAlertViewDidPresentBlockKey, didPresentBlock, OBJC_ASSOCIATION_COPY); -} - -- (UIAlertViewBlock)cancelBlock { - return objc_getAssociatedObject(self, UIAlertViewCancelBlockKey); -} - -- (void)setCancelBlock:(UIAlertViewBlock)cancelBlock { - [self _checkAlertViewDelegate]; - objc_setAssociatedObject(self, UIAlertViewCancelBlockKey, cancelBlock, OBJC_ASSOCIATION_COPY); -} - -- (void)setShouldEnableFirstOtherButtonBlock:(BOOL (^)(UIAlertView *alertView))shouldEnableFirstOtherButtonBlock { - [self _checkAlertViewDelegate]; - objc_setAssociatedObject(self, UIAlertViewShouldEnableFirstOtherButtonBlockKey, shouldEnableFirstOtherButtonBlock, - OBJC_ASSOCIATION_COPY); -} - -- (BOOL (^)(UIAlertView *alertView))shouldEnableFirstOtherButtonBlock { - return objc_getAssociatedObject(self, UIAlertViewShouldEnableFirstOtherButtonBlockKey); -} - -#pragma mark - UIAlertViewDelegate - -- (void)willPresentAlertView:(UIAlertView *)alertView { - UIAlertViewBlock block = alertView.willPresentBlock; - - if (block) { - block(alertView); - } - - id originalDelegate = objc_getAssociatedObject(self, UIAlertViewOriginalDelegateKey); - if (originalDelegate && [originalDelegate respondsToSelector:@selector(willPresentAlertView:)]) { - [originalDelegate willPresentAlertView:alertView]; - } -} - -- (void)didPresentAlertView:(UIAlertView *)alertView { - UIAlertViewBlock block = alertView.didPresentBlock; - - if (block) { - block(alertView); - } - - id originalDelegate = objc_getAssociatedObject(self, UIAlertViewOriginalDelegateKey); - if (originalDelegate && [originalDelegate respondsToSelector:@selector(didPresentAlertView:)]) { - [originalDelegate didPresentAlertView:alertView]; - } -} - -- (void)alertViewCancel:(UIAlertView *)alertView { - UIAlertViewBlock block = alertView.cancelBlock; - - if (block) { - block(alertView); - } - - id originalDelegate = objc_getAssociatedObject(self, UIAlertViewOriginalDelegateKey); - if (originalDelegate && [originalDelegate respondsToSelector:@selector(alertViewCancel:)]) { - [originalDelegate alertViewCancel:alertView]; - } -} - -- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { - UIAlertViewCompletionBlock completion = alertView.tapBlock; - - if (completion) { - completion(alertView, buttonIndex); - } - - id originalDelegate = objc_getAssociatedObject(self, UIAlertViewOriginalDelegateKey); - if (originalDelegate && [originalDelegate respondsToSelector:@selector(alertView:clickedButtonAtIndex:)]) { - [originalDelegate alertView:alertView clickedButtonAtIndex:buttonIndex]; - } -} - -- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex { - UIAlertViewCompletionBlock completion = alertView.willDismissBlock; - - if (completion) { - completion(alertView, buttonIndex); - } - - id originalDelegate = objc_getAssociatedObject(self, UIAlertViewOriginalDelegateKey); - if (originalDelegate && [originalDelegate respondsToSelector:@selector(alertView:willDismissWithButtonIndex:)]) { - [originalDelegate alertView:alertView willDismissWithButtonIndex:buttonIndex]; - } -} - -- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { - UIAlertViewCompletionBlock completion = alertView.didDismissBlock; - - if (completion) { - completion(alertView, buttonIndex); - } - - id originalDelegate = objc_getAssociatedObject(self, UIAlertViewOriginalDelegateKey); - if (originalDelegate && [originalDelegate respondsToSelector:@selector(alertView:didDismissWithButtonIndex:)]) { - [originalDelegate alertView:alertView didDismissWithButtonIndex:buttonIndex]; - } -} - -- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView { - BOOL (^shouldEnableFirstOtherButtonBlock)(UIAlertView *alertView) = alertView.shouldEnableFirstOtherButtonBlock; - - if (shouldEnableFirstOtherButtonBlock) { - return shouldEnableFirstOtherButtonBlock(alertView); - } - - id originalDelegate = objc_getAssociatedObject(self, UIAlertViewOriginalDelegateKey); - if (originalDelegate && [originalDelegate respondsToSelector:@selector(alertViewShouldEnableFirstOtherButton:)]) { - return [originalDelegate alertViewShouldEnableFirstOtherButton:alertView]; - } - - return YES; -} - -@end diff --git a/Classes/Utils/Utils.h b/Classes/Utils/Utils.h deleted file mode 100644 index 75614f956..000000000 --- a/Classes/Utils/Utils.h +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "LinphoneManager.h" - -#define IPAD (LinphoneManager.runningOnIpad) -#define ANIMATED ([LinphoneManager.instance lpConfigBoolForKey:@"animations_preference"]) -#define LC ([LinphoneManager getLc]) -#define UIColorFromRGB(rgbValue) \ -[UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 \ - green:((float)((rgbValue & 0x00FF00) >> 8))/255.0 \ - blue:((float)((rgbValue & 0x0000FF) >> 0))/255.0 \ - alpha:1.0] - -@interface LinphoneUtils : NSObject - -+ (BOOL)findAndResignFirstResponder:(UIView*)view; -+ (void)adjustFontSize:(UIView*)view mult:(float)mult; -+ (void)buttonFixStates:(UIButton*)button; -+ (void)buttonMultiViewAddAttributes:(NSMutableDictionary*)attributes button:(UIButton*)button; -+ (void)buttonMultiViewApplyAttributes:(NSDictionary*)attributes button:(UIButton*)button; -+ (NSString *)deviceModelIdentifier; -+ (UIImage *)resizeImage:(UIImage *)imageToResize newSize:(CGSize)newSize; - -+ (LinphoneAddress *)normalizeSipOrPhoneAddress:(NSString *)addr; -+ (UIAlertController *)networkErrorView:(NSString *)action; - -typedef enum { - LinphoneDateHistoryList, - LinphoneDateHistoryDetails, - LinphoneDateChatList, - LinphoneDateChatBubble, -} LinphoneDateFormat; - -+ (NSString *)timeToString:(time_t)time withFormat:(LinphoneDateFormat)format; - -+ (BOOL)hasSelfAvatar; -+ (UIImage *)selfAvatar; - -+ (NSString *)durationToString:(int)duration; -+ (NSString *)intervalToString:(NSTimeInterval)interval ; - -+ (NSMutableDictionary *)photoAssetsDictionary; - -+ (NSArray *)parseRecordingName:(NSString *)filename; - -@end - -@interface NSNumber (HumanReadableSize) - -- (NSString*)toHumanReadableSize; - -@end - -@interface UIImage (systemIcons) - -+ (UIImage *)imageFromSystemBarButton:(UIBarButtonSystemItem)systemItem :(UIColor *) color; - -@end - -@interface UIImageView (ImageWithTint) - -- (void)setImageNamed:(NSString *)name tintColor:(UIColor *)color; -- (void)setImageNamed:(NSString *)name tintColorLetter:(NSString *)letter; - -@end - -@interface NSString (linphoneExt) - -- (NSString *)md5; -- (BOOL)containsSubstring:(NSString *)str; - -@end - -@interface UIImage (squareCrop) - -- (UIImage *)squareCrop; -- (UIImage *)scaleToSize:(CGSize)size squared:(BOOL)squared; -+ (UIImage *)resizeImage:(UIImage *)image withMaxWidth:(float)maxWidth andMaxHeight:(float)maxHeight; - -@end - -@interface ContactDisplay : NSObject -+ (void)setDisplayNameLabel:(UILabel *)label forContact:(Contact *)contact; -+ (void)setDisplayNameLabel:(UILabel *)label forAddress:(const LinphoneAddress *)addr; -+ (void)setDisplayNameLabel:(UILabel *)label forAddress:(const LinphoneAddress *)addr withAddressLabel:(UILabel*)addressLabel; -@end - -#import -#import - -#define LINPHONE_MAIN_COLOR [UIColor colorWithRed:207.0f / 255.0f green:76.0f / 255.0f blue:41.0f / 255.0f alpha:1.0f] -#define LINPHONE_SETTINGS_BG_IOS7 [UIColor colorWithRed:164 / 255. green:175 / 255. blue:183 / 255. alpha:1.0] - -@interface UIColor (LightAndDark) - -- (UIColor *)adjustHue:(float)hm saturation:(float)sm brightness:(float)bm alpha:(float)am; - -- (UIColor *)lumColor:(float)mult; - -- (UIColor *)lighterColor; - -- (UIColor *)darkerColor; - -+(UIColor *)color:(NSString *)letter; - -@end - -//@interface UIImage (ForceDecode) - -//+ (UIImage *)decodedImageWithImage:(UIImage *)image; - -//@end - -@interface UIImage (ResizeAndThumbnail) - -+ (UIImage *)UIImageThumbnail:(UIImage *)image thumbSize:(CGFloat) tbSize; - -+ (UIImage *)UIImageResize:(UIImage *)image toSize:(CGSize) newSize; - -+ (CGImageRef)resizeCGImage:(CGImageRef)image toWidth:(int)width andHeight:(int)height; - -@end - -/* Use that macro when you want to invoke a custom initialisation method on your class, - whatever is using it (xib, source code, etc., tableview cell) */ -#define INIT_WITH_COMMON_C \ - -(instancetype)init { \ - return [[super init] commonInit]; \ - } \ - -(instancetype)initWithCoder : (NSCoder *)aDecoder { \ - return [[super initWithCoder:aDecoder] commonInit]; \ - } \ - -(instancetype)commonInit - -#define INIT_WITH_COMMON_CF \ - -(instancetype)initWithFrame : (CGRect)frame { \ - return [[super initWithFrame:frame] commonInit]; \ - } \ - INIT_WITH_COMMON_C diff --git a/Classes/Utils/Utils.m b/Classes/Utils/Utils.m deleted file mode 100644 index 7073b1950..000000000 --- a/Classes/Utils/Utils.m +++ /dev/null @@ -1,979 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import -#import -#import - -#import "Utils.h" -#import "linphone/linphonecore.h" -#import "UILabel+Boldify.h" -#import "FastAddressBook.h" -#import "ColorSpaceUtilities.h" - -@implementation LinphoneUtils - - -+ (UIImage *)resizeImage:(UIImage *)imageToResize newSize:(CGSize)newSize { - UIGraphicsImageRenderer *renderer = [[UIGraphicsImageRenderer alloc] initWithSize:newSize]; - UIImage *image = [renderer imageWithActions:^(UIGraphicsImageRendererContext*_Nonnull myContext) { - [imageToResize drawInRect:(CGRect) {.origin = CGPointZero, .size = newSize}]; - }]; - return [image imageWithRenderingMode:imageToResize.renderingMode]; -} - -+ (BOOL)hasSelfAvatar { - return [LinphoneManager.instance lpConfigStringForKey:@"avatar"] != nil; -} -+ (UIImage *)selfAvatar { - return [LinphoneManager.instance avatar]; -} - -+ (NSString *)durationToString:(int)duration { - NSMutableString *result = [[NSMutableString alloc] init]; - if (duration / 3600 > 0) { - [result appendString:[NSString stringWithFormat:@"%02i:", duration / 3600]]; - duration = duration % 3600; - } - return [result stringByAppendingString:[NSString stringWithFormat:@"%02i:%02i", (duration / 60), (duration % 60)]]; -} - -+ (NSString *) intervalToString:(NSTimeInterval)interval { - NSDateComponentsFormatter *formatter = [[NSDateComponentsFormatter alloc] init]; - formatter.allowedUnits = NSCalendarUnitSecond; - formatter.unitsStyle = NSDateComponentsFormatterUnitsStyleAbbreviated; - formatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorDropAll; - return [formatter stringFromTimeInterval:interval]; -} - - -+ (NSMutableDictionary *)photoAssetsDictionary { - NSMutableDictionary *assetDict = [NSMutableDictionary dictionary]; - - PHFetchOptions *options = [[PHFetchOptions alloc] init]; - [options setIncludeHiddenAssets:YES]; - [options setIncludeAllBurstAssets:YES]; - - PHFetchResult *fetchRes = [PHAsset fetchAssetsWithOptions:options]; - - for (PHAsset *asset in fetchRes) { - NSString *key = [asset valueForKey:@"filename"]; - [assetDict setObject:asset forKey:[[key componentsSeparatedByString:@"."] firstObject]]; - } - - return assetDict; -} - -+ (NSString *)timeToString:(time_t)time withFormat:(LinphoneDateFormat)format { - NSString *formatstr; - NSDate *todayDate = [[NSDate alloc] init]; - NSDate *messageDate = (time == 0) ? todayDate : [NSDate dateWithTimeIntervalSince1970:time]; - NSDateComponents *todayComponents = - [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear - fromDate:todayDate]; - NSDateComponents *dateComponents = - [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear - fromDate:messageDate]; - BOOL sameYear = (todayComponents.year == dateComponents.year); - BOOL sameMonth = (sameYear && (todayComponents.month == dateComponents.month)); - BOOL sameDay = (sameMonth && (todayComponents.day == dateComponents.day)); - - switch (format) { - case LinphoneDateHistoryList: - if (sameYear) { - formatstr = NSLocalizedString(@"EEE dd MMMM", - @"Date formatting in History List, for current year (also see " - @"http://cybersam.com/ios-dev/quick-guide-to-ios-dateformatting)"); - } else { - formatstr = NSLocalizedString(@"EEE dd MMMM yyyy", - @"Date formatting in History List, for previous years (also see " - @"http://cybersam.com/ios-dev/quick-guide-to-ios-dateformatting)"); - } - break; - case LinphoneDateHistoryDetails: - formatstr = NSLocalizedString(@"EEE dd MMM 'at' HH'h'mm", @"Date formatting in History Details (also see " - @"http://cybersam.com/ios-dev/" - @"quick-guide-to-ios-dateformatting)"); - break; - case LinphoneDateChatList: - if (sameDay) { - formatstr = NSLocalizedString( - @"HH:mm", @"Date formatting in Chat List and Conversation bubbles, for current day (also see " - @"http://cybersam.com/ios-dev/quick-guide-to-ios-dateformatting)"); - } else { - formatstr = - NSLocalizedString(@"MM/dd", @"Date formatting in Chat List, for all but current day (also see " - @"http://cybersam.com/ios-dev/quick-guide-to-ios-dateformatting)"); - } - break; - case LinphoneDateChatBubble: - if (sameDay) { - formatstr = NSLocalizedString( - @"HH:mm", @"Date formatting in Chat List and Conversation bubbles, for current day (also see " - @"http://cybersam.com/ios-dev/quick-guide-to-ios-dateformatting)"); - } else { - formatstr = NSLocalizedString(@"MM/dd - HH:mm", - @"Date formatting in Conversation bubbles, for all but current day (also " - @"see http://cybersam.com/ios-dev/quick-guide-to-ios-dateformatting)"); - } - break; - } - NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; - [dateFormatter setDateFormat:formatstr]; - return [dateFormatter stringFromDate:messageDate]; -} - -+ (BOOL)findAndResignFirstResponder:(UIView *)view { - if (view.isFirstResponder) { - [view resignFirstResponder]; - return YES; - } - for (UIView *subView in view.subviews) { - if ([LinphoneUtils findAndResignFirstResponder:subView]) - return YES; - } - return NO; -} - -+ (void)adjustFontSize:(UIView *)view mult:(float)mult { - if ([view isKindOfClass:[UILabel class]]) { - UILabel *label = (UILabel *)view; - UIFont *font = [label font]; - [label setFont:[UIFont fontWithName:font.fontName size:font.pointSize * mult]]; - } else if ([view isKindOfClass:[UITextField class]]) { - UITextField *label = (UITextField *)view; - UIFont *font = [label font]; - [label setFont:[UIFont fontWithName:font.fontName size:font.pointSize * mult]]; - } else if ([view isKindOfClass:[UIButton class]]) { - UIButton *button = (UIButton *)view; - UIFont *font = button.titleLabel.font; - [button.titleLabel setFont:[UIFont fontWithName:font.fontName size:font.pointSize * mult]]; - } else { - for (UIView *subView in [view subviews]) { - [LinphoneUtils adjustFontSize:subView mult:mult]; - } - } -} - -+ (void)buttonFixStates:(UIButton *)button { - // Interface builder lack fixes - [button setTitle:[button titleForState:UIControlStateSelected] - forState:(UIControlStateHighlighted | UIControlStateSelected)]; - [button setTitleColor:[button titleColorForState:UIControlStateHighlighted] - forState:(UIControlStateHighlighted | UIControlStateSelected)]; - [button setTitle:[button titleForState:UIControlStateSelected] - forState:(UIControlStateDisabled | UIControlStateSelected)]; - [button setTitleColor:[button titleColorForState:UIControlStateDisabled] - forState:(UIControlStateDisabled | UIControlStateSelected)]; -} - -+ (void)buttonMultiViewAddAttributes:(NSMutableDictionary *)attributes button:(UIButton *)button { - [LinphoneUtils addDictEntry:attributes item:[button titleForState:UIControlStateNormal] key:@"title-normal"]; - [LinphoneUtils addDictEntry:attributes - item:[button titleForState:UIControlStateHighlighted] - key:@"title-highlighted"]; - [LinphoneUtils addDictEntry:attributes item:[button titleForState:UIControlStateDisabled] key:@"title-disabled"]; - [LinphoneUtils addDictEntry:attributes item:[button titleForState:UIControlStateSelected] key:@"title-selected"]; - [LinphoneUtils addDictEntry:attributes - item:[button titleForState:UIControlStateDisabled | UIControlStateHighlighted] - key:@"title-disabled-highlighted"]; - [LinphoneUtils addDictEntry:attributes - item:[button titleForState:UIControlStateSelected | UIControlStateHighlighted] - key:@"title-selected-highlighted"]; - [LinphoneUtils addDictEntry:attributes - item:[button titleForState:UIControlStateSelected | UIControlStateDisabled] - key:@"title-selected-disabled"]; - - [LinphoneUtils addDictEntry:attributes - item:[button titleColorForState:UIControlStateNormal] - key:@"title-color-normal"]; - [LinphoneUtils addDictEntry:attributes - item:[button titleColorForState:UIControlStateHighlighted] - key:@"title-color-highlighted"]; - [LinphoneUtils addDictEntry:attributes - item:[button titleColorForState:UIControlStateDisabled] - key:@"title-color-disabled"]; - [LinphoneUtils addDictEntry:attributes - item:[button titleColorForState:UIControlStateSelected] - key:@"title-color-selected"]; - [LinphoneUtils addDictEntry:attributes - item:[button titleColorForState:UIControlStateDisabled | UIControlStateHighlighted] - key:@"title-color-disabled-highlighted"]; - [LinphoneUtils addDictEntry:attributes - item:[button titleColorForState:UIControlStateSelected | UIControlStateHighlighted] - key:@"title-color-selected-highlighted"]; - [LinphoneUtils addDictEntry:attributes - item:[button titleColorForState:UIControlStateSelected | UIControlStateDisabled] - key:@"title-color-selected-disabled"]; - - [LinphoneUtils addDictEntry:attributes item:NSStringFromUIEdgeInsets([button titleEdgeInsets]) key:@"title-edge"]; - [LinphoneUtils addDictEntry:attributes - item:NSStringFromUIEdgeInsets([button contentEdgeInsets]) - key:@"content-edge"]; - [LinphoneUtils addDictEntry:attributes item:NSStringFromUIEdgeInsets([button imageEdgeInsets]) key:@"image-edge"]; - - [LinphoneUtils addDictEntry:attributes item:[button imageForState:UIControlStateNormal] key:@"image-normal"]; - [LinphoneUtils addDictEntry:attributes - item:[button imageForState:UIControlStateHighlighted] - key:@"image-highlighted"]; - [LinphoneUtils addDictEntry:attributes item:[button imageForState:UIControlStateDisabled] key:@"image-disabled"]; - [LinphoneUtils addDictEntry:attributes item:[button imageForState:UIControlStateSelected] key:@"image-selected"]; - [LinphoneUtils addDictEntry:attributes - item:[button imageForState:UIControlStateDisabled | UIControlStateHighlighted] - key:@"image-disabled-highlighted"]; - [LinphoneUtils addDictEntry:attributes - item:[button imageForState:UIControlStateSelected | UIControlStateHighlighted] - key:@"image-selected-highlighted"]; - [LinphoneUtils addDictEntry:attributes - item:[button imageForState:UIControlStateSelected | UIControlStateDisabled] - key:@"image-selected-disabled"]; - - [LinphoneUtils addDictEntry:attributes - item:[button backgroundImageForState:UIControlStateNormal] - key:@"background-normal"]; - [LinphoneUtils addDictEntry:attributes - item:[button backgroundImageForState:UIControlStateHighlighted] - key:@"background-highlighted"]; - [LinphoneUtils addDictEntry:attributes - item:[button backgroundImageForState:UIControlStateDisabled] - key:@"background-disabled"]; - [LinphoneUtils addDictEntry:attributes - item:[button backgroundImageForState:UIControlStateSelected] - key:@"background-selected"]; - [LinphoneUtils addDictEntry:attributes - item:[button backgroundImageForState:UIControlStateDisabled | UIControlStateHighlighted] - key:@"background-disabled-highlighted"]; - [LinphoneUtils addDictEntry:attributes - item:[button backgroundImageForState:UIControlStateSelected | UIControlStateHighlighted] - key:@"background-selected-highlighted"]; - [LinphoneUtils addDictEntry:attributes - item:[button backgroundImageForState:UIControlStateSelected | UIControlStateDisabled] - key:@"background-selected-disabled"]; -} - -+ (void)buttonMultiViewApplyAttributes:(NSDictionary *)attributes button:(UIButton *)button { - [button setTitle:[LinphoneUtils getDictEntry:attributes key:@"title-normal"] forState:UIControlStateNormal]; - [button setTitle:[LinphoneUtils getDictEntry:attributes key:@"title-highlighted"] - forState:UIControlStateHighlighted]; - [button setTitle:[LinphoneUtils getDictEntry:attributes key:@"title-disabled"] forState:UIControlStateDisabled]; - [button setTitle:[LinphoneUtils getDictEntry:attributes key:@"title-selected"] forState:UIControlStateSelected]; - [button setTitle:[LinphoneUtils getDictEntry:attributes key:@"title-disabled-highlighted"] - forState:UIControlStateDisabled | UIControlStateHighlighted]; - [button setTitle:[LinphoneUtils getDictEntry:attributes key:@"title-selected-highlighted"] - forState:UIControlStateSelected | UIControlStateHighlighted]; - [button setTitle:[LinphoneUtils getDictEntry:attributes key:@"title-selected-disabled"] - forState:UIControlStateSelected | UIControlStateDisabled]; - - [button setTitleColor:[LinphoneUtils getDictEntry:attributes key:@"title-color-normal"] - forState:UIControlStateNormal]; - [button setTitleColor:[LinphoneUtils getDictEntry:attributes key:@"title-color-highlighted"] - forState:UIControlStateHighlighted]; - [button setTitleColor:[LinphoneUtils getDictEntry:attributes key:@"title-color-disabled"] - forState:UIControlStateDisabled]; - [button setTitleColor:[LinphoneUtils getDictEntry:attributes key:@"title-color-selected"] - forState:UIControlStateSelected]; - [button setTitleColor:[LinphoneUtils getDictEntry:attributes key:@"title-color-disabled-highlighted"] - forState:UIControlStateDisabled | UIControlStateHighlighted]; - [button setTitleColor:[LinphoneUtils getDictEntry:attributes key:@"title-color-selected-highlighted"] - forState:UIControlStateSelected | UIControlStateHighlighted]; - [button setTitleColor:[LinphoneUtils getDictEntry:attributes key:@"title-color-selected-disabled"] - forState:UIControlStateSelected | UIControlStateDisabled]; - - [button setTitleEdgeInsets:UIEdgeInsetsFromString([LinphoneUtils getDictEntry:attributes key:@"title-edge"])]; - [button setContentEdgeInsets:UIEdgeInsetsFromString([LinphoneUtils getDictEntry:attributes key:@"content-edge"])]; - [button setImageEdgeInsets:UIEdgeInsetsFromString([LinphoneUtils getDictEntry:attributes key:@"image-edge"])]; - - [button setImage:[LinphoneUtils getDictEntry:attributes key:@"image-normal"] forState:UIControlStateNormal]; - [button setImage:[LinphoneUtils getDictEntry:attributes key:@"image-highlighted"] - forState:UIControlStateHighlighted]; - [button setImage:[LinphoneUtils getDictEntry:attributes key:@"image-disabled"] forState:UIControlStateDisabled]; - [button setImage:[LinphoneUtils getDictEntry:attributes key:@"image-selected"] forState:UIControlStateSelected]; - [button setImage:[LinphoneUtils getDictEntry:attributes key:@"image-disabled-highlighted"] - forState:UIControlStateDisabled | UIControlStateHighlighted]; - [button setImage:[LinphoneUtils getDictEntry:attributes key:@"image-selected-highlighted"] - forState:UIControlStateSelected | UIControlStateHighlighted]; - [button setImage:[LinphoneUtils getDictEntry:attributes key:@"image-selected-disabled"] - forState:UIControlStateSelected | UIControlStateDisabled]; - - [button setBackgroundImage:[LinphoneUtils getDictEntry:attributes key:@"background-normal"] - forState:UIControlStateNormal]; - [button setBackgroundImage:[LinphoneUtils getDictEntry:attributes key:@"background-highlighted"] - forState:UIControlStateHighlighted]; - [button setBackgroundImage:[LinphoneUtils getDictEntry:attributes key:@"background-disabled"] - forState:UIControlStateDisabled]; - [button setBackgroundImage:[LinphoneUtils getDictEntry:attributes key:@"background-selected"] - forState:UIControlStateSelected]; - [button setBackgroundImage:[LinphoneUtils getDictEntry:attributes key:@"background-disabled-highlighted"] - forState:UIControlStateDisabled | UIControlStateHighlighted]; - [button setBackgroundImage:[LinphoneUtils getDictEntry:attributes key:@"background-selected-highlighted"] - forState:UIControlStateSelected | UIControlStateHighlighted]; - [button setBackgroundImage:[LinphoneUtils getDictEntry:attributes key:@"background-selected-disabled"] - forState:UIControlStateSelected | UIControlStateDisabled]; -} - -+ (void)addDictEntry:(NSMutableDictionary *)dict item:(id)item key:(id)key { - if (item != nil && key != nil) { - [dict setObject:item forKey:key]; - } -} - -+ (id)getDictEntry:(NSDictionary *)dict key:(id)key { - if (key != nil) { - return [dict objectForKey:key]; - } - return nil; -} - -+ (NSString *)deviceModelIdentifier { - struct utsname systemInfo; - uname(&systemInfo); - - NSString *machine = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; - - if ([machine isEqual:@"iPad1,1"]) - return @"iPad"; - else if ([machine isEqual:@"iPad2,1"]) - return @"iPad 2"; - else if ([machine isEqual:@"iPad2,2"]) - return @"iPad 2"; - else if ([machine isEqual:@"iPad2,3"]) - return @"iPad 2"; - else if ([machine isEqual:@"iPad2,4"]) - return @"iPad 2"; - else if ([machine isEqual:@"iPad3,1"]) - return @"iPad 3"; - else if ([machine isEqual:@"iPad3,2"]) - return @"iPad 3"; - else if ([machine isEqual:@"iPad3,3"]) - return @"iPad 3"; - else if ([machine isEqual:@"iPad3,4"]) - return @"iPad 4"; - else if ([machine isEqual:@"iPad3,5"]) - return @"iPad 4"; - else if ([machine isEqual:@"iPad3,6"]) - return @"iPad 4"; - else if ([machine isEqual:@"iPad4,1"]) - return @"iPad Air"; - else if ([machine isEqual:@"iPad4,2"]) - return @"iPad Air"; - else if ([machine isEqual:@"iPad4,3"]) - return @"iPad Air"; - else if ([machine isEqual:@"iPad5,3"]) - return @"iPad Air 2"; - else if ([machine isEqual:@"iPad5,4"]) - return @"iPad Air 2"; - else if ([machine isEqual:@"iPad6,7"]) - return @"iPad Pro 12.9"; - else if ([machine isEqual:@"iPad6,8"]) - return @"iPad Pro 12.9"; - else if ([machine isEqual:@"iPad6,3"]) - return @"iPad Pro 9.7"; - else if ([machine isEqual:@"iPad6,4"]) - return @"iPad Pro 9.7"; - else if ([machine isEqual:@"iPad2,5"]) - return @"iPad mini"; - else if ([machine isEqual:@"iPad2,6"]) - return @"iPad mini"; - else if ([machine isEqual:@"iPad2,7"]) - return @"iPad mini"; - else if ([machine isEqual:@"iPad4,4"]) - return @"iPad mini 2"; - else if ([machine isEqual:@"iPad4,5"]) - return @"iPad mini 2"; - else if ([machine isEqual:@"iPad4,6"]) - return @"iPad mini 2"; - else if ([machine isEqual:@"iPad4,7"]) - return @"iPad mini 3"; - else if ([machine isEqual:@"iPad4,8"]) - return @"iPad mini 3"; - else if ([machine isEqual:@"iPad4,9"]) - return @"iPad mini 3"; - else if ([machine isEqual:@"iPad5,1"]) - return @"iPad mini 4"; - else if ([machine isEqual:@"iPad5,2"]) - return @"iPad mini 4"; - - else if ([machine isEqual:@"iPhone1,1"]) - return @"iPhone"; - else if ([machine isEqual:@"iPhone1,2"]) - return @"iPhone 3G"; - else if ([machine isEqual:@"iPhone2,1"]) - return @"iPhone 3GS"; - else if ([machine isEqual:@"iPhone3,1"]) - return @"iPhone 4"; - else if ([machine isEqual:@"iPhone3,2"]) - return @"iPhone 4"; - else if ([machine isEqual:@"iPhone3,3"]) - return @"iPhone 4"; - else if ([machine isEqual:@"iPhone4,1"]) - return @"iPhone 4S"; - else if ([machine isEqual:@"iPhone5,1"]) - return @"iPhone5,2 iPhone 5"; - else if ([machine isEqual:@"iPhone5,3"]) - return @"iPhone5,4 iPhone 5c"; - else if ([machine isEqual:@"iPhone6,1"]) - return @"iPhone6,2 iPhone 5s"; - else if ([machine isEqual:@"iPhone7,2"]) - return @"iPhone 6"; - else if ([machine isEqual:@"iPhone7,1"]) - return @"iPhone 6 Plus"; - else if ([machine isEqual:@"iPhone8,1"]) - return @"iPhone 6s"; - else if ([machine isEqual:@"iPhone8,2"]) - return @"iPhone 6s Plus"; - else if ([machine isEqual:@"iPhone8,4"]) - return @"iPhone SE"; - - else if ([machine isEqual:@"iPod1,1"]) - return @"iPod touch"; - else if ([machine isEqual:@"iPod2,1"]) - return @"iPod touch 2G"; - else if ([machine isEqual:@"iPod3,1"]) - return @"iPod touch 3G"; - else if ([machine isEqual:@"iPod4,1"]) - return @"iPod touch 4G"; - else if ([machine isEqual:@"iPod5,1"]) - return @"iPod touch 5G"; - else if ([machine isEqual:@"iPod7,1"]) - return @"iPod touch 6G"; - - else if ([machine isEqual:@"x86_64"]) - return @"simulator 64bits"; - - // none matched: cf https://www.theiphonewiki.com/wiki/Models for the whole list - LOGW(@"%s: Oops, unknown machine %@... consider completing me!", __FUNCTION__, machine); - return machine; -} - -+ (LinphoneAddress *)normalizeSipOrPhoneAddress:(NSString *)value { - if (!value || [value isEqualToString:@""]) - return NULL; - - LinphoneAccount *account = linphone_core_get_default_account(LC); - bool dial_escape_plus_enabled = account && linphone_account_get_params(account) && linphone_account_params_get_dial_escape_plus_enabled(linphone_account_get_params(account)); - char *normvalue; - normvalue = linphone_account_is_phone_number(account, value.UTF8String) && dial_escape_plus_enabled - ? linphone_account_normalize_phone_number(account, value.UTF8String) - : bctbx_strdup(value.UTF8String); - - LinphoneAddress *addr = linphone_account_normalize_sip_uri(account, normvalue); - // first try to find a friend with the given address - Contact *c = [FastAddressBook getContactWithAddress:addr]; - bctbx_free(normvalue); - - if (c && c.friend) { - LinphoneFriend *f = c.friend; - const LinphonePresenceModel *m = f - ? linphone_friend_get_presence_model_for_uri_or_tel(f, value.UTF8String) - : NULL; - char *contact = m ? linphone_presence_model_get_contact(m) : NULL; - if (contact) { - LinphoneAddress *contact_addr = linphone_address_new(contact); - ms_free(contact); - if (contact_addr) { - linphone_address_unref(addr); - return contact_addr; - } - } - } - - // since user wants to escape plus, we assume it expects to have phone - // numbers by default - if (addr && account) { - const char *username = dial_escape_plus_enabled ? normvalue : value.UTF8String; - if (linphone_account_is_phone_number(account, username) && dial_escape_plus_enabled){ - char *normalized = linphone_account_normalize_phone_number(account, username); - linphone_address_set_username(addr, normalized); - bctbx_free(normalized); - } - } - return addr; -} - -+ (NSArray *)parseRecordingName:(NSString *)filename { - NSString *rec = @"recording_"; //key that helps find recordings - NSString *subName = [filename substringFromIndex:[filename rangeOfString:rec].location]; //We remove the parent folders if they exist in the filename - NSArray *splitString = [subName componentsSeparatedByString:@"_"]; - //splitString: first element is the 'recording' prefix, last element is the date with the "E-d-MMM-yyyy-HH-mm-ss" format. - NSString *name = [[splitString subarrayWithRange:NSMakeRange(1, [splitString count] -2)] componentsJoinedByString:@""]; - NSDateFormatter *format = [[NSDateFormatter alloc] init]; - [format setDateFormat:@"E-d-MMM-yyyy-HH-mm-ss"]; - NSString *dateWithMkv = [splitString objectAtIndex:[splitString count]-1]; //this will be in the form "E-d-MMM-yyyy-HH-mm-ss.mkv", we have to delete the extension - NSDate *date = [format dateFromString:[dateWithMkv substringToIndex:[dateWithMkv length] - 4]]; - NSArray *res = [NSArray arrayWithObjects:name, date, nil]; - return res; -} - -+ (UIAlertController *)networkErrorView:(NSString *)action { - UIAlertController *errView = - [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Network Error", nil) - message:NSLocalizedString([@"There is no network connection available, enable WIFI or WWAN prior to " stringByAppendingString:action],nil) - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *action){ - }]; - - [errView addAction:defaultAction]; - return errView; -} - -@end - -@implementation NSNumber (HumanReadableSize) - -- (NSString *)toHumanReadableSize { - float floatSize = [self floatValue]; - if (floatSize < 1023) - return ([NSString stringWithFormat:@"%1.0f bytes", floatSize]); - floatSize = floatSize / 1024; - if (floatSize < 1023) - return ([NSString stringWithFormat:@"%1.1f KB", floatSize]); - floatSize = floatSize / 1024; - if (floatSize < 1023) - return ([NSString stringWithFormat:@"%1.1f MB", floatSize]); - floatSize = floatSize / 1024; - - return ([NSString stringWithFormat:@"%1.1f GB", floatSize]); -} - -@end - -@implementation UIImage (systemIcons) - -+ (UIImage *)imageFromSystemBarButton:(UIBarButtonSystemItem)systemItem :(UIColor *) color { - // thanks to Renetik https://stackoverflow.com/a/49822488 - UIToolbar *bar = UIToolbar.new; - UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:systemItem target:nil action:nil]; - [bar setItems:@[buttonItem] animated:NO]; - [bar snapshotViewAfterScreenUpdates:YES]; - for (UIView *view in [(id) buttonItem view].subviews) - if ([view isKindOfClass:UIButton.class]) { - UIImage *image = [((UIButton *) view).imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; - UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale); - //[color set]; - [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)]; - image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - return image; - } - return nil; -} - -@end - - - -@implementation UIImageView (ImageWithTint) - -- (void)setImageNamed:(NSString *)name tintColor:(UIColor *)color { - self.image = [[UIImage imageNamed:name] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; - self.tintColor = color; -} - -- (void)setImageNamed:(NSString *)name tintColorLetter:(NSString *)letter { - UIColor *color = [UIColor color:letter]; - self.image = [[UIImage imageNamed:name] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; - self.tintColor = color; -} - -@end - -@implementation NSString (md5) - -- (NSString *)md5 { - const char *ptr = [self UTF8String]; - unsigned char md5Buffer[CC_MD5_DIGEST_LENGTH]; - CC_MD5(ptr, (unsigned int)strlen(ptr), md5Buffer); - NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; - for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) { - [output appendFormat:@"%02x", md5Buffer[i]]; - } - - return output; -} - -- (BOOL)containsSubstring:(NSString *)str { - if (UIDevice.currentDevice.systemVersion.doubleValue >= 8.0) { -#pragma deploymate push "ignored-api-availability" - return [self containsString:str]; -#pragma deploymate pop - } - return ([self rangeOfString:str].location != NSNotFound); -} - -@end - -@implementation ContactDisplay - -+ (void)setDisplayNameLabel:(UILabel *)label forContact:(Contact *)contact { - label.text = [FastAddressBook displayNameForContact:contact]; -#if 0 - NSString *lLastName = CFBridgingRelease(ABRecordCopyValue(contact, kABPersonLastNameProperty)); - NSString *lLocalizedLastName = [FastAddressBook localizedLabel:lLastName]; - if (lLocalizedLastName) { - [label boldSubstring:lLocalizedLastName]; - } -#endif -} - -+ (void)setDisplayNameLabel:(UILabel *)label forAddress:(const LinphoneAddress *)addr { - - const LinphoneConferenceInfo * ci = linphone_core_find_conference_information_from_uri(LC, (LinphoneAddress *)addr); - if (ci != nil) { - label.text = [NSString stringWithUTF8String:linphone_conference_info_get_subject(ci)]; - return; - } - - Contact *contact = [FastAddressBook getContactWithAddress:addr]; - if (contact) { - [ContactDisplay setDisplayNameLabel:label forContact:contact]; - } else { - label.text = [FastAddressBook displayNameForAddress:addr]; - } -} - -+ (void)setDisplayNameLabel:(UILabel *)label forAddress:(const LinphoneAddress *)addr withAddressLabel:(UILabel*)addressLabel{ - - const LinphoneConferenceInfo * ci = linphone_core_find_conference_information_from_uri(LC, (LinphoneAddress *)addr); - if (ci != nil) { - label.text = [NSString stringWithUTF8String:linphone_conference_info_get_subject(ci)]; - addressLabel.text = NSLocalizedString(@"Conference",nil); - return; - } - - Contact *contact = [FastAddressBook getContactWithAddress:addr]; - NSString *tmpAddress = nil; - char *uri = linphone_address_as_string_uri_only(addr); - if (contact) { - [ContactDisplay setDisplayNameLabel:label forContact:contact]; - tmpAddress = [NSString stringWithUTF8String:uri]; - addressLabel.hidden = FALSE; - } else { - label.text = [FastAddressBook displayNameForAddress:addr]; - if([LinphoneManager.instance lpConfigBoolForKey:@"display_phone_only" inSection:@"app"]) - addressLabel.hidden = TRUE; - else - tmpAddress = [NSString stringWithUTF8String:uri]; - } - ms_free(uri); - NSRange range = [tmpAddress rangeOfString:@";"]; - if (range.location != NSNotFound) { - tmpAddress = [tmpAddress substringToIndex:range.location]; - } - addressLabel.text = tmpAddress; -} - - -@end - -@implementation UIImage (squareCrop) - -- (UIImage *)squareCrop { - // This calculates the crop area. - - size_t originalWidth = CGImageGetWidth(self.CGImage); - size_t originalHeight = CGImageGetHeight(self.CGImage); - - size_t edge = MIN(originalWidth, originalHeight); - - float posX = (originalWidth - edge) / 2.0f; - float posY = (originalHeight - edge) / 2.0f; - - CGRect rect = CGRectMake(posX, posY, edge, edge); - - // Create bitmap image from original image data, - // using rectangle to specify desired crop area - CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], rect); - UIImage *img = [UIImage imageWithCGImage:imageRef]; - CGImageRelease(imageRef); - - return img; /* - UIImage *ret = nil; - - - - CGRect cropSquare = CGRectMake(posX, posY, edge, edge); - - // CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], cropSquare); - // ret = [UIImage imageWithCGImage:imageRef scale:self.scale orientation:self.imageOrientation]; - // - // CGImageRelease(imageRef); - - CGImageRef imageRef = CGImageCreateWithImageInRect(self.CGImage, cropSquare); - ret = [UIImage imageWithCGImage:imageRef scale:self.scale orientation:self.imageOrientation]; - CGImageRelease(imageRef); - - - return ret;*/ -} - -- (UIImage *)scaleToSize:(CGSize)size squared:(BOOL)squared { - UIImage *scaledImage = self; - if (squared) { - // scaledImage = [self squareCrop]; - size.width = size.height = MAX(size.width, size.height); - } - - UIGraphicsBeginImageContext(size); - - [scaledImage drawInRect:CGRectMake(0, 0, size.width, size.height)]; - scaledImage = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - return scaledImage; -} - -+ (UIImage *)resizeImage:(UIImage *)image withMaxWidth:(float)maxWidth andMaxHeight:(float)maxHeight { - float actualHeight = image.size.height; - float actualWidth = image.size.width; - float imgRatio = actualWidth / actualHeight; - float maxRatio = maxWidth / maxHeight; - float compressionQuality = 1; - if (actualHeight > maxHeight || actualWidth > maxWidth) - { - if (imgRatio < maxRatio) { - imgRatio = maxHeight / actualHeight; - actualWidth = imgRatio * actualWidth; - actualHeight = maxHeight; - } else if (imgRatio > maxRatio) { - imgRatio = maxWidth / actualWidth; - actualHeight = imgRatio * actualHeight; - actualWidth = maxWidth; - } else { - actualHeight = maxHeight; - actualWidth = maxWidth; - } - } - CGRect rect = CGRectMake(0.0, 0.0, actualWidth, actualHeight); - UIGraphicsBeginImageContext(rect.size); - [image drawInRect:rect]; - UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); - NSData *imageData = UIImageJPEGRepresentation(img, compressionQuality); - UIGraphicsEndImageContext(); - return [UIImage imageWithData:imageData]; -} - -@end - -@implementation UIColor (LightAndDark) - -- (UIColor *)lumColor:(float)mult { - float hsbH, hsbS, hsbB; - float rgbaR, rgbaG, rgbaB, rgbaA; - - // Get RGB - CGColorRef cgColor = [self CGColor]; - CGColorSpaceRef cgColorSpace = CGColorGetColorSpace(cgColor); - if (CGColorSpaceGetModel(cgColorSpace) != kCGColorSpaceModelRGB) { - LOGW(@"Can't convert not RGB color"); - return self; - } else { - const CGFloat *colors = CGColorGetComponents(cgColor); - rgbaR = colors[0]; - rgbaG = colors[1]; - rgbaB = colors[2]; - rgbaA = CGColorGetAlpha(cgColor); - } - - RGB2HSL(rgbaR, rgbaG, rgbaB, &hsbH, &hsbS, &hsbB); - - hsbB = MIN(MAX(hsbB * mult, 0.0), 1.0); - - HSL2RGB(hsbH, hsbS, hsbB, &rgbaR, &rgbaG, &rgbaB); - - return [UIColor colorWithRed:rgbaR green:rgbaG blue:rgbaB alpha:rgbaA]; -} - -- (UIColor *)adjustHue:(float)hm saturation:(float)sm brightness:(float)bm alpha:(float)am { - float hsbH, hsbS, hsbB; - float rgbaR, rgbaG, rgbaB, rgbaA; - - // Get RGB - CGColorRef cgColor = [self CGColor]; - CGColorSpaceRef cgColorSpace = CGColorGetColorSpace(cgColor); - if (CGColorSpaceGetModel(cgColorSpace) != kCGColorSpaceModelRGB) { - LOGW(@"Can't convert not RGB color"); - return self; - } else { - const CGFloat *colors = CGColorGetComponents(cgColor); - rgbaR = colors[0]; - rgbaG = colors[1]; - rgbaB = colors[2]; - rgbaA = CGColorGetAlpha(cgColor); - } - - RGB2HSL(rgbaR, rgbaG, rgbaB, &hsbH, &hsbS, &hsbB); - - hsbH = MIN(MAX(hsbH + hm, 0.0), 1.0); - hsbS = MIN(MAX(hsbS + sm, 0.0), 1.0); - hsbB = MIN(MAX(hsbB + bm, 0.0), 1.0); - rgbaA = MIN(MAX(rgbaA + am, 0.0), 1.0); - - HSL2RGB(hsbH, hsbS, hsbB, &rgbaR, &rgbaG, &rgbaB); - - return [UIColor colorWithRed:rgbaR green:rgbaG blue:rgbaB alpha:rgbaA]; -} - -- (UIColor *)lighterColor { - return [self lumColor:1.3]; -} - -- (UIColor *)darkerColor { - return [self lumColor:0.75]; -} - - -static NSMutableDictionary *letterColors = nil; - -+(UIColor *)color:(NSString *)letter { - if (letterColors == nil) - letterColors = [[NSMutableDictionary alloc] init]; - if (![letterColors objectForKey:letter]) { - UIImage *colorImage = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/color_%@.png",[[NSBundle mainBundle] bundlePath],letter]]; - [letterColors setObject:[UIColor colorWithPatternImage:colorImage] forKey:letter]; - } - return [letterColors objectForKey:letter]; -} - -@end - -@implementation UIImage (ForceDecode) - -+ (UIImage *)decodedImageWithImage:(UIImage *)image { - CGImageRef imageRef = image.CGImage; - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); - CGContextRef context = CGBitmapContextCreate( - NULL, CGImageGetWidth(imageRef), CGImageGetHeight(imageRef), 8, - // Just always return width * 4 will be enough - CGImageGetWidth(imageRef) * 4, - // System only supports RGB, set explicitly - colorSpace, - // Makes system don't need to do extra conversion when displayed. - // NOTE: here we remove the alpha channel for performance. Most of the time, images loaded - // from the network are jpeg with no alpha channel. As a TODO, finding a way to detect - // if alpha channel is necessary would be nice. - kCGImageAlphaNoneSkipLast | kCGBitmapByteOrder32Little); - CGColorSpaceRelease(colorSpace); - if (!context) - return nil; - - CGRect rect = (CGRect){CGPointZero, {CGImageGetWidth(imageRef), CGImageGetHeight(imageRef)}}; - CGContextDrawImage(context, rect, imageRef); - CGImageRef decompressedImageRef = CGBitmapContextCreateImage(context); - CGContextRelease(context); - - UIImage *decompressedImage = - [[UIImage alloc] initWithCGImage:decompressedImageRef scale:image.scale orientation:image.imageOrientation]; - CGImageRelease(decompressedImageRef); - return decompressedImage; -} - -@end - -@implementation UIImage (ResizeAndThumbnail) - -+ (UIImage *)UIImageThumbnail:(UIImage *)image thumbSize:(CGFloat) tbSize { - // Create a thumbnail version of the image for the event object. - CGSize size = image.size; - CGSize croppedSize; - CGFloat offsetX = 0.0; - CGFloat offsetY = 0.0; - CGFloat actualTbSize = MAX(tbSize, MAX(size.height, size.width)); - // check the size of the image, we want to make it - // a square with sides the size of the smallest end - if (size.width > size.height) { - offsetX = (size.height - size.width) / 2; - croppedSize = CGSizeMake(size.height, size.height); - } else { - offsetY = (size.width - size.height) / 2; - croppedSize = CGSizeMake(size.width, size.width); - } - - // Crop the image before resize - CGRect clippedRect = CGRectMake(offsetX * -1, - offsetY * -1, - croppedSize.width, - croppedSize.height); - CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], - clippedRect); - - UIImage *cropped = [UIImage imageWithCGImage:imageRef]; - CGImageRelease(imageRef); - // Done cropping - - // Resize the image - CGRect rect = CGRectMake(0, 0, actualTbSize, actualTbSize); - - UIGraphicsBeginImageContext(rect.size); - [cropped drawInRect:rect]; - UIImage *thumbnail = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - // Done Resizing - - return thumbnail; -} - - -+ (UIImage *)UIImageResize:(UIImage *)image toSize:(CGSize) newSize { - CGImageRef newImage = [image CGImage]; - CGSize originalSize = [image size]; - float originalAspectRatio = originalSize.width / originalSize.height; - // We resize in width and crop in height - if (originalSize.width > newSize.width) { - int height = newSize.width / originalAspectRatio; - newImage = [UIImage resizeCGImage:newImage toWidth:newSize.width andHeight:height]; - originalSize.height = height; - } - CGRect cropRect = CGRectMake(0, 0, newSize.width, newSize.height); - if (newSize.height < originalSize.height) cropRect.origin.y = (originalSize.height - newSize.height)/2; - newImage = CGImageCreateWithImageInRect(newImage, cropRect); - - - UIImage *cropped = [UIImage imageWithCGImage:newImage]; - CGImageRelease(newImage); - return cropped; -} - -+ (CGImageRef)resizeCGImage:(CGImageRef)image toWidth:(int)width andHeight:(int)height { - // create context, keeping original image properties - CGColorSpaceRef colorspace = CGImageGetColorSpace(image); - CGContextRef context = CGBitmapContextCreate(NULL, width, height, - CGImageGetBitsPerComponent(image), - CGImageGetBytesPerRow(image), - colorspace, - CGImageGetAlphaInfo(image)); - CGColorSpaceRelease(colorspace); - - if(context == NULL) - return nil; - - // draw image to context (resizing it) - CGContextDrawImage(context, CGRectMake(0, 0, width, height), image); - // extract resulting image from context - CGImageRef imgRef = CGBitmapContextCreateImage(context); - CGContextRelease(context); - - return imgRef; -} - - -@end diff --git a/Classes/Utils/XMLRPC/XMLRPCConnectionDelegate.h b/Classes/Utils/XMLRPC/XMLRPCConnectionDelegate.h deleted file mode 100755 index 4c1e7d2c3..000000000 --- a/Classes/Utils/XMLRPC/XMLRPCConnectionDelegate.h +++ /dev/null @@ -1,27 +0,0 @@ -#import - -@class XMLRPCConnection, XMLRPCRequest, XMLRPCResponse; - -@protocol XMLRPCConnectionDelegate - -@required -- (void)request: (XMLRPCRequest *)request didReceiveResponse: (XMLRPCResponse *)response; - -@optional -- (void)request: (XMLRPCRequest *)request didSendBodyData: (float)percent; - -@required -- (void)request: (XMLRPCRequest *)request didFailWithError: (NSError *)error; - -#pragma mark - - -@required -- (BOOL)request: (XMLRPCRequest *)request canAuthenticateAgainstProtectionSpace: (NSURLProtectionSpace *)protectionSpace; - -@required -- (void)request: (XMLRPCRequest *)request didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge; - -@required -- (void)request: (XMLRPCRequest *)request didCancelAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge; - -@end diff --git a/Classes/Utils/XMLRPCHelper.h b/Classes/Utils/XMLRPCHelper.h deleted file mode 100644 index 44fdbe542..000000000 --- a/Classes/Utils/XMLRPCHelper.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -@interface XMLRPCHelper : NSObject -/* This class is only here to handle - * - * All the rest is implemented to do nothing - */ - -@property(nonatomic, strong) NSMutableArray *personsArray; - -+ (void)sendXMLRPCRequest:(NSString *)method; -+ (void)sendXMLRPCRequestWithParams:(NSString *)method withParams:(NSArray *)params; -+ (void)sendXMLRPCRequestWithParams:(NSString *)method - withParams:(NSArray *)params - onSuccess:(void (^)(NSString *response))block; -+ (void)sendXMLRPCRequestWithParams:(NSString *)method - withParams:(NSArray *)params - onSuccess:(void (^)(NSString *response))successBlock - onError:(void (^)(NSString *response))errorBlock; - -- (void)dealWithXmlRpcResponse:(LinphoneXmlRpcRequest *)request; -- (void)displayErrorPopup:(NSString *)error; -+ (void)initArray; - -@end diff --git a/Classes/Utils/XMLRPCHelper.m b/Classes/Utils/XMLRPCHelper.m deleted file mode 100644 index d48107f9d..000000000 --- a/Classes/Utils/XMLRPCHelper.m +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import - -#import "LinphoneManager.h" -#import "XMLRPCHelper.h" -#import "Utils.h" -#import "PhoneMainView.h" - -/* This subclass allows use to store the block to execute on success */ -@interface XMLRPCRequestObject : NSObject -@property(copy, nonatomic) void (^XMLRPCHelperBlockSuccess)(NSString *something); -@property(copy, nonatomic) void (^XMLRPCHelperBlockError)(NSString *something); -@property LinphoneXmlRpcRequest *xmlRpcRequest; -@end - -@implementation XMLRPCRequestObject -@end - -@implementation XMLRPCHelper - -#pragma mark - API - -// typedef void (^XMLRPCHelperBlock)(NSString *something); - -// XMLRPCHelperBlock successBlock = nil; -// XMLRPCHelperBlock errorBlock = nil; - -NSMutableArray *personsArray; - -/*****************************************************************************************/ -+ (void)initArray { - personsArray = [[NSMutableArray alloc] init]; -} - -+ (void)sendXMLRPCRequest:(NSString *)method { - [self sendXMLRPCRequestWithParams:method withParams:nil onSuccess:nil onError:nil]; -} - -+ (void)sendXMLRPCRequestWithParams:(NSString *)method withParams:(NSArray *)params { - [self sendXMLRPCRequestWithParams:method withParams:params onSuccess:nil onError:nil]; -} - -+ (void)sendXMLRPCRequestWithParams:(NSString *)method - withParams:(NSArray *)params - onSuccess:(void (^)(NSString *))successBk { - [self sendXMLRPCRequestWithParams:method withParams:params onSuccess:successBk onError:nil]; -} - -// change block by callback and implement callback with different behavior if success (: call InAppManager) or error (: -// manage error here) -+ (void)sendXMLRPCRequestWithParams:(NSString *)method - withParams:(NSArray *)params - onSuccess:(void (^)(NSString *))successBk - onError:(void (^)(NSString *req))errorBk { - LOGI(@"XMLRPC %@ - %@", method, params); - XMLRPCRequestObject *requestObject = [XMLRPCRequestObject alloc]; - const char *URL = - [LinphoneManager.instance lpConfigStringForKey:@"receipt_validation_url" inSection:@"in_app_purchase"] - .UTF8String; - - requestObject.XMLRPCHelperBlockSuccess = successBk; - requestObject.XMLRPCHelperBlockError = errorBk; - - // Create LinphoneXMLRPCRequest - LinphoneXmlRpcSession *requestSession = linphone_xml_rpc_session_new(LC, URL); - // LinphoneXmlRpcRequest *request = linphone_xml_rpc_request_new(method.UTF8String, LinphoneXmlRpcArgString); - requestObject.xmlRpcRequest = linphone_xml_rpc_request_new(LinphoneXmlRpcArgString, method.UTF8String); - - [personsArray addObject:requestObject]; - // Set argument to this LinphoneXMLRPCRequest - for (NSString *item in params) { - NSLog(@"Linphone XMLRPC Request with argument: %@", item); - linphone_xml_rpc_request_add_string_arg(requestObject.xmlRpcRequest, item.UTF8String); - } - - // Ref and send the LinphoneXMLRPCRequest - requestSession = linphone_xml_rpc_session_ref(requestSession); - linphone_xml_rpc_session_send_request(requestSession, requestObject.xmlRpcRequest); - - // Set the callbacks to this LinphoneXMLRPCRequest - LinphoneXmlRpcRequestCbs *cbs = linphone_xml_rpc_request_get_callbacks(requestObject.xmlRpcRequest); - - // Register XMLRPCHelper in user data to get it back on Callback rised - XMLRPCHelper *xMLRPCHelper = [[XMLRPCHelper alloc] init]; - linphone_xml_rpc_request_set_user_data(requestObject.xmlRpcRequest, ((void *)CFBridgingRetain(xMLRPCHelper))); - - // Set the response Callback - linphone_xml_rpc_request_cbs_set_response(cbs, linphone_xmlrpc_call_back_received); -} - -static void linphone_xmlrpc_call_back_received(LinphoneXmlRpcRequest *request) { - [(__bridge XMLRPCHelper *)linphone_xml_rpc_request_get_user_data(request) dealWithXmlRpcResponse:request]; -} - -- (void)dealWithXmlRpcResponse:(LinphoneXmlRpcRequest *)request { - XMLRPCRequestObject *xmlrpcObject; - NSInteger index = 0; - for (int i = 0; i < [personsArray count]; i++) { - xmlrpcObject = [personsArray objectAtIndex:i]; - if (xmlrpcObject.xmlRpcRequest == request) - break; - index++; - } - - NSString *responseString = - [NSString stringWithFormat:@"%s", (linphone_xml_rpc_request_get_string_response(request))]; - LOGI(@"XMLRPC query: %@", responseString); - if (linphone_xml_rpc_request_get_status(request) == LinphoneXmlRpcStatusOk) { - // Call success block - xmlrpcObject.XMLRPCHelperBlockSuccess(responseString); - } else if (linphone_xml_rpc_request_get_status(request) == LinphoneXmlRpcStatusFailed) { - if (xmlrpcObject.XMLRPCHelperBlockError != nil) { - LOGI(@"XMLRPC query ErrorBlock rised"); - xmlrpcObject.XMLRPCHelperBlockError(responseString); - } - // Display Error alert - [self displayErrorPopup:@"LinphoneXMLRPC Request Failed"]; - } - linphone_xml_rpc_request_unref(request); - [personsArray removeObjectAtIndex:index]; -} - -#pragma mark - Error alerts - -- (void)displayErrorPopup:(NSString *)error { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Server request error", nil) - message:error - preferredStyle:UIAlertControllerStyleAlert]; - - UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) {}]; - - [errView addAction:defaultAction]; - [PhoneMainView.instance presentViewController:errView animated:YES completion:nil]; -} - -@end - -/*****************************************************************************************/ diff --git a/Classes/ar.lproj/AboutView.strings b/Classes/ar.lproj/AboutView.strings deleted file mode 100644 index f9531d29d..000000000 Binary files a/Classes/ar.lproj/AboutView.strings and /dev/null differ diff --git a/Classes/ar.lproj/AssistantLinkView.strings b/Classes/ar.lproj/AssistantLinkView.strings deleted file mode 100644 index 4cdde4b17..000000000 Binary files a/Classes/ar.lproj/AssistantLinkView.strings and /dev/null differ diff --git a/Classes/ar.lproj/AssistantView.strings b/Classes/ar.lproj/AssistantView.strings deleted file mode 100644 index 33607735e..000000000 Binary files a/Classes/ar.lproj/AssistantView.strings and /dev/null differ diff --git a/Classes/ar.lproj/AssistantViewScreens.strings b/Classes/ar.lproj/AssistantViewScreens.strings deleted file mode 100644 index 2becf0ea1..000000000 Binary files a/Classes/ar.lproj/AssistantViewScreens.strings and /dev/null differ diff --git a/Classes/ar.lproj/CallOutgoingView.strings b/Classes/ar.lproj/CallOutgoingView.strings deleted file mode 100644 index 41577a571..000000000 Binary files a/Classes/ar.lproj/CallOutgoingView.strings and /dev/null differ diff --git a/Classes/ar.lproj/CallView~ipad.strings b/Classes/ar.lproj/CallView~ipad.strings deleted file mode 100644 index 148582360..000000000 Binary files a/Classes/ar.lproj/CallView~ipad.strings and /dev/null differ diff --git a/Classes/ar.lproj/ChatConversationCreateView.strings b/Classes/ar.lproj/ChatConversationCreateView.strings deleted file mode 100644 index 1fbf2317c..000000000 Binary files a/Classes/ar.lproj/ChatConversationCreateView.strings and /dev/null differ diff --git a/Classes/ar.lproj/ChatConversationImdnView.strings b/Classes/ar.lproj/ChatConversationImdnView.strings deleted file mode 100644 index 6d3aee378..000000000 Binary files a/Classes/ar.lproj/ChatConversationImdnView.strings and /dev/null differ diff --git a/Classes/ar.lproj/ChatConversationInfoView.strings b/Classes/ar.lproj/ChatConversationInfoView.strings deleted file mode 100644 index d16dfa5fc..000000000 Binary files a/Classes/ar.lproj/ChatConversationInfoView.strings and /dev/null differ diff --git a/Classes/ar.lproj/ChatConversationView.strings b/Classes/ar.lproj/ChatConversationView.strings deleted file mode 100644 index e7a2d2c7f..000000000 Binary files a/Classes/ar.lproj/ChatConversationView.strings and /dev/null differ diff --git a/Classes/ar.lproj/ChatsListView.strings b/Classes/ar.lproj/ChatsListView.strings deleted file mode 100644 index 1d2ec4081..000000000 Binary files a/Classes/ar.lproj/ChatsListView.strings and /dev/null differ diff --git a/Classes/ar.lproj/ContactDetailsView.strings b/Classes/ar.lproj/ContactDetailsView.strings deleted file mode 100644 index 863d6c8ef..000000000 Binary files a/Classes/ar.lproj/ContactDetailsView.strings and /dev/null differ diff --git a/Classes/ar.lproj/ContactsListView.strings b/Classes/ar.lproj/ContactsListView.strings deleted file mode 100644 index 9d6d02520..000000000 Binary files a/Classes/ar.lproj/ContactsListView.strings and /dev/null differ diff --git a/Classes/ar.lproj/CountryListView.strings b/Classes/ar.lproj/CountryListView.strings deleted file mode 100644 index 75501c496..000000000 Binary files a/Classes/ar.lproj/CountryListView.strings and /dev/null differ diff --git a/Classes/ar.lproj/DialerView.strings b/Classes/ar.lproj/DialerView.strings deleted file mode 100644 index 62fda9295..000000000 Binary files a/Classes/ar.lproj/DialerView.strings and /dev/null differ diff --git a/Classes/ar.lproj/DialerView~ipad.strings b/Classes/ar.lproj/DialerView~ipad.strings deleted file mode 100644 index 155fe8c53..000000000 Binary files a/Classes/ar.lproj/DialerView~ipad.strings and /dev/null differ diff --git a/Classes/ar.lproj/FirstLoginView.strings b/Classes/ar.lproj/FirstLoginView.strings deleted file mode 100644 index dec26bac5..000000000 Binary files a/Classes/ar.lproj/FirstLoginView.strings and /dev/null differ diff --git a/Classes/ar.lproj/HistoryDetailsView.strings b/Classes/ar.lproj/HistoryDetailsView.strings deleted file mode 100644 index c98d7d693..000000000 Binary files a/Classes/ar.lproj/HistoryDetailsView.strings and /dev/null differ diff --git a/Classes/ar.lproj/HistoryListView.strings b/Classes/ar.lproj/HistoryListView.strings deleted file mode 100644 index de3c0d52f..000000000 Binary files a/Classes/ar.lproj/HistoryListView.strings and /dev/null differ diff --git a/Classes/ar.lproj/ImageView.strings b/Classes/ar.lproj/ImageView.strings deleted file mode 100644 index fb1a6a864..000000000 Binary files a/Classes/ar.lproj/ImageView.strings and /dev/null differ diff --git a/Classes/ar.lproj/SettingsView.strings b/Classes/ar.lproj/SettingsView.strings deleted file mode 100644 index d112af4fc..000000000 Binary files a/Classes/ar.lproj/SettingsView.strings and /dev/null differ diff --git a/Classes/ar.lproj/ShopView.strings b/Classes/ar.lproj/ShopView.strings deleted file mode 100644 index e8058a446..000000000 Binary files a/Classes/ar.lproj/ShopView.strings and /dev/null differ diff --git a/Classes/ar.lproj/SideMenuView.strings b/Classes/ar.lproj/SideMenuView.strings deleted file mode 100644 index 1ad15f747..000000000 Binary files a/Classes/ar.lproj/SideMenuView.strings and /dev/null differ diff --git a/Classes/ar.lproj/SideMenuView~ipad.strings b/Classes/ar.lproj/SideMenuView~ipad.strings deleted file mode 100644 index edf1890dd..000000000 Binary files a/Classes/ar.lproj/SideMenuView~ipad.strings and /dev/null differ diff --git a/Classes/cs.lproj/AboutView.strings b/Classes/cs.lproj/AboutView.strings deleted file mode 100644 index 7fa3d5394..000000000 Binary files a/Classes/cs.lproj/AboutView.strings and /dev/null differ diff --git a/Classes/cs.lproj/AssistantLinkView.strings b/Classes/cs.lproj/AssistantLinkView.strings deleted file mode 100644 index 4cd079c18..000000000 Binary files a/Classes/cs.lproj/AssistantLinkView.strings and /dev/null differ diff --git a/Classes/cs.lproj/AssistantView.strings b/Classes/cs.lproj/AssistantView.strings deleted file mode 100644 index a472cab99..000000000 Binary files a/Classes/cs.lproj/AssistantView.strings and /dev/null differ diff --git a/Classes/cs.lproj/AssistantViewScreens.strings b/Classes/cs.lproj/AssistantViewScreens.strings deleted file mode 100644 index 068c8d066..000000000 Binary files a/Classes/cs.lproj/AssistantViewScreens.strings and /dev/null differ diff --git a/Classes/cs.lproj/CallIncomingView.strings b/Classes/cs.lproj/CallIncomingView.strings deleted file mode 100644 index fa8f86e44..000000000 Binary files a/Classes/cs.lproj/CallIncomingView.strings and /dev/null differ diff --git a/Classes/cs.lproj/CallOutgoingView.strings b/Classes/cs.lproj/CallOutgoingView.strings deleted file mode 100644 index c5ee0df1f..000000000 Binary files a/Classes/cs.lproj/CallOutgoingView.strings and /dev/null differ diff --git a/Classes/cs.lproj/CallView.strings b/Classes/cs.lproj/CallView.strings deleted file mode 100644 index d62293086..000000000 Binary files a/Classes/cs.lproj/CallView.strings and /dev/null differ diff --git a/Classes/cs.lproj/CallView~ipad.strings b/Classes/cs.lproj/CallView~ipad.strings deleted file mode 100644 index 5028d10aa..000000000 Binary files a/Classes/cs.lproj/CallView~ipad.strings and /dev/null differ diff --git a/Classes/cs.lproj/ChatConversationCreateView.strings b/Classes/cs.lproj/ChatConversationCreateView.strings deleted file mode 100644 index 4e2eec3ad..000000000 Binary files a/Classes/cs.lproj/ChatConversationCreateView.strings and /dev/null differ diff --git a/Classes/cs.lproj/ChatConversationImdnView.strings b/Classes/cs.lproj/ChatConversationImdnView.strings deleted file mode 100644 index 21dbb2a16..000000000 Binary files a/Classes/cs.lproj/ChatConversationImdnView.strings and /dev/null differ diff --git a/Classes/cs.lproj/ChatConversationInfoView.strings b/Classes/cs.lproj/ChatConversationInfoView.strings deleted file mode 100644 index 96abd854c..000000000 Binary files a/Classes/cs.lproj/ChatConversationInfoView.strings and /dev/null differ diff --git a/Classes/cs.lproj/ChatConversationView.strings b/Classes/cs.lproj/ChatConversationView.strings deleted file mode 100644 index 997be2745..000000000 Binary files a/Classes/cs.lproj/ChatConversationView.strings and /dev/null differ diff --git a/Classes/cs.lproj/ContactDetailsView.strings b/Classes/cs.lproj/ContactDetailsView.strings deleted file mode 100644 index e0827c1d1..000000000 Binary files a/Classes/cs.lproj/ContactDetailsView.strings and /dev/null differ diff --git a/Classes/cs.lproj/ContactsListView.strings b/Classes/cs.lproj/ContactsListView.strings deleted file mode 100644 index a90ed875b..000000000 Binary files a/Classes/cs.lproj/ContactsListView.strings and /dev/null differ diff --git a/Classes/cs.lproj/CountryListView.strings b/Classes/cs.lproj/CountryListView.strings deleted file mode 100644 index 332bc7997..000000000 Binary files a/Classes/cs.lproj/CountryListView.strings and /dev/null differ diff --git a/Classes/cs.lproj/DialerView.strings b/Classes/cs.lproj/DialerView.strings deleted file mode 100644 index e149a02c7..000000000 Binary files a/Classes/cs.lproj/DialerView.strings and /dev/null differ diff --git a/Classes/cs.lproj/DialerView~ipad.strings b/Classes/cs.lproj/DialerView~ipad.strings deleted file mode 100644 index d20c6122b..000000000 Binary files a/Classes/cs.lproj/DialerView~ipad.strings and /dev/null differ diff --git a/Classes/cs.lproj/FirstLoginView.strings b/Classes/cs.lproj/FirstLoginView.strings deleted file mode 100644 index 8e3a3c900..000000000 Binary files a/Classes/cs.lproj/FirstLoginView.strings and /dev/null differ diff --git a/Classes/cs.lproj/HistoryDetailsView.strings b/Classes/cs.lproj/HistoryDetailsView.strings deleted file mode 100644 index debe7ca37..000000000 Binary files a/Classes/cs.lproj/HistoryDetailsView.strings and /dev/null differ diff --git a/Classes/cs.lproj/SettingsView.strings b/Classes/cs.lproj/SettingsView.strings deleted file mode 100644 index 4a9364003..000000000 Binary files a/Classes/cs.lproj/SettingsView.strings and /dev/null differ diff --git a/Classes/cs.lproj/ShopView.strings b/Classes/cs.lproj/ShopView.strings deleted file mode 100644 index 9bd4733ca..000000000 Binary files a/Classes/cs.lproj/ShopView.strings and /dev/null differ diff --git a/Classes/cs.lproj/SideMenuView.strings b/Classes/cs.lproj/SideMenuView.strings deleted file mode 100644 index 6411825a3..000000000 Binary files a/Classes/cs.lproj/SideMenuView.strings and /dev/null differ diff --git a/Classes/de.lproj/AboutView.strings b/Classes/de.lproj/AboutView.strings deleted file mode 100644 index f77f8d9ce..000000000 Binary files a/Classes/de.lproj/AboutView.strings and /dev/null differ diff --git a/Classes/de.lproj/AssistantLinkView.strings b/Classes/de.lproj/AssistantLinkView.strings deleted file mode 100644 index d0d2758fa..000000000 Binary files a/Classes/de.lproj/AssistantLinkView.strings and /dev/null differ diff --git a/Classes/de.lproj/AssistantView.strings b/Classes/de.lproj/AssistantView.strings deleted file mode 100644 index 35ec5f829..000000000 Binary files a/Classes/de.lproj/AssistantView.strings and /dev/null differ diff --git a/Classes/de.lproj/AssistantViewScreens.strings b/Classes/de.lproj/AssistantViewScreens.strings deleted file mode 100644 index 939955561..000000000 Binary files a/Classes/de.lproj/AssistantViewScreens.strings and /dev/null differ diff --git a/Classes/de.lproj/AssistantViews.strings b/Classes/de.lproj/AssistantViews.strings deleted file mode 100644 index 135adbe94..000000000 Binary files a/Classes/de.lproj/AssistantViews.strings and /dev/null differ diff --git a/Classes/de.lproj/AssistantView~ipad.strings b/Classes/de.lproj/AssistantView~ipad.strings deleted file mode 100644 index a7bd70f9d..000000000 Binary files a/Classes/de.lproj/AssistantView~ipad.strings and /dev/null differ diff --git a/Classes/de.lproj/CallIncomingView.strings b/Classes/de.lproj/CallIncomingView.strings deleted file mode 100644 index ddd82f96d..000000000 Binary files a/Classes/de.lproj/CallIncomingView.strings and /dev/null differ diff --git a/Classes/de.lproj/CallOutgoingView.strings b/Classes/de.lproj/CallOutgoingView.strings deleted file mode 100644 index 88483e79f..000000000 Binary files a/Classes/de.lproj/CallOutgoingView.strings and /dev/null differ diff --git a/Classes/de.lproj/CallView.strings b/Classes/de.lproj/CallView.strings deleted file mode 100644 index a965ca76c..000000000 Binary files a/Classes/de.lproj/CallView.strings and /dev/null differ diff --git a/Classes/de.lproj/CallView~ipad.strings b/Classes/de.lproj/CallView~ipad.strings deleted file mode 100644 index 3395287b7..000000000 Binary files a/Classes/de.lproj/CallView~ipad.strings and /dev/null differ diff --git a/Classes/de.lproj/ChatConversationCreateView.strings b/Classes/de.lproj/ChatConversationCreateView.strings deleted file mode 100644 index 4274a47c2..000000000 Binary files a/Classes/de.lproj/ChatConversationCreateView.strings and /dev/null differ diff --git a/Classes/de.lproj/ChatConversationImdnView.strings b/Classes/de.lproj/ChatConversationImdnView.strings deleted file mode 100644 index 095214986..000000000 Binary files a/Classes/de.lproj/ChatConversationImdnView.strings and /dev/null differ diff --git a/Classes/de.lproj/ChatConversationInfoView.strings b/Classes/de.lproj/ChatConversationInfoView.strings deleted file mode 100644 index 21814eb94..000000000 Binary files a/Classes/de.lproj/ChatConversationInfoView.strings and /dev/null differ diff --git a/Classes/de.lproj/ChatConversationView.strings b/Classes/de.lproj/ChatConversationView.strings deleted file mode 100644 index 5a77de52a..000000000 Binary files a/Classes/de.lproj/ChatConversationView.strings and /dev/null differ diff --git a/Classes/de.lproj/ChatRoomView.strings b/Classes/de.lproj/ChatRoomView.strings deleted file mode 100644 index 52f33c128..000000000 Binary files a/Classes/de.lproj/ChatRoomView.strings and /dev/null differ diff --git a/Classes/de.lproj/ChatView.strings b/Classes/de.lproj/ChatView.strings deleted file mode 100644 index f40dfd2ae..000000000 Binary files a/Classes/de.lproj/ChatView.strings and /dev/null differ diff --git a/Classes/de.lproj/ChatsListView.strings b/Classes/de.lproj/ChatsListView.strings deleted file mode 100644 index b145a2d79..000000000 Binary files a/Classes/de.lproj/ChatsListView.strings and /dev/null differ diff --git a/Classes/de.lproj/ContactDetailsView.strings b/Classes/de.lproj/ContactDetailsView.strings deleted file mode 100644 index cf1039fb1..000000000 Binary files a/Classes/de.lproj/ContactDetailsView.strings and /dev/null differ diff --git a/Classes/de.lproj/ContactsListView.strings b/Classes/de.lproj/ContactsListView.strings deleted file mode 100644 index 7dbb476e5..000000000 Binary files a/Classes/de.lproj/ContactsListView.strings and /dev/null differ diff --git a/Classes/de.lproj/ContactsView.strings b/Classes/de.lproj/ContactsView.strings deleted file mode 100644 index fdd063fb9..000000000 Binary files a/Classes/de.lproj/ContactsView.strings and /dev/null differ diff --git a/Classes/de.lproj/CountryListView.strings b/Classes/de.lproj/CountryListView.strings deleted file mode 100644 index 3091c70c6..000000000 Binary files a/Classes/de.lproj/CountryListView.strings and /dev/null differ diff --git a/Classes/de.lproj/DialerView.strings b/Classes/de.lproj/DialerView.strings deleted file mode 100644 index 06dc438f5..000000000 Binary files a/Classes/de.lproj/DialerView.strings and /dev/null differ diff --git a/Classes/de.lproj/DialerView~ipad.strings b/Classes/de.lproj/DialerView~ipad.strings deleted file mode 100644 index 2cf029bbe..000000000 Binary files a/Classes/de.lproj/DialerView~ipad.strings and /dev/null differ diff --git a/Classes/de.lproj/FirstLoginView.strings b/Classes/de.lproj/FirstLoginView.strings deleted file mode 100644 index eda0efe90..000000000 Binary files a/Classes/de.lproj/FirstLoginView.strings and /dev/null differ diff --git a/Classes/de.lproj/HistoryDetailsView.strings b/Classes/de.lproj/HistoryDetailsView.strings deleted file mode 100644 index 9aece229f..000000000 Binary files a/Classes/de.lproj/HistoryDetailsView.strings and /dev/null differ diff --git a/Classes/de.lproj/HistoryListView.strings b/Classes/de.lproj/HistoryListView.strings deleted file mode 100644 index e505be34c..000000000 Binary files a/Classes/de.lproj/HistoryListView.strings and /dev/null differ diff --git a/Classes/de.lproj/HistoryView.strings b/Classes/de.lproj/HistoryView.strings deleted file mode 100644 index b1ce4a4ea..000000000 Binary files a/Classes/de.lproj/HistoryView.strings and /dev/null differ diff --git a/Classes/de.lproj/ImageView.strings b/Classes/de.lproj/ImageView.strings deleted file mode 100644 index 65e8970e8..000000000 Binary files a/Classes/de.lproj/ImageView.strings and /dev/null differ diff --git a/Classes/de.lproj/InCallView.strings b/Classes/de.lproj/InCallView.strings deleted file mode 100644 index ecce22323..000000000 Binary files a/Classes/de.lproj/InCallView.strings and /dev/null differ diff --git a/Classes/de.lproj/IncomingCallView.strings b/Classes/de.lproj/IncomingCallView.strings deleted file mode 100644 index 53c9c18ae..000000000 Binary files a/Classes/de.lproj/IncomingCallView.strings and /dev/null differ diff --git a/Classes/de.lproj/IncomingCallView~ipad.strings b/Classes/de.lproj/IncomingCallView~ipad.strings deleted file mode 100644 index b50cb2cce..000000000 Binary files a/Classes/de.lproj/IncomingCallView~ipad.strings and /dev/null differ diff --git a/Classes/de.lproj/SettingsView.strings b/Classes/de.lproj/SettingsView.strings deleted file mode 100644 index fc0832923..000000000 Binary files a/Classes/de.lproj/SettingsView.strings and /dev/null differ diff --git a/Classes/de.lproj/ShopView.strings b/Classes/de.lproj/ShopView.strings deleted file mode 100644 index f0903290a..000000000 Binary files a/Classes/de.lproj/ShopView.strings and /dev/null differ diff --git a/Classes/de.lproj/SideMenuView.strings b/Classes/de.lproj/SideMenuView.strings deleted file mode 100644 index e8c385f6a..000000000 Binary files a/Classes/de.lproj/SideMenuView.strings and /dev/null differ diff --git a/Classes/de.lproj/SideMenuView~ipad.strings b/Classes/de.lproj/SideMenuView~ipad.strings deleted file mode 100644 index d23f8ecb2..000000000 Binary files a/Classes/de.lproj/SideMenuView~ipad.strings and /dev/null differ diff --git a/Classes/en.lproj/RecordingsListView.strings b/Classes/en.lproj/RecordingsListView.strings deleted file mode 100644 index 8025d9b51..000000000 --- a/Classes/en.lproj/RecordingsListView.strings +++ /dev/null @@ -1,18 +0,0 @@ - -/* Class = "UIButton"; accessibilityLabel = "Select all"; ObjectID = "16S-9G-2cb"; */ -"16S-9G-2cb.accessibilityLabel" = "Select all"; - -/* Class = "UIButton"; accessibilityLabel = "Edit"; ObjectID = "CWx-9g-0JG"; */ -"CWx-9g-0JG.accessibilityLabel" = "Edit"; - -/* Class = "UIButton"; accessibilityLabel = "Delete all"; ObjectID = "CqG-tB-maQ"; */ -"CqG-tB-maQ.accessibilityLabel" = "Delete all"; - -/* Class = "UIButton"; accessibilityLabel = "Back"; ObjectID = "rAc-tI-AVp"; */ -"rAc-tI-AVp.accessibilityLabel" = "Back"; - -/* Class = "UIButton"; accessibilityLabel = "Delete all"; ObjectID = "zDs-pW-vyA"; */ -"zDs-pW-vyA.accessibilityLabel" = "Delete all"; - -/* Class = "UILabel"; text = "No recording found"; ObjectID = "zXd-Ic-rwm"; */ -"zXd-Ic-rwm.text" = "No recording found"; diff --git a/Classes/es.lproj/AboutView.strings b/Classes/es.lproj/AboutView.strings deleted file mode 100644 index 2869f0d37..000000000 Binary files a/Classes/es.lproj/AboutView.strings and /dev/null differ diff --git a/Classes/es.lproj/AssistantLinkView.strings b/Classes/es.lproj/AssistantLinkView.strings deleted file mode 100644 index 2582a58ce..000000000 Binary files a/Classes/es.lproj/AssistantLinkView.strings and /dev/null differ diff --git a/Classes/es.lproj/AssistantView.strings b/Classes/es.lproj/AssistantView.strings deleted file mode 100644 index a62ff7261..000000000 Binary files a/Classes/es.lproj/AssistantView.strings and /dev/null differ diff --git a/Classes/es.lproj/AssistantViewScreens.strings b/Classes/es.lproj/AssistantViewScreens.strings deleted file mode 100644 index 5fb312b9e..000000000 Binary files a/Classes/es.lproj/AssistantViewScreens.strings and /dev/null differ diff --git a/Classes/es.lproj/CallIncomingView.strings b/Classes/es.lproj/CallIncomingView.strings deleted file mode 100644 index 1ab84b080..000000000 Binary files a/Classes/es.lproj/CallIncomingView.strings and /dev/null differ diff --git a/Classes/es.lproj/CallOutgoingView.strings b/Classes/es.lproj/CallOutgoingView.strings deleted file mode 100644 index b10453591..000000000 Binary files a/Classes/es.lproj/CallOutgoingView.strings and /dev/null differ diff --git a/Classes/es.lproj/CallView.strings b/Classes/es.lproj/CallView.strings deleted file mode 100644 index 9d9fdd31e..000000000 Binary files a/Classes/es.lproj/CallView.strings and /dev/null differ diff --git a/Classes/es.lproj/CallView~ipad.strings b/Classes/es.lproj/CallView~ipad.strings deleted file mode 100644 index 088cb5445..000000000 Binary files a/Classes/es.lproj/CallView~ipad.strings and /dev/null differ diff --git a/Classes/es.lproj/ChatConversationCreateView.strings b/Classes/es.lproj/ChatConversationCreateView.strings deleted file mode 100644 index a30f760fd..000000000 Binary files a/Classes/es.lproj/ChatConversationCreateView.strings and /dev/null differ diff --git a/Classes/es.lproj/ChatConversationImdnView.strings b/Classes/es.lproj/ChatConversationImdnView.strings deleted file mode 100644 index b8fa0a132..000000000 Binary files a/Classes/es.lproj/ChatConversationImdnView.strings and /dev/null differ diff --git a/Classes/es.lproj/ChatConversationInfoView.strings b/Classes/es.lproj/ChatConversationInfoView.strings deleted file mode 100644 index 87be82250..000000000 Binary files a/Classes/es.lproj/ChatConversationInfoView.strings and /dev/null differ diff --git a/Classes/es.lproj/ChatConversationView.strings b/Classes/es.lproj/ChatConversationView.strings deleted file mode 100644 index 0fe13d54f..000000000 Binary files a/Classes/es.lproj/ChatConversationView.strings and /dev/null differ diff --git a/Classes/es.lproj/ChatsListView.strings b/Classes/es.lproj/ChatsListView.strings deleted file mode 100644 index aa6e38c83..000000000 Binary files a/Classes/es.lproj/ChatsListView.strings and /dev/null differ diff --git a/Classes/es.lproj/ContactDetailsView.strings b/Classes/es.lproj/ContactDetailsView.strings deleted file mode 100644 index 8c5f8daa4..000000000 Binary files a/Classes/es.lproj/ContactDetailsView.strings and /dev/null differ diff --git a/Classes/es.lproj/ContactsListView.strings b/Classes/es.lproj/ContactsListView.strings deleted file mode 100644 index bb690d9a1..000000000 Binary files a/Classes/es.lproj/ContactsListView.strings and /dev/null differ diff --git a/Classes/es.lproj/CountryListView.strings b/Classes/es.lproj/CountryListView.strings deleted file mode 100644 index 81c3daff6..000000000 Binary files a/Classes/es.lproj/CountryListView.strings and /dev/null differ diff --git a/Classes/es.lproj/DialerView.strings b/Classes/es.lproj/DialerView.strings deleted file mode 100644 index f6e5cfefb..000000000 Binary files a/Classes/es.lproj/DialerView.strings and /dev/null differ diff --git a/Classes/es.lproj/DialerView~ipad.strings b/Classes/es.lproj/DialerView~ipad.strings deleted file mode 100644 index 5b82d187c..000000000 Binary files a/Classes/es.lproj/DialerView~ipad.strings and /dev/null differ diff --git a/Classes/es.lproj/FirstLoginView.strings b/Classes/es.lproj/FirstLoginView.strings deleted file mode 100644 index 648ad962f..000000000 Binary files a/Classes/es.lproj/FirstLoginView.strings and /dev/null differ diff --git a/Classes/es.lproj/HistoryDetailsView.strings b/Classes/es.lproj/HistoryDetailsView.strings deleted file mode 100644 index 51fb27ebd..000000000 Binary files a/Classes/es.lproj/HistoryDetailsView.strings and /dev/null differ diff --git a/Classes/es.lproj/HistoryListView.strings b/Classes/es.lproj/HistoryListView.strings deleted file mode 100644 index 766ee54bb..000000000 Binary files a/Classes/es.lproj/HistoryListView.strings and /dev/null differ diff --git a/Classes/es.lproj/ImageView.strings b/Classes/es.lproj/ImageView.strings deleted file mode 100644 index 2575a4289..000000000 Binary files a/Classes/es.lproj/ImageView.strings and /dev/null differ diff --git a/Classes/es.lproj/SettingsView.strings b/Classes/es.lproj/SettingsView.strings deleted file mode 100644 index 64c8718bc..000000000 Binary files a/Classes/es.lproj/SettingsView.strings and /dev/null differ diff --git a/Classes/es.lproj/ShopView.strings b/Classes/es.lproj/ShopView.strings deleted file mode 100644 index 736605c95..000000000 Binary files a/Classes/es.lproj/ShopView.strings and /dev/null differ diff --git a/Classes/es.lproj/SideMenuView.strings b/Classes/es.lproj/SideMenuView.strings deleted file mode 100644 index a1f126d9b..000000000 Binary files a/Classes/es.lproj/SideMenuView.strings and /dev/null differ diff --git a/Classes/es.lproj/SideMenuView~ipad.strings b/Classes/es.lproj/SideMenuView~ipad.strings deleted file mode 100644 index 0ec55c3e1..000000000 Binary files a/Classes/es.lproj/SideMenuView~ipad.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/AboutView.strings b/Classes/es_AR.lproj/AboutView.strings deleted file mode 100644 index 066cf2ad6..000000000 Binary files a/Classes/es_AR.lproj/AboutView.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/AssistantLinkView.strings b/Classes/es_AR.lproj/AssistantLinkView.strings deleted file mode 100644 index 163f68764..000000000 Binary files a/Classes/es_AR.lproj/AssistantLinkView.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/AssistantView.strings b/Classes/es_AR.lproj/AssistantView.strings deleted file mode 100644 index a62ff7261..000000000 Binary files a/Classes/es_AR.lproj/AssistantView.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/AssistantViewScreens.strings b/Classes/es_AR.lproj/AssistantViewScreens.strings deleted file mode 100644 index d306da1dc..000000000 Binary files a/Classes/es_AR.lproj/AssistantViewScreens.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/CallIncomingView.strings b/Classes/es_AR.lproj/CallIncomingView.strings deleted file mode 100644 index 1ab84b080..000000000 Binary files a/Classes/es_AR.lproj/CallIncomingView.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/CallOutgoingView.strings b/Classes/es_AR.lproj/CallOutgoingView.strings deleted file mode 100644 index b10453591..000000000 Binary files a/Classes/es_AR.lproj/CallOutgoingView.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/CallView.strings b/Classes/es_AR.lproj/CallView.strings deleted file mode 100644 index 9d9fdd31e..000000000 Binary files a/Classes/es_AR.lproj/CallView.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/CallView~ipad.strings b/Classes/es_AR.lproj/CallView~ipad.strings deleted file mode 100644 index 088cb5445..000000000 Binary files a/Classes/es_AR.lproj/CallView~ipad.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/ChatConversationCreateView.strings b/Classes/es_AR.lproj/ChatConversationCreateView.strings deleted file mode 100644 index 0616ce3c9..000000000 Binary files a/Classes/es_AR.lproj/ChatConversationCreateView.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/ChatConversationImdnView.strings b/Classes/es_AR.lproj/ChatConversationImdnView.strings deleted file mode 100644 index 9e41d4c7f..000000000 Binary files a/Classes/es_AR.lproj/ChatConversationImdnView.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/ChatConversationInfoView.strings b/Classes/es_AR.lproj/ChatConversationInfoView.strings deleted file mode 100644 index e24fcd243..000000000 Binary files a/Classes/es_AR.lproj/ChatConversationInfoView.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/ChatConversationView.strings b/Classes/es_AR.lproj/ChatConversationView.strings deleted file mode 100644 index 0fe13d54f..000000000 Binary files a/Classes/es_AR.lproj/ChatConversationView.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/ChatsListView.strings b/Classes/es_AR.lproj/ChatsListView.strings deleted file mode 100644 index aa6e38c83..000000000 Binary files a/Classes/es_AR.lproj/ChatsListView.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/ContactDetailsView.strings b/Classes/es_AR.lproj/ContactDetailsView.strings deleted file mode 100644 index 8c5f8daa4..000000000 Binary files a/Classes/es_AR.lproj/ContactDetailsView.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/ContactsListView.strings b/Classes/es_AR.lproj/ContactsListView.strings deleted file mode 100644 index 7a6c2efb2..000000000 Binary files a/Classes/es_AR.lproj/ContactsListView.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/CountryListView.strings b/Classes/es_AR.lproj/CountryListView.strings deleted file mode 100644 index 81c3daff6..000000000 Binary files a/Classes/es_AR.lproj/CountryListView.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/DialerView.strings b/Classes/es_AR.lproj/DialerView.strings deleted file mode 100644 index f6e5cfefb..000000000 Binary files a/Classes/es_AR.lproj/DialerView.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/DialerView~ipad.strings b/Classes/es_AR.lproj/DialerView~ipad.strings deleted file mode 100644 index 5b82d187c..000000000 Binary files a/Classes/es_AR.lproj/DialerView~ipad.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/FirstLoginView.strings b/Classes/es_AR.lproj/FirstLoginView.strings deleted file mode 100644 index ec979500a..000000000 Binary files a/Classes/es_AR.lproj/FirstLoginView.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/HistoryDetailsView.strings b/Classes/es_AR.lproj/HistoryDetailsView.strings deleted file mode 100644 index 51fb27ebd..000000000 Binary files a/Classes/es_AR.lproj/HistoryDetailsView.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/HistoryListView.strings b/Classes/es_AR.lproj/HistoryListView.strings deleted file mode 100644 index 766ee54bb..000000000 Binary files a/Classes/es_AR.lproj/HistoryListView.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/ImageView.strings b/Classes/es_AR.lproj/ImageView.strings deleted file mode 100644 index 2575a4289..000000000 Binary files a/Classes/es_AR.lproj/ImageView.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/SettingsView.strings b/Classes/es_AR.lproj/SettingsView.strings deleted file mode 100644 index b3f73e557..000000000 Binary files a/Classes/es_AR.lproj/SettingsView.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/ShopView.strings b/Classes/es_AR.lproj/ShopView.strings deleted file mode 100644 index e7a76f213..000000000 Binary files a/Classes/es_AR.lproj/ShopView.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/SideMenuView.strings b/Classes/es_AR.lproj/SideMenuView.strings deleted file mode 100644 index a1f126d9b..000000000 Binary files a/Classes/es_AR.lproj/SideMenuView.strings and /dev/null differ diff --git a/Classes/es_AR.lproj/SideMenuView~ipad.strings b/Classes/es_AR.lproj/SideMenuView~ipad.strings deleted file mode 100644 index 0ec55c3e1..000000000 Binary files a/Classes/es_AR.lproj/SideMenuView~ipad.strings and /dev/null differ diff --git a/Classes/fr.lproj/AboutView.strings b/Classes/fr.lproj/AboutView.strings deleted file mode 100644 index e55d09238..000000000 Binary files a/Classes/fr.lproj/AboutView.strings and /dev/null differ diff --git a/Classes/fr.lproj/AssistantLinkView.strings b/Classes/fr.lproj/AssistantLinkView.strings deleted file mode 100644 index 06f083708..000000000 Binary files a/Classes/fr.lproj/AssistantLinkView.strings and /dev/null differ diff --git a/Classes/fr.lproj/AssistantView.strings b/Classes/fr.lproj/AssistantView.strings deleted file mode 100644 index 2caf45e7e..000000000 Binary files a/Classes/fr.lproj/AssistantView.strings and /dev/null differ diff --git a/Classes/fr.lproj/AssistantViewScreens.strings b/Classes/fr.lproj/AssistantViewScreens.strings deleted file mode 100644 index 3b2d48592..000000000 Binary files a/Classes/fr.lproj/AssistantViewScreens.strings and /dev/null differ diff --git a/Classes/fr.lproj/ChatConversationCreateView.strings b/Classes/fr.lproj/ChatConversationCreateView.strings deleted file mode 100644 index b7064d510..000000000 Binary files a/Classes/fr.lproj/ChatConversationCreateView.strings and /dev/null differ diff --git a/Classes/fr.lproj/ChatConversationImdnView.strings b/Classes/fr.lproj/ChatConversationImdnView.strings deleted file mode 100644 index b2541aa72..000000000 Binary files a/Classes/fr.lproj/ChatConversationImdnView.strings and /dev/null differ diff --git a/Classes/fr.lproj/ChatConversationInfoView.strings b/Classes/fr.lproj/ChatConversationInfoView.strings deleted file mode 100644 index dfd983e84..000000000 Binary files a/Classes/fr.lproj/ChatConversationInfoView.strings and /dev/null differ diff --git a/Classes/fr.lproj/ChatConversationView.strings b/Classes/fr.lproj/ChatConversationView.strings deleted file mode 100644 index 474ee39ad..000000000 Binary files a/Classes/fr.lproj/ChatConversationView.strings and /dev/null differ diff --git a/Classes/fr.lproj/ChatsListView.strings b/Classes/fr.lproj/ChatsListView.strings deleted file mode 100644 index fc08a6c9c..000000000 Binary files a/Classes/fr.lproj/ChatsListView.strings and /dev/null differ diff --git a/Classes/fr.lproj/ContactDetailsView.strings b/Classes/fr.lproj/ContactDetailsView.strings deleted file mode 100644 index 84e81843f..000000000 Binary files a/Classes/fr.lproj/ContactDetailsView.strings and /dev/null differ diff --git a/Classes/fr.lproj/ContactsListView.strings b/Classes/fr.lproj/ContactsListView.strings deleted file mode 100644 index c683eec07..000000000 Binary files a/Classes/fr.lproj/ContactsListView.strings and /dev/null differ diff --git a/Classes/fr.lproj/CountryListView.strings b/Classes/fr.lproj/CountryListView.strings deleted file mode 100644 index af293dd97..000000000 Binary files a/Classes/fr.lproj/CountryListView.strings and /dev/null differ diff --git a/Classes/fr.lproj/DialerView.strings b/Classes/fr.lproj/DialerView.strings deleted file mode 100644 index a6d6f0346..000000000 Binary files a/Classes/fr.lproj/DialerView.strings and /dev/null differ diff --git a/Classes/fr.lproj/DialerView~ipad.strings b/Classes/fr.lproj/DialerView~ipad.strings deleted file mode 100644 index 13406ed6f..000000000 Binary files a/Classes/fr.lproj/DialerView~ipad.strings and /dev/null differ diff --git a/Classes/fr.lproj/FirstLoginView.strings b/Classes/fr.lproj/FirstLoginView.strings deleted file mode 100644 index f29da653b..000000000 Binary files a/Classes/fr.lproj/FirstLoginView.strings and /dev/null differ diff --git a/Classes/fr.lproj/HistoryDetailsView.strings b/Classes/fr.lproj/HistoryDetailsView.strings deleted file mode 100644 index 5f60ea629..000000000 Binary files a/Classes/fr.lproj/HistoryDetailsView.strings and /dev/null differ diff --git a/Classes/fr.lproj/HistoryListView.strings b/Classes/fr.lproj/HistoryListView.strings deleted file mode 100644 index 09536aa9e..000000000 Binary files a/Classes/fr.lproj/HistoryListView.strings and /dev/null differ diff --git a/Classes/fr.lproj/ImageView.strings b/Classes/fr.lproj/ImageView.strings deleted file mode 100644 index abd98de6a..000000000 Binary files a/Classes/fr.lproj/ImageView.strings and /dev/null differ diff --git a/Classes/fr.lproj/PhoneMainView.strings b/Classes/fr.lproj/PhoneMainView.strings deleted file mode 100644 index 8b1378917..000000000 --- a/Classes/fr.lproj/PhoneMainView.strings +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Classes/fr.lproj/RecordingsListView.strings b/Classes/fr.lproj/RecordingsListView.strings deleted file mode 100644 index f30067e9a..000000000 --- a/Classes/fr.lproj/RecordingsListView.strings +++ /dev/null @@ -1,18 +0,0 @@ - -/* Class = "UIButton"; accessibilityLabel = "Select all"; ObjectID = "16S-9G-2cb"; */ -"16S-9G-2cb.accessibilityLabel" = "Tout sélectionner"; - -/* Class = "UIButton"; accessibilityLabel = "Edit"; ObjectID = "CWx-9g-0JG"; */ -"CWx-9g-0JG.accessibilityLabel" = "Éditer"; - -/* Class = "UIButton"; accessibilityLabel = "Delete all"; ObjectID = "CqG-tB-maQ"; */ -"CqG-tB-maQ.accessibilityLabel" = "Tout supprimer"; - -/* Class = "UIButton"; accessibilityLabel = "Back"; ObjectID = "rAc-tI-AVp"; */ -"rAc-tI-AVp.accessibilityLabel" = "Retour"; - -/* Class = "UIButton"; accessibilityLabel = "Delete all"; ObjectID = "zDs-pW-vyA"; */ -"zDs-pW-vyA.accessibilityLabel" = "Tout supprimer"; - -/* Class = "UILabel"; text = "No recording found"; ObjectID = "zXd-Ic-rwm"; */ -"zXd-Ic-rwm.text" = "Aucun enregistrement trouvé"; diff --git a/Classes/fr.lproj/SettingsView.strings b/Classes/fr.lproj/SettingsView.strings deleted file mode 100644 index d9b341fb8..000000000 Binary files a/Classes/fr.lproj/SettingsView.strings and /dev/null differ diff --git a/Classes/fr.lproj/ShopView.strings b/Classes/fr.lproj/ShopView.strings deleted file mode 100644 index 9b120c88e..000000000 Binary files a/Classes/fr.lproj/ShopView.strings and /dev/null differ diff --git a/Classes/fr.lproj/SideMenuView.strings b/Classes/fr.lproj/SideMenuView.strings deleted file mode 100644 index a1f126d9b..000000000 Binary files a/Classes/fr.lproj/SideMenuView.strings and /dev/null differ diff --git a/Classes/fr.lproj/SideMenuView~ipad.strings b/Classes/fr.lproj/SideMenuView~ipad.strings deleted file mode 100644 index 0ec55c3e1..000000000 Binary files a/Classes/fr.lproj/SideMenuView~ipad.strings and /dev/null differ diff --git a/Classes/he.lproj/AboutView.strings b/Classes/he.lproj/AboutView.strings deleted file mode 100644 index 772833379..000000000 Binary files a/Classes/he.lproj/AboutView.strings and /dev/null differ diff --git a/Classes/hu.lproj/AboutView.strings b/Classes/hu.lproj/AboutView.strings deleted file mode 100644 index a10171208..000000000 Binary files a/Classes/hu.lproj/AboutView.strings and /dev/null differ diff --git a/Classes/hu.lproj/AssistantLinkView.strings b/Classes/hu.lproj/AssistantLinkView.strings deleted file mode 100644 index 7749f89ed..000000000 Binary files a/Classes/hu.lproj/AssistantLinkView.strings and /dev/null differ diff --git a/Classes/hu.lproj/AssistantView.strings b/Classes/hu.lproj/AssistantView.strings deleted file mode 100644 index 89dd43619..000000000 Binary files a/Classes/hu.lproj/AssistantView.strings and /dev/null differ diff --git a/Classes/hu.lproj/AssistantViewScreens.strings b/Classes/hu.lproj/AssistantViewScreens.strings deleted file mode 100644 index 91218eda5..000000000 Binary files a/Classes/hu.lproj/AssistantViewScreens.strings and /dev/null differ diff --git a/Classes/hu.lproj/ChatConversationCreateView.strings b/Classes/hu.lproj/ChatConversationCreateView.strings deleted file mode 100644 index c754b8af6..000000000 Binary files a/Classes/hu.lproj/ChatConversationCreateView.strings and /dev/null differ diff --git a/Classes/hu.lproj/ChatConversationImdnView.strings b/Classes/hu.lproj/ChatConversationImdnView.strings deleted file mode 100644 index 6fa673e30..000000000 Binary files a/Classes/hu.lproj/ChatConversationImdnView.strings and /dev/null differ diff --git a/Classes/hu.lproj/ChatConversationInfoView.strings b/Classes/hu.lproj/ChatConversationInfoView.strings deleted file mode 100644 index 19dce51e8..000000000 Binary files a/Classes/hu.lproj/ChatConversationInfoView.strings and /dev/null differ diff --git a/Classes/hu.lproj/ChatConversationView.strings b/Classes/hu.lproj/ChatConversationView.strings deleted file mode 100644 index 9bd4adb94..000000000 Binary files a/Classes/hu.lproj/ChatConversationView.strings and /dev/null differ diff --git a/Classes/hu.lproj/ChatsListView.strings b/Classes/hu.lproj/ChatsListView.strings deleted file mode 100644 index f39a8e4db..000000000 Binary files a/Classes/hu.lproj/ChatsListView.strings and /dev/null differ diff --git a/Classes/hu.lproj/ContactDetailsView.strings b/Classes/hu.lproj/ContactDetailsView.strings deleted file mode 100644 index 62ae0d353..000000000 Binary files a/Classes/hu.lproj/ContactDetailsView.strings and /dev/null differ diff --git a/Classes/hu.lproj/ContactsListView.strings b/Classes/hu.lproj/ContactsListView.strings deleted file mode 100644 index f4f3ce6a0..000000000 Binary files a/Classes/hu.lproj/ContactsListView.strings and /dev/null differ diff --git a/Classes/hu.lproj/CountryListView.strings b/Classes/hu.lproj/CountryListView.strings deleted file mode 100644 index 0e76faddc..000000000 Binary files a/Classes/hu.lproj/CountryListView.strings and /dev/null differ diff --git a/Classes/hu.lproj/DialerView.strings b/Classes/hu.lproj/DialerView.strings deleted file mode 100644 index 826c10e01..000000000 Binary files a/Classes/hu.lproj/DialerView.strings and /dev/null differ diff --git a/Classes/hu.lproj/DialerView~ipad.strings b/Classes/hu.lproj/DialerView~ipad.strings deleted file mode 100644 index 7f40ccbb0..000000000 Binary files a/Classes/hu.lproj/DialerView~ipad.strings and /dev/null differ diff --git a/Classes/hu.lproj/FirstLoginView.strings b/Classes/hu.lproj/FirstLoginView.strings deleted file mode 100644 index f7abbf22e..000000000 Binary files a/Classes/hu.lproj/FirstLoginView.strings and /dev/null differ diff --git a/Classes/hu.lproj/HistoryDetailsView.strings b/Classes/hu.lproj/HistoryDetailsView.strings deleted file mode 100644 index af70cdabb..000000000 Binary files a/Classes/hu.lproj/HistoryDetailsView.strings and /dev/null differ diff --git a/Classes/hu.lproj/HistoryListView.strings b/Classes/hu.lproj/HistoryListView.strings deleted file mode 100644 index a9357ec6e..000000000 Binary files a/Classes/hu.lproj/HistoryListView.strings and /dev/null differ diff --git a/Classes/hu.lproj/ImageView.strings b/Classes/hu.lproj/ImageView.strings deleted file mode 100644 index e4b19a3bd..000000000 Binary files a/Classes/hu.lproj/ImageView.strings and /dev/null differ diff --git a/Classes/hu.lproj/PhoneMainView.strings b/Classes/hu.lproj/PhoneMainView.strings deleted file mode 100644 index 8b1378917..000000000 --- a/Classes/hu.lproj/PhoneMainView.strings +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Classes/hu.lproj/SettingsView.strings b/Classes/hu.lproj/SettingsView.strings deleted file mode 100644 index c75a386ac..000000000 Binary files a/Classes/hu.lproj/SettingsView.strings and /dev/null differ diff --git a/Classes/hu.lproj/ShopView.strings b/Classes/hu.lproj/ShopView.strings deleted file mode 100644 index 01a0bc2e9..000000000 Binary files a/Classes/hu.lproj/ShopView.strings and /dev/null differ diff --git a/Classes/hu.lproj/SideMenuView.strings b/Classes/hu.lproj/SideMenuView.strings deleted file mode 100644 index 4d32deddc..000000000 Binary files a/Classes/hu.lproj/SideMenuView.strings and /dev/null differ diff --git a/Classes/hu.lproj/SideMenuView~ipad.strings b/Classes/hu.lproj/SideMenuView~ipad.strings deleted file mode 100644 index 520c82897..000000000 Binary files a/Classes/hu.lproj/SideMenuView~ipad.strings and /dev/null differ diff --git a/Classes/it.lproj/AboutView.strings b/Classes/it.lproj/AboutView.strings deleted file mode 100644 index abf6ed6ef..000000000 Binary files a/Classes/it.lproj/AboutView.strings and /dev/null differ diff --git a/Classes/it.lproj/AssistantLinkView.strings b/Classes/it.lproj/AssistantLinkView.strings deleted file mode 100644 index 5f362da29..000000000 Binary files a/Classes/it.lproj/AssistantLinkView.strings and /dev/null differ diff --git a/Classes/it.lproj/AssistantView.strings b/Classes/it.lproj/AssistantView.strings deleted file mode 100644 index 9bb799569..000000000 Binary files a/Classes/it.lproj/AssistantView.strings and /dev/null differ diff --git a/Classes/it.lproj/AssistantViewScreens.strings b/Classes/it.lproj/AssistantViewScreens.strings deleted file mode 100644 index 74c092e77..000000000 Binary files a/Classes/it.lproj/AssistantViewScreens.strings and /dev/null differ diff --git a/Classes/it.lproj/CallIncomingView.strings b/Classes/it.lproj/CallIncomingView.strings deleted file mode 100644 index 2572d25fb..000000000 Binary files a/Classes/it.lproj/CallIncomingView.strings and /dev/null differ diff --git a/Classes/it.lproj/CallOutgoingView.strings b/Classes/it.lproj/CallOutgoingView.strings deleted file mode 100644 index 07a9d8853..000000000 Binary files a/Classes/it.lproj/CallOutgoingView.strings and /dev/null differ diff --git a/Classes/it.lproj/CallView.strings b/Classes/it.lproj/CallView.strings deleted file mode 100644 index 861ab09b2..000000000 Binary files a/Classes/it.lproj/CallView.strings and /dev/null differ diff --git a/Classes/it.lproj/CallView~ipad.strings b/Classes/it.lproj/CallView~ipad.strings deleted file mode 100644 index 6c4696aa4..000000000 Binary files a/Classes/it.lproj/CallView~ipad.strings and /dev/null differ diff --git a/Classes/it.lproj/ChatConversationCreateView.strings b/Classes/it.lproj/ChatConversationCreateView.strings deleted file mode 100644 index 088942672..000000000 Binary files a/Classes/it.lproj/ChatConversationCreateView.strings and /dev/null differ diff --git a/Classes/it.lproj/ChatConversationImdnView.strings b/Classes/it.lproj/ChatConversationImdnView.strings deleted file mode 100644 index f76e02d85..000000000 Binary files a/Classes/it.lproj/ChatConversationImdnView.strings and /dev/null differ diff --git a/Classes/it.lproj/ChatConversationInfoView.strings b/Classes/it.lproj/ChatConversationInfoView.strings deleted file mode 100644 index 126a910ba..000000000 Binary files a/Classes/it.lproj/ChatConversationInfoView.strings and /dev/null differ diff --git a/Classes/it.lproj/ChatConversationView.strings b/Classes/it.lproj/ChatConversationView.strings deleted file mode 100644 index 18a8454dc..000000000 Binary files a/Classes/it.lproj/ChatConversationView.strings and /dev/null differ diff --git a/Classes/it.lproj/ChatsListView.strings b/Classes/it.lproj/ChatsListView.strings deleted file mode 100644 index 22a7f3b13..000000000 Binary files a/Classes/it.lproj/ChatsListView.strings and /dev/null differ diff --git a/Classes/it.lproj/ContactDetailsView.strings b/Classes/it.lproj/ContactDetailsView.strings deleted file mode 100644 index cbe47cfd7..000000000 Binary files a/Classes/it.lproj/ContactDetailsView.strings and /dev/null differ diff --git a/Classes/it.lproj/ContactsListView.strings b/Classes/it.lproj/ContactsListView.strings deleted file mode 100644 index 645a03695..000000000 Binary files a/Classes/it.lproj/ContactsListView.strings and /dev/null differ diff --git a/Classes/it.lproj/CountryListView.strings b/Classes/it.lproj/CountryListView.strings deleted file mode 100644 index 95a6145e2..000000000 Binary files a/Classes/it.lproj/CountryListView.strings and /dev/null differ diff --git a/Classes/it.lproj/DialerView.strings b/Classes/it.lproj/DialerView.strings deleted file mode 100644 index a00dbf1d0..000000000 Binary files a/Classes/it.lproj/DialerView.strings and /dev/null differ diff --git a/Classes/it.lproj/DialerView~ipad.strings b/Classes/it.lproj/DialerView~ipad.strings deleted file mode 100644 index 2101c5f8a..000000000 Binary files a/Classes/it.lproj/DialerView~ipad.strings and /dev/null differ diff --git a/Classes/it.lproj/FirstLoginView.strings b/Classes/it.lproj/FirstLoginView.strings deleted file mode 100644 index 55637334f..000000000 Binary files a/Classes/it.lproj/FirstLoginView.strings and /dev/null differ diff --git a/Classes/it.lproj/HistoryDetailsView.strings b/Classes/it.lproj/HistoryDetailsView.strings deleted file mode 100644 index a4eefd0bd..000000000 Binary files a/Classes/it.lproj/HistoryDetailsView.strings and /dev/null differ diff --git a/Classes/it.lproj/HistoryListView.strings b/Classes/it.lproj/HistoryListView.strings deleted file mode 100644 index 5f37d555e..000000000 Binary files a/Classes/it.lproj/HistoryListView.strings and /dev/null differ diff --git a/Classes/it.lproj/ImageView.strings b/Classes/it.lproj/ImageView.strings deleted file mode 100644 index 8985da6de..000000000 Binary files a/Classes/it.lproj/ImageView.strings and /dev/null differ diff --git a/Classes/it.lproj/SettingsView.strings b/Classes/it.lproj/SettingsView.strings deleted file mode 100644 index 83ece1a85..000000000 Binary files a/Classes/it.lproj/SettingsView.strings and /dev/null differ diff --git a/Classes/it.lproj/ShopView.strings b/Classes/it.lproj/ShopView.strings deleted file mode 100644 index f89460a1c..000000000 Binary files a/Classes/it.lproj/ShopView.strings and /dev/null differ diff --git a/Classes/it.lproj/SideMenuView.strings b/Classes/it.lproj/SideMenuView.strings deleted file mode 100644 index f3ede4222..000000000 Binary files a/Classes/it.lproj/SideMenuView.strings and /dev/null differ diff --git a/Classes/it.lproj/SideMenuView~ipad.strings b/Classes/it.lproj/SideMenuView~ipad.strings deleted file mode 100644 index 35e94722a..000000000 Binary files a/Classes/it.lproj/SideMenuView~ipad.strings and /dev/null differ diff --git a/Classes/ja.lproj/AboutView.strings b/Classes/ja.lproj/AboutView.strings deleted file mode 100644 index 865139aa8..000000000 Binary files a/Classes/ja.lproj/AboutView.strings and /dev/null differ diff --git a/Classes/ja.lproj/AssistantLinkView.strings b/Classes/ja.lproj/AssistantLinkView.strings deleted file mode 100644 index 2e2cbdc9e..000000000 Binary files a/Classes/ja.lproj/AssistantLinkView.strings and /dev/null differ diff --git a/Classes/ja.lproj/AssistantView.strings b/Classes/ja.lproj/AssistantView.strings deleted file mode 100644 index 6c6c17a52..000000000 Binary files a/Classes/ja.lproj/AssistantView.strings and /dev/null differ diff --git a/Classes/ja.lproj/AssistantViewScreens.strings b/Classes/ja.lproj/AssistantViewScreens.strings deleted file mode 100644 index cc4cebb78..000000000 Binary files a/Classes/ja.lproj/AssistantViewScreens.strings and /dev/null differ diff --git a/Classes/ja.lproj/AssistantViews.strings b/Classes/ja.lproj/AssistantViews.strings deleted file mode 100644 index 75bbd975a..000000000 Binary files a/Classes/ja.lproj/AssistantViews.strings and /dev/null differ diff --git a/Classes/ja.lproj/AssistantView~ipad.strings b/Classes/ja.lproj/AssistantView~ipad.strings deleted file mode 100644 index 3987f0dd1..000000000 Binary files a/Classes/ja.lproj/AssistantView~ipad.strings and /dev/null differ diff --git a/Classes/ja.lproj/CallIncomingView.strings b/Classes/ja.lproj/CallIncomingView.strings deleted file mode 100644 index b83245ae9..000000000 Binary files a/Classes/ja.lproj/CallIncomingView.strings and /dev/null differ diff --git a/Classes/ja.lproj/CallOutgoingView.strings b/Classes/ja.lproj/CallOutgoingView.strings deleted file mode 100644 index 4741cbca8..000000000 Binary files a/Classes/ja.lproj/CallOutgoingView.strings and /dev/null differ diff --git a/Classes/ja.lproj/CallView.strings b/Classes/ja.lproj/CallView.strings deleted file mode 100644 index 467af224f..000000000 Binary files a/Classes/ja.lproj/CallView.strings and /dev/null differ diff --git a/Classes/ja.lproj/CallView~ipad.strings b/Classes/ja.lproj/CallView~ipad.strings deleted file mode 100644 index fc730dde8..000000000 Binary files a/Classes/ja.lproj/CallView~ipad.strings and /dev/null differ diff --git a/Classes/ja.lproj/ChatConversationCreateView.strings b/Classes/ja.lproj/ChatConversationCreateView.strings deleted file mode 100644 index 8fc70040e..000000000 Binary files a/Classes/ja.lproj/ChatConversationCreateView.strings and /dev/null differ diff --git a/Classes/ja.lproj/ChatConversationImdnView.strings b/Classes/ja.lproj/ChatConversationImdnView.strings deleted file mode 100644 index 312f45fa6..000000000 Binary files a/Classes/ja.lproj/ChatConversationImdnView.strings and /dev/null differ diff --git a/Classes/ja.lproj/ChatConversationInfoView.strings b/Classes/ja.lproj/ChatConversationInfoView.strings deleted file mode 100644 index 9aa03b514..000000000 Binary files a/Classes/ja.lproj/ChatConversationInfoView.strings and /dev/null differ diff --git a/Classes/ja.lproj/ChatConversationView.strings b/Classes/ja.lproj/ChatConversationView.strings deleted file mode 100644 index 3b4a27898..000000000 Binary files a/Classes/ja.lproj/ChatConversationView.strings and /dev/null differ diff --git a/Classes/ja.lproj/ChatRoomView.strings b/Classes/ja.lproj/ChatRoomView.strings deleted file mode 100644 index 9e0ce9df2..000000000 Binary files a/Classes/ja.lproj/ChatRoomView.strings and /dev/null differ diff --git a/Classes/ja.lproj/ChatView.strings b/Classes/ja.lproj/ChatView.strings deleted file mode 100644 index bed49f963..000000000 Binary files a/Classes/ja.lproj/ChatView.strings and /dev/null differ diff --git a/Classes/ja.lproj/ChatsListView.strings b/Classes/ja.lproj/ChatsListView.strings deleted file mode 100644 index cf6b012f9..000000000 Binary files a/Classes/ja.lproj/ChatsListView.strings and /dev/null differ diff --git a/Classes/ja.lproj/ContactDetailsView.strings b/Classes/ja.lproj/ContactDetailsView.strings deleted file mode 100644 index cfd8c6277..000000000 Binary files a/Classes/ja.lproj/ContactDetailsView.strings and /dev/null differ diff --git a/Classes/ja.lproj/ContactsListView.strings b/Classes/ja.lproj/ContactsListView.strings deleted file mode 100644 index d702b6018..000000000 Binary files a/Classes/ja.lproj/ContactsListView.strings and /dev/null differ diff --git a/Classes/ja.lproj/ContactsView.strings b/Classes/ja.lproj/ContactsView.strings deleted file mode 100644 index 3c82f0b50..000000000 Binary files a/Classes/ja.lproj/ContactsView.strings and /dev/null differ diff --git a/Classes/ja.lproj/CountryListView.strings b/Classes/ja.lproj/CountryListView.strings deleted file mode 100644 index 383b7aff5..000000000 Binary files a/Classes/ja.lproj/CountryListView.strings and /dev/null differ diff --git a/Classes/ja.lproj/DialerView.strings b/Classes/ja.lproj/DialerView.strings deleted file mode 100644 index e5a4bfabb..000000000 Binary files a/Classes/ja.lproj/DialerView.strings and /dev/null differ diff --git a/Classes/ja.lproj/DialerView~ipad.strings b/Classes/ja.lproj/DialerView~ipad.strings deleted file mode 100644 index 08a005cb0..000000000 Binary files a/Classes/ja.lproj/DialerView~ipad.strings and /dev/null differ diff --git a/Classes/ja.lproj/FirstLoginView.strings b/Classes/ja.lproj/FirstLoginView.strings deleted file mode 100644 index 60c04388c..000000000 Binary files a/Classes/ja.lproj/FirstLoginView.strings and /dev/null differ diff --git a/Classes/ja.lproj/HistoryDetailsView.strings b/Classes/ja.lproj/HistoryDetailsView.strings deleted file mode 100644 index 4b44f5070..000000000 Binary files a/Classes/ja.lproj/HistoryDetailsView.strings and /dev/null differ diff --git a/Classes/ja.lproj/HistoryListView.strings b/Classes/ja.lproj/HistoryListView.strings deleted file mode 100644 index c9405e3a2..000000000 Binary files a/Classes/ja.lproj/HistoryListView.strings and /dev/null differ diff --git a/Classes/ja.lproj/HistoryView.strings b/Classes/ja.lproj/HistoryView.strings deleted file mode 100644 index 7f3010a36..000000000 Binary files a/Classes/ja.lproj/HistoryView.strings and /dev/null differ diff --git a/Classes/ja.lproj/ImageView.strings b/Classes/ja.lproj/ImageView.strings deleted file mode 100644 index f412a5c8c..000000000 Binary files a/Classes/ja.lproj/ImageView.strings and /dev/null differ diff --git a/Classes/ja.lproj/InCallView.strings b/Classes/ja.lproj/InCallView.strings deleted file mode 100644 index 1957fd91f..000000000 Binary files a/Classes/ja.lproj/InCallView.strings and /dev/null differ diff --git a/Classes/ja.lproj/IncomingCallView.strings b/Classes/ja.lproj/IncomingCallView.strings deleted file mode 100644 index 0f451c30a..000000000 Binary files a/Classes/ja.lproj/IncomingCallView.strings and /dev/null differ diff --git a/Classes/ja.lproj/IncomingCallView~ipad.strings b/Classes/ja.lproj/IncomingCallView~ipad.strings deleted file mode 100644 index a1b6009a4..000000000 Binary files a/Classes/ja.lproj/IncomingCallView~ipad.strings and /dev/null differ diff --git a/Classes/ja.lproj/SettingsView.strings b/Classes/ja.lproj/SettingsView.strings deleted file mode 100644 index 5e81cc99e..000000000 Binary files a/Classes/ja.lproj/SettingsView.strings and /dev/null differ diff --git a/Classes/ja.lproj/ShopView.strings b/Classes/ja.lproj/ShopView.strings deleted file mode 100644 index a04c82417..000000000 Binary files a/Classes/ja.lproj/ShopView.strings and /dev/null differ diff --git a/Classes/ja.lproj/SideMenuView.strings b/Classes/ja.lproj/SideMenuView.strings deleted file mode 100644 index a1f126d9b..000000000 Binary files a/Classes/ja.lproj/SideMenuView.strings and /dev/null differ diff --git a/Classes/ja.lproj/SideMenuView~ipad.strings b/Classes/ja.lproj/SideMenuView~ipad.strings deleted file mode 100644 index 0ec55c3e1..000000000 Binary files a/Classes/ja.lproj/SideMenuView~ipad.strings and /dev/null differ diff --git a/Classes/ka.lproj/AboutView.strings b/Classes/ka.lproj/AboutView.strings deleted file mode 100644 index 70ee53399..000000000 Binary files a/Classes/ka.lproj/AboutView.strings and /dev/null differ diff --git a/Classes/ka.lproj/AssistantLinkView.strings b/Classes/ka.lproj/AssistantLinkView.strings deleted file mode 100644 index be1efee41..000000000 Binary files a/Classes/ka.lproj/AssistantLinkView.strings and /dev/null differ diff --git a/Classes/ka.lproj/AssistantView.strings b/Classes/ka.lproj/AssistantView.strings deleted file mode 100644 index 57254633a..000000000 Binary files a/Classes/ka.lproj/AssistantView.strings and /dev/null differ diff --git a/Classes/ka.lproj/AssistantViewScreens.strings b/Classes/ka.lproj/AssistantViewScreens.strings deleted file mode 100644 index beb7f44ea..000000000 Binary files a/Classes/ka.lproj/AssistantViewScreens.strings and /dev/null differ diff --git a/Classes/ka.lproj/CallIncomingView.strings b/Classes/ka.lproj/CallIncomingView.strings deleted file mode 100644 index ffe5d9777..000000000 Binary files a/Classes/ka.lproj/CallIncomingView.strings and /dev/null differ diff --git a/Classes/ka.lproj/CallOutgoingView.strings b/Classes/ka.lproj/CallOutgoingView.strings deleted file mode 100644 index 591588a60..000000000 Binary files a/Classes/ka.lproj/CallOutgoingView.strings and /dev/null differ diff --git a/Classes/ka.lproj/CallView.strings b/Classes/ka.lproj/CallView.strings deleted file mode 100644 index 7c9961668..000000000 Binary files a/Classes/ka.lproj/CallView.strings and /dev/null differ diff --git a/Classes/ka.lproj/CallView~ipad.strings b/Classes/ka.lproj/CallView~ipad.strings deleted file mode 100644 index 5f3a58b53..000000000 Binary files a/Classes/ka.lproj/CallView~ipad.strings and /dev/null differ diff --git a/Classes/ka.lproj/ChatConversationCreateView.strings b/Classes/ka.lproj/ChatConversationCreateView.strings deleted file mode 100644 index 51a28ef3b..000000000 Binary files a/Classes/ka.lproj/ChatConversationCreateView.strings and /dev/null differ diff --git a/Classes/ka.lproj/ChatConversationImdnView.strings b/Classes/ka.lproj/ChatConversationImdnView.strings deleted file mode 100644 index 36bff3321..000000000 Binary files a/Classes/ka.lproj/ChatConversationImdnView.strings and /dev/null differ diff --git a/Classes/ka.lproj/ChatConversationInfoView.strings b/Classes/ka.lproj/ChatConversationInfoView.strings deleted file mode 100644 index 424e9a5db..000000000 Binary files a/Classes/ka.lproj/ChatConversationInfoView.strings and /dev/null differ diff --git a/Classes/ka.lproj/ChatConversationView.strings b/Classes/ka.lproj/ChatConversationView.strings deleted file mode 100644 index 119a5d013..000000000 Binary files a/Classes/ka.lproj/ChatConversationView.strings and /dev/null differ diff --git a/Classes/ka.lproj/ChatsListView.strings b/Classes/ka.lproj/ChatsListView.strings deleted file mode 100644 index 949ce45db..000000000 Binary files a/Classes/ka.lproj/ChatsListView.strings and /dev/null differ diff --git a/Classes/ka.lproj/ContactDetailsView.strings b/Classes/ka.lproj/ContactDetailsView.strings deleted file mode 100644 index d27b45303..000000000 Binary files a/Classes/ka.lproj/ContactDetailsView.strings and /dev/null differ diff --git a/Classes/ka.lproj/ContactsListView.strings b/Classes/ka.lproj/ContactsListView.strings deleted file mode 100644 index 7bf7f6a88..000000000 Binary files a/Classes/ka.lproj/ContactsListView.strings and /dev/null differ diff --git a/Classes/ka.lproj/CountryListView.strings b/Classes/ka.lproj/CountryListView.strings deleted file mode 100644 index 870e6cad5..000000000 Binary files a/Classes/ka.lproj/CountryListView.strings and /dev/null differ diff --git a/Classes/ka.lproj/DialerView.strings b/Classes/ka.lproj/DialerView.strings deleted file mode 100644 index 43aa9f18f..000000000 Binary files a/Classes/ka.lproj/DialerView.strings and /dev/null differ diff --git a/Classes/ka.lproj/DialerView~ipad.strings b/Classes/ka.lproj/DialerView~ipad.strings deleted file mode 100644 index ee6935b39..000000000 Binary files a/Classes/ka.lproj/DialerView~ipad.strings and /dev/null differ diff --git a/Classes/ka.lproj/FirstLoginView.strings b/Classes/ka.lproj/FirstLoginView.strings deleted file mode 100644 index 74e3ad513..000000000 Binary files a/Classes/ka.lproj/FirstLoginView.strings and /dev/null differ diff --git a/Classes/ka.lproj/HistoryDetailsView.strings b/Classes/ka.lproj/HistoryDetailsView.strings deleted file mode 100644 index 2c595b0c8..000000000 Binary files a/Classes/ka.lproj/HistoryDetailsView.strings and /dev/null differ diff --git a/Classes/ka.lproj/HistoryListView.strings b/Classes/ka.lproj/HistoryListView.strings deleted file mode 100644 index 2bffdc6fb..000000000 Binary files a/Classes/ka.lproj/HistoryListView.strings and /dev/null differ diff --git a/Classes/ka.lproj/ImageView.strings b/Classes/ka.lproj/ImageView.strings deleted file mode 100644 index 06f252971..000000000 Binary files a/Classes/ka.lproj/ImageView.strings and /dev/null differ diff --git a/Classes/ka.lproj/SettingsView.strings b/Classes/ka.lproj/SettingsView.strings deleted file mode 100644 index 28732ffe7..000000000 Binary files a/Classes/ka.lproj/SettingsView.strings and /dev/null differ diff --git a/Classes/ka.lproj/ShopView.strings b/Classes/ka.lproj/ShopView.strings deleted file mode 100644 index 770552568..000000000 Binary files a/Classes/ka.lproj/ShopView.strings and /dev/null differ diff --git a/Classes/ka.lproj/SideMenuView.strings b/Classes/ka.lproj/SideMenuView.strings deleted file mode 100644 index a1f126d9b..000000000 Binary files a/Classes/ka.lproj/SideMenuView.strings and /dev/null differ diff --git a/Classes/ka.lproj/SideMenuView~ipad.strings b/Classes/ka.lproj/SideMenuView~ipad.strings deleted file mode 100644 index 0ec55c3e1..000000000 Binary files a/Classes/ka.lproj/SideMenuView~ipad.strings and /dev/null differ diff --git a/Classes/linphone-Bridging-Header.h b/Classes/linphone-Bridging-Header.h deleted file mode 100644 index 7da4b8a16..000000000 --- a/Classes/linphone-Bridging-Header.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// Use this file to import your target's public headers that you would like to expose to Swift. -// - - - -#import -#import "FastAddressBook.h" -#import "LinphoneManager.h" -#import "Log.h" -#import "LinphoneUI/UICompositeView.h" -#import "Contact.h" -#import "StatusBarView.h" -#import "LinphoneUI/UIBouncingView.h" -#import "PhoneMainView.h" -#import "UICamSwitch.h" -#import "UIChatBubbleTextCell.h" -#import "ChatConversationTableView.h" -#import "EphemeralSettingsView.h" -#import "FileTransferDelegate.h" diff --git a/Classes/nl.lproj/AboutView.strings b/Classes/nl.lproj/AboutView.strings deleted file mode 100644 index 4cb7d5b09..000000000 Binary files a/Classes/nl.lproj/AboutView.strings and /dev/null differ diff --git a/Classes/nl.lproj/AssistantLinkView.strings b/Classes/nl.lproj/AssistantLinkView.strings deleted file mode 100644 index 98cb5fe8a..000000000 Binary files a/Classes/nl.lproj/AssistantLinkView.strings and /dev/null differ diff --git a/Classes/nl.lproj/AssistantView.strings b/Classes/nl.lproj/AssistantView.strings deleted file mode 100644 index 243eacb86..000000000 Binary files a/Classes/nl.lproj/AssistantView.strings and /dev/null differ diff --git a/Classes/nl.lproj/AssistantViewScreens.strings b/Classes/nl.lproj/AssistantViewScreens.strings deleted file mode 100644 index d219ac502..000000000 Binary files a/Classes/nl.lproj/AssistantViewScreens.strings and /dev/null differ diff --git a/Classes/nl.lproj/AssistantViews.strings b/Classes/nl.lproj/AssistantViews.strings deleted file mode 100644 index 1ce464cfe..000000000 Binary files a/Classes/nl.lproj/AssistantViews.strings and /dev/null differ diff --git a/Classes/nl.lproj/AssistantView~ipad.strings b/Classes/nl.lproj/AssistantView~ipad.strings deleted file mode 100644 index b27cb9834..000000000 Binary files a/Classes/nl.lproj/AssistantView~ipad.strings and /dev/null differ diff --git a/Classes/nl.lproj/CallIncomingView.strings b/Classes/nl.lproj/CallIncomingView.strings deleted file mode 100644 index 70e3a5539..000000000 Binary files a/Classes/nl.lproj/CallIncomingView.strings and /dev/null differ diff --git a/Classes/nl.lproj/CallOutgoingView.strings b/Classes/nl.lproj/CallOutgoingView.strings deleted file mode 100644 index 27783edb8..000000000 Binary files a/Classes/nl.lproj/CallOutgoingView.strings and /dev/null differ diff --git a/Classes/nl.lproj/CallView.strings b/Classes/nl.lproj/CallView.strings deleted file mode 100644 index 402d6f312..000000000 Binary files a/Classes/nl.lproj/CallView.strings and /dev/null differ diff --git a/Classes/nl.lproj/CallView~ipad.strings b/Classes/nl.lproj/CallView~ipad.strings deleted file mode 100644 index 713fd0063..000000000 Binary files a/Classes/nl.lproj/CallView~ipad.strings and /dev/null differ diff --git a/Classes/nl.lproj/ChatConversationCreateView.strings b/Classes/nl.lproj/ChatConversationCreateView.strings deleted file mode 100644 index 468b840fe..000000000 Binary files a/Classes/nl.lproj/ChatConversationCreateView.strings and /dev/null differ diff --git a/Classes/nl.lproj/ChatConversationImdnView.strings b/Classes/nl.lproj/ChatConversationImdnView.strings deleted file mode 100644 index 45142e0ca..000000000 Binary files a/Classes/nl.lproj/ChatConversationImdnView.strings and /dev/null differ diff --git a/Classes/nl.lproj/ChatConversationInfoView.strings b/Classes/nl.lproj/ChatConversationInfoView.strings deleted file mode 100644 index fa2cfba7a..000000000 Binary files a/Classes/nl.lproj/ChatConversationInfoView.strings and /dev/null differ diff --git a/Classes/nl.lproj/ChatConversationView.strings b/Classes/nl.lproj/ChatConversationView.strings deleted file mode 100644 index bf88da50d..000000000 Binary files a/Classes/nl.lproj/ChatConversationView.strings and /dev/null differ diff --git a/Classes/nl.lproj/ChatRoomView.strings b/Classes/nl.lproj/ChatRoomView.strings deleted file mode 100644 index 72c87d738..000000000 Binary files a/Classes/nl.lproj/ChatRoomView.strings and /dev/null differ diff --git a/Classes/nl.lproj/ChatView.strings b/Classes/nl.lproj/ChatView.strings deleted file mode 100644 index 067368519..000000000 Binary files a/Classes/nl.lproj/ChatView.strings and /dev/null differ diff --git a/Classes/nl.lproj/ChatsListView.strings b/Classes/nl.lproj/ChatsListView.strings deleted file mode 100644 index 82c059477..000000000 Binary files a/Classes/nl.lproj/ChatsListView.strings and /dev/null differ diff --git a/Classes/nl.lproj/ContactDetailsView.strings b/Classes/nl.lproj/ContactDetailsView.strings deleted file mode 100644 index cdb8c45a7..000000000 Binary files a/Classes/nl.lproj/ContactDetailsView.strings and /dev/null differ diff --git a/Classes/nl.lproj/ContactsListView.strings b/Classes/nl.lproj/ContactsListView.strings deleted file mode 100644 index 11db8e801..000000000 Binary files a/Classes/nl.lproj/ContactsListView.strings and /dev/null differ diff --git a/Classes/nl.lproj/ContactsView.strings b/Classes/nl.lproj/ContactsView.strings deleted file mode 100644 index 33a5ec66a..000000000 Binary files a/Classes/nl.lproj/ContactsView.strings and /dev/null differ diff --git a/Classes/nl.lproj/CountryListView.strings b/Classes/nl.lproj/CountryListView.strings deleted file mode 100644 index b60275c67..000000000 Binary files a/Classes/nl.lproj/CountryListView.strings and /dev/null differ diff --git a/Classes/nl.lproj/DialerView.strings b/Classes/nl.lproj/DialerView.strings deleted file mode 100644 index d865102d3..000000000 Binary files a/Classes/nl.lproj/DialerView.strings and /dev/null differ diff --git a/Classes/nl.lproj/DialerView~ipad.strings b/Classes/nl.lproj/DialerView~ipad.strings deleted file mode 100644 index 2d3032115..000000000 Binary files a/Classes/nl.lproj/DialerView~ipad.strings and /dev/null differ diff --git a/Classes/nl.lproj/FirstLoginView.strings b/Classes/nl.lproj/FirstLoginView.strings deleted file mode 100644 index 918214345..000000000 Binary files a/Classes/nl.lproj/FirstLoginView.strings and /dev/null differ diff --git a/Classes/nl.lproj/HistoryDetailsView.strings b/Classes/nl.lproj/HistoryDetailsView.strings deleted file mode 100644 index b1efc77cf..000000000 Binary files a/Classes/nl.lproj/HistoryDetailsView.strings and /dev/null differ diff --git a/Classes/nl.lproj/HistoryListView.strings b/Classes/nl.lproj/HistoryListView.strings deleted file mode 100644 index c250982b1..000000000 Binary files a/Classes/nl.lproj/HistoryListView.strings and /dev/null differ diff --git a/Classes/nl.lproj/HistoryView.strings b/Classes/nl.lproj/HistoryView.strings deleted file mode 100644 index cacf8ee1b..000000000 Binary files a/Classes/nl.lproj/HistoryView.strings and /dev/null differ diff --git a/Classes/nl.lproj/ImageView.strings b/Classes/nl.lproj/ImageView.strings deleted file mode 100644 index f89f0207e..000000000 Binary files a/Classes/nl.lproj/ImageView.strings and /dev/null differ diff --git a/Classes/nl.lproj/InCallView.strings b/Classes/nl.lproj/InCallView.strings deleted file mode 100644 index 2af985384..000000000 Binary files a/Classes/nl.lproj/InCallView.strings and /dev/null differ diff --git a/Classes/nl.lproj/IncomingCallView.strings b/Classes/nl.lproj/IncomingCallView.strings deleted file mode 100644 index d9397e11a..000000000 Binary files a/Classes/nl.lproj/IncomingCallView.strings and /dev/null differ diff --git a/Classes/nl.lproj/IncomingCallView~ipad.strings b/Classes/nl.lproj/IncomingCallView~ipad.strings deleted file mode 100644 index 735a91234..000000000 Binary files a/Classes/nl.lproj/IncomingCallView~ipad.strings and /dev/null differ diff --git a/Classes/nl.lproj/SettingsView.strings b/Classes/nl.lproj/SettingsView.strings deleted file mode 100644 index 09bbf0dfb..000000000 Binary files a/Classes/nl.lproj/SettingsView.strings and /dev/null differ diff --git a/Classes/nl.lproj/ShopView.strings b/Classes/nl.lproj/ShopView.strings deleted file mode 100644 index 1d36ff076..000000000 Binary files a/Classes/nl.lproj/ShopView.strings and /dev/null differ diff --git a/Classes/pl.lproj/AboutView.strings b/Classes/pl.lproj/AboutView.strings deleted file mode 100644 index 264699d72..000000000 Binary files a/Classes/pl.lproj/AboutView.strings and /dev/null differ diff --git a/Classes/pl.lproj/AssistantLinkView.strings b/Classes/pl.lproj/AssistantLinkView.strings deleted file mode 100644 index a953b6136..000000000 Binary files a/Classes/pl.lproj/AssistantLinkView.strings and /dev/null differ diff --git a/Classes/pl.lproj/AssistantView.strings b/Classes/pl.lproj/AssistantView.strings deleted file mode 100644 index d32b4555a..000000000 Binary files a/Classes/pl.lproj/AssistantView.strings and /dev/null differ diff --git a/Classes/pl.lproj/AssistantViewScreens.strings b/Classes/pl.lproj/AssistantViewScreens.strings deleted file mode 100644 index 31e6ffc73..000000000 Binary files a/Classes/pl.lproj/AssistantViewScreens.strings and /dev/null differ diff --git a/Classes/pl.lproj/CallIncomingView.strings b/Classes/pl.lproj/CallIncomingView.strings deleted file mode 100644 index ecf71203f..000000000 Binary files a/Classes/pl.lproj/CallIncomingView.strings and /dev/null differ diff --git a/Classes/pl.lproj/CallOutgoingView.strings b/Classes/pl.lproj/CallOutgoingView.strings deleted file mode 100644 index 986dc8756..000000000 Binary files a/Classes/pl.lproj/CallOutgoingView.strings and /dev/null differ diff --git a/Classes/pl.lproj/CallView.strings b/Classes/pl.lproj/CallView.strings deleted file mode 100644 index c3e48f40c..000000000 Binary files a/Classes/pl.lproj/CallView.strings and /dev/null differ diff --git a/Classes/pl.lproj/CallView~ipad.strings b/Classes/pl.lproj/CallView~ipad.strings deleted file mode 100644 index 73b306a4a..000000000 Binary files a/Classes/pl.lproj/CallView~ipad.strings and /dev/null differ diff --git a/Classes/pl.lproj/ChatConversationCreateView.strings b/Classes/pl.lproj/ChatConversationCreateView.strings deleted file mode 100644 index a453cd27d..000000000 Binary files a/Classes/pl.lproj/ChatConversationCreateView.strings and /dev/null differ diff --git a/Classes/pl.lproj/ChatConversationImdnView.strings b/Classes/pl.lproj/ChatConversationImdnView.strings deleted file mode 100644 index 9d7f9e5d5..000000000 Binary files a/Classes/pl.lproj/ChatConversationImdnView.strings and /dev/null differ diff --git a/Classes/pl.lproj/ChatConversationInfoView.strings b/Classes/pl.lproj/ChatConversationInfoView.strings deleted file mode 100644 index e5a63625d..000000000 Binary files a/Classes/pl.lproj/ChatConversationInfoView.strings and /dev/null differ diff --git a/Classes/pl.lproj/ChatConversationView.strings b/Classes/pl.lproj/ChatConversationView.strings deleted file mode 100644 index e26aff082..000000000 Binary files a/Classes/pl.lproj/ChatConversationView.strings and /dev/null differ diff --git a/Classes/pl.lproj/ChatsListView.strings b/Classes/pl.lproj/ChatsListView.strings deleted file mode 100644 index 98f4b1fc1..000000000 Binary files a/Classes/pl.lproj/ChatsListView.strings and /dev/null differ diff --git a/Classes/pl.lproj/ContactDetailsView.strings b/Classes/pl.lproj/ContactDetailsView.strings deleted file mode 100644 index 7ede7b0c0..000000000 Binary files a/Classes/pl.lproj/ContactDetailsView.strings and /dev/null differ diff --git a/Classes/pl.lproj/ContactsListView.strings b/Classes/pl.lproj/ContactsListView.strings deleted file mode 100644 index 482fdd76a..000000000 Binary files a/Classes/pl.lproj/ContactsListView.strings and /dev/null differ diff --git a/Classes/pl.lproj/CountryListView.strings b/Classes/pl.lproj/CountryListView.strings deleted file mode 100644 index c36927107..000000000 Binary files a/Classes/pl.lproj/CountryListView.strings and /dev/null differ diff --git a/Classes/pl.lproj/DialerView.strings b/Classes/pl.lproj/DialerView.strings deleted file mode 100644 index a42908394..000000000 Binary files a/Classes/pl.lproj/DialerView.strings and /dev/null differ diff --git a/Classes/pl.lproj/DialerView~ipad.strings b/Classes/pl.lproj/DialerView~ipad.strings deleted file mode 100644 index b48f5ba83..000000000 Binary files a/Classes/pl.lproj/DialerView~ipad.strings and /dev/null differ diff --git a/Classes/pl.lproj/FirstLoginView.strings b/Classes/pl.lproj/FirstLoginView.strings deleted file mode 100644 index 6e82e4e22..000000000 Binary files a/Classes/pl.lproj/FirstLoginView.strings and /dev/null differ diff --git a/Classes/pl.lproj/HistoryDetailsView.strings b/Classes/pl.lproj/HistoryDetailsView.strings deleted file mode 100644 index 1c07396fc..000000000 Binary files a/Classes/pl.lproj/HistoryDetailsView.strings and /dev/null differ diff --git a/Classes/pl.lproj/HistoryListView.strings b/Classes/pl.lproj/HistoryListView.strings deleted file mode 100644 index 7607d6cbd..000000000 Binary files a/Classes/pl.lproj/HistoryListView.strings and /dev/null differ diff --git a/Classes/pl.lproj/ImageView.strings b/Classes/pl.lproj/ImageView.strings deleted file mode 100644 index bf3e9fbf5..000000000 Binary files a/Classes/pl.lproj/ImageView.strings and /dev/null differ diff --git a/Classes/pl.lproj/SettingsView.strings b/Classes/pl.lproj/SettingsView.strings deleted file mode 100644 index 7e8f38786..000000000 Binary files a/Classes/pl.lproj/SettingsView.strings and /dev/null differ diff --git a/Classes/pl.lproj/ShopView.strings b/Classes/pl.lproj/ShopView.strings deleted file mode 100644 index d40507b08..000000000 Binary files a/Classes/pl.lproj/ShopView.strings and /dev/null differ diff --git a/Classes/pl.lproj/SideMenuView.strings b/Classes/pl.lproj/SideMenuView.strings deleted file mode 100644 index cc397972d..000000000 Binary files a/Classes/pl.lproj/SideMenuView.strings and /dev/null differ diff --git a/Classes/pl.lproj/SideMenuView~ipad.strings b/Classes/pl.lproj/SideMenuView~ipad.strings deleted file mode 100644 index b452adebf..000000000 Binary files a/Classes/pl.lproj/SideMenuView~ipad.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/AboutView.strings b/Classes/pt_BR.lproj/AboutView.strings deleted file mode 100644 index 5b4555d47..000000000 Binary files a/Classes/pt_BR.lproj/AboutView.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/AssistantLinkView.strings b/Classes/pt_BR.lproj/AssistantLinkView.strings deleted file mode 100644 index 09aff2346..000000000 Binary files a/Classes/pt_BR.lproj/AssistantLinkView.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/AssistantView.strings b/Classes/pt_BR.lproj/AssistantView.strings deleted file mode 100644 index 076d92b47..000000000 Binary files a/Classes/pt_BR.lproj/AssistantView.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/AssistantViewScreens.strings b/Classes/pt_BR.lproj/AssistantViewScreens.strings deleted file mode 100644 index 83d121c43..000000000 Binary files a/Classes/pt_BR.lproj/AssistantViewScreens.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/CallIncomingView.strings b/Classes/pt_BR.lproj/CallIncomingView.strings deleted file mode 100644 index 1c1207516..000000000 Binary files a/Classes/pt_BR.lproj/CallIncomingView.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/CallOutgoingView.strings b/Classes/pt_BR.lproj/CallOutgoingView.strings deleted file mode 100644 index bd3a0988e..000000000 Binary files a/Classes/pt_BR.lproj/CallOutgoingView.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/CallView.strings b/Classes/pt_BR.lproj/CallView.strings deleted file mode 100644 index 5b91d20d1..000000000 Binary files a/Classes/pt_BR.lproj/CallView.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/CallView~ipad.strings b/Classes/pt_BR.lproj/CallView~ipad.strings deleted file mode 100644 index 2caede80c..000000000 Binary files a/Classes/pt_BR.lproj/CallView~ipad.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/ChatConversationCreateView.strings b/Classes/pt_BR.lproj/ChatConversationCreateView.strings deleted file mode 100644 index 3b3d778ce..000000000 Binary files a/Classes/pt_BR.lproj/ChatConversationCreateView.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/ChatConversationImdnView.strings b/Classes/pt_BR.lproj/ChatConversationImdnView.strings deleted file mode 100644 index fc24762e5..000000000 Binary files a/Classes/pt_BR.lproj/ChatConversationImdnView.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/ChatConversationInfoView.strings b/Classes/pt_BR.lproj/ChatConversationInfoView.strings deleted file mode 100644 index a1adcfa71..000000000 Binary files a/Classes/pt_BR.lproj/ChatConversationInfoView.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/ChatConversationView.strings b/Classes/pt_BR.lproj/ChatConversationView.strings deleted file mode 100644 index de453b44f..000000000 Binary files a/Classes/pt_BR.lproj/ChatConversationView.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/ChatsListView.strings b/Classes/pt_BR.lproj/ChatsListView.strings deleted file mode 100644 index cca414694..000000000 Binary files a/Classes/pt_BR.lproj/ChatsListView.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/ContactDetailsView.strings b/Classes/pt_BR.lproj/ContactDetailsView.strings deleted file mode 100644 index 464ecd5e7..000000000 Binary files a/Classes/pt_BR.lproj/ContactDetailsView.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/ContactsListView.strings b/Classes/pt_BR.lproj/ContactsListView.strings deleted file mode 100644 index 1e8a233fb..000000000 Binary files a/Classes/pt_BR.lproj/ContactsListView.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/CountryListView.strings b/Classes/pt_BR.lproj/CountryListView.strings deleted file mode 100644 index 769356359..000000000 Binary files a/Classes/pt_BR.lproj/CountryListView.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/DialerView.strings b/Classes/pt_BR.lproj/DialerView.strings deleted file mode 100644 index 402948175..000000000 Binary files a/Classes/pt_BR.lproj/DialerView.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/DialerView~ipad.strings b/Classes/pt_BR.lproj/DialerView~ipad.strings deleted file mode 100644 index eab0b3c20..000000000 Binary files a/Classes/pt_BR.lproj/DialerView~ipad.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/FirstLoginView.strings b/Classes/pt_BR.lproj/FirstLoginView.strings deleted file mode 100644 index 7691a0099..000000000 Binary files a/Classes/pt_BR.lproj/FirstLoginView.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/HistoryDetailsView.strings b/Classes/pt_BR.lproj/HistoryDetailsView.strings deleted file mode 100644 index 5decd8c7a..000000000 Binary files a/Classes/pt_BR.lproj/HistoryDetailsView.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/HistoryListView.strings b/Classes/pt_BR.lproj/HistoryListView.strings deleted file mode 100644 index be8591c9a..000000000 Binary files a/Classes/pt_BR.lproj/HistoryListView.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/ImageView.strings b/Classes/pt_BR.lproj/ImageView.strings deleted file mode 100644 index 41830e370..000000000 Binary files a/Classes/pt_BR.lproj/ImageView.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/SettingsView.strings b/Classes/pt_BR.lproj/SettingsView.strings deleted file mode 100644 index 596519b43..000000000 Binary files a/Classes/pt_BR.lproj/SettingsView.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/ShopView.strings b/Classes/pt_BR.lproj/ShopView.strings deleted file mode 100644 index 8c478ab70..000000000 Binary files a/Classes/pt_BR.lproj/ShopView.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/SideMenuView.strings b/Classes/pt_BR.lproj/SideMenuView.strings deleted file mode 100644 index 17c2c1050..000000000 Binary files a/Classes/pt_BR.lproj/SideMenuView.strings and /dev/null differ diff --git a/Classes/pt_BR.lproj/SideMenuView~ipad.strings b/Classes/pt_BR.lproj/SideMenuView~ipad.strings deleted file mode 100644 index 62e287fcf..000000000 Binary files a/Classes/pt_BR.lproj/SideMenuView~ipad.strings and /dev/null differ diff --git a/Classes/ru.lproj/AboutView.strings b/Classes/ru.lproj/AboutView.strings deleted file mode 100644 index 6dd506899..000000000 Binary files a/Classes/ru.lproj/AboutView.strings and /dev/null differ diff --git a/Classes/ru.lproj/AssistantLinkView.strings b/Classes/ru.lproj/AssistantLinkView.strings deleted file mode 100644 index 5f73bc5e4..000000000 Binary files a/Classes/ru.lproj/AssistantLinkView.strings and /dev/null differ diff --git a/Classes/ru.lproj/AssistantView.strings b/Classes/ru.lproj/AssistantView.strings deleted file mode 100644 index 551b98d6b..000000000 Binary files a/Classes/ru.lproj/AssistantView.strings and /dev/null differ diff --git a/Classes/ru.lproj/AssistantViewScreens.strings b/Classes/ru.lproj/AssistantViewScreens.strings deleted file mode 100644 index a0f1f518a..000000000 Binary files a/Classes/ru.lproj/AssistantViewScreens.strings and /dev/null differ diff --git a/Classes/ru.lproj/CallOutgoingView.strings b/Classes/ru.lproj/CallOutgoingView.strings deleted file mode 100644 index 5e66f9f28..000000000 Binary files a/Classes/ru.lproj/CallOutgoingView.strings and /dev/null differ diff --git a/Classes/ru.lproj/CallView~ipad.strings b/Classes/ru.lproj/CallView~ipad.strings deleted file mode 100644 index 7108f5ce4..000000000 Binary files a/Classes/ru.lproj/CallView~ipad.strings and /dev/null differ diff --git a/Classes/ru.lproj/ChatConversationCreateView.strings b/Classes/ru.lproj/ChatConversationCreateView.strings deleted file mode 100644 index bdaefb33f..000000000 Binary files a/Classes/ru.lproj/ChatConversationCreateView.strings and /dev/null differ diff --git a/Classes/ru.lproj/ChatConversationImdnView.strings b/Classes/ru.lproj/ChatConversationImdnView.strings deleted file mode 100644 index c9053785e..000000000 Binary files a/Classes/ru.lproj/ChatConversationImdnView.strings and /dev/null differ diff --git a/Classes/ru.lproj/ChatConversationInfoView.strings b/Classes/ru.lproj/ChatConversationInfoView.strings deleted file mode 100644 index 8de0928db..000000000 Binary files a/Classes/ru.lproj/ChatConversationInfoView.strings and /dev/null differ diff --git a/Classes/ru.lproj/ChatConversationView.strings b/Classes/ru.lproj/ChatConversationView.strings deleted file mode 100644 index ea0ff7b07..000000000 Binary files a/Classes/ru.lproj/ChatConversationView.strings and /dev/null differ diff --git a/Classes/ru.lproj/ChatsListView.strings b/Classes/ru.lproj/ChatsListView.strings deleted file mode 100644 index f5adeea9e..000000000 Binary files a/Classes/ru.lproj/ChatsListView.strings and /dev/null differ diff --git a/Classes/ru.lproj/ContactDetailsView.strings b/Classes/ru.lproj/ContactDetailsView.strings deleted file mode 100644 index e19a91292..000000000 Binary files a/Classes/ru.lproj/ContactDetailsView.strings and /dev/null differ diff --git a/Classes/ru.lproj/ContactsListView.strings b/Classes/ru.lproj/ContactsListView.strings deleted file mode 100644 index cd1fed03a..000000000 Binary files a/Classes/ru.lproj/ContactsListView.strings and /dev/null differ diff --git a/Classes/ru.lproj/CountryListView.strings b/Classes/ru.lproj/CountryListView.strings deleted file mode 100644 index e0a3d8f8f..000000000 Binary files a/Classes/ru.lproj/CountryListView.strings and /dev/null differ diff --git a/Classes/ru.lproj/DialerView.strings b/Classes/ru.lproj/DialerView.strings deleted file mode 100644 index 1ce421ca0..000000000 Binary files a/Classes/ru.lproj/DialerView.strings and /dev/null differ diff --git a/Classes/ru.lproj/DialerView~ipad.strings b/Classes/ru.lproj/DialerView~ipad.strings deleted file mode 100644 index 1da7cd9e8..000000000 Binary files a/Classes/ru.lproj/DialerView~ipad.strings and /dev/null differ diff --git a/Classes/ru.lproj/FirstLoginView.strings b/Classes/ru.lproj/FirstLoginView.strings deleted file mode 100644 index def64200c..000000000 Binary files a/Classes/ru.lproj/FirstLoginView.strings and /dev/null differ diff --git a/Classes/ru.lproj/HistoryDetailsView.strings b/Classes/ru.lproj/HistoryDetailsView.strings deleted file mode 100644 index 5eb797adc..000000000 Binary files a/Classes/ru.lproj/HistoryDetailsView.strings and /dev/null differ diff --git a/Classes/ru.lproj/HistoryListView.strings b/Classes/ru.lproj/HistoryListView.strings deleted file mode 100644 index 22bb61cb3..000000000 Binary files a/Classes/ru.lproj/HistoryListView.strings and /dev/null differ diff --git a/Classes/ru.lproj/ImageView.strings b/Classes/ru.lproj/ImageView.strings deleted file mode 100644 index b47a96808..000000000 Binary files a/Classes/ru.lproj/ImageView.strings and /dev/null differ diff --git a/Classes/ru.lproj/SettingsView.strings b/Classes/ru.lproj/SettingsView.strings deleted file mode 100644 index 6d0f43acc..000000000 Binary files a/Classes/ru.lproj/SettingsView.strings and /dev/null differ diff --git a/Classes/ru.lproj/ShopView.strings b/Classes/ru.lproj/ShopView.strings deleted file mode 100644 index 5f68657e1..000000000 Binary files a/Classes/ru.lproj/ShopView.strings and /dev/null differ diff --git a/Classes/ru.lproj/SideMenuView.strings b/Classes/ru.lproj/SideMenuView.strings deleted file mode 100644 index 16e47bdbc..000000000 Binary files a/Classes/ru.lproj/SideMenuView.strings and /dev/null differ diff --git a/Classes/ru.lproj/SideMenuView~ipad.strings b/Classes/ru.lproj/SideMenuView~ipad.strings deleted file mode 100644 index 767c92271..000000000 Binary files a/Classes/ru.lproj/SideMenuView~ipad.strings and /dev/null differ diff --git a/Classes/sv.lproj/AboutView.strings b/Classes/sv.lproj/AboutView.strings deleted file mode 100644 index 36bdd7a6a..000000000 Binary files a/Classes/sv.lproj/AboutView.strings and /dev/null differ diff --git a/Classes/sv.lproj/AssistantLinkView.strings b/Classes/sv.lproj/AssistantLinkView.strings deleted file mode 100644 index b911b3b73..000000000 Binary files a/Classes/sv.lproj/AssistantLinkView.strings and /dev/null differ diff --git a/Classes/sv.lproj/AssistantView.strings b/Classes/sv.lproj/AssistantView.strings deleted file mode 100644 index 7c7d7fae8..000000000 Binary files a/Classes/sv.lproj/AssistantView.strings and /dev/null differ diff --git a/Classes/sv.lproj/AssistantViewScreens.strings b/Classes/sv.lproj/AssistantViewScreens.strings deleted file mode 100644 index a1abf326b..000000000 Binary files a/Classes/sv.lproj/AssistantViewScreens.strings and /dev/null differ diff --git a/Classes/sv.lproj/CallIncomingView.strings b/Classes/sv.lproj/CallIncomingView.strings deleted file mode 100644 index 8e18174d7..000000000 Binary files a/Classes/sv.lproj/CallIncomingView.strings and /dev/null differ diff --git a/Classes/sv.lproj/CallOutgoingView.strings b/Classes/sv.lproj/CallOutgoingView.strings deleted file mode 100644 index 0ce248fd7..000000000 Binary files a/Classes/sv.lproj/CallOutgoingView.strings and /dev/null differ diff --git a/Classes/sv.lproj/CallView.strings b/Classes/sv.lproj/CallView.strings deleted file mode 100644 index 1c2825241..000000000 Binary files a/Classes/sv.lproj/CallView.strings and /dev/null differ diff --git a/Classes/sv.lproj/CallView~ipad.strings b/Classes/sv.lproj/CallView~ipad.strings deleted file mode 100644 index 5e21cf873..000000000 Binary files a/Classes/sv.lproj/CallView~ipad.strings and /dev/null differ diff --git a/Classes/sv.lproj/ChatConversationCreateView.strings b/Classes/sv.lproj/ChatConversationCreateView.strings deleted file mode 100644 index 563648ef8..000000000 Binary files a/Classes/sv.lproj/ChatConversationCreateView.strings and /dev/null differ diff --git a/Classes/sv.lproj/ChatConversationImdnView.strings b/Classes/sv.lproj/ChatConversationImdnView.strings deleted file mode 100644 index bf9318fc5..000000000 Binary files a/Classes/sv.lproj/ChatConversationImdnView.strings and /dev/null differ diff --git a/Classes/sv.lproj/ChatConversationInfoView.strings b/Classes/sv.lproj/ChatConversationInfoView.strings deleted file mode 100644 index 8261f1183..000000000 Binary files a/Classes/sv.lproj/ChatConversationInfoView.strings and /dev/null differ diff --git a/Classes/sv.lproj/ChatConversationView.strings b/Classes/sv.lproj/ChatConversationView.strings deleted file mode 100644 index c53f6d2dc..000000000 Binary files a/Classes/sv.lproj/ChatConversationView.strings and /dev/null differ diff --git a/Classes/sv.lproj/ChatsListView.strings b/Classes/sv.lproj/ChatsListView.strings deleted file mode 100644 index 903f672cb..000000000 Binary files a/Classes/sv.lproj/ChatsListView.strings and /dev/null differ diff --git a/Classes/sv.lproj/ContactDetailsView.strings b/Classes/sv.lproj/ContactDetailsView.strings deleted file mode 100644 index e4a9f97c6..000000000 Binary files a/Classes/sv.lproj/ContactDetailsView.strings and /dev/null differ diff --git a/Classes/sv.lproj/ContactsListView.strings b/Classes/sv.lproj/ContactsListView.strings deleted file mode 100644 index 85bde852a..000000000 Binary files a/Classes/sv.lproj/ContactsListView.strings and /dev/null differ diff --git a/Classes/sv.lproj/CountryListView.strings b/Classes/sv.lproj/CountryListView.strings deleted file mode 100644 index be7e0b848..000000000 Binary files a/Classes/sv.lproj/CountryListView.strings and /dev/null differ diff --git a/Classes/sv.lproj/DialerView.strings b/Classes/sv.lproj/DialerView.strings deleted file mode 100644 index b4b05984b..000000000 Binary files a/Classes/sv.lproj/DialerView.strings and /dev/null differ diff --git a/Classes/sv.lproj/DialerView~ipad.strings b/Classes/sv.lproj/DialerView~ipad.strings deleted file mode 100644 index ccb53ccf6..000000000 Binary files a/Classes/sv.lproj/DialerView~ipad.strings and /dev/null differ diff --git a/Classes/sv.lproj/FirstLoginView.strings b/Classes/sv.lproj/FirstLoginView.strings deleted file mode 100644 index bf7e4ffc3..000000000 Binary files a/Classes/sv.lproj/FirstLoginView.strings and /dev/null differ diff --git a/Classes/sv.lproj/HistoryDetailsView.strings b/Classes/sv.lproj/HistoryDetailsView.strings deleted file mode 100644 index 84a8b1a30..000000000 Binary files a/Classes/sv.lproj/HistoryDetailsView.strings and /dev/null differ diff --git a/Classes/sv.lproj/HistoryListView.strings b/Classes/sv.lproj/HistoryListView.strings deleted file mode 100644 index 7c5b42960..000000000 Binary files a/Classes/sv.lproj/HistoryListView.strings and /dev/null differ diff --git a/Classes/sv.lproj/ImageView.strings b/Classes/sv.lproj/ImageView.strings deleted file mode 100644 index bfc519a95..000000000 Binary files a/Classes/sv.lproj/ImageView.strings and /dev/null differ diff --git a/Classes/sv.lproj/SettingsView.strings b/Classes/sv.lproj/SettingsView.strings deleted file mode 100644 index ea85eff65..000000000 Binary files a/Classes/sv.lproj/SettingsView.strings and /dev/null differ diff --git a/Classes/sv.lproj/ShopView.strings b/Classes/sv.lproj/ShopView.strings deleted file mode 100644 index 754057e45..000000000 Binary files a/Classes/sv.lproj/ShopView.strings and /dev/null differ diff --git a/Classes/sv.lproj/SideMenuView.strings b/Classes/sv.lproj/SideMenuView.strings deleted file mode 100644 index a1f126d9b..000000000 Binary files a/Classes/sv.lproj/SideMenuView.strings and /dev/null differ diff --git a/Classes/sv.lproj/SideMenuView~ipad.strings b/Classes/sv.lproj/SideMenuView~ipad.strings deleted file mode 100644 index 0ec55c3e1..000000000 Binary files a/Classes/sv.lproj/SideMenuView~ipad.strings and /dev/null differ diff --git a/Classes/tr.lproj/AboutView.strings b/Classes/tr.lproj/AboutView.strings deleted file mode 100644 index 216f6350d..000000000 Binary files a/Classes/tr.lproj/AboutView.strings and /dev/null differ diff --git a/Classes/tr.lproj/AssistantLinkView.strings b/Classes/tr.lproj/AssistantLinkView.strings deleted file mode 100644 index b7e6b8e86..000000000 Binary files a/Classes/tr.lproj/AssistantLinkView.strings and /dev/null differ diff --git a/Classes/tr.lproj/AssistantView.strings b/Classes/tr.lproj/AssistantView.strings deleted file mode 100644 index 3f6b17b64..000000000 Binary files a/Classes/tr.lproj/AssistantView.strings and /dev/null differ diff --git a/Classes/tr.lproj/AssistantViewScreens.strings b/Classes/tr.lproj/AssistantViewScreens.strings deleted file mode 100644 index d61a249e6..000000000 Binary files a/Classes/tr.lproj/AssistantViewScreens.strings and /dev/null differ diff --git a/Classes/tr.lproj/CallIncomingView.strings b/Classes/tr.lproj/CallIncomingView.strings deleted file mode 100644 index ed061468f..000000000 Binary files a/Classes/tr.lproj/CallIncomingView.strings and /dev/null differ diff --git a/Classes/tr.lproj/CallOutgoingView.strings b/Classes/tr.lproj/CallOutgoingView.strings deleted file mode 100644 index 378718e49..000000000 Binary files a/Classes/tr.lproj/CallOutgoingView.strings and /dev/null differ diff --git a/Classes/tr.lproj/CallView.strings b/Classes/tr.lproj/CallView.strings deleted file mode 100644 index bba4cac59..000000000 Binary files a/Classes/tr.lproj/CallView.strings and /dev/null differ diff --git a/Classes/tr.lproj/CallView~ipad.strings b/Classes/tr.lproj/CallView~ipad.strings deleted file mode 100644 index 168baadf3..000000000 Binary files a/Classes/tr.lproj/CallView~ipad.strings and /dev/null differ diff --git a/Classes/tr.lproj/ChatConversationCreateView.strings b/Classes/tr.lproj/ChatConversationCreateView.strings deleted file mode 100644 index 38a13b3d3..000000000 Binary files a/Classes/tr.lproj/ChatConversationCreateView.strings and /dev/null differ diff --git a/Classes/tr.lproj/ChatConversationImdnView.strings b/Classes/tr.lproj/ChatConversationImdnView.strings deleted file mode 100644 index 2d1752d32..000000000 Binary files a/Classes/tr.lproj/ChatConversationImdnView.strings and /dev/null differ diff --git a/Classes/tr.lproj/ChatConversationInfoView.strings b/Classes/tr.lproj/ChatConversationInfoView.strings deleted file mode 100644 index aa019b7ed..000000000 Binary files a/Classes/tr.lproj/ChatConversationInfoView.strings and /dev/null differ diff --git a/Classes/tr.lproj/ChatConversationView.strings b/Classes/tr.lproj/ChatConversationView.strings deleted file mode 100644 index 6e92461a4..000000000 Binary files a/Classes/tr.lproj/ChatConversationView.strings and /dev/null differ diff --git a/Classes/tr.lproj/ChatsListView.strings b/Classes/tr.lproj/ChatsListView.strings deleted file mode 100644 index da0f45e2f..000000000 Binary files a/Classes/tr.lproj/ChatsListView.strings and /dev/null differ diff --git a/Classes/tr.lproj/ContactDetailsView.strings b/Classes/tr.lproj/ContactDetailsView.strings deleted file mode 100644 index d5eaa1ee3..000000000 Binary files a/Classes/tr.lproj/ContactDetailsView.strings and /dev/null differ diff --git a/Classes/tr.lproj/ContactsListView.strings b/Classes/tr.lproj/ContactsListView.strings deleted file mode 100644 index 35ad061df..000000000 Binary files a/Classes/tr.lproj/ContactsListView.strings and /dev/null differ diff --git a/Classes/tr.lproj/CountryListView.strings b/Classes/tr.lproj/CountryListView.strings deleted file mode 100644 index da178e19f..000000000 Binary files a/Classes/tr.lproj/CountryListView.strings and /dev/null differ diff --git a/Classes/tr.lproj/DialerView.strings b/Classes/tr.lproj/DialerView.strings deleted file mode 100644 index 52182248b..000000000 Binary files a/Classes/tr.lproj/DialerView.strings and /dev/null differ diff --git a/Classes/tr.lproj/DialerView~ipad.strings b/Classes/tr.lproj/DialerView~ipad.strings deleted file mode 100644 index b2117df0c..000000000 Binary files a/Classes/tr.lproj/DialerView~ipad.strings and /dev/null differ diff --git a/Classes/tr.lproj/FirstLoginView.strings b/Classes/tr.lproj/FirstLoginView.strings deleted file mode 100644 index fa49f3dcf..000000000 Binary files a/Classes/tr.lproj/FirstLoginView.strings and /dev/null differ diff --git a/Classes/tr.lproj/HistoryDetailsView.strings b/Classes/tr.lproj/HistoryDetailsView.strings deleted file mode 100644 index 944c29ad2..000000000 Binary files a/Classes/tr.lproj/HistoryDetailsView.strings and /dev/null differ diff --git a/Classes/tr.lproj/HistoryListView.strings b/Classes/tr.lproj/HistoryListView.strings deleted file mode 100644 index cfdedb57e..000000000 Binary files a/Classes/tr.lproj/HistoryListView.strings and /dev/null differ diff --git a/Classes/tr.lproj/ImageView.strings b/Classes/tr.lproj/ImageView.strings deleted file mode 100644 index 27b35a9b9..000000000 Binary files a/Classes/tr.lproj/ImageView.strings and /dev/null differ diff --git a/Classes/tr.lproj/SettingsView.strings b/Classes/tr.lproj/SettingsView.strings deleted file mode 100644 index 530ee0ebd..000000000 Binary files a/Classes/tr.lproj/SettingsView.strings and /dev/null differ diff --git a/Classes/tr.lproj/ShopView.strings b/Classes/tr.lproj/ShopView.strings deleted file mode 100644 index 3d789bbec..000000000 Binary files a/Classes/tr.lproj/ShopView.strings and /dev/null differ diff --git a/Classes/tr.lproj/SideMenuView.strings b/Classes/tr.lproj/SideMenuView.strings deleted file mode 100644 index a1f126d9b..000000000 Binary files a/Classes/tr.lproj/SideMenuView.strings and /dev/null differ diff --git a/Classes/tr.lproj/SideMenuView~ipad.strings b/Classes/tr.lproj/SideMenuView~ipad.strings deleted file mode 100644 index 0ec55c3e1..000000000 Binary files a/Classes/tr.lproj/SideMenuView~ipad.strings and /dev/null differ diff --git a/Classes/uk.lproj/AboutView.strings b/Classes/uk.lproj/AboutView.strings deleted file mode 100644 index 8a34a9be8..000000000 Binary files a/Classes/uk.lproj/AboutView.strings and /dev/null differ diff --git a/Classes/uk.lproj/AssistantLinkView.strings b/Classes/uk.lproj/AssistantLinkView.strings deleted file mode 100644 index 1874bbb60..000000000 Binary files a/Classes/uk.lproj/AssistantLinkView.strings and /dev/null differ diff --git a/Classes/uk.lproj/AssistantView.strings b/Classes/uk.lproj/AssistantView.strings deleted file mode 100644 index 9df526714..000000000 Binary files a/Classes/uk.lproj/AssistantView.strings and /dev/null differ diff --git a/Classes/uk.lproj/AssistantViewScreens.strings b/Classes/uk.lproj/AssistantViewScreens.strings deleted file mode 100644 index c25e5a313..000000000 Binary files a/Classes/uk.lproj/AssistantViewScreens.strings and /dev/null differ diff --git a/Classes/uk.lproj/CallIncomingView.strings b/Classes/uk.lproj/CallIncomingView.strings deleted file mode 100644 index 6d54b8204..000000000 Binary files a/Classes/uk.lproj/CallIncomingView.strings and /dev/null differ diff --git a/Classes/uk.lproj/CallOutgoingView.strings b/Classes/uk.lproj/CallOutgoingView.strings deleted file mode 100644 index 46877ee38..000000000 Binary files a/Classes/uk.lproj/CallOutgoingView.strings and /dev/null differ diff --git a/Classes/uk.lproj/CallView.strings b/Classes/uk.lproj/CallView.strings deleted file mode 100644 index a0d32550f..000000000 Binary files a/Classes/uk.lproj/CallView.strings and /dev/null differ diff --git a/Classes/uk.lproj/CallView~ipad.strings b/Classes/uk.lproj/CallView~ipad.strings deleted file mode 100644 index 4b61fc909..000000000 Binary files a/Classes/uk.lproj/CallView~ipad.strings and /dev/null differ diff --git a/Classes/uk.lproj/ChatConversationCreateView.strings b/Classes/uk.lproj/ChatConversationCreateView.strings deleted file mode 100644 index 157fd322b..000000000 Binary files a/Classes/uk.lproj/ChatConversationCreateView.strings and /dev/null differ diff --git a/Classes/uk.lproj/ChatConversationImdnView.strings b/Classes/uk.lproj/ChatConversationImdnView.strings deleted file mode 100644 index 1e7158caf..000000000 Binary files a/Classes/uk.lproj/ChatConversationImdnView.strings and /dev/null differ diff --git a/Classes/uk.lproj/ChatConversationInfoView.strings b/Classes/uk.lproj/ChatConversationInfoView.strings deleted file mode 100644 index 36bba7452..000000000 Binary files a/Classes/uk.lproj/ChatConversationInfoView.strings and /dev/null differ diff --git a/Classes/uk.lproj/ChatConversationView.strings b/Classes/uk.lproj/ChatConversationView.strings deleted file mode 100644 index aac05227f..000000000 Binary files a/Classes/uk.lproj/ChatConversationView.strings and /dev/null differ diff --git a/Classes/uk.lproj/ChatsListView.strings b/Classes/uk.lproj/ChatsListView.strings deleted file mode 100644 index b590bca46..000000000 Binary files a/Classes/uk.lproj/ChatsListView.strings and /dev/null differ diff --git a/Classes/uk.lproj/ContactDetailsView.strings b/Classes/uk.lproj/ContactDetailsView.strings deleted file mode 100644 index ddfd15e3c..000000000 Binary files a/Classes/uk.lproj/ContactDetailsView.strings and /dev/null differ diff --git a/Classes/uk.lproj/ContactsListView.strings b/Classes/uk.lproj/ContactsListView.strings deleted file mode 100644 index 8c7faa0d2..000000000 Binary files a/Classes/uk.lproj/ContactsListView.strings and /dev/null differ diff --git a/Classes/uk.lproj/CountryListView.strings b/Classes/uk.lproj/CountryListView.strings deleted file mode 100644 index 1c20f7a25..000000000 Binary files a/Classes/uk.lproj/CountryListView.strings and /dev/null differ diff --git a/Classes/uk.lproj/DialerView.strings b/Classes/uk.lproj/DialerView.strings deleted file mode 100644 index 3daa0ddc0..000000000 Binary files a/Classes/uk.lproj/DialerView.strings and /dev/null differ diff --git a/Classes/uk.lproj/DialerView~ipad.strings b/Classes/uk.lproj/DialerView~ipad.strings deleted file mode 100644 index 5a3ea4c64..000000000 Binary files a/Classes/uk.lproj/DialerView~ipad.strings and /dev/null differ diff --git a/Classes/uk.lproj/FirstLoginView.strings b/Classes/uk.lproj/FirstLoginView.strings deleted file mode 100644 index 6bbb063f6..000000000 Binary files a/Classes/uk.lproj/FirstLoginView.strings and /dev/null differ diff --git a/Classes/uk.lproj/HistoryDetailsView.strings b/Classes/uk.lproj/HistoryDetailsView.strings deleted file mode 100644 index ff18bbdd2..000000000 Binary files a/Classes/uk.lproj/HistoryDetailsView.strings and /dev/null differ diff --git a/Classes/uk.lproj/HistoryListView.strings b/Classes/uk.lproj/HistoryListView.strings deleted file mode 100644 index 82555fd50..000000000 Binary files a/Classes/uk.lproj/HistoryListView.strings and /dev/null differ diff --git a/Classes/uk.lproj/ImageView.strings b/Classes/uk.lproj/ImageView.strings deleted file mode 100644 index b20eefbff..000000000 Binary files a/Classes/uk.lproj/ImageView.strings and /dev/null differ diff --git a/Classes/uk.lproj/SettingsView.strings b/Classes/uk.lproj/SettingsView.strings deleted file mode 100644 index d43c4ef91..000000000 Binary files a/Classes/uk.lproj/SettingsView.strings and /dev/null differ diff --git a/Classes/uk.lproj/ShopView.strings b/Classes/uk.lproj/ShopView.strings deleted file mode 100644 index 9d30cf255..000000000 Binary files a/Classes/uk.lproj/ShopView.strings and /dev/null differ diff --git a/Classes/uk.lproj/SideMenuView.strings b/Classes/uk.lproj/SideMenuView.strings deleted file mode 100644 index 2fd20c6a8..000000000 Binary files a/Classes/uk.lproj/SideMenuView.strings and /dev/null differ diff --git a/Classes/uk.lproj/SideMenuView~ipad.strings b/Classes/uk.lproj/SideMenuView~ipad.strings deleted file mode 100644 index d1980668d..000000000 Binary files a/Classes/uk.lproj/SideMenuView~ipad.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/AboutView.strings b/Classes/zh_CN.lproj/AboutView.strings deleted file mode 100644 index 81ea70e29..000000000 Binary files a/Classes/zh_CN.lproj/AboutView.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/AssistantLinkView.strings b/Classes/zh_CN.lproj/AssistantLinkView.strings deleted file mode 100644 index 298f5ac03..000000000 Binary files a/Classes/zh_CN.lproj/AssistantLinkView.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/AssistantView.strings b/Classes/zh_CN.lproj/AssistantView.strings deleted file mode 100644 index ef29f75d7..000000000 Binary files a/Classes/zh_CN.lproj/AssistantView.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/AssistantViewScreens.strings b/Classes/zh_CN.lproj/AssistantViewScreens.strings deleted file mode 100644 index fd787b547..000000000 Binary files a/Classes/zh_CN.lproj/AssistantViewScreens.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/CallIncomingView.strings b/Classes/zh_CN.lproj/CallIncomingView.strings deleted file mode 100644 index c0853cfd8..000000000 Binary files a/Classes/zh_CN.lproj/CallIncomingView.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/CallOutgoingView.strings b/Classes/zh_CN.lproj/CallOutgoingView.strings deleted file mode 100644 index fbc1bc8b0..000000000 Binary files a/Classes/zh_CN.lproj/CallOutgoingView.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/CallView.strings b/Classes/zh_CN.lproj/CallView.strings deleted file mode 100644 index 1b0270967..000000000 Binary files a/Classes/zh_CN.lproj/CallView.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/CallView~ipad.strings b/Classes/zh_CN.lproj/CallView~ipad.strings deleted file mode 100644 index 013f8faca..000000000 Binary files a/Classes/zh_CN.lproj/CallView~ipad.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/ChatConversationCreateView.strings b/Classes/zh_CN.lproj/ChatConversationCreateView.strings deleted file mode 100644 index eb0068e8c..000000000 Binary files a/Classes/zh_CN.lproj/ChatConversationCreateView.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/ChatConversationImdnView.strings b/Classes/zh_CN.lproj/ChatConversationImdnView.strings deleted file mode 100644 index efbef0558..000000000 Binary files a/Classes/zh_CN.lproj/ChatConversationImdnView.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/ChatConversationInfoView.strings b/Classes/zh_CN.lproj/ChatConversationInfoView.strings deleted file mode 100644 index ee2583413..000000000 Binary files a/Classes/zh_CN.lproj/ChatConversationInfoView.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/ChatConversationView.strings b/Classes/zh_CN.lproj/ChatConversationView.strings deleted file mode 100644 index 7489ed104..000000000 Binary files a/Classes/zh_CN.lproj/ChatConversationView.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/ChatsListView.strings b/Classes/zh_CN.lproj/ChatsListView.strings deleted file mode 100644 index 7bd04c740..000000000 Binary files a/Classes/zh_CN.lproj/ChatsListView.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/ContactDetailsView.strings b/Classes/zh_CN.lproj/ContactDetailsView.strings deleted file mode 100644 index 2b16704d3..000000000 Binary files a/Classes/zh_CN.lproj/ContactDetailsView.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/ContactsListView.strings b/Classes/zh_CN.lproj/ContactsListView.strings deleted file mode 100644 index b0a50b578..000000000 Binary files a/Classes/zh_CN.lproj/ContactsListView.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/CountryListView.strings b/Classes/zh_CN.lproj/CountryListView.strings deleted file mode 100644 index 45141df60..000000000 Binary files a/Classes/zh_CN.lproj/CountryListView.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/DialerView.strings b/Classes/zh_CN.lproj/DialerView.strings deleted file mode 100644 index 81c6709fd..000000000 Binary files a/Classes/zh_CN.lproj/DialerView.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/DialerView~ipad.strings b/Classes/zh_CN.lproj/DialerView~ipad.strings deleted file mode 100644 index 08fc063f8..000000000 Binary files a/Classes/zh_CN.lproj/DialerView~ipad.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/FirstLoginView.strings b/Classes/zh_CN.lproj/FirstLoginView.strings deleted file mode 100644 index 511bfb646..000000000 Binary files a/Classes/zh_CN.lproj/FirstLoginView.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/HistoryDetailsView.strings b/Classes/zh_CN.lproj/HistoryDetailsView.strings deleted file mode 100644 index 6388539d9..000000000 Binary files a/Classes/zh_CN.lproj/HistoryDetailsView.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/HistoryListView.strings b/Classes/zh_CN.lproj/HistoryListView.strings deleted file mode 100644 index f317d080c..000000000 Binary files a/Classes/zh_CN.lproj/HistoryListView.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/ImageView.strings b/Classes/zh_CN.lproj/ImageView.strings deleted file mode 100644 index 883b0fc5b..000000000 Binary files a/Classes/zh_CN.lproj/ImageView.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/SettingsView.strings b/Classes/zh_CN.lproj/SettingsView.strings deleted file mode 100644 index 755181ba2..000000000 Binary files a/Classes/zh_CN.lproj/SettingsView.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/ShopView.strings b/Classes/zh_CN.lproj/ShopView.strings deleted file mode 100644 index 58f6621e5..000000000 Binary files a/Classes/zh_CN.lproj/ShopView.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/SideMenuView.strings b/Classes/zh_CN.lproj/SideMenuView.strings deleted file mode 100644 index c5098e4f1..000000000 Binary files a/Classes/zh_CN.lproj/SideMenuView.strings and /dev/null differ diff --git a/Classes/zh_CN.lproj/SideMenuView~ipad.strings b/Classes/zh_CN.lproj/SideMenuView~ipad.strings deleted file mode 100644 index e0549f8a2..000000000 Binary files a/Classes/zh_CN.lproj/SideMenuView~ipad.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/AboutView.strings b/Classes/zh_TW.lproj/AboutView.strings deleted file mode 100644 index fd1469a62..000000000 Binary files a/Classes/zh_TW.lproj/AboutView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/AssistantLinkView.strings b/Classes/zh_TW.lproj/AssistantLinkView.strings deleted file mode 100644 index a573e82d6..000000000 Binary files a/Classes/zh_TW.lproj/AssistantLinkView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/AssistantView.strings b/Classes/zh_TW.lproj/AssistantView.strings deleted file mode 100644 index 105466152..000000000 Binary files a/Classes/zh_TW.lproj/AssistantView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/AssistantViewScreens.strings b/Classes/zh_TW.lproj/AssistantViewScreens.strings deleted file mode 100644 index d22115a9d..000000000 Binary files a/Classes/zh_TW.lproj/AssistantViewScreens.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/AssistantViews.strings b/Classes/zh_TW.lproj/AssistantViews.strings deleted file mode 100644 index a71b3edde..000000000 Binary files a/Classes/zh_TW.lproj/AssistantViews.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/AssistantView~ipad.strings b/Classes/zh_TW.lproj/AssistantView~ipad.strings deleted file mode 100644 index 4f6645238..000000000 Binary files a/Classes/zh_TW.lproj/AssistantView~ipad.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/CallIncomingView.strings b/Classes/zh_TW.lproj/CallIncomingView.strings deleted file mode 100644 index fd207bfeb..000000000 Binary files a/Classes/zh_TW.lproj/CallIncomingView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/CallOutgoingView.strings b/Classes/zh_TW.lproj/CallOutgoingView.strings deleted file mode 100644 index edf02803d..000000000 Binary files a/Classes/zh_TW.lproj/CallOutgoingView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/CallView.strings b/Classes/zh_TW.lproj/CallView.strings deleted file mode 100644 index 4238dc63d..000000000 Binary files a/Classes/zh_TW.lproj/CallView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/CallView~ipad.strings b/Classes/zh_TW.lproj/CallView~ipad.strings deleted file mode 100644 index f7f369f1c..000000000 Binary files a/Classes/zh_TW.lproj/CallView~ipad.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/ChatConversationCreateView.strings b/Classes/zh_TW.lproj/ChatConversationCreateView.strings deleted file mode 100644 index 6beb3dbd5..000000000 Binary files a/Classes/zh_TW.lproj/ChatConversationCreateView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/ChatConversationImdnView.strings b/Classes/zh_TW.lproj/ChatConversationImdnView.strings deleted file mode 100644 index 2fa524ccf..000000000 Binary files a/Classes/zh_TW.lproj/ChatConversationImdnView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/ChatConversationInfoView.strings b/Classes/zh_TW.lproj/ChatConversationInfoView.strings deleted file mode 100644 index 309ace75b..000000000 Binary files a/Classes/zh_TW.lproj/ChatConversationInfoView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/ChatConversationView.strings b/Classes/zh_TW.lproj/ChatConversationView.strings deleted file mode 100644 index 2e322678d..000000000 Binary files a/Classes/zh_TW.lproj/ChatConversationView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/ChatRoomView.strings b/Classes/zh_TW.lproj/ChatRoomView.strings deleted file mode 100644 index 0daf7d801..000000000 Binary files a/Classes/zh_TW.lproj/ChatRoomView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/ChatView.strings b/Classes/zh_TW.lproj/ChatView.strings deleted file mode 100644 index 4b91117ad..000000000 Binary files a/Classes/zh_TW.lproj/ChatView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/ChatsListView.strings b/Classes/zh_TW.lproj/ChatsListView.strings deleted file mode 100644 index ace9c07d6..000000000 Binary files a/Classes/zh_TW.lproj/ChatsListView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/ContactDetailsView.strings b/Classes/zh_TW.lproj/ContactDetailsView.strings deleted file mode 100644 index 006bf4f11..000000000 Binary files a/Classes/zh_TW.lproj/ContactDetailsView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/ContactsListView.strings b/Classes/zh_TW.lproj/ContactsListView.strings deleted file mode 100644 index 1fdcc27bd..000000000 Binary files a/Classes/zh_TW.lproj/ContactsListView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/ContactsView.strings b/Classes/zh_TW.lproj/ContactsView.strings deleted file mode 100644 index b28da865b..000000000 Binary files a/Classes/zh_TW.lproj/ContactsView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/CountryListView.strings b/Classes/zh_TW.lproj/CountryListView.strings deleted file mode 100644 index 4b09dcbfb..000000000 Binary files a/Classes/zh_TW.lproj/CountryListView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/DialerView.strings b/Classes/zh_TW.lproj/DialerView.strings deleted file mode 100644 index 237f4308e..000000000 Binary files a/Classes/zh_TW.lproj/DialerView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/DialerView~ipad.strings b/Classes/zh_TW.lproj/DialerView~ipad.strings deleted file mode 100644 index 002660152..000000000 Binary files a/Classes/zh_TW.lproj/DialerView~ipad.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/FirstLoginView.strings b/Classes/zh_TW.lproj/FirstLoginView.strings deleted file mode 100644 index a5bfd875c..000000000 Binary files a/Classes/zh_TW.lproj/FirstLoginView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/HistoryDetailsView.strings b/Classes/zh_TW.lproj/HistoryDetailsView.strings deleted file mode 100644 index 2deb22cd4..000000000 Binary files a/Classes/zh_TW.lproj/HistoryDetailsView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/HistoryListView.strings b/Classes/zh_TW.lproj/HistoryListView.strings deleted file mode 100644 index 2c3e76e7a..000000000 Binary files a/Classes/zh_TW.lproj/HistoryListView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/HistoryView.strings b/Classes/zh_TW.lproj/HistoryView.strings deleted file mode 100644 index dfe003109..000000000 Binary files a/Classes/zh_TW.lproj/HistoryView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/ImageView.strings b/Classes/zh_TW.lproj/ImageView.strings deleted file mode 100644 index 9422ca307..000000000 Binary files a/Classes/zh_TW.lproj/ImageView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/InCallView.strings b/Classes/zh_TW.lproj/InCallView.strings deleted file mode 100644 index 229e293de..000000000 Binary files a/Classes/zh_TW.lproj/InCallView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/IncomingCallView.strings b/Classes/zh_TW.lproj/IncomingCallView.strings deleted file mode 100644 index 43263a7bb..000000000 Binary files a/Classes/zh_TW.lproj/IncomingCallView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/IncomingCallView~ipad.strings b/Classes/zh_TW.lproj/IncomingCallView~ipad.strings deleted file mode 100644 index 3ef43bd2a..000000000 Binary files a/Classes/zh_TW.lproj/IncomingCallView~ipad.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/SettingsView.strings b/Classes/zh_TW.lproj/SettingsView.strings deleted file mode 100644 index 997c28f74..000000000 Binary files a/Classes/zh_TW.lproj/SettingsView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/ShopView.strings b/Classes/zh_TW.lproj/ShopView.strings deleted file mode 100644 index 428466948..000000000 Binary files a/Classes/zh_TW.lproj/ShopView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/SideMenuView.strings b/Classes/zh_TW.lproj/SideMenuView.strings deleted file mode 100644 index ce1be0b3c..000000000 Binary files a/Classes/zh_TW.lproj/SideMenuView.strings and /dev/null differ diff --git a/Classes/zh_TW.lproj/SideMenuView~ipad.strings b/Classes/zh_TW.lproj/SideMenuView~ipad.strings deleted file mode 100644 index 7c20ab24b..000000000 Binary files a/Classes/zh_TW.lproj/SideMenuView~ipad.strings and /dev/null differ diff --git a/GoogleService-Info.plist b/GoogleService-Info.plist deleted file mode 100644 index f996be8f2..000000000 --- a/GoogleService-Info.plist +++ /dev/null @@ -1,36 +0,0 @@ - - - - - CLIENT_ID - 221368768663-0ufgu96cel0auk4v0me863lgm252b9n2.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.221368768663-0ufgu96cel0auk4v0me863lgm252b9n2 - API_KEY - AIzaSyDJTtlRCM7IqdVUU2dSIYq2YIsTz6bqnkI - GCM_SENDER_ID - 221368768663 - PLIST_VERSION - 1 - BUNDLE_ID - org.linphone.phone - PROJECT_ID - linphone-iphone - STORAGE_BUCKET - linphone-iphone.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:221368768663:ios:a2c822bc087b5a219431d2 - DATABASE_URL - https://linphone-iphone.firebaseio.com - - diff --git a/LocalPushProvider/Info.plist b/LocalPushProvider/Info.plist deleted file mode 100644 index 801ea4212..000000000 --- a/LocalPushProvider/Info.plist +++ /dev/null @@ -1,13 +0,0 @@ - - - - - NSExtension - - NSExtensionPointIdentifier - com.apple.networkextension.app-push - NSExtensionPrincipalClass - $(PRODUCT_MODULE_NAME).LocalPushProvider - - - diff --git a/LocalPushProvider/LocalPushProvider.entitlements b/LocalPushProvider/LocalPushProvider.entitlements deleted file mode 100644 index 71743be9c..000000000 --- a/LocalPushProvider/LocalPushProvider.entitlements +++ /dev/null @@ -1,14 +0,0 @@ - - - - - com.apple.developer.networking.networkextension - - app-push-provider - - com.apple.security.application-groups - - group.org.linphone.phone.msgNotification - - - diff --git a/LocalPushProvider/LocalPushProvider.swift b/LocalPushProvider/LocalPushProvider.swift deleted file mode 100644 index ff42e2c6e..000000000 --- a/LocalPushProvider/LocalPushProvider.swift +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import Foundation -import Combine -import NetworkExtension -import UserNotifications -import linphonesw -import os -import linphone - -let APP_GROUP_ID = "group.org.linphone.phone.msgNotification" - -extension String: Error {} - -class LocalPushProvider: NEAppPushProvider { - var core: Core? = nil - let log = LoggingService.Instance - var logDelegate: LinphoneLoggingServiceManager! - var coreDelegateStub : CoreDelegateStub? = nil - let defaults = UserDefaults.init(suiteName: APP_GROUP_ID) - var coreIteratorTimer:Timer? = nil - var aggretatorTimer:Timer? = nil - var aggregagor:[ChatMessage] = [] - - func chatRoomMuted(chatRoom:ChatRoom) -> Bool { - if let chatroomsPushStatus = defaults?.dictionary(forKey: "chatroomsPushStatus"), let from = chatRoom.peerAddress?.asStringUriOnly() { - if ((chatroomsPushStatus[from] as? String) == "disabled") { - return true - } - } - return false - } - - func createCore() throws { - coreDelegateStub = CoreDelegateStub( - onMessageReceived: { (core:Core, chatRoom:ChatRoom, message:ChatMessage) -> Void in - if (self.ignoredContentTypes.contains(message.contentType)) { - self.log.error(message: "Received unexpected content type.\(message.contentType)") - } else if (!self.chatRoomMuted(chatRoom: chatRoom)) { - self.aggregagor.append(message) - } - } - ) - guard let configString = providerConfiguration?["coreconfig"] as? String, let config = Config.newFromBuffer(buffer: configString) else { - log.error(message: "Unable to get core config through provider configuration") - throw "Unable to get core config through provider configuration" - } - logDelegate = try LinphoneLoggingServiceManager(config: config, log: log, domain: "LocalPushProvider") - - // Ensure a separate UUID from app is used, use previously generated one or a new one if n/a. - - if let uuid = defaults?.string(forKey: "misc_uuid") { - config.setString(section: "misc", key: "uuid", value: uuid) - } else { - config.cleanEntry(section: "misc", key: "uuid") - } - - log.message(message: "Creating LocalPushProvider core with configuration : \(config.dump())") - core = try Factory.Instance.createCoreWithConfig(config: config, systemContext: nil) - core?.autoIterateEnabled = false // 20ms auto-iterations are too frequent for NE, sometimes it gets killed by the OS. (triggers limit exceed of 150 wakeups per second over 300 seconds) - core?.addDelegate(delegate: coreDelegateStub!) - coreIteratorTimer = Timer(timeInterval: 0.1, target: self, selector: #selector(iterate), userInfo: nil, repeats: true) // 0.1 second - RunLoop.main.add(coreIteratorTimer!, forMode: .default) - - let aggregateTime = config.getInt(section: "local_push", key: "notif_aggregation_period", defaultValue: 3) - aggretatorTimer = Timer(timeInterval: TimeInterval(aggregateTime), target: self, selector: #selector(flushAggregator), userInfo: nil, repeats: true) // 0.1 second - RunLoop.main.add(aggretatorTimer!, forMode: .default) - - - core?.accountList.forEach { account in - let params = account.params?.clone() - params?.expires = 60 // handleTimerEvent(), called by the OS, refreshes registers every 60 seconds, we don't need to expiration longer as if it's not refreshed it means the extension is not reachable. - account.params = params - } - } - - @objc func iterate() { - core?.iterate() - } - - @objc func flushAggregator() { - if (aggregagor.count == 1) { - showLocalNotification(message: aggregagor[0]) - } else if (aggregagor.count > 1) { - var displayNames : [String] = [] - aggregagor.forEach { message in - let displayName = getDisplayName(message: message) - if (!displayNames.contains(displayName)) { - displayNames.append(displayName) - } - } - displayNames.sort() - showMultipleMessagesNotifications(count: aggregagor.count,displayNames: displayNames.joined(separator: ",")) - } - aggregagor.removeAll() - } - - - - // MARK: - NEAppPushProvider Life Cycle - - override func start(completionHandler: @escaping (Error?) -> Void) { - do { - if (core == nil) { - try createCore() - log.message(message: "Creating core") - } - try core?.start() - coreIteratorTimer?.fire() - aggretatorTimer?.fire() - log.message(message: "Core started") - // Keep freshly generated UUID after start to avoid re-creating one every time the NE is starting. - if (core?.config?.hasEntry(section: "misc", key: "uuid") != 0) { - defaults?.set(core?.config?.getString(section: "misc", key: "uuid", defaultString: ""), forKey: "misc_uuid") - log.message(message: "storing generated UUID \(String(describing: defaults?.string(forKey: "misc_uuid")))") - } - completionHandler(nil) - } catch { - completionHandler(error) - } - } - - override func stop(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) { - log.message(message: "Received stop for reason \(reason)") - core?.stopAsync() - coreIteratorTimer?.invalidate() - aggretatorTimer?.invalidate() - flushAggregator() - completionHandler() - } - - override func handleTimerEvent() { - log.message(message: "Refreshing registers (handleTimerEvent)") - core?.refreshRegisters() - } - - // MARK: - Notify User - - let ignoredContentTypes = ["message/imdn+xml","application/im-iscomposing+xml"] - - func showMultipleMessagesNotifications(count:Int, displayNames: String) { - let content = UNMutableNotificationContent() - content.title = NSLocalizedString("%s messages received", comment: "").replacingOccurrences(of: "%s", with: String(count)) - content.body = NSLocalizedString("from: %s", comment: "").replacingOccurrences(of: "%s", with: displayNames) - content.sound = UNNotificationSound(named: UNNotificationSoundName("msg.caf")) - content.categoryIdentifier = "app_active" - let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: nil) - UNUserNotificationCenter.current().add(request) { error in - if let error = error { - self.log.error(message: "Error submitting local notification: \(error)") - return - } - self.log.message(message: "Local notification posted successfully") - } - } - - func getDisplayName(message:ChatMessage) -> String { - let fromAddr = message.chatRoom?.peerAddress?.asStringUriOnly() - var displayName = fromAddr?.getDisplayNameFromSipAddress(lc: core!, logger: log, groupId: APP_GROUP_ID) - displayName = displayName != nil ? displayName : message.chatRoom?.peerAddress?.displayName - displayName = displayName != nil && displayName?.isEmpty != true ? displayName :message.chatRoom?.peerAddress?.username - return displayName! - } - - func showLocalNotification(message: ChatMessage) { - - var messageContent = "" - if (message.hasConferenceInvitationContent()) { - messageContent = NSLocalizedString("📅 You are invited to a meeting", comment: "") - } else { - messageContent = message.hasTextContent() ? message.utf8Text ?? "" : "🗻" - } - - let content = UNMutableNotificationContent() - content.title = getDisplayName(message:message) - content.body = messageContent - content.sound = UNNotificationSound(named: UNNotificationSoundName("msg.caf")) - content.categoryIdentifier = "app_active" - let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: nil) - UNUserNotificationCenter.current().add(request) { error in - if let error = error { - self.log.error(message: "Error submitting local notification: \(error)") - return - } - self.log.message(message: "Local notification posted successfully") - } - } - -} diff --git a/Podfile b/Podfile deleted file mode 100644 index 5cd62175c..000000000 --- a/Podfile +++ /dev/null @@ -1,127 +0,0 @@ -# Uncomment the next line to define a global platform for your project -platform :ios, '13.0' -source "https://gitlab.linphone.org/BC/public/podspec.git" -source "https://github.com/CocoaPods/Specs.git" - -def all_pods - if ENV['PODFILE_PATH'].nil? - pod 'linphone-sdk', '~>5.3.4' - else - pod 'linphone-sdk', :path => ENV['PODFILE_PATH'] # local sdk - end - - crashlytics -end - -def crashlytics - if not ENV['USE_CRASHLYTICS'].nil? - pod 'Firebase/Analytics' - pod 'Firebase/Crashlytics' - end -end - -target 'linphone' do - # Uncomment the next line if you're using Swift or would like to use dynamic frameworks - use_frameworks! - - # Pods for linphone - pod 'SVProgressHUD' - pod 'SnapKit', '~> 5.6.0' - pod 'DropDown' - pod 'IQKeyboardManager' - pod 'SwipeCellKit' - #License: https://github.com/SwipeCellKit/SwipeCellKit/blob/develop/LICENSE - pod 'EmojiPicker', :git => 'https://github.com/htmlprogrammist/EmojiPicker' - #License: https://github.com/htmlprogrammist/EmojiPicker/blob/main/LICENSE - all_pods - -end - -target 'msgNotificationService' do - # Uncomment the next line if you're using Swift or would like to use dynamic frameworks - use_frameworks! - - # Pods for messagesNotification - all_pods - -end - -target 'msgNotificationContent' do - # Uncomment the next line if you're using Swift or would like to use dynamic frameworks - use_frameworks! - - # Pods for messagesNotification - all_pods - -end - -target 'CallUITests' do - # Uncomment the next line if you're using Swift or would like to use dynamic frameworks - use_frameworks! - - # Pods for CallUITests - all_pods - -end - -#target 'LocalPushProvider' do - # Uncomment the next line if you're using Swift or would like to use dynamic frameworks - #use_frameworks! - - # Pods for CallUITests - #all_pods - -#end - -post_install do |installer| - system("sed 's/fileprivate let tableView =/public let tableView =/g' ./Pods/DropDown/DropDown/src/DropDown.swift > tmp.swift && mv -f tmp.swift ./Pods/DropDown/DropDown/src/DropDown.swift") - # Get the version of linphone-sdk - installer.pod_targets.each do |target| - if target.pod_name == 'linphone-sdk' - target.specs.each do |spec| - $linphone_sdk_version = spec.version - end - end - end - - app_project = Xcodeproj::Project.open(Dir.glob("*.xcodeproj")[0]) - app_project.native_targets.each do |target| - target.build_configurations.each do |config| - if target.name == "linphone" || target.name == 'msgNotificationService' || target.name == 'msgNotificationContent' - if ENV['USE_CRASHLYTICS'].nil? - if config.name == "Debug" then - config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = '$(inherited) DEBUG=1' - else - config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = '$(inherited)' - end - config.build_settings['OTHER_SWIFT_FLAGS'] = '$(inherited)' - else - # activate crashlytics - if config.name == "Debug" then - config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = '$(inherited) DEBUG=1 USE_CRASHLYTICS=1' - else - config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = '$(inherited) USE_CRASHLYTICS=1' - end - config.build_settings['OTHER_SWIFT_FLAGS'] = '$(inherited) -DUSE_CRASHLYTICS' - end - end - - if target.name == "linphone" - config.build_settings['OTHER_CFLAGS'] = '-DBCTBX_LOG_DOMAIN=\"ios\"', - '-DCHECK_VERSION_UPDATE=FALSE', - '-DENABLE_QRCODE=TRUE', - '-DENABLE_SMS_INVITE=TRUE', - '$(inherited)', - "-DLINPHONE_SDK_VERSION=\\\"#{$linphone_sdk_version}\\\"" - end - - app_project.save - end - end - - installer.pods_project.targets.each do |target| - target.build_configurations.each do |config| - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0' - end - end -end diff --git a/Resources/Images.xcassets/AppIcon.appiconset/1024.png b/Resources/Images.xcassets/AppIcon.appiconset/1024.png deleted file mode 100644 index 2ced7c36c..000000000 Binary files a/Resources/Images.xcassets/AppIcon.appiconset/1024.png and /dev/null differ diff --git a/Resources/Images.xcassets/AppIcon.appiconset/120-1.png b/Resources/Images.xcassets/AppIcon.appiconset/120-1.png deleted file mode 100644 index eaa599a65..000000000 Binary files a/Resources/Images.xcassets/AppIcon.appiconset/120-1.png and /dev/null differ diff --git a/Resources/Images.xcassets/AppIcon.appiconset/120.png b/Resources/Images.xcassets/AppIcon.appiconset/120.png deleted file mode 100644 index eaa599a65..000000000 Binary files a/Resources/Images.xcassets/AppIcon.appiconset/120.png and /dev/null differ diff --git a/Resources/Images.xcassets/AppIcon.appiconset/152.png b/Resources/Images.xcassets/AppIcon.appiconset/152.png deleted file mode 100644 index 5012b07b0..000000000 Binary files a/Resources/Images.xcassets/AppIcon.appiconset/152.png and /dev/null differ diff --git a/Resources/Images.xcassets/AppIcon.appiconset/167.png b/Resources/Images.xcassets/AppIcon.appiconset/167.png deleted file mode 100644 index da2881b21..000000000 Binary files a/Resources/Images.xcassets/AppIcon.appiconset/167.png and /dev/null differ diff --git a/Resources/Images.xcassets/AppIcon.appiconset/180.png b/Resources/Images.xcassets/AppIcon.appiconset/180.png deleted file mode 100644 index c04b414ac..000000000 Binary files a/Resources/Images.xcassets/AppIcon.appiconset/180.png and /dev/null differ diff --git a/Resources/Images.xcassets/AppIcon.appiconset/20.png b/Resources/Images.xcassets/AppIcon.appiconset/20.png deleted file mode 100644 index f34f18553..000000000 Binary files a/Resources/Images.xcassets/AppIcon.appiconset/20.png and /dev/null differ diff --git a/Resources/Images.xcassets/AppIcon.appiconset/29-1.png b/Resources/Images.xcassets/AppIcon.appiconset/29-1.png deleted file mode 100644 index 381c876f3..000000000 Binary files a/Resources/Images.xcassets/AppIcon.appiconset/29-1.png and /dev/null differ diff --git a/Resources/Images.xcassets/AppIcon.appiconset/29.png b/Resources/Images.xcassets/AppIcon.appiconset/29.png deleted file mode 100644 index 381c876f3..000000000 Binary files a/Resources/Images.xcassets/AppIcon.appiconset/29.png and /dev/null differ diff --git a/Resources/Images.xcassets/AppIcon.appiconset/40-1.png b/Resources/Images.xcassets/AppIcon.appiconset/40-1.png deleted file mode 100644 index 80d6ed7f8..000000000 Binary files a/Resources/Images.xcassets/AppIcon.appiconset/40-1.png and /dev/null differ diff --git a/Resources/Images.xcassets/AppIcon.appiconset/40-2.png b/Resources/Images.xcassets/AppIcon.appiconset/40-2.png deleted file mode 100644 index 80d6ed7f8..000000000 Binary files a/Resources/Images.xcassets/AppIcon.appiconset/40-2.png and /dev/null differ diff --git a/Resources/Images.xcassets/AppIcon.appiconset/40.png b/Resources/Images.xcassets/AppIcon.appiconset/40.png deleted file mode 100644 index 80d6ed7f8..000000000 Binary files a/Resources/Images.xcassets/AppIcon.appiconset/40.png and /dev/null differ diff --git a/Resources/Images.xcassets/AppIcon.appiconset/58-1.png b/Resources/Images.xcassets/AppIcon.appiconset/58-1.png deleted file mode 100644 index 6854d840f..000000000 Binary files a/Resources/Images.xcassets/AppIcon.appiconset/58-1.png and /dev/null differ diff --git a/Resources/Images.xcassets/AppIcon.appiconset/58.png b/Resources/Images.xcassets/AppIcon.appiconset/58.png deleted file mode 100644 index 6854d840f..000000000 Binary files a/Resources/Images.xcassets/AppIcon.appiconset/58.png and /dev/null differ diff --git a/Resources/Images.xcassets/AppIcon.appiconset/60.png b/Resources/Images.xcassets/AppIcon.appiconset/60.png deleted file mode 100644 index 00493f613..000000000 Binary files a/Resources/Images.xcassets/AppIcon.appiconset/60.png and /dev/null differ diff --git a/Resources/Images.xcassets/AppIcon.appiconset/76.png b/Resources/Images.xcassets/AppIcon.appiconset/76.png deleted file mode 100644 index 073d8a6fc..000000000 Binary files a/Resources/Images.xcassets/AppIcon.appiconset/76.png and /dev/null differ diff --git a/Resources/Images.xcassets/AppIcon.appiconset/80-1.png b/Resources/Images.xcassets/AppIcon.appiconset/80-1.png deleted file mode 100644 index ee236fee3..000000000 Binary files a/Resources/Images.xcassets/AppIcon.appiconset/80-1.png and /dev/null differ diff --git a/Resources/Images.xcassets/AppIcon.appiconset/80.png b/Resources/Images.xcassets/AppIcon.appiconset/80.png deleted file mode 100644 index ee236fee3..000000000 Binary files a/Resources/Images.xcassets/AppIcon.appiconset/80.png and /dev/null differ diff --git a/Resources/Images.xcassets/AppIcon.appiconset/87.png b/Resources/Images.xcassets/AppIcon.appiconset/87.png deleted file mode 100644 index a867123dc..000000000 Binary files a/Resources/Images.xcassets/AppIcon.appiconset/87.png and /dev/null differ diff --git a/Resources/Images.xcassets/AppIcon.appiconset/Contents.json b/Resources/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 141fff5d6..000000000 --- a/Resources/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,152 +0,0 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "40.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "60.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "29.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "58.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "87.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "80.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "120.png", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "57x57", - "scale" : "1x" - }, - { - "idiom" : "iphone", - "size" : "57x57", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "120-1.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "180.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "20.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "40-1.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "29-1.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "58-1.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "40-2.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "80-1.png", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "50x50", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "50x50", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "72x72", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "72x72", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "76.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "152.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "167.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "1024.png", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Resources/Images.xcassets/Contents.json b/Resources/Images.xcassets/Contents.json deleted file mode 100644 index da4a164c9..000000000 --- a/Resources/Images.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Resources/Images.xcassets/LaunchImage.launchimage/Contents.json b/Resources/Images.xcassets/LaunchImage.launchimage/Contents.json deleted file mode 100644 index 0e8b0ff04..000000000 --- a/Resources/Images.xcassets/LaunchImage.launchimage/Contents.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "images" : [ - { - "orientation" : "portrait", - "idiom" : "iphone", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "subtype" : "retina4", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "1x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "1x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "extent" : "full-screen", - "scale" : "1x" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "extent" : "full-screen", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "extent" : "full-screen", - "subtype" : "retina4", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "extent" : "to-status-bar", - "scale" : "1x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "extent" : "to-status-bar", - "scale" : "1x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "extent" : "to-status-bar", - "scale" : "2x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "extent" : "to-status-bar", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Resources/ar.lproj/Localizable.strings b/Resources/ar.lproj/Localizable.strings deleted file mode 100644 index a219b0987..000000000 Binary files a/Resources/ar.lproj/Localizable.strings and /dev/null differ diff --git a/Resources/assistant_external_sip.rc b/Resources/assistant_external_sip.rc deleted file mode 100644 index 355634107..000000000 --- a/Resources/assistant_external_sip.rc +++ /dev/null @@ -1,41 +0,0 @@ - - - -
- 0 - 0 - -1 - 3600 - - - - 1 - - - 0 - 0 - 0 - - - 0 -
- - -
- - 1 -
- -
- - -1 - -1 - -1 - -1 - 1 - .* -
-
- -
-
diff --git a/Resources/assistant_linphone_create.rc b/Resources/assistant_linphone_create.rc deleted file mode 100644 index 9673fbaa1..000000000 --- a/Resources/assistant_linphone_create.rc +++ /dev/null @@ -1,49 +0,0 @@ - - - -
- 1 - 0 - 1 - 120 - sip:voip-metrics@sip.linphone.org;transport=tls - 1 - 180 - 31536000 - sip:?@sip.linphone.org - <sip:sip.linphone.org;transport=tls> - 1 - sip.linphone.org - nat_policy_default_values - 1 - 1 - 1 - sip:conference-factory@sip.linphone.org - sip:videoconference-factory@sip.linphone.org - 1 -
- -
- stun.linphone.org - stun,ice -
- -
- sips:rls@sip.linphone.org - 1 -
- -
- sip.linphone.org - SHA-256 - -1 - 1 - -1 - 64 - 1 - ^[a-z0-9+_.\-]*$ -
-
- https://lime.linphone.org/lime-server/lime-server.php -
-
diff --git a/Resources/assistant_linphone_existing.rc b/Resources/assistant_linphone_existing.rc deleted file mode 100644 index ec26c381e..000000000 --- a/Resources/assistant_linphone_existing.rc +++ /dev/null @@ -1,45 +0,0 @@ - - -
- 1 - 0 - 1 - 120 - sip:voip-metrics@sip.linphone.org;transport=tls - 1 - 180 - 31536000 - sip:?@sip.linphone.org - <sip:sip.linphone.org;transport=tls> - 1 - sip.linphone.org - nat_policy_default_values - 1 - 1 - 1 - sip:conference-factory@sip.linphone.org - sip:videoconference-factory@sip.linphone.org - 1 -
-
- stun.linphone.org - stun,ice -
-
- sips:rls@sip.linphone.org - 1 -
-
- sip.linphone.org - 34 - 1 - -1 - 64 - 1 - ^[a-z0-9+_.\-]*$ - https://subscribe.linphone.org:444/wizard.php -
-
- https://lime.linphone.org/lime-server/lime-server.php -
-
diff --git a/Resources/assistant_remote.rc b/Resources/assistant_remote.rc deleted file mode 100644 index ded0bf160..000000000 --- a/Resources/assistant_remote.rc +++ /dev/null @@ -1,31 +0,0 @@ - - - -
- 0 - 0 - 3600 - - - - 1 - - -
- - -
- - 1 -
- -
- - -1 - -1 - -1 - -1 - -1 - .* -
-
diff --git a/Resources/cs.lproj/Localizable.strings b/Resources/cs.lproj/Localizable.strings deleted file mode 100644 index e1d381586..000000000 Binary files a/Resources/cs.lproj/Localizable.strings and /dev/null differ diff --git a/Resources/de.lproj/Localizable.strings b/Resources/de.lproj/Localizable.strings deleted file mode 100644 index 290cfb820..000000000 Binary files a/Resources/de.lproj/Localizable.strings and /dev/null differ diff --git a/Resources/en.lproj/Localizable.strings b/Resources/en.lproj/Localizable.strings deleted file mode 100644 index 93bb71648..000000000 Binary files a/Resources/en.lproj/Localizable.strings and /dev/null differ diff --git a/Resources/es.lproj/Localizable.strings b/Resources/es.lproj/Localizable.strings deleted file mode 100644 index 92c0f1c48..000000000 Binary files a/Resources/es.lproj/Localizable.strings and /dev/null differ diff --git a/Resources/es_AR.lproj/Localizable.strings b/Resources/es_AR.lproj/Localizable.strings deleted file mode 100644 index 294072b7f..000000000 Binary files a/Resources/es_AR.lproj/Localizable.strings and /dev/null differ diff --git a/Resources/fonts/Roboto-Bold.ttf b/Resources/fonts/Roboto-Bold.ttf deleted file mode 100644 index 8d6cf0551..000000000 Binary files a/Resources/fonts/Roboto-Bold.ttf and /dev/null differ diff --git a/Resources/fonts/Roboto-Italic.ttf b/Resources/fonts/Roboto-Italic.ttf deleted file mode 100644 index 737244bc0..000000000 Binary files a/Resources/fonts/Roboto-Italic.ttf and /dev/null differ diff --git a/Resources/fonts/Roboto-Regular.ttf b/Resources/fonts/Roboto-Regular.ttf deleted file mode 100644 index 3a4973c78..000000000 Binary files a/Resources/fonts/Roboto-Regular.ttf and /dev/null differ diff --git a/Resources/fr.lproj/Localizable.strings b/Resources/fr.lproj/Localizable.strings deleted file mode 100644 index 25ff586b0..000000000 Binary files a/Resources/fr.lproj/Localizable.strings and /dev/null differ diff --git a/Resources/hu.lproj/Localizable.strings b/Resources/hu.lproj/Localizable.strings deleted file mode 100644 index 2a857d6d6..000000000 Binary files a/Resources/hu.lproj/Localizable.strings and /dev/null differ diff --git a/Resources/images/add_field_default.png b/Resources/images/add_field_default.png deleted file mode 100644 index 50e4b6f72..000000000 Binary files a/Resources/images/add_field_default.png and /dev/null differ diff --git a/Resources/images/add_field_default@2x.png b/Resources/images/add_field_default@2x.png deleted file mode 100644 index bcfe6dc83..000000000 Binary files a/Resources/images/add_field_default@2x.png and /dev/null differ diff --git a/Resources/images/add_field_over.png b/Resources/images/add_field_over.png deleted file mode 100644 index 8b8656078..000000000 Binary files a/Resources/images/add_field_over.png and /dev/null differ diff --git a/Resources/images/add_field_over@2x.png b/Resources/images/add_field_over@2x.png deleted file mode 100644 index 42283c20d..000000000 Binary files a/Resources/images/add_field_over@2x.png and /dev/null differ diff --git a/Resources/images/avatar.png b/Resources/images/avatar.png deleted file mode 100644 index 6c9409881..000000000 Binary files a/Resources/images/avatar.png and /dev/null differ diff --git a/Resources/images/avatar@2x.png b/Resources/images/avatar@2x.png deleted file mode 100644 index ce4e7ef5d..000000000 Binary files a/Resources/images/avatar@2x.png and /dev/null differ diff --git a/Resources/images/avatar~ipad.png b/Resources/images/avatar~ipad.png deleted file mode 100644 index bd1719fd2..000000000 Binary files a/Resources/images/avatar~ipad.png and /dev/null differ diff --git a/Resources/images/avatar~ipad@2x.png b/Resources/images/avatar~ipad@2x.png deleted file mode 100644 index d105c1e06..000000000 Binary files a/Resources/images/avatar~ipad@2x.png and /dev/null differ diff --git a/Resources/images/back_default.png b/Resources/images/back_default.png deleted file mode 100644 index 8ea5b68d9..000000000 Binary files a/Resources/images/back_default.png and /dev/null differ diff --git a/Resources/images/back_default@2x.png b/Resources/images/back_default@2x.png deleted file mode 100644 index 350249b87..000000000 Binary files a/Resources/images/back_default@2x.png and /dev/null differ diff --git a/Resources/images/back_disabled.png b/Resources/images/back_disabled.png deleted file mode 100644 index b01a65b2f..000000000 Binary files a/Resources/images/back_disabled.png and /dev/null differ diff --git a/Resources/images/back_disabled@2x.png b/Resources/images/back_disabled@2x.png deleted file mode 100644 index 1ab995345..000000000 Binary files a/Resources/images/back_disabled@2x.png and /dev/null differ diff --git a/Resources/images/backspace_default.png b/Resources/images/backspace_default.png deleted file mode 100644 index bb6a070fd..000000000 Binary files a/Resources/images/backspace_default.png and /dev/null differ diff --git a/Resources/images/backspace_default@2x.png b/Resources/images/backspace_default@2x.png deleted file mode 100644 index 363187d5b..000000000 Binary files a/Resources/images/backspace_default@2x.png and /dev/null differ diff --git a/Resources/images/backspace_disabled.png b/Resources/images/backspace_disabled.png deleted file mode 100644 index 09bfd90bd..000000000 Binary files a/Resources/images/backspace_disabled.png and /dev/null differ diff --git a/Resources/images/backspace_disabled@2x.png b/Resources/images/backspace_disabled@2x.png deleted file mode 100644 index 577cba160..000000000 Binary files a/Resources/images/backspace_disabled@2x.png and /dev/null differ diff --git a/Resources/images/backspace_over.png b/Resources/images/backspace_over.png deleted file mode 100644 index 54bd8c461..000000000 Binary files a/Resources/images/backspace_over.png and /dev/null differ diff --git a/Resources/images/backspace_over@2x.png b/Resources/images/backspace_over@2x.png deleted file mode 100644 index 68a1ceebb..000000000 Binary files a/Resources/images/backspace_over@2x.png and /dev/null differ diff --git a/Resources/images/call_add_default.png b/Resources/images/call_add_default.png deleted file mode 100644 index 3d7790f6a..000000000 Binary files a/Resources/images/call_add_default.png and /dev/null differ diff --git a/Resources/images/call_add_default@2x.png b/Resources/images/call_add_default@2x.png deleted file mode 100644 index 91101a564..000000000 Binary files a/Resources/images/call_add_default@2x.png and /dev/null differ diff --git a/Resources/images/call_add_disabled.png b/Resources/images/call_add_disabled.png deleted file mode 100644 index 929174aeb..000000000 Binary files a/Resources/images/call_add_disabled.png and /dev/null differ diff --git a/Resources/images/call_add_disabled@2x.png b/Resources/images/call_add_disabled@2x.png deleted file mode 100644 index d37f931c5..000000000 Binary files a/Resources/images/call_add_disabled@2x.png and /dev/null differ diff --git a/Resources/images/call_alt_back_default.png b/Resources/images/call_alt_back_default.png deleted file mode 100644 index 2c31d1ca9..000000000 Binary files a/Resources/images/call_alt_back_default.png and /dev/null differ diff --git a/Resources/images/call_alt_back_default@2x.png b/Resources/images/call_alt_back_default@2x.png deleted file mode 100644 index fd2318c9c..000000000 Binary files a/Resources/images/call_alt_back_default@2x.png and /dev/null differ diff --git a/Resources/images/call_alt_back_disabled.png b/Resources/images/call_alt_back_disabled.png deleted file mode 100644 index 3ae7e6e0b..000000000 Binary files a/Resources/images/call_alt_back_disabled.png and /dev/null differ diff --git a/Resources/images/call_alt_back_disabled@2x.png b/Resources/images/call_alt_back_disabled@2x.png deleted file mode 100644 index ba6a10b2f..000000000 Binary files a/Resources/images/call_alt_back_disabled@2x.png and /dev/null differ diff --git a/Resources/images/call_alt_start_default.png b/Resources/images/call_alt_start_default.png deleted file mode 100644 index bf5a7a79e..000000000 Binary files a/Resources/images/call_alt_start_default.png and /dev/null differ diff --git a/Resources/images/call_alt_start_default@2x.png b/Resources/images/call_alt_start_default@2x.png deleted file mode 100644 index c6c11e33e..000000000 Binary files a/Resources/images/call_alt_start_default@2x.png and /dev/null differ diff --git a/Resources/images/call_alt_start_disabled.png b/Resources/images/call_alt_start_disabled.png deleted file mode 100644 index 82276498d..000000000 Binary files a/Resources/images/call_alt_start_disabled.png and /dev/null differ diff --git a/Resources/images/call_alt_start_disabled@2x.png b/Resources/images/call_alt_start_disabled@2x.png deleted file mode 100644 index dc47a8365..000000000 Binary files a/Resources/images/call_alt_start_disabled@2x.png and /dev/null differ diff --git a/Resources/images/call_audio_start_default.png b/Resources/images/call_audio_start_default.png deleted file mode 100644 index b0e330a1f..000000000 Binary files a/Resources/images/call_audio_start_default.png and /dev/null differ diff --git a/Resources/images/call_audio_start_default@2x.png b/Resources/images/call_audio_start_default@2x.png deleted file mode 100644 index c0480602b..000000000 Binary files a/Resources/images/call_audio_start_default@2x.png and /dev/null differ diff --git a/Resources/images/call_audio_start_disabled.png b/Resources/images/call_audio_start_disabled.png deleted file mode 100644 index 766061c6e..000000000 Binary files a/Resources/images/call_audio_start_disabled.png and /dev/null differ diff --git a/Resources/images/call_audio_start_disabled@2x.png b/Resources/images/call_audio_start_disabled@2x.png deleted file mode 100644 index 6745d669e..000000000 Binary files a/Resources/images/call_audio_start_disabled@2x.png and /dev/null differ diff --git a/Resources/images/call_back_default.png b/Resources/images/call_back_default.png deleted file mode 100644 index 3dcf50187..000000000 Binary files a/Resources/images/call_back_default.png and /dev/null differ diff --git a/Resources/images/call_back_default@2x.png b/Resources/images/call_back_default@2x.png deleted file mode 100644 index 981317c63..000000000 Binary files a/Resources/images/call_back_default@2x.png and /dev/null differ diff --git a/Resources/images/call_back_disabled.png b/Resources/images/call_back_disabled.png deleted file mode 100644 index bebdde29f..000000000 Binary files a/Resources/images/call_back_disabled.png and /dev/null differ diff --git a/Resources/images/call_back_disabled@2x.png b/Resources/images/call_back_disabled@2x.png deleted file mode 100644 index 1b3928606..000000000 Binary files a/Resources/images/call_back_disabled@2x.png and /dev/null differ diff --git a/Resources/images/call_hangup_default.png b/Resources/images/call_hangup_default.png deleted file mode 100644 index 742a740fe..000000000 Binary files a/Resources/images/call_hangup_default.png and /dev/null differ diff --git a/Resources/images/call_hangup_default@2x.png b/Resources/images/call_hangup_default@2x.png deleted file mode 100644 index c599618c2..000000000 Binary files a/Resources/images/call_hangup_default@2x.png and /dev/null differ diff --git a/Resources/images/call_hangup_disabled.png b/Resources/images/call_hangup_disabled.png deleted file mode 100644 index 5a8d6b7ea..000000000 Binary files a/Resources/images/call_hangup_disabled.png and /dev/null differ diff --git a/Resources/images/call_hangup_disabled@2x.png b/Resources/images/call_hangup_disabled@2x.png deleted file mode 100644 index b9bf1224b..000000000 Binary files a/Resources/images/call_hangup_disabled@2x.png and /dev/null differ diff --git a/Resources/images/call_incoming.png b/Resources/images/call_incoming.png deleted file mode 100644 index c5d01c2b1..000000000 Binary files a/Resources/images/call_incoming.png and /dev/null differ diff --git a/Resources/images/call_incoming@2x.png b/Resources/images/call_incoming@2x.png deleted file mode 100644 index 4cb6dfd87..000000000 Binary files a/Resources/images/call_incoming@2x.png and /dev/null differ diff --git a/Resources/images/call_missed.png b/Resources/images/call_missed.png deleted file mode 100644 index c3306f173..000000000 Binary files a/Resources/images/call_missed.png and /dev/null differ diff --git a/Resources/images/call_missed@2x.png b/Resources/images/call_missed@2x.png deleted file mode 100644 index 5faeae4b4..000000000 Binary files a/Resources/images/call_missed@2x.png and /dev/null differ diff --git a/Resources/images/call_outgoing.png b/Resources/images/call_outgoing.png deleted file mode 100644 index 3853b174a..000000000 Binary files a/Resources/images/call_outgoing.png and /dev/null differ diff --git a/Resources/images/call_outgoing@2x.png b/Resources/images/call_outgoing@2x.png deleted file mode 100644 index d734e7975..000000000 Binary files a/Resources/images/call_outgoing@2x.png and /dev/null differ diff --git a/Resources/images/call_quality_indicator_0.png b/Resources/images/call_quality_indicator_0.png deleted file mode 100644 index 8de54e2dd..000000000 Binary files a/Resources/images/call_quality_indicator_0.png and /dev/null differ diff --git a/Resources/images/call_quality_indicator_0@2x.png b/Resources/images/call_quality_indicator_0@2x.png deleted file mode 100644 index 5e21e5099..000000000 Binary files a/Resources/images/call_quality_indicator_0@2x.png and /dev/null differ diff --git a/Resources/images/call_quality_indicator_1.png b/Resources/images/call_quality_indicator_1.png deleted file mode 100644 index 882df7128..000000000 Binary files a/Resources/images/call_quality_indicator_1.png and /dev/null differ diff --git a/Resources/images/call_quality_indicator_1@2x.png b/Resources/images/call_quality_indicator_1@2x.png deleted file mode 100644 index 779ead493..000000000 Binary files a/Resources/images/call_quality_indicator_1@2x.png and /dev/null differ diff --git a/Resources/images/call_quality_indicator_2.png b/Resources/images/call_quality_indicator_2.png deleted file mode 100644 index b9bc73cfd..000000000 Binary files a/Resources/images/call_quality_indicator_2.png and /dev/null differ diff --git a/Resources/images/call_quality_indicator_2@2x.png b/Resources/images/call_quality_indicator_2@2x.png deleted file mode 100644 index 782e0fa1a..000000000 Binary files a/Resources/images/call_quality_indicator_2@2x.png and /dev/null differ diff --git a/Resources/images/call_quality_indicator_3.png b/Resources/images/call_quality_indicator_3.png deleted file mode 100644 index 2c9e0dc62..000000000 Binary files a/Resources/images/call_quality_indicator_3.png and /dev/null differ diff --git a/Resources/images/call_quality_indicator_3@2x.png b/Resources/images/call_quality_indicator_3@2x.png deleted file mode 100644 index f7c5728c6..000000000 Binary files a/Resources/images/call_quality_indicator_3@2x.png and /dev/null differ diff --git a/Resources/images/call_quality_indicator_4.png b/Resources/images/call_quality_indicator_4.png deleted file mode 100644 index 8de54e2dd..000000000 Binary files a/Resources/images/call_quality_indicator_4.png and /dev/null differ diff --git a/Resources/images/call_quality_indicator_4@2x.png b/Resources/images/call_quality_indicator_4@2x.png deleted file mode 100644 index 5e21e5099..000000000 Binary files a/Resources/images/call_quality_indicator_4@2x.png and /dev/null differ diff --git a/Resources/images/call_start_body_default.png b/Resources/images/call_start_body_default.png deleted file mode 100644 index afa4aefb3..000000000 Binary files a/Resources/images/call_start_body_default.png and /dev/null differ diff --git a/Resources/images/call_start_body_default@2x.png b/Resources/images/call_start_body_default@2x.png deleted file mode 100644 index c9a2e742f..000000000 Binary files a/Resources/images/call_start_body_default@2x.png and /dev/null differ diff --git a/Resources/images/call_start_body_default~ipad.png b/Resources/images/call_start_body_default~ipad.png deleted file mode 100644 index 74af60f86..000000000 Binary files a/Resources/images/call_start_body_default~ipad.png and /dev/null differ diff --git a/Resources/images/call_start_body_default~ipad@2x.png b/Resources/images/call_start_body_default~ipad@2x.png deleted file mode 100644 index b631a22e1..000000000 Binary files a/Resources/images/call_start_body_default~ipad@2x.png and /dev/null differ diff --git a/Resources/images/call_start_body_disabled.png b/Resources/images/call_start_body_disabled.png deleted file mode 100644 index a86f8b119..000000000 Binary files a/Resources/images/call_start_body_disabled.png and /dev/null differ diff --git a/Resources/images/call_start_body_disabled@2x.png b/Resources/images/call_start_body_disabled@2x.png deleted file mode 100644 index 4c3cfe693..000000000 Binary files a/Resources/images/call_start_body_disabled@2x.png and /dev/null differ diff --git a/Resources/images/call_start_body_disabled~ipad.png b/Resources/images/call_start_body_disabled~ipad.png deleted file mode 100644 index 3fa179706..000000000 Binary files a/Resources/images/call_start_body_disabled~ipad.png and /dev/null differ diff --git a/Resources/images/call_start_body_disabled~ipad@2x.png b/Resources/images/call_start_body_disabled~ipad@2x.png deleted file mode 100644 index 6dd8dc7a3..000000000 Binary files a/Resources/images/call_start_body_disabled~ipad@2x.png and /dev/null differ diff --git a/Resources/images/call_start_body_over.png b/Resources/images/call_start_body_over.png deleted file mode 100644 index 4d8ce6d0e..000000000 Binary files a/Resources/images/call_start_body_over.png and /dev/null differ diff --git a/Resources/images/call_start_body_over@2x.png b/Resources/images/call_start_body_over@2x.png deleted file mode 100644 index 3b640bab2..000000000 Binary files a/Resources/images/call_start_body_over@2x.png and /dev/null differ diff --git a/Resources/images/call_start_body_over~ipad.png b/Resources/images/call_start_body_over~ipad.png deleted file mode 100644 index b36106a3d..000000000 Binary files a/Resources/images/call_start_body_over~ipad.png and /dev/null differ diff --git a/Resources/images/call_start_body_over~ipad@2x.png b/Resources/images/call_start_body_over~ipad@2x.png deleted file mode 100644 index ad01088c9..000000000 Binary files a/Resources/images/call_start_body_over~ipad@2x.png and /dev/null differ diff --git a/Resources/images/call_status_incoming.png b/Resources/images/call_status_incoming.png deleted file mode 100644 index 8db060a68..000000000 Binary files a/Resources/images/call_status_incoming.png and /dev/null differ diff --git a/Resources/images/call_status_incoming@2x.png b/Resources/images/call_status_incoming@2x.png deleted file mode 100644 index 6cb67ba30..000000000 Binary files a/Resources/images/call_status_incoming@2x.png and /dev/null differ diff --git a/Resources/images/call_status_incoming~ipad.png b/Resources/images/call_status_incoming~ipad.png deleted file mode 100644 index 304fa306c..000000000 Binary files a/Resources/images/call_status_incoming~ipad.png and /dev/null differ diff --git a/Resources/images/call_status_incoming~ipad@2x.png b/Resources/images/call_status_incoming~ipad@2x.png deleted file mode 100644 index 660bc909f..000000000 Binary files a/Resources/images/call_status_incoming~ipad@2x.png and /dev/null differ diff --git a/Resources/images/call_status_missed.png b/Resources/images/call_status_missed.png deleted file mode 100644 index 2ad8b36fa..000000000 Binary files a/Resources/images/call_status_missed.png and /dev/null differ diff --git a/Resources/images/call_status_missed@2x.png b/Resources/images/call_status_missed@2x.png deleted file mode 100644 index 12c2123f9..000000000 Binary files a/Resources/images/call_status_missed@2x.png and /dev/null differ diff --git a/Resources/images/call_status_missed~ipad.png b/Resources/images/call_status_missed~ipad.png deleted file mode 100644 index 3dae10262..000000000 Binary files a/Resources/images/call_status_missed~ipad.png and /dev/null differ diff --git a/Resources/images/call_status_missed~ipad@2x.png b/Resources/images/call_status_missed~ipad@2x.png deleted file mode 100644 index 56f2f801d..000000000 Binary files a/Resources/images/call_status_missed~ipad@2x.png and /dev/null differ diff --git a/Resources/images/call_status_outgoing.png b/Resources/images/call_status_outgoing.png deleted file mode 100644 index fd9e19a95..000000000 Binary files a/Resources/images/call_status_outgoing.png and /dev/null differ diff --git a/Resources/images/call_status_outgoing@2x.png b/Resources/images/call_status_outgoing@2x.png deleted file mode 100644 index 337875f72..000000000 Binary files a/Resources/images/call_status_outgoing@2x.png and /dev/null differ diff --git a/Resources/images/call_status_outgoing~ipad.png b/Resources/images/call_status_outgoing~ipad.png deleted file mode 100644 index 2a3c931a0..000000000 Binary files a/Resources/images/call_status_outgoing~ipad.png and /dev/null differ diff --git a/Resources/images/call_status_outgoing~ipad@2x.png b/Resources/images/call_status_outgoing~ipad@2x.png deleted file mode 100644 index 54bdb2e12..000000000 Binary files a/Resources/images/call_status_outgoing~ipad@2x.png and /dev/null differ diff --git a/Resources/images/call_transfer_default.png b/Resources/images/call_transfer_default.png deleted file mode 100644 index 79aaad67a..000000000 Binary files a/Resources/images/call_transfer_default.png and /dev/null differ diff --git a/Resources/images/call_transfer_default@2x.png b/Resources/images/call_transfer_default@2x.png deleted file mode 100644 index 43c47e864..000000000 Binary files a/Resources/images/call_transfer_default@2x.png and /dev/null differ diff --git a/Resources/images/call_transfer_disabled.png b/Resources/images/call_transfer_disabled.png deleted file mode 100644 index fbf51e1bb..000000000 Binary files a/Resources/images/call_transfer_disabled.png and /dev/null differ diff --git a/Resources/images/call_transfer_disabled@2x.png b/Resources/images/call_transfer_disabled@2x.png deleted file mode 100644 index 562ca6a85..000000000 Binary files a/Resources/images/call_transfer_disabled@2x.png and /dev/null differ diff --git a/Resources/images/call_video_start_default.png b/Resources/images/call_video_start_default.png deleted file mode 100644 index 00b9d1862..000000000 Binary files a/Resources/images/call_video_start_default.png and /dev/null differ diff --git a/Resources/images/call_video_start_default@2x.png b/Resources/images/call_video_start_default@2x.png deleted file mode 100644 index efa229d6b..000000000 Binary files a/Resources/images/call_video_start_default@2x.png and /dev/null differ diff --git a/Resources/images/call_video_start_disabled.png b/Resources/images/call_video_start_disabled.png deleted file mode 100644 index cb0f07972..000000000 Binary files a/Resources/images/call_video_start_disabled.png and /dev/null differ diff --git a/Resources/images/call_video_start_disabled@2x.png b/Resources/images/call_video_start_disabled@2x.png deleted file mode 100644 index 53b4040b8..000000000 Binary files a/Resources/images/call_video_start_disabled@2x.png and /dev/null differ diff --git a/Resources/images/callkit_logo.png b/Resources/images/callkit_logo.png deleted file mode 100644 index 9aa295af2..000000000 Binary files a/Resources/images/callkit_logo.png and /dev/null differ diff --git a/Resources/images/callkit_logo@2x.png b/Resources/images/callkit_logo@2x.png deleted file mode 100644 index a6c6549be..000000000 Binary files a/Resources/images/callkit_logo@2x.png and /dev/null differ diff --git a/Resources/images/camera_default.png b/Resources/images/camera_default.png deleted file mode 100644 index 322d818f8..000000000 Binary files a/Resources/images/camera_default.png and /dev/null differ diff --git a/Resources/images/camera_default@2x.png b/Resources/images/camera_default@2x.png deleted file mode 100644 index a4190c8ad..000000000 Binary files a/Resources/images/camera_default@2x.png and /dev/null differ diff --git a/Resources/images/camera_disabled.png b/Resources/images/camera_disabled.png deleted file mode 100644 index ee66d14b5..000000000 Binary files a/Resources/images/camera_disabled.png and /dev/null differ diff --git a/Resources/images/camera_disabled@2x.png b/Resources/images/camera_disabled@2x.png deleted file mode 100644 index 3f48071b7..000000000 Binary files a/Resources/images/camera_disabled@2x.png and /dev/null differ diff --git a/Resources/images/camera_selected.png b/Resources/images/camera_selected.png deleted file mode 100644 index 7620a6db8..000000000 Binary files a/Resources/images/camera_selected.png and /dev/null differ diff --git a/Resources/images/camera_selected@2x.png b/Resources/images/camera_selected@2x.png deleted file mode 100644 index 610ad8634..000000000 Binary files a/Resources/images/camera_selected@2x.png and /dev/null differ diff --git a/Resources/images/camera_switch_default.png b/Resources/images/camera_switch_default.png deleted file mode 100644 index 488800dc2..000000000 Binary files a/Resources/images/camera_switch_default.png and /dev/null differ diff --git a/Resources/images/camera_switch_default@2x.png b/Resources/images/camera_switch_default@2x.png deleted file mode 100644 index 93a44bc18..000000000 Binary files a/Resources/images/camera_switch_default@2x.png and /dev/null differ diff --git a/Resources/images/camera_switch_disabled.png b/Resources/images/camera_switch_disabled.png deleted file mode 100644 index c1f11c235..000000000 Binary files a/Resources/images/camera_switch_disabled.png and /dev/null differ diff --git a/Resources/images/camera_switch_disabled@2x.png b/Resources/images/camera_switch_disabled@2x.png deleted file mode 100644 index a0029e1b5..000000000 Binary files a/Resources/images/camera_switch_disabled@2x.png and /dev/null differ diff --git a/Resources/images/camera_switch_over.png b/Resources/images/camera_switch_over.png deleted file mode 100644 index 63174b4cb..000000000 Binary files a/Resources/images/camera_switch_over.png and /dev/null differ diff --git a/Resources/images/camera_switch_over@2x.png b/Resources/images/camera_switch_over@2x.png deleted file mode 100644 index ad3dbae3f..000000000 Binary files a/Resources/images/camera_switch_over@2x.png and /dev/null differ diff --git a/Resources/images/cancel_edit_default.png b/Resources/images/cancel_edit_default.png deleted file mode 100644 index 5f38f51ba..000000000 Binary files a/Resources/images/cancel_edit_default.png and /dev/null differ diff --git a/Resources/images/cancel_edit_default@2x.png b/Resources/images/cancel_edit_default@2x.png deleted file mode 100644 index b937b0338..000000000 Binary files a/Resources/images/cancel_edit_default@2x.png and /dev/null differ diff --git a/Resources/images/cancel_edit_disabled.png b/Resources/images/cancel_edit_disabled.png deleted file mode 100644 index 6a64e5200..000000000 Binary files a/Resources/images/cancel_edit_disabled.png and /dev/null differ diff --git a/Resources/images/cancel_edit_disabled@2x.png b/Resources/images/cancel_edit_disabled@2x.png deleted file mode 100644 index 21782e3aa..000000000 Binary files a/Resources/images/cancel_edit_disabled@2x.png and /dev/null differ diff --git a/Resources/images/cancel_forward.png b/Resources/images/cancel_forward.png deleted file mode 100644 index 8043430fe..000000000 Binary files a/Resources/images/cancel_forward.png and /dev/null differ diff --git a/Resources/images/chat_add_default.png b/Resources/images/chat_add_default.png deleted file mode 100644 index e481b4337..000000000 Binary files a/Resources/images/chat_add_default.png and /dev/null differ diff --git a/Resources/images/chat_add_default@2x.png b/Resources/images/chat_add_default@2x.png deleted file mode 100644 index 9c60be92d..000000000 Binary files a/Resources/images/chat_add_default@2x.png and /dev/null differ diff --git a/Resources/images/chat_add_disabled.png b/Resources/images/chat_add_disabled.png deleted file mode 100644 index 20e95fad2..000000000 Binary files a/Resources/images/chat_add_disabled.png and /dev/null differ diff --git a/Resources/images/chat_add_disabled@2x.png b/Resources/images/chat_add_disabled@2x.png deleted file mode 100644 index 7a275aa3d..000000000 Binary files a/Resources/images/chat_add_disabled@2x.png and /dev/null differ diff --git a/Resources/images/chat_add_group.png b/Resources/images/chat_add_group.png deleted file mode 100644 index 721a3d7e5..000000000 Binary files a/Resources/images/chat_add_group.png and /dev/null differ diff --git a/Resources/images/chat_add_group@2x.png b/Resources/images/chat_add_group@2x.png deleted file mode 100644 index 9d2013833..000000000 Binary files a/Resources/images/chat_add_group@2x.png and /dev/null differ diff --git a/Resources/images/chat_attachment_default.png b/Resources/images/chat_attachment_default.png deleted file mode 100644 index d7d0ff0c1..000000000 Binary files a/Resources/images/chat_attachment_default.png and /dev/null differ diff --git a/Resources/images/chat_attachment_default@2x.png b/Resources/images/chat_attachment_default@2x.png deleted file mode 100644 index 8d70ff810..000000000 Binary files a/Resources/images/chat_attachment_default@2x.png and /dev/null differ diff --git a/Resources/images/chat_attachment_disabled.png b/Resources/images/chat_attachment_disabled.png deleted file mode 100644 index c6ad25af2..000000000 Binary files a/Resources/images/chat_attachment_disabled.png and /dev/null differ diff --git a/Resources/images/chat_attachment_disabled@2x.png b/Resources/images/chat_attachment_disabled@2x.png deleted file mode 100644 index eafbe0956..000000000 Binary files a/Resources/images/chat_attachment_disabled@2x.png and /dev/null differ diff --git a/Resources/images/chat_attachment_over.png b/Resources/images/chat_attachment_over.png deleted file mode 100644 index 2a83012f6..000000000 Binary files a/Resources/images/chat_attachment_over.png and /dev/null differ diff --git a/Resources/images/chat_attachment_over@2x.png b/Resources/images/chat_attachment_over@2x.png deleted file mode 100644 index 696b24f06..000000000 Binary files a/Resources/images/chat_attachment_over@2x.png and /dev/null differ diff --git a/Resources/images/chat_delivered.png b/Resources/images/chat_delivered.png deleted file mode 100644 index 356b8ecd1..000000000 Binary files a/Resources/images/chat_delivered.png and /dev/null differ diff --git a/Resources/images/chat_error.png b/Resources/images/chat_error.png deleted file mode 100644 index b7789c9a0..000000000 Binary files a/Resources/images/chat_error.png and /dev/null differ diff --git a/Resources/images/chat_group_add.png b/Resources/images/chat_group_add.png deleted file mode 100644 index 54a8954b9..000000000 Binary files a/Resources/images/chat_group_add.png and /dev/null differ diff --git a/Resources/images/chat_group_add@2x.png b/Resources/images/chat_group_add@2x.png deleted file mode 100644 index 7a3522e19..000000000 Binary files a/Resources/images/chat_group_add@2x.png and /dev/null differ diff --git a/Resources/images/chat_group_avatar.png b/Resources/images/chat_group_avatar.png deleted file mode 100644 index db9230dbb..000000000 Binary files a/Resources/images/chat_group_avatar.png and /dev/null differ diff --git a/Resources/images/chat_group_avatar@2x.png b/Resources/images/chat_group_avatar@2x.png deleted file mode 100644 index fa4a55bb2..000000000 Binary files a/Resources/images/chat_group_avatar@2x.png and /dev/null differ diff --git a/Resources/images/chat_group_informations.png b/Resources/images/chat_group_informations.png deleted file mode 100644 index 2d722f77d..000000000 Binary files a/Resources/images/chat_group_informations.png and /dev/null differ diff --git a/Resources/images/chat_group_informations@2x.png b/Resources/images/chat_group_informations@2x.png deleted file mode 100644 index 9dd0cd040..000000000 Binary files a/Resources/images/chat_group_informations@2x.png and /dev/null differ diff --git a/Resources/images/chat_list_indicator.png b/Resources/images/chat_list_indicator.png deleted file mode 100644 index 3e51b8857..000000000 Binary files a/Resources/images/chat_list_indicator.png and /dev/null differ diff --git a/Resources/images/chat_list_indicator@2x.png b/Resources/images/chat_list_indicator@2x.png deleted file mode 100644 index 3e51b8857..000000000 Binary files a/Resources/images/chat_list_indicator@2x.png and /dev/null differ diff --git a/Resources/images/chat_list_indicator~ipad.png b/Resources/images/chat_list_indicator~ipad.png deleted file mode 100644 index 11bb642ce..000000000 Binary files a/Resources/images/chat_list_indicator~ipad.png and /dev/null differ diff --git a/Resources/images/chat_list_indicator~ipad@2x.png b/Resources/images/chat_list_indicator~ipad@2x.png deleted file mode 100644 index 3e51b8857..000000000 Binary files a/Resources/images/chat_list_indicator~ipad@2x.png and /dev/null differ diff --git a/Resources/images/chat_message_not_delivered.png b/Resources/images/chat_message_not_delivered.png deleted file mode 100644 index 02becbccb..000000000 Binary files a/Resources/images/chat_message_not_delivered.png and /dev/null differ diff --git a/Resources/images/chat_message_not_delivered@2x.png b/Resources/images/chat_message_not_delivered@2x.png deleted file mode 100644 index 85e4c6c14..000000000 Binary files a/Resources/images/chat_message_not_delivered@2x.png and /dev/null differ diff --git a/Resources/images/chat_read.png b/Resources/images/chat_read.png deleted file mode 100644 index 8f8f467c1..000000000 Binary files a/Resources/images/chat_read.png and /dev/null differ diff --git a/Resources/images/chat_secure.png b/Resources/images/chat_secure.png deleted file mode 100644 index cc4b93786..000000000 Binary files a/Resources/images/chat_secure.png and /dev/null differ diff --git a/Resources/images/chat_send_default.png b/Resources/images/chat_send_default.png deleted file mode 100644 index 07f3b7b3a..000000000 Binary files a/Resources/images/chat_send_default.png and /dev/null differ diff --git a/Resources/images/chat_send_default@2x.png b/Resources/images/chat_send_default@2x.png deleted file mode 100644 index a5d659beb..000000000 Binary files a/Resources/images/chat_send_default@2x.png and /dev/null differ diff --git a/Resources/images/chat_send_disabled.png b/Resources/images/chat_send_disabled.png deleted file mode 100644 index 9efc5564f..000000000 Binary files a/Resources/images/chat_send_disabled.png and /dev/null differ diff --git a/Resources/images/chat_send_disabled@2x.png b/Resources/images/chat_send_disabled@2x.png deleted file mode 100644 index 20ec4fda5..000000000 Binary files a/Resources/images/chat_send_disabled@2x.png and /dev/null differ diff --git a/Resources/images/chat_send_over.png b/Resources/images/chat_send_over.png deleted file mode 100644 index af9e1b85f..000000000 Binary files a/Resources/images/chat_send_over.png and /dev/null differ diff --git a/Resources/images/chat_send_over@2x.png b/Resources/images/chat_send_over@2x.png deleted file mode 100644 index 67b35d842..000000000 Binary files a/Resources/images/chat_send_over@2x.png and /dev/null differ diff --git a/Resources/images/chat_start_body_default.png b/Resources/images/chat_start_body_default.png deleted file mode 100644 index 522010fb3..000000000 Binary files a/Resources/images/chat_start_body_default.png and /dev/null differ diff --git a/Resources/images/chat_start_body_default@2x.png b/Resources/images/chat_start_body_default@2x.png deleted file mode 100644 index 36e772805..000000000 Binary files a/Resources/images/chat_start_body_default@2x.png and /dev/null differ diff --git a/Resources/images/chat_start_body_default~ipad.png b/Resources/images/chat_start_body_default~ipad.png deleted file mode 100644 index 7851a7063..000000000 Binary files a/Resources/images/chat_start_body_default~ipad.png and /dev/null differ diff --git a/Resources/images/chat_start_body_default~ipad@2x.png b/Resources/images/chat_start_body_default~ipad@2x.png deleted file mode 100644 index 5fd30d5e6..000000000 Binary files a/Resources/images/chat_start_body_default~ipad@2x.png and /dev/null differ diff --git a/Resources/images/chat_start_body_disabled.png b/Resources/images/chat_start_body_disabled.png deleted file mode 100644 index 09c186379..000000000 Binary files a/Resources/images/chat_start_body_disabled.png and /dev/null differ diff --git a/Resources/images/chat_start_body_disabled@2x.png b/Resources/images/chat_start_body_disabled@2x.png deleted file mode 100644 index 26d669bbe..000000000 Binary files a/Resources/images/chat_start_body_disabled@2x.png and /dev/null differ diff --git a/Resources/images/chat_start_body_disabled~ipad.png b/Resources/images/chat_start_body_disabled~ipad.png deleted file mode 100644 index 5c0e9dd6b..000000000 Binary files a/Resources/images/chat_start_body_disabled~ipad.png and /dev/null differ diff --git a/Resources/images/chat_start_body_disabled~ipad@2x.png b/Resources/images/chat_start_body_disabled~ipad@2x.png deleted file mode 100644 index 0e0be4896..000000000 Binary files a/Resources/images/chat_start_body_disabled~ipad@2x.png and /dev/null differ diff --git a/Resources/images/chat_start_body_over.png b/Resources/images/chat_start_body_over.png deleted file mode 100644 index c66066d5f..000000000 Binary files a/Resources/images/chat_start_body_over.png and /dev/null differ diff --git a/Resources/images/chat_start_body_over@2x.png b/Resources/images/chat_start_body_over@2x.png deleted file mode 100644 index f1d48d10d..000000000 Binary files a/Resources/images/chat_start_body_over@2x.png and /dev/null differ diff --git a/Resources/images/chat_start_body_over~ipad.png b/Resources/images/chat_start_body_over~ipad.png deleted file mode 100644 index 561922878..000000000 Binary files a/Resources/images/chat_start_body_over~ipad.png and /dev/null differ diff --git a/Resources/images/chat_start_body_over~ipad@2x.png b/Resources/images/chat_start_body_over~ipad@2x.png deleted file mode 100644 index eaa3e3fff..000000000 Binary files a/Resources/images/chat_start_body_over~ipad@2x.png and /dev/null differ diff --git a/Resources/images/chat_unsecure.png b/Resources/images/chat_unsecure.png deleted file mode 100644 index 7c80434d8..000000000 Binary files a/Resources/images/chat_unsecure.png and /dev/null differ diff --git a/Resources/images/check_selected.png b/Resources/images/check_selected.png deleted file mode 100644 index 07298e894..000000000 Binary files a/Resources/images/check_selected.png and /dev/null differ diff --git a/Resources/images/check_selected@2x.png b/Resources/images/check_selected@2x.png deleted file mode 100644 index 8f7e9bf89..000000000 Binary files a/Resources/images/check_selected@2x.png and /dev/null differ diff --git a/Resources/images/check_unselected.png b/Resources/images/check_unselected.png deleted file mode 100644 index 3e8704632..000000000 Binary files a/Resources/images/check_unselected.png and /dev/null differ diff --git a/Resources/images/check_unselected@2x.png b/Resources/images/check_unselected@2x.png deleted file mode 100644 index da20b4dca..000000000 Binary files a/Resources/images/check_unselected@2x.png and /dev/null differ diff --git a/Resources/images/checkbox_checked.png b/Resources/images/checkbox_checked.png deleted file mode 100644 index 42716f5bd..000000000 Binary files a/Resources/images/checkbox_checked.png and /dev/null differ diff --git a/Resources/images/checkbox_checked@2x.png b/Resources/images/checkbox_checked@2x.png deleted file mode 100644 index 1e13a875a..000000000 Binary files a/Resources/images/checkbox_checked@2x.png and /dev/null differ diff --git a/Resources/images/checkbox_unchecked.png b/Resources/images/checkbox_unchecked.png deleted file mode 100644 index 8615429a7..000000000 Binary files a/Resources/images/checkbox_unchecked.png and /dev/null differ diff --git a/Resources/images/checkbox_unchecked@2x.png b/Resources/images/checkbox_unchecked@2x.png deleted file mode 100644 index 3248e8122..000000000 Binary files a/Resources/images/checkbox_unchecked@2x.png and /dev/null differ diff --git a/Resources/images/chevron_list_close.png b/Resources/images/chevron_list_close.png deleted file mode 100644 index a82d1d38b..000000000 Binary files a/Resources/images/chevron_list_close.png and /dev/null differ diff --git a/Resources/images/chevron_list_close@2x.png b/Resources/images/chevron_list_close@2x.png deleted file mode 100644 index 893c9c77b..000000000 Binary files a/Resources/images/chevron_list_close@2x.png and /dev/null differ diff --git a/Resources/images/chevron_list_open.png b/Resources/images/chevron_list_open.png deleted file mode 100644 index f1ec597cf..000000000 Binary files a/Resources/images/chevron_list_open.png and /dev/null differ diff --git a/Resources/images/chevron_list_open@2x.png b/Resources/images/chevron_list_open@2x.png deleted file mode 100644 index a5b95a924..000000000 Binary files a/Resources/images/chevron_list_open@2x.png and /dev/null differ diff --git a/Resources/images/color_A.png b/Resources/images/color_A.png deleted file mode 100644 index 649910430..000000000 Binary files a/Resources/images/color_A.png and /dev/null differ diff --git a/Resources/images/color_C.png b/Resources/images/color_C.png deleted file mode 100644 index acb5708cf..000000000 Binary files a/Resources/images/color_C.png and /dev/null differ diff --git a/Resources/images/color_D.png b/Resources/images/color_D.png deleted file mode 100644 index 589c5b981..000000000 Binary files a/Resources/images/color_D.png and /dev/null differ diff --git a/Resources/images/color_E.png b/Resources/images/color_E.png deleted file mode 100644 index 34ad7df2c..000000000 Binary files a/Resources/images/color_E.png and /dev/null differ diff --git a/Resources/images/color_F.png b/Resources/images/color_F.png deleted file mode 100644 index 76db80c3b..000000000 Binary files a/Resources/images/color_F.png and /dev/null differ diff --git a/Resources/images/color_G.png b/Resources/images/color_G.png deleted file mode 100644 index 2c608140c..000000000 Binary files a/Resources/images/color_G.png and /dev/null differ diff --git a/Resources/images/color_H.png b/Resources/images/color_H.png deleted file mode 100644 index 60f3a7459..000000000 Binary files a/Resources/images/color_H.png and /dev/null differ diff --git a/Resources/images/color_I.png b/Resources/images/color_I.png deleted file mode 100644 index 1859a8bdb..000000000 Binary files a/Resources/images/color_I.png and /dev/null differ diff --git a/Resources/images/color_L.png b/Resources/images/color_L.png deleted file mode 100644 index e0f593c7b..000000000 Binary files a/Resources/images/color_L.png and /dev/null differ diff --git a/Resources/images/color_M.png b/Resources/images/color_M.png deleted file mode 100644 index 709a8e917..000000000 Binary files a/Resources/images/color_M.png and /dev/null differ diff --git a/Resources/images/conference_delete.png b/Resources/images/conference_delete.png deleted file mode 100644 index c3306f173..000000000 Binary files a/Resources/images/conference_delete.png and /dev/null differ diff --git a/Resources/images/conference_delete@2x.png b/Resources/images/conference_delete@2x.png deleted file mode 100644 index 5faeae4b4..000000000 Binary files a/Resources/images/conference_delete@2x.png and /dev/null differ diff --git a/Resources/images/conference_exit_default.png b/Resources/images/conference_exit_default.png deleted file mode 100644 index 825a7c479..000000000 Binary files a/Resources/images/conference_exit_default.png and /dev/null differ diff --git a/Resources/images/conference_exit_default@2x.png b/Resources/images/conference_exit_default@2x.png deleted file mode 100644 index cb199863d..000000000 Binary files a/Resources/images/conference_exit_default@2x.png and /dev/null differ diff --git a/Resources/images/conference_exit_over.png b/Resources/images/conference_exit_over.png deleted file mode 100644 index 356a67e6d..000000000 Binary files a/Resources/images/conference_exit_over.png and /dev/null differ diff --git a/Resources/images/conference_exit_over@2x.png b/Resources/images/conference_exit_over@2x.png deleted file mode 100644 index b2b4d2b89..000000000 Binary files a/Resources/images/conference_exit_over@2x.png and /dev/null differ diff --git a/Resources/images/conference_schedule_calendar_default.png b/Resources/images/conference_schedule_calendar_default.png deleted file mode 100644 index 59fe950fb..000000000 Binary files a/Resources/images/conference_schedule_calendar_default.png and /dev/null differ diff --git a/Resources/images/conference_schedule_participants_default.png b/Resources/images/conference_schedule_participants_default.png deleted file mode 100644 index a58af55e1..000000000 Binary files a/Resources/images/conference_schedule_participants_default.png and /dev/null differ diff --git a/Resources/images/conference_schedule_time_default.png b/Resources/images/conference_schedule_time_default.png deleted file mode 100644 index 7a9534617..000000000 Binary files a/Resources/images/conference_schedule_time_default.png and /dev/null differ diff --git a/Resources/images/contact_add_default.png b/Resources/images/contact_add_default.png deleted file mode 100644 index d4c24a48e..000000000 Binary files a/Resources/images/contact_add_default.png and /dev/null differ diff --git a/Resources/images/contact_add_default@2x.png b/Resources/images/contact_add_default@2x.png deleted file mode 100644 index 10a708034..000000000 Binary files a/Resources/images/contact_add_default@2x.png and /dev/null differ diff --git a/Resources/images/contact_add_disabled.png b/Resources/images/contact_add_disabled.png deleted file mode 100644 index 6c2b5c47f..000000000 Binary files a/Resources/images/contact_add_disabled.png and /dev/null differ diff --git a/Resources/images/contact_add_disabled@2x.png b/Resources/images/contact_add_disabled@2x.png deleted file mode 100644 index fcf75ba20..000000000 Binary files a/Resources/images/contact_add_disabled@2x.png and /dev/null differ diff --git a/Resources/images/contacts_all_default.png b/Resources/images/contacts_all_default.png deleted file mode 100644 index 2783f8ae7..000000000 Binary files a/Resources/images/contacts_all_default.png and /dev/null differ diff --git a/Resources/images/contacts_all_default@2x.png b/Resources/images/contacts_all_default@2x.png deleted file mode 100644 index ce084e60d..000000000 Binary files a/Resources/images/contacts_all_default@2x.png and /dev/null differ diff --git a/Resources/images/contacts_all_disabled.png b/Resources/images/contacts_all_disabled.png deleted file mode 100644 index 365de44b8..000000000 Binary files a/Resources/images/contacts_all_disabled.png and /dev/null differ diff --git a/Resources/images/contacts_all_disabled@2x.png b/Resources/images/contacts_all_disabled@2x.png deleted file mode 100644 index 924cc7d57..000000000 Binary files a/Resources/images/contacts_all_disabled@2x.png and /dev/null differ diff --git a/Resources/images/contacts_all_selected.png b/Resources/images/contacts_all_selected.png deleted file mode 100644 index 2620c9f45..000000000 Binary files a/Resources/images/contacts_all_selected.png and /dev/null differ diff --git a/Resources/images/contacts_all_selected@2x.png b/Resources/images/contacts_all_selected@2x.png deleted file mode 100644 index 998386d18..000000000 Binary files a/Resources/images/contacts_all_selected@2x.png and /dev/null differ diff --git a/Resources/images/contacts_sip_default.png b/Resources/images/contacts_sip_default.png deleted file mode 100644 index 00c474f6f..000000000 Binary files a/Resources/images/contacts_sip_default.png and /dev/null differ diff --git a/Resources/images/contacts_sip_default@2x.png b/Resources/images/contacts_sip_default@2x.png deleted file mode 100644 index a4a82cb77..000000000 Binary files a/Resources/images/contacts_sip_default@2x.png and /dev/null differ diff --git a/Resources/images/contacts_sip_selected.png b/Resources/images/contacts_sip_selected.png deleted file mode 100644 index c6e794f85..000000000 Binary files a/Resources/images/contacts_sip_selected.png and /dev/null differ diff --git a/Resources/images/contacts_sip_selected@2x.png b/Resources/images/contacts_sip_selected@2x.png deleted file mode 100644 index ca7f652d5..000000000 Binary files a/Resources/images/contacts_sip_selected@2x.png and /dev/null differ diff --git a/Resources/images/delete_default.png b/Resources/images/delete_default.png deleted file mode 100644 index 0263f17cc..000000000 Binary files a/Resources/images/delete_default.png and /dev/null differ diff --git a/Resources/images/delete_default@2x.png b/Resources/images/delete_default@2x.png deleted file mode 100644 index 2859f5e33..000000000 Binary files a/Resources/images/delete_default@2x.png and /dev/null differ diff --git a/Resources/images/delete_disabled.png b/Resources/images/delete_disabled.png deleted file mode 100644 index f2f12cdc6..000000000 Binary files a/Resources/images/delete_disabled.png and /dev/null differ diff --git a/Resources/images/delete_disabled@2x.png b/Resources/images/delete_disabled@2x.png deleted file mode 100644 index d1e8bedb5..000000000 Binary files a/Resources/images/delete_disabled@2x.png and /dev/null differ diff --git a/Resources/images/delete_field_default.png b/Resources/images/delete_field_default.png deleted file mode 100644 index fb16c0d97..000000000 Binary files a/Resources/images/delete_field_default.png and /dev/null differ diff --git a/Resources/images/delete_field_default@2x.png b/Resources/images/delete_field_default@2x.png deleted file mode 100644 index 1e517887d..000000000 Binary files a/Resources/images/delete_field_default@2x.png and /dev/null differ diff --git a/Resources/images/delete_field_over.png b/Resources/images/delete_field_over.png deleted file mode 100644 index f6f874edf..000000000 Binary files a/Resources/images/delete_field_over.png and /dev/null differ diff --git a/Resources/images/delete_field_over@2x.png b/Resources/images/delete_field_over@2x.png deleted file mode 100644 index 4c6f32478..000000000 Binary files a/Resources/images/delete_field_over@2x.png and /dev/null differ diff --git a/Resources/images/delete_img.png b/Resources/images/delete_img.png deleted file mode 100644 index b9aaa86c9..000000000 Binary files a/Resources/images/delete_img.png and /dev/null differ diff --git a/Resources/images/deselect_all.png b/Resources/images/deselect_all.png deleted file mode 100644 index 9b44c48ed..000000000 Binary files a/Resources/images/deselect_all.png and /dev/null differ diff --git a/Resources/images/deselect_all@2x.png b/Resources/images/deselect_all@2x.png deleted file mode 100644 index 2b8c3cf79..000000000 Binary files a/Resources/images/deselect_all@2x.png and /dev/null differ diff --git a/Resources/images/dialer_alt_back.png b/Resources/images/dialer_alt_back.png deleted file mode 100644 index 8dc8b29a4..000000000 Binary files a/Resources/images/dialer_alt_back.png and /dev/null differ diff --git a/Resources/images/dialer_alt_back@2x.png b/Resources/images/dialer_alt_back@2x.png deleted file mode 100644 index 1731f6fd2..000000000 Binary files a/Resources/images/dialer_alt_back@2x.png and /dev/null differ diff --git a/Resources/images/dialer_back_default.png b/Resources/images/dialer_back_default.png deleted file mode 100644 index 0a5378ff0..000000000 Binary files a/Resources/images/dialer_back_default.png and /dev/null differ diff --git a/Resources/images/dialer_back_default@2x.png b/Resources/images/dialer_back_default@2x.png deleted file mode 100644 index d593d186f..000000000 Binary files a/Resources/images/dialer_back_default@2x.png and /dev/null differ diff --git a/Resources/images/dialer_back_disabled.png b/Resources/images/dialer_back_disabled.png deleted file mode 100644 index 650c950e4..000000000 Binary files a/Resources/images/dialer_back_disabled.png and /dev/null differ diff --git a/Resources/images/dialer_back_disabled@2x.png b/Resources/images/dialer_back_disabled@2x.png deleted file mode 100644 index d8a8f2aba..000000000 Binary files a/Resources/images/dialer_back_disabled@2x.png and /dev/null differ diff --git a/Resources/images/dialer_background.png b/Resources/images/dialer_background.png deleted file mode 100644 index ccb0eedd9..000000000 Binary files a/Resources/images/dialer_background.png and /dev/null differ diff --git a/Resources/images/edit_default.png b/Resources/images/edit_default.png deleted file mode 100644 index e55a7bc37..000000000 Binary files a/Resources/images/edit_default.png and /dev/null differ diff --git a/Resources/images/edit_default@2x.png b/Resources/images/edit_default@2x.png deleted file mode 100644 index 5fe831d26..000000000 Binary files a/Resources/images/edit_default@2x.png and /dev/null differ diff --git a/Resources/images/edit_disabled.png b/Resources/images/edit_disabled.png deleted file mode 100644 index c14a06b5b..000000000 Binary files a/Resources/images/edit_disabled.png and /dev/null differ diff --git a/Resources/images/edit_disabled@2x.png b/Resources/images/edit_disabled@2x.png deleted file mode 100644 index af6f5930e..000000000 Binary files a/Resources/images/edit_disabled@2x.png and /dev/null differ diff --git a/Resources/images/edit_list_default.png b/Resources/images/edit_list_default.png deleted file mode 100644 index 16d2f0132..000000000 Binary files a/Resources/images/edit_list_default.png and /dev/null differ diff --git a/Resources/images/edit_list_default@2x.png b/Resources/images/edit_list_default@2x.png deleted file mode 100644 index cfb65c39e..000000000 Binary files a/Resources/images/edit_list_default@2x.png and /dev/null differ diff --git a/Resources/images/edit_list_disabled.png b/Resources/images/edit_list_disabled.png deleted file mode 100644 index 80c3ce414..000000000 Binary files a/Resources/images/edit_list_disabled.png and /dev/null differ diff --git a/Resources/images/edit_list_disabled@2x.png b/Resources/images/edit_list_disabled@2x.png deleted file mode 100644 index 28fbc02ba..000000000 Binary files a/Resources/images/edit_list_disabled@2x.png and /dev/null differ diff --git a/Resources/images/emoji.png b/Resources/images/emoji.png deleted file mode 100644 index 5b334ba09..000000000 Binary files a/Resources/images/emoji.png and /dev/null differ diff --git a/Resources/images/ephemeral_messages_color_A.png b/Resources/images/ephemeral_messages_color_A.png deleted file mode 100644 index 19753e7f1..000000000 Binary files a/Resources/images/ephemeral_messages_color_A.png and /dev/null differ diff --git a/Resources/images/ephemeral_messages_default.png b/Resources/images/ephemeral_messages_default.png deleted file mode 100644 index fed52afb5..000000000 Binary files a/Resources/images/ephemeral_messages_default.png and /dev/null differ diff --git a/Resources/images/file_audio_default.png b/Resources/images/file_audio_default.png deleted file mode 100644 index ce5af4fd5..000000000 Binary files a/Resources/images/file_audio_default.png and /dev/null differ diff --git a/Resources/images/file_default.png b/Resources/images/file_default.png deleted file mode 100644 index f660964fb..000000000 Binary files a/Resources/images/file_default.png and /dev/null differ diff --git a/Resources/images/file_pdf_default.png b/Resources/images/file_pdf_default.png deleted file mode 100644 index 3a6a30c94..000000000 Binary files a/Resources/images/file_pdf_default.png and /dev/null differ diff --git a/Resources/images/file_picture_default.png b/Resources/images/file_picture_default.png deleted file mode 100644 index 26f2c8d0c..000000000 Binary files a/Resources/images/file_picture_default.png and /dev/null differ diff --git a/Resources/images/file_video_default.png b/Resources/images/file_video_default.png deleted file mode 100644 index 9a3d1a301..000000000 Binary files a/Resources/images/file_video_default.png and /dev/null differ diff --git a/Resources/images/file_voice_default.png b/Resources/images/file_voice_default.png deleted file mode 100644 index a492d31a5..000000000 Binary files a/Resources/images/file_voice_default.png and /dev/null differ diff --git a/Resources/images/footer_chat_default.png b/Resources/images/footer_chat_default.png deleted file mode 100644 index 4e0d5286b..000000000 Binary files a/Resources/images/footer_chat_default.png and /dev/null differ diff --git a/Resources/images/footer_chat_default@2x.png b/Resources/images/footer_chat_default@2x.png deleted file mode 100644 index 9f688ed83..000000000 Binary files a/Resources/images/footer_chat_default@2x.png and /dev/null differ diff --git a/Resources/images/footer_chat_disabled.png b/Resources/images/footer_chat_disabled.png deleted file mode 100644 index a31687432..000000000 Binary files a/Resources/images/footer_chat_disabled.png and /dev/null differ diff --git a/Resources/images/footer_chat_disabled@2x.png b/Resources/images/footer_chat_disabled@2x.png deleted file mode 100644 index 8ef385c95..000000000 Binary files a/Resources/images/footer_chat_disabled@2x.png and /dev/null differ diff --git a/Resources/images/footer_contacts_default.png b/Resources/images/footer_contacts_default.png deleted file mode 100644 index a74119719..000000000 Binary files a/Resources/images/footer_contacts_default.png and /dev/null differ diff --git a/Resources/images/footer_contacts_default@2x.png b/Resources/images/footer_contacts_default@2x.png deleted file mode 100644 index 2ad0d4c33..000000000 Binary files a/Resources/images/footer_contacts_default@2x.png and /dev/null differ diff --git a/Resources/images/footer_contacts_disabled.png b/Resources/images/footer_contacts_disabled.png deleted file mode 100644 index 4cf83f330..000000000 Binary files a/Resources/images/footer_contacts_disabled.png and /dev/null differ diff --git a/Resources/images/footer_contacts_disabled@2x.png b/Resources/images/footer_contacts_disabled@2x.png deleted file mode 100644 index 1680b9da7..000000000 Binary files a/Resources/images/footer_contacts_disabled@2x.png and /dev/null differ diff --git a/Resources/images/footer_dialer_default.png b/Resources/images/footer_dialer_default.png deleted file mode 100644 index 77f32be59..000000000 Binary files a/Resources/images/footer_dialer_default.png and /dev/null differ diff --git a/Resources/images/footer_dialer_default@2x.png b/Resources/images/footer_dialer_default@2x.png deleted file mode 100644 index 04425a2f7..000000000 Binary files a/Resources/images/footer_dialer_default@2x.png and /dev/null differ diff --git a/Resources/images/footer_dialer_disabled.png b/Resources/images/footer_dialer_disabled.png deleted file mode 100644 index aef564671..000000000 Binary files a/Resources/images/footer_dialer_disabled.png and /dev/null differ diff --git a/Resources/images/footer_dialer_disabled@2x.png b/Resources/images/footer_dialer_disabled@2x.png deleted file mode 100644 index 7e467ef92..000000000 Binary files a/Resources/images/footer_dialer_disabled@2x.png and /dev/null differ diff --git a/Resources/images/footer_history_default.png b/Resources/images/footer_history_default.png deleted file mode 100644 index 9da3469a7..000000000 Binary files a/Resources/images/footer_history_default.png and /dev/null differ diff --git a/Resources/images/footer_history_default@2x.png b/Resources/images/footer_history_default@2x.png deleted file mode 100644 index 9d7d954b6..000000000 Binary files a/Resources/images/footer_history_default@2x.png and /dev/null differ diff --git a/Resources/images/footer_history_disabled.png b/Resources/images/footer_history_disabled.png deleted file mode 100644 index 5adb7ce78..000000000 Binary files a/Resources/images/footer_history_disabled.png and /dev/null differ diff --git a/Resources/images/footer_history_disabled@2x.png b/Resources/images/footer_history_disabled@2x.png deleted file mode 100644 index dce58b1fb..000000000 Binary files a/Resources/images/footer_history_disabled@2x.png and /dev/null differ diff --git a/Resources/images/forward_message_default.png b/Resources/images/forward_message_default.png deleted file mode 100644 index b51542ec8..000000000 Binary files a/Resources/images/forward_message_default.png and /dev/null differ diff --git a/Resources/images/history_all_default.png b/Resources/images/history_all_default.png deleted file mode 100644 index 16c76b995..000000000 Binary files a/Resources/images/history_all_default.png and /dev/null differ diff --git a/Resources/images/history_all_default@2x.png b/Resources/images/history_all_default@2x.png deleted file mode 100644 index 7459878f9..000000000 Binary files a/Resources/images/history_all_default@2x.png and /dev/null differ diff --git a/Resources/images/history_all_disabled.png b/Resources/images/history_all_disabled.png deleted file mode 100644 index cef8e42af..000000000 Binary files a/Resources/images/history_all_disabled.png and /dev/null differ diff --git a/Resources/images/history_all_disabled@2x.png b/Resources/images/history_all_disabled@2x.png deleted file mode 100644 index 8d3e3934e..000000000 Binary files a/Resources/images/history_all_disabled@2x.png and /dev/null differ diff --git a/Resources/images/history_all_selected.png b/Resources/images/history_all_selected.png deleted file mode 100644 index 8a9abd3e8..000000000 Binary files a/Resources/images/history_all_selected.png and /dev/null differ diff --git a/Resources/images/history_all_selected@2x.png b/Resources/images/history_all_selected@2x.png deleted file mode 100644 index 5a819e94e..000000000 Binary files a/Resources/images/history_all_selected@2x.png and /dev/null differ diff --git a/Resources/images/history_chat_indicator.png b/Resources/images/history_chat_indicator.png deleted file mode 100644 index 7097ddc9a..000000000 Binary files a/Resources/images/history_chat_indicator.png and /dev/null differ diff --git a/Resources/images/history_chat_indicator@2x.png b/Resources/images/history_chat_indicator@2x.png deleted file mode 100644 index d261a26ee..000000000 Binary files a/Resources/images/history_chat_indicator@2x.png and /dev/null differ diff --git a/Resources/images/history_missed_default.png b/Resources/images/history_missed_default.png deleted file mode 100644 index c624d422b..000000000 Binary files a/Resources/images/history_missed_default.png and /dev/null differ diff --git a/Resources/images/history_missed_default@2x.png b/Resources/images/history_missed_default@2x.png deleted file mode 100644 index 46bdd7cb4..000000000 Binary files a/Resources/images/history_missed_default@2x.png and /dev/null differ diff --git a/Resources/images/history_missed_disabled.png b/Resources/images/history_missed_disabled.png deleted file mode 100644 index dd07a5da2..000000000 Binary files a/Resources/images/history_missed_disabled.png and /dev/null differ diff --git a/Resources/images/history_missed_disabled@2x.png b/Resources/images/history_missed_disabled@2x.png deleted file mode 100644 index e013b76e8..000000000 Binary files a/Resources/images/history_missed_disabled@2x.png and /dev/null differ diff --git a/Resources/images/history_missed_selected.png b/Resources/images/history_missed_selected.png deleted file mode 100644 index df77bb434..000000000 Binary files a/Resources/images/history_missed_selected.png and /dev/null differ diff --git a/Resources/images/history_missed_selected@2x.png b/Resources/images/history_missed_selected@2x.png deleted file mode 100644 index 9bc9f5a62..000000000 Binary files a/Resources/images/history_missed_selected@2x.png and /dev/null differ diff --git a/Resources/images/invite_linphone.png b/Resources/images/invite_linphone.png deleted file mode 100644 index 20606be43..000000000 Binary files a/Resources/images/invite_linphone.png and /dev/null differ diff --git a/Resources/images/invite_linphone@2x.png b/Resources/images/invite_linphone@2x.png deleted file mode 100644 index 20606be43..000000000 Binary files a/Resources/images/invite_linphone@2x.png and /dev/null differ diff --git a/Resources/images/led_connected.png b/Resources/images/led_connected.png deleted file mode 100644 index 3789d3fa3..000000000 Binary files a/Resources/images/led_connected.png and /dev/null differ diff --git a/Resources/images/led_connected@2x.png b/Resources/images/led_connected@2x.png deleted file mode 100644 index 9c6ccf56f..000000000 Binary files a/Resources/images/led_connected@2x.png and /dev/null differ diff --git a/Resources/images/led_disconnected.png b/Resources/images/led_disconnected.png deleted file mode 100644 index 8040797a8..000000000 Binary files a/Resources/images/led_disconnected.png and /dev/null differ diff --git a/Resources/images/led_disconnected@2x.png b/Resources/images/led_disconnected@2x.png deleted file mode 100644 index b864ea244..000000000 Binary files a/Resources/images/led_disconnected@2x.png and /dev/null differ diff --git a/Resources/images/led_error.png b/Resources/images/led_error.png deleted file mode 100644 index 863c885de..000000000 Binary files a/Resources/images/led_error.png and /dev/null differ diff --git a/Resources/images/led_error@2x.png b/Resources/images/led_error@2x.png deleted file mode 100644 index 0fbe91384..000000000 Binary files a/Resources/images/led_error@2x.png and /dev/null differ diff --git a/Resources/images/led_inprogress.png b/Resources/images/led_inprogress.png deleted file mode 100644 index 56c46dc2b..000000000 Binary files a/Resources/images/led_inprogress.png and /dev/null differ diff --git a/Resources/images/led_inprogress@2x.png b/Resources/images/led_inprogress@2x.png deleted file mode 100644 index 6204da881..000000000 Binary files a/Resources/images/led_inprogress@2x.png and /dev/null differ diff --git a/Resources/images/lime_ko.png b/Resources/images/lime_ko.png deleted file mode 100644 index 915e86773..000000000 Binary files a/Resources/images/lime_ko.png and /dev/null differ diff --git a/Resources/images/lime_ko@2x.png b/Resources/images/lime_ko@2x.png deleted file mode 100644 index f3a5e6b80..000000000 Binary files a/Resources/images/lime_ko@2x.png and /dev/null differ diff --git a/Resources/images/linphone_logo.png b/Resources/images/linphone_logo.png deleted file mode 100644 index bcf916c69..000000000 Binary files a/Resources/images/linphone_logo.png and /dev/null differ diff --git a/Resources/images/linphone_logo@2x.png b/Resources/images/linphone_logo@2x.png deleted file mode 100644 index 0c73e2f79..000000000 Binary files a/Resources/images/linphone_logo@2x.png and /dev/null differ diff --git a/Resources/images/linphone_user.png b/Resources/images/linphone_user.png deleted file mode 100644 index bcf916c69..000000000 Binary files a/Resources/images/linphone_user.png and /dev/null differ diff --git a/Resources/images/linphone_user@2x.png b/Resources/images/linphone_user@2x.png deleted file mode 100644 index 0c73e2f79..000000000 Binary files a/Resources/images/linphone_user@2x.png and /dev/null differ diff --git a/Resources/images/linphone_user~ipad.png b/Resources/images/linphone_user~ipad.png deleted file mode 100644 index 20c8e1019..000000000 Binary files a/Resources/images/linphone_user~ipad.png and /dev/null differ diff --git a/Resources/images/linphone_user~ipad@2x.png b/Resources/images/linphone_user~ipad@2x.png deleted file mode 100644 index 9b25a445d..000000000 Binary files a/Resources/images/linphone_user~ipad@2x.png and /dev/null differ diff --git a/Resources/images/list_details_default.png b/Resources/images/list_details_default.png deleted file mode 100644 index 82fd769a3..000000000 Binary files a/Resources/images/list_details_default.png and /dev/null differ diff --git a/Resources/images/list_details_default@2x.png b/Resources/images/list_details_default@2x.png deleted file mode 100644 index b552326d8..000000000 Binary files a/Resources/images/list_details_default@2x.png and /dev/null differ diff --git a/Resources/images/list_details_over.png b/Resources/images/list_details_over.png deleted file mode 100644 index c2d467cfb..000000000 Binary files a/Resources/images/list_details_over.png and /dev/null differ diff --git a/Resources/images/list_details_over@2x.png b/Resources/images/list_details_over@2x.png deleted file mode 100644 index e57833872..000000000 Binary files a/Resources/images/list_details_over@2x.png and /dev/null differ diff --git a/Resources/images/menu.png b/Resources/images/menu.png deleted file mode 100644 index 2aad3f90c..000000000 Binary files a/Resources/images/menu.png and /dev/null differ diff --git a/Resources/images/menu@2x.png b/Resources/images/menu@2x.png deleted file mode 100644 index 5a781e1a5..000000000 Binary files a/Resources/images/menu@2x.png and /dev/null differ diff --git a/Resources/images/menu_about.png b/Resources/images/menu_about.png deleted file mode 100644 index 0fccc59c1..000000000 Binary files a/Resources/images/menu_about.png and /dev/null differ diff --git a/Resources/images/menu_about@2x.png b/Resources/images/menu_about@2x.png deleted file mode 100644 index f4c1115c0..000000000 Binary files a/Resources/images/menu_about@2x.png and /dev/null differ diff --git a/Resources/images/menu_assistant.png b/Resources/images/menu_assistant.png deleted file mode 100644 index f5f432e16..000000000 Binary files a/Resources/images/menu_assistant.png and /dev/null differ diff --git a/Resources/images/menu_assistant@2x.png b/Resources/images/menu_assistant@2x.png deleted file mode 100644 index a79bba4c0..000000000 Binary files a/Resources/images/menu_assistant@2x.png and /dev/null differ diff --git a/Resources/images/menu_copy_text_default.png b/Resources/images/menu_copy_text_default.png deleted file mode 100644 index ac945fb5e..000000000 Binary files a/Resources/images/menu_copy_text_default.png and /dev/null differ diff --git a/Resources/images/menu_delete.png b/Resources/images/menu_delete.png deleted file mode 100644 index 65d612aae..000000000 Binary files a/Resources/images/menu_delete.png and /dev/null differ diff --git a/Resources/images/menu_forward_default.png b/Resources/images/menu_forward_default.png deleted file mode 100644 index 9a5b9d85f..000000000 Binary files a/Resources/images/menu_forward_default.png and /dev/null differ diff --git a/Resources/images/menu_info.png b/Resources/images/menu_info.png deleted file mode 100644 index 249d74a56..000000000 Binary files a/Resources/images/menu_info.png and /dev/null differ diff --git a/Resources/images/menu_link_account.png b/Resources/images/menu_link_account.png deleted file mode 100644 index 0b84e1478..000000000 Binary files a/Resources/images/menu_link_account.png and /dev/null differ diff --git a/Resources/images/menu_link_account@2x.png b/Resources/images/menu_link_account@2x.png deleted file mode 100644 index 2b266ea63..000000000 Binary files a/Resources/images/menu_link_account@2x.png and /dev/null differ diff --git a/Resources/images/menu_notifications_off.png b/Resources/images/menu_notifications_off.png deleted file mode 100644 index 666c09f17..000000000 Binary files a/Resources/images/menu_notifications_off.png and /dev/null differ diff --git a/Resources/images/menu_notifications_on.png b/Resources/images/menu_notifications_on.png deleted file mode 100644 index 020cfd827..000000000 Binary files a/Resources/images/menu_notifications_on.png and /dev/null differ diff --git a/Resources/images/menu_options.png b/Resources/images/menu_options.png deleted file mode 100644 index e123c23e8..000000000 Binary files a/Resources/images/menu_options.png and /dev/null differ diff --git a/Resources/images/menu_options@2x.png b/Resources/images/menu_options@2x.png deleted file mode 100644 index a9a8fe427..000000000 Binary files a/Resources/images/menu_options@2x.png and /dev/null differ diff --git a/Resources/images/menu_recordings.png b/Resources/images/menu_recordings.png deleted file mode 100644 index 65f7f1331..000000000 Binary files a/Resources/images/menu_recordings.png and /dev/null differ diff --git a/Resources/images/menu_recordings@2x.png b/Resources/images/menu_recordings@2x.png deleted file mode 100644 index 47e658bc5..000000000 Binary files a/Resources/images/menu_recordings@2x.png and /dev/null differ diff --git a/Resources/images/menu_reply_default.png b/Resources/images/menu_reply_default.png deleted file mode 100644 index 7f898c47e..000000000 Binary files a/Resources/images/menu_reply_default.png and /dev/null differ diff --git a/Resources/images/menu_resend_default.png b/Resources/images/menu_resend_default.png deleted file mode 100644 index cce92a4b9..000000000 Binary files a/Resources/images/menu_resend_default.png and /dev/null differ diff --git a/Resources/images/menu_security_default.png b/Resources/images/menu_security_default.png deleted file mode 100644 index 51ee24fd9..000000000 Binary files a/Resources/images/menu_security_default.png and /dev/null differ diff --git a/Resources/images/menu_voip_meeting_schedule.png b/Resources/images/menu_voip_meeting_schedule.png deleted file mode 100644 index 9170b81fc..000000000 Binary files a/Resources/images/menu_voip_meeting_schedule.png and /dev/null differ diff --git a/Resources/images/micro_default.png b/Resources/images/micro_default.png deleted file mode 100644 index afcb9f05f..000000000 Binary files a/Resources/images/micro_default.png and /dev/null differ diff --git a/Resources/images/micro_default@2x.png b/Resources/images/micro_default@2x.png deleted file mode 100644 index 2af308d25..000000000 Binary files a/Resources/images/micro_default@2x.png and /dev/null differ diff --git a/Resources/images/micro_disabled.png b/Resources/images/micro_disabled.png deleted file mode 100644 index 2770d1817..000000000 Binary files a/Resources/images/micro_disabled.png and /dev/null differ diff --git a/Resources/images/micro_disabled@2x.png b/Resources/images/micro_disabled@2x.png deleted file mode 100644 index 313b6b118..000000000 Binary files a/Resources/images/micro_disabled@2x.png and /dev/null differ diff --git a/Resources/images/micro_selected.png b/Resources/images/micro_selected.png deleted file mode 100644 index 181433de2..000000000 Binary files a/Resources/images/micro_selected.png and /dev/null differ diff --git a/Resources/images/micro_selected@2x.png b/Resources/images/micro_selected@2x.png deleted file mode 100644 index c0d104c81..000000000 Binary files a/Resources/images/micro_selected@2x.png and /dev/null differ diff --git a/Resources/images/more_menu_default.png b/Resources/images/more_menu_default.png deleted file mode 100644 index b4e2ff3bf..000000000 Binary files a/Resources/images/more_menu_default.png and /dev/null differ diff --git a/Resources/images/new_chat_attachment_default.png b/Resources/images/new_chat_attachment_default.png deleted file mode 100644 index bf610b0fb..000000000 Binary files a/Resources/images/new_chat_attachment_default.png and /dev/null differ diff --git a/Resources/images/new_chat_send_default.png b/Resources/images/new_chat_send_default.png deleted file mode 100644 index ffd84f2ea..000000000 Binary files a/Resources/images/new_chat_send_default.png and /dev/null differ diff --git a/Resources/images/new_vr_off.png b/Resources/images/new_vr_off.png deleted file mode 100644 index 11a52d2e0..000000000 Binary files a/Resources/images/new_vr_off.png and /dev/null differ diff --git a/Resources/images/next_default.png b/Resources/images/next_default.png deleted file mode 100644 index 4f77e0c2a..000000000 Binary files a/Resources/images/next_default.png and /dev/null differ diff --git a/Resources/images/next_default@2x.png b/Resources/images/next_default@2x.png deleted file mode 100644 index 7d34fbe5b..000000000 Binary files a/Resources/images/next_default@2x.png and /dev/null differ diff --git a/Resources/images/next_disabled.png b/Resources/images/next_disabled.png deleted file mode 100644 index 48df90f00..000000000 Binary files a/Resources/images/next_disabled.png and /dev/null differ diff --git a/Resources/images/next_disabled@2x.png b/Resources/images/next_disabled@2x.png deleted file mode 100644 index e81e4c1c0..000000000 Binary files a/Resources/images/next_disabled@2x.png and /dev/null differ diff --git a/Resources/images/nowebcamCIF.jpg b/Resources/images/nowebcamCIF.jpg deleted file mode 100644 index 2ab8bdc2a..000000000 Binary files a/Resources/images/nowebcamCIF.jpg and /dev/null differ diff --git a/Resources/images/numpad_0_default.png b/Resources/images/numpad_0_default.png deleted file mode 100644 index 702622011..000000000 Binary files a/Resources/images/numpad_0_default.png and /dev/null differ diff --git a/Resources/images/numpad_0_default@2x.png b/Resources/images/numpad_0_default@2x.png deleted file mode 100644 index bc8814a21..000000000 Binary files a/Resources/images/numpad_0_default@2x.png and /dev/null differ diff --git a/Resources/images/numpad_0_over.png b/Resources/images/numpad_0_over.png deleted file mode 100644 index f0deeee1e..000000000 Binary files a/Resources/images/numpad_0_over.png and /dev/null differ diff --git a/Resources/images/numpad_0_over@2x.png b/Resources/images/numpad_0_over@2x.png deleted file mode 100644 index 382302355..000000000 Binary files a/Resources/images/numpad_0_over@2x.png and /dev/null differ diff --git a/Resources/images/numpad_0_over~ipad.png b/Resources/images/numpad_0_over~ipad.png deleted file mode 100644 index ea6709350..000000000 Binary files a/Resources/images/numpad_0_over~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_0_over~ipad@2x.png b/Resources/images/numpad_0_over~ipad@2x.png deleted file mode 100644 index 7aa55fdb7..000000000 Binary files a/Resources/images/numpad_0_over~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_0~ipad.png b/Resources/images/numpad_0~ipad.png deleted file mode 100644 index c086766a3..000000000 Binary files a/Resources/images/numpad_0~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_0~ipad@2x.png b/Resources/images/numpad_0~ipad@2x.png deleted file mode 100644 index 1f96a3b87..000000000 Binary files a/Resources/images/numpad_0~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_1_default.png b/Resources/images/numpad_1_default.png deleted file mode 100644 index 7c2087689..000000000 Binary files a/Resources/images/numpad_1_default.png and /dev/null differ diff --git a/Resources/images/numpad_1_default@2x.png b/Resources/images/numpad_1_default@2x.png deleted file mode 100644 index 8e6541777..000000000 Binary files a/Resources/images/numpad_1_default@2x.png and /dev/null differ diff --git a/Resources/images/numpad_1_over.png b/Resources/images/numpad_1_over.png deleted file mode 100644 index 6ec5eab69..000000000 Binary files a/Resources/images/numpad_1_over.png and /dev/null differ diff --git a/Resources/images/numpad_1_over@2x.png b/Resources/images/numpad_1_over@2x.png deleted file mode 100644 index 682481d16..000000000 Binary files a/Resources/images/numpad_1_over@2x.png and /dev/null differ diff --git a/Resources/images/numpad_1_over~ipad.png b/Resources/images/numpad_1_over~ipad.png deleted file mode 100644 index 6f749a18a..000000000 Binary files a/Resources/images/numpad_1_over~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_1_over~ipad@2x.png b/Resources/images/numpad_1_over~ipad@2x.png deleted file mode 100644 index 5096f0dab..000000000 Binary files a/Resources/images/numpad_1_over~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_1~ipad.png b/Resources/images/numpad_1~ipad.png deleted file mode 100644 index fe47ff2d6..000000000 Binary files a/Resources/images/numpad_1~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_1~ipad@2x.png b/Resources/images/numpad_1~ipad@2x.png deleted file mode 100644 index 78b196b21..000000000 Binary files a/Resources/images/numpad_1~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_2_default.png b/Resources/images/numpad_2_default.png deleted file mode 100644 index cf6dd9d38..000000000 Binary files a/Resources/images/numpad_2_default.png and /dev/null differ diff --git a/Resources/images/numpad_2_default@2x.png b/Resources/images/numpad_2_default@2x.png deleted file mode 100644 index 54b4ab42f..000000000 Binary files a/Resources/images/numpad_2_default@2x.png and /dev/null differ diff --git a/Resources/images/numpad_2_over.png b/Resources/images/numpad_2_over.png deleted file mode 100644 index e0f710e99..000000000 Binary files a/Resources/images/numpad_2_over.png and /dev/null differ diff --git a/Resources/images/numpad_2_over@2x.png b/Resources/images/numpad_2_over@2x.png deleted file mode 100644 index b5e1dbd49..000000000 Binary files a/Resources/images/numpad_2_over@2x.png and /dev/null differ diff --git a/Resources/images/numpad_2_over~ipad.png b/Resources/images/numpad_2_over~ipad.png deleted file mode 100644 index 89dbf4948..000000000 Binary files a/Resources/images/numpad_2_over~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_2_over~ipad@2x.png b/Resources/images/numpad_2_over~ipad@2x.png deleted file mode 100644 index 2c6bd4fc9..000000000 Binary files a/Resources/images/numpad_2_over~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_2~ipad.png b/Resources/images/numpad_2~ipad.png deleted file mode 100644 index 765548b96..000000000 Binary files a/Resources/images/numpad_2~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_2~ipad@2x.png b/Resources/images/numpad_2~ipad@2x.png deleted file mode 100644 index 1b8c3e37b..000000000 Binary files a/Resources/images/numpad_2~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_3_default.png b/Resources/images/numpad_3_default.png deleted file mode 100644 index 407d0f3f0..000000000 Binary files a/Resources/images/numpad_3_default.png and /dev/null differ diff --git a/Resources/images/numpad_3_default@2x.png b/Resources/images/numpad_3_default@2x.png deleted file mode 100644 index c548ea5a8..000000000 Binary files a/Resources/images/numpad_3_default@2x.png and /dev/null differ diff --git a/Resources/images/numpad_3_over.png b/Resources/images/numpad_3_over.png deleted file mode 100644 index 007d64907..000000000 Binary files a/Resources/images/numpad_3_over.png and /dev/null differ diff --git a/Resources/images/numpad_3_over@2x.png b/Resources/images/numpad_3_over@2x.png deleted file mode 100644 index c6b004aa6..000000000 Binary files a/Resources/images/numpad_3_over@2x.png and /dev/null differ diff --git a/Resources/images/numpad_3_over~ipad.png b/Resources/images/numpad_3_over~ipad.png deleted file mode 100644 index 61cc05baa..000000000 Binary files a/Resources/images/numpad_3_over~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_3_over~ipad@2x.png b/Resources/images/numpad_3_over~ipad@2x.png deleted file mode 100644 index 1d37f4974..000000000 Binary files a/Resources/images/numpad_3_over~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_3~ipad.png b/Resources/images/numpad_3~ipad.png deleted file mode 100644 index 8ae61007e..000000000 Binary files a/Resources/images/numpad_3~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_3~ipad@2x.png b/Resources/images/numpad_3~ipad@2x.png deleted file mode 100644 index f1590e20e..000000000 Binary files a/Resources/images/numpad_3~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_4_default.png b/Resources/images/numpad_4_default.png deleted file mode 100644 index 4bdb8f227..000000000 Binary files a/Resources/images/numpad_4_default.png and /dev/null differ diff --git a/Resources/images/numpad_4_default@2x.png b/Resources/images/numpad_4_default@2x.png deleted file mode 100644 index 33d73545f..000000000 Binary files a/Resources/images/numpad_4_default@2x.png and /dev/null differ diff --git a/Resources/images/numpad_4_over.png b/Resources/images/numpad_4_over.png deleted file mode 100644 index 3304ea566..000000000 Binary files a/Resources/images/numpad_4_over.png and /dev/null differ diff --git a/Resources/images/numpad_4_over@2x.png b/Resources/images/numpad_4_over@2x.png deleted file mode 100644 index d60dc1f60..000000000 Binary files a/Resources/images/numpad_4_over@2x.png and /dev/null differ diff --git a/Resources/images/numpad_4_over~ipad.png b/Resources/images/numpad_4_over~ipad.png deleted file mode 100644 index 27117331b..000000000 Binary files a/Resources/images/numpad_4_over~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_4_over~ipad@2x.png b/Resources/images/numpad_4_over~ipad@2x.png deleted file mode 100644 index edb024b31..000000000 Binary files a/Resources/images/numpad_4_over~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_4~ipad.png b/Resources/images/numpad_4~ipad.png deleted file mode 100644 index cef14a07a..000000000 Binary files a/Resources/images/numpad_4~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_4~ipad@2x.png b/Resources/images/numpad_4~ipad@2x.png deleted file mode 100644 index 3ff454c17..000000000 Binary files a/Resources/images/numpad_4~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_5_default.png b/Resources/images/numpad_5_default.png deleted file mode 100644 index 752d2b0f5..000000000 Binary files a/Resources/images/numpad_5_default.png and /dev/null differ diff --git a/Resources/images/numpad_5_default@2x.png b/Resources/images/numpad_5_default@2x.png deleted file mode 100644 index c4690b6ba..000000000 Binary files a/Resources/images/numpad_5_default@2x.png and /dev/null differ diff --git a/Resources/images/numpad_5_over.png b/Resources/images/numpad_5_over.png deleted file mode 100644 index 3d71249e9..000000000 Binary files a/Resources/images/numpad_5_over.png and /dev/null differ diff --git a/Resources/images/numpad_5_over@2x.png b/Resources/images/numpad_5_over@2x.png deleted file mode 100644 index 17f11404c..000000000 Binary files a/Resources/images/numpad_5_over@2x.png and /dev/null differ diff --git a/Resources/images/numpad_5_over~ipad.png b/Resources/images/numpad_5_over~ipad.png deleted file mode 100644 index 4fa750487..000000000 Binary files a/Resources/images/numpad_5_over~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_5_over~ipad@2x.png b/Resources/images/numpad_5_over~ipad@2x.png deleted file mode 100644 index 745608706..000000000 Binary files a/Resources/images/numpad_5_over~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_5~ipad.png b/Resources/images/numpad_5~ipad.png deleted file mode 100644 index 68badf95f..000000000 Binary files a/Resources/images/numpad_5~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_5~ipad@2x.png b/Resources/images/numpad_5~ipad@2x.png deleted file mode 100644 index 2fffa2c78..000000000 Binary files a/Resources/images/numpad_5~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_6_default.png b/Resources/images/numpad_6_default.png deleted file mode 100644 index e02afb9d8..000000000 Binary files a/Resources/images/numpad_6_default.png and /dev/null differ diff --git a/Resources/images/numpad_6_default@2x.png b/Resources/images/numpad_6_default@2x.png deleted file mode 100644 index 56e510052..000000000 Binary files a/Resources/images/numpad_6_default@2x.png and /dev/null differ diff --git a/Resources/images/numpad_6_over.png b/Resources/images/numpad_6_over.png deleted file mode 100644 index 6881b758d..000000000 Binary files a/Resources/images/numpad_6_over.png and /dev/null differ diff --git a/Resources/images/numpad_6_over@2x.png b/Resources/images/numpad_6_over@2x.png deleted file mode 100644 index d23468529..000000000 Binary files a/Resources/images/numpad_6_over@2x.png and /dev/null differ diff --git a/Resources/images/numpad_6_over~ipad.png b/Resources/images/numpad_6_over~ipad.png deleted file mode 100644 index d9d2edc5a..000000000 Binary files a/Resources/images/numpad_6_over~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_6_over~ipad@2x.png b/Resources/images/numpad_6_over~ipad@2x.png deleted file mode 100644 index 7d3e8483c..000000000 Binary files a/Resources/images/numpad_6_over~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_6~ipad.png b/Resources/images/numpad_6~ipad.png deleted file mode 100644 index 915db6f30..000000000 Binary files a/Resources/images/numpad_6~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_6~ipad@2x.png b/Resources/images/numpad_6~ipad@2x.png deleted file mode 100644 index 320295c6a..000000000 Binary files a/Resources/images/numpad_6~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_7_default.png b/Resources/images/numpad_7_default.png deleted file mode 100644 index 0217c2eac..000000000 Binary files a/Resources/images/numpad_7_default.png and /dev/null differ diff --git a/Resources/images/numpad_7_default@2x.png b/Resources/images/numpad_7_default@2x.png deleted file mode 100644 index 0a12730be..000000000 Binary files a/Resources/images/numpad_7_default@2x.png and /dev/null differ diff --git a/Resources/images/numpad_7_over.png b/Resources/images/numpad_7_over.png deleted file mode 100644 index 7a91dfe7c..000000000 Binary files a/Resources/images/numpad_7_over.png and /dev/null differ diff --git a/Resources/images/numpad_7_over@2x.png b/Resources/images/numpad_7_over@2x.png deleted file mode 100644 index 827d20937..000000000 Binary files a/Resources/images/numpad_7_over@2x.png and /dev/null differ diff --git a/Resources/images/numpad_7_over~ipad.png b/Resources/images/numpad_7_over~ipad.png deleted file mode 100644 index 02d3e526b..000000000 Binary files a/Resources/images/numpad_7_over~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_7_over~ipad@2x.png b/Resources/images/numpad_7_over~ipad@2x.png deleted file mode 100644 index d190cc919..000000000 Binary files a/Resources/images/numpad_7_over~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_7~ipad.png b/Resources/images/numpad_7~ipad.png deleted file mode 100644 index 803142691..000000000 Binary files a/Resources/images/numpad_7~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_7~ipad@2x.png b/Resources/images/numpad_7~ipad@2x.png deleted file mode 100644 index d4cafee88..000000000 Binary files a/Resources/images/numpad_7~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_8_default.png b/Resources/images/numpad_8_default.png deleted file mode 100644 index 9f37f32e8..000000000 Binary files a/Resources/images/numpad_8_default.png and /dev/null differ diff --git a/Resources/images/numpad_8_default@2x.png b/Resources/images/numpad_8_default@2x.png deleted file mode 100644 index e576a52fb..000000000 Binary files a/Resources/images/numpad_8_default@2x.png and /dev/null differ diff --git a/Resources/images/numpad_8_over.png b/Resources/images/numpad_8_over.png deleted file mode 100644 index 93ff078a2..000000000 Binary files a/Resources/images/numpad_8_over.png and /dev/null differ diff --git a/Resources/images/numpad_8_over@2x.png b/Resources/images/numpad_8_over@2x.png deleted file mode 100644 index 98a6927fb..000000000 Binary files a/Resources/images/numpad_8_over@2x.png and /dev/null differ diff --git a/Resources/images/numpad_8_over~ipad.png b/Resources/images/numpad_8_over~ipad.png deleted file mode 100644 index 973ab3e8e..000000000 Binary files a/Resources/images/numpad_8_over~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_8_over~ipad@2x.png b/Resources/images/numpad_8_over~ipad@2x.png deleted file mode 100644 index 6edd5e0b5..000000000 Binary files a/Resources/images/numpad_8_over~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_8~ipad.png b/Resources/images/numpad_8~ipad.png deleted file mode 100644 index f5776ea44..000000000 Binary files a/Resources/images/numpad_8~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_8~ipad@2x.png b/Resources/images/numpad_8~ipad@2x.png deleted file mode 100644 index 042ce4973..000000000 Binary files a/Resources/images/numpad_8~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_9_default.png b/Resources/images/numpad_9_default.png deleted file mode 100644 index 126c8a5ab..000000000 Binary files a/Resources/images/numpad_9_default.png and /dev/null differ diff --git a/Resources/images/numpad_9_default@2x.png b/Resources/images/numpad_9_default@2x.png deleted file mode 100644 index 93acaecc8..000000000 Binary files a/Resources/images/numpad_9_default@2x.png and /dev/null differ diff --git a/Resources/images/numpad_9_over.png b/Resources/images/numpad_9_over.png deleted file mode 100644 index 52903130b..000000000 Binary files a/Resources/images/numpad_9_over.png and /dev/null differ diff --git a/Resources/images/numpad_9_over@2x.png b/Resources/images/numpad_9_over@2x.png deleted file mode 100644 index 7c775b384..000000000 Binary files a/Resources/images/numpad_9_over@2x.png and /dev/null differ diff --git a/Resources/images/numpad_9_over~ipad.png b/Resources/images/numpad_9_over~ipad.png deleted file mode 100644 index 1218b127c..000000000 Binary files a/Resources/images/numpad_9_over~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_9_over~ipad@2x.png b/Resources/images/numpad_9_over~ipad@2x.png deleted file mode 100644 index abeb49689..000000000 Binary files a/Resources/images/numpad_9_over~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_9~ipad.png b/Resources/images/numpad_9~ipad.png deleted file mode 100644 index 78e8997ae..000000000 Binary files a/Resources/images/numpad_9~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_9~ipad@2x.png b/Resources/images/numpad_9~ipad@2x.png deleted file mode 100644 index caed2da5e..000000000 Binary files a/Resources/images/numpad_9~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_hash_default.png b/Resources/images/numpad_hash_default.png deleted file mode 100644 index f689fa551..000000000 Binary files a/Resources/images/numpad_hash_default.png and /dev/null differ diff --git a/Resources/images/numpad_hash_default@2x.png b/Resources/images/numpad_hash_default@2x.png deleted file mode 100644 index c43d30d54..000000000 Binary files a/Resources/images/numpad_hash_default@2x.png and /dev/null differ diff --git a/Resources/images/numpad_hash_over.png b/Resources/images/numpad_hash_over.png deleted file mode 100644 index 38c124f07..000000000 Binary files a/Resources/images/numpad_hash_over.png and /dev/null differ diff --git a/Resources/images/numpad_hash_over@2x.png b/Resources/images/numpad_hash_over@2x.png deleted file mode 100644 index f97fb3f0a..000000000 Binary files a/Resources/images/numpad_hash_over@2x.png and /dev/null differ diff --git a/Resources/images/numpad_hash_over~ipad.png b/Resources/images/numpad_hash_over~ipad.png deleted file mode 100644 index 07be53fb8..000000000 Binary files a/Resources/images/numpad_hash_over~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_hash_over~ipad@2x.png b/Resources/images/numpad_hash_over~ipad@2x.png deleted file mode 100644 index ab0860e97..000000000 Binary files a/Resources/images/numpad_hash_over~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_hash~ipad.png b/Resources/images/numpad_hash~ipad.png deleted file mode 100644 index 5b23bb3c9..000000000 Binary files a/Resources/images/numpad_hash~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_hash~ipad@2x.png b/Resources/images/numpad_hash~ipad@2x.png deleted file mode 100644 index 6435dee86..000000000 Binary files a/Resources/images/numpad_hash~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_over_background.png b/Resources/images/numpad_over_background.png deleted file mode 100644 index 1da019a54..000000000 Binary files a/Resources/images/numpad_over_background.png and /dev/null differ diff --git a/Resources/images/numpad_star_default.png b/Resources/images/numpad_star_default.png deleted file mode 100644 index 24316dc6e..000000000 Binary files a/Resources/images/numpad_star_default.png and /dev/null differ diff --git a/Resources/images/numpad_star_default@2x.png b/Resources/images/numpad_star_default@2x.png deleted file mode 100644 index 43e60e9a8..000000000 Binary files a/Resources/images/numpad_star_default@2x.png and /dev/null differ diff --git a/Resources/images/numpad_star_over.png b/Resources/images/numpad_star_over.png deleted file mode 100644 index 7548259bd..000000000 Binary files a/Resources/images/numpad_star_over.png and /dev/null differ diff --git a/Resources/images/numpad_star_over@2x.png b/Resources/images/numpad_star_over@2x.png deleted file mode 100644 index 0ede457ab..000000000 Binary files a/Resources/images/numpad_star_over@2x.png and /dev/null differ diff --git a/Resources/images/numpad_star_over~ipad.png b/Resources/images/numpad_star_over~ipad.png deleted file mode 100644 index 86d821071..000000000 Binary files a/Resources/images/numpad_star_over~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_star_over~ipad@2x.png b/Resources/images/numpad_star_over~ipad@2x.png deleted file mode 100644 index 9a6f166a6..000000000 Binary files a/Resources/images/numpad_star_over~ipad@2x.png and /dev/null differ diff --git a/Resources/images/numpad_star~ipad.png b/Resources/images/numpad_star~ipad.png deleted file mode 100644 index 5945ef2bd..000000000 Binary files a/Resources/images/numpad_star~ipad.png and /dev/null differ diff --git a/Resources/images/numpad_star~ipad@2x.png b/Resources/images/numpad_star~ipad@2x.png deleted file mode 100644 index 0fd4d5872..000000000 Binary files a/Resources/images/numpad_star~ipad@2x.png and /dev/null differ diff --git a/Resources/images/options_add_call_default.png b/Resources/images/options_add_call_default.png deleted file mode 100644 index a8b97bb50..000000000 Binary files a/Resources/images/options_add_call_default.png and /dev/null differ diff --git a/Resources/images/options_add_call_default@2x.png b/Resources/images/options_add_call_default@2x.png deleted file mode 100644 index 824aa2495..000000000 Binary files a/Resources/images/options_add_call_default@2x.png and /dev/null differ diff --git a/Resources/images/options_add_call_disabled.png b/Resources/images/options_add_call_disabled.png deleted file mode 100644 index 1ac61d61f..000000000 Binary files a/Resources/images/options_add_call_disabled.png and /dev/null differ diff --git a/Resources/images/options_add_call_disabled@2x.png b/Resources/images/options_add_call_disabled@2x.png deleted file mode 100644 index e395f70ca..000000000 Binary files a/Resources/images/options_add_call_disabled@2x.png and /dev/null differ diff --git a/Resources/images/options_default.png b/Resources/images/options_default.png deleted file mode 100644 index 8431086b0..000000000 Binary files a/Resources/images/options_default.png and /dev/null differ diff --git a/Resources/images/options_default@2x.png b/Resources/images/options_default@2x.png deleted file mode 100644 index f93c7356f..000000000 Binary files a/Resources/images/options_default@2x.png and /dev/null differ diff --git a/Resources/images/options_disabled.png b/Resources/images/options_disabled.png deleted file mode 100644 index b13b985d5..000000000 Binary files a/Resources/images/options_disabled.png and /dev/null differ diff --git a/Resources/images/options_disabled@2x.png b/Resources/images/options_disabled@2x.png deleted file mode 100644 index 6264ff3cf..000000000 Binary files a/Resources/images/options_disabled@2x.png and /dev/null differ diff --git a/Resources/images/options_selected.png b/Resources/images/options_selected.png deleted file mode 100644 index b4ba41a01..000000000 Binary files a/Resources/images/options_selected.png and /dev/null differ diff --git a/Resources/images/options_selected@2x.png b/Resources/images/options_selected@2x.png deleted file mode 100644 index 080409b42..000000000 Binary files a/Resources/images/options_selected@2x.png and /dev/null differ diff --git a/Resources/images/options_start_conference_default.png b/Resources/images/options_start_conference_default.png deleted file mode 100644 index 184220aef..000000000 Binary files a/Resources/images/options_start_conference_default.png and /dev/null differ diff --git a/Resources/images/options_start_conference_default@2x.png b/Resources/images/options_start_conference_default@2x.png deleted file mode 100644 index 7bede1c9e..000000000 Binary files a/Resources/images/options_start_conference_default@2x.png and /dev/null differ diff --git a/Resources/images/options_start_conference_disabled.png b/Resources/images/options_start_conference_disabled.png deleted file mode 100644 index 75b142b30..000000000 Binary files a/Resources/images/options_start_conference_disabled.png and /dev/null differ diff --git a/Resources/images/options_start_conference_disabled@2x.png b/Resources/images/options_start_conference_disabled@2x.png deleted file mode 100644 index 25bf4e9c8..000000000 Binary files a/Resources/images/options_start_conference_disabled@2x.png and /dev/null differ diff --git a/Resources/images/options_transfer_call_default.png b/Resources/images/options_transfer_call_default.png deleted file mode 100644 index aaeb9b671..000000000 Binary files a/Resources/images/options_transfer_call_default.png and /dev/null differ diff --git a/Resources/images/options_transfer_call_default@2x.png b/Resources/images/options_transfer_call_default@2x.png deleted file mode 100644 index 1ead36be0..000000000 Binary files a/Resources/images/options_transfer_call_default@2x.png and /dev/null differ diff --git a/Resources/images/options_transfer_call_disabled.png b/Resources/images/options_transfer_call_disabled.png deleted file mode 100644 index 682eb335b..000000000 Binary files a/Resources/images/options_transfer_call_disabled.png and /dev/null differ diff --git a/Resources/images/options_transfer_call_disabled@2x.png b/Resources/images/options_transfer_call_disabled@2x.png deleted file mode 100644 index 33b697cc5..000000000 Binary files a/Resources/images/options_transfer_call_disabled@2x.png and /dev/null differ diff --git a/Resources/images/pause_big_default.png b/Resources/images/pause_big_default.png deleted file mode 100644 index 82f3b472d..000000000 Binary files a/Resources/images/pause_big_default.png and /dev/null differ diff --git a/Resources/images/pause_big_default@2x.png b/Resources/images/pause_big_default@2x.png deleted file mode 100644 index 5e754cb48..000000000 Binary files a/Resources/images/pause_big_default@2x.png and /dev/null differ diff --git a/Resources/images/pause_big_disabled.png b/Resources/images/pause_big_disabled.png deleted file mode 100644 index 7cd8ac14f..000000000 Binary files a/Resources/images/pause_big_disabled.png and /dev/null differ diff --git a/Resources/images/pause_big_disabled@2x.png b/Resources/images/pause_big_disabled@2x.png deleted file mode 100644 index aebc2557d..000000000 Binary files a/Resources/images/pause_big_disabled@2x.png and /dev/null differ diff --git a/Resources/images/pause_big_over_selected.png b/Resources/images/pause_big_over_selected.png deleted file mode 100644 index c7e10bce6..000000000 Binary files a/Resources/images/pause_big_over_selected.png and /dev/null differ diff --git a/Resources/images/pause_big_over_selected@2x.png b/Resources/images/pause_big_over_selected@2x.png deleted file mode 100644 index dd51a1751..000000000 Binary files a/Resources/images/pause_big_over_selected@2x.png and /dev/null differ diff --git a/Resources/images/pause_small_default.png b/Resources/images/pause_small_default.png deleted file mode 100644 index 1345d121d..000000000 Binary files a/Resources/images/pause_small_default.png and /dev/null differ diff --git a/Resources/images/pause_small_default@2x.png b/Resources/images/pause_small_default@2x.png deleted file mode 100644 index 2dfa7f88b..000000000 Binary files a/Resources/images/pause_small_default@2x.png and /dev/null differ diff --git a/Resources/images/pause_small_disabled.png b/Resources/images/pause_small_disabled.png deleted file mode 100644 index 91f0d0685..000000000 Binary files a/Resources/images/pause_small_disabled.png and /dev/null differ diff --git a/Resources/images/pause_small_disabled@2x.png b/Resources/images/pause_small_disabled@2x.png deleted file mode 100644 index 64c812ab9..000000000 Binary files a/Resources/images/pause_small_disabled@2x.png and /dev/null differ diff --git a/Resources/images/pause_small_over_selected.png b/Resources/images/pause_small_over_selected.png deleted file mode 100644 index 5e50311cf..000000000 Binary files a/Resources/images/pause_small_over_selected.png and /dev/null differ diff --git a/Resources/images/pause_small_over_selected@2x.png b/Resources/images/pause_small_over_selected@2x.png deleted file mode 100644 index c4b98b07c..000000000 Binary files a/Resources/images/pause_small_over_selected@2x.png and /dev/null differ diff --git a/Resources/images/post_quantum_secure@3x.png b/Resources/images/post_quantum_secure@3x.png deleted file mode 100644 index 586933335..000000000 Binary files a/Resources/images/post_quantum_secure@3x.png and /dev/null differ diff --git a/Resources/images/presence_away.png b/Resources/images/presence_away.png deleted file mode 100644 index b6d121df7..000000000 Binary files a/Resources/images/presence_away.png and /dev/null differ diff --git a/Resources/images/presence_away@2x.png b/Resources/images/presence_away@2x.png deleted file mode 100644 index 0953e7499..000000000 Binary files a/Resources/images/presence_away@2x.png and /dev/null differ diff --git a/Resources/images/presence_offline.png b/Resources/images/presence_offline.png deleted file mode 100644 index c9cd3e70a..000000000 Binary files a/Resources/images/presence_offline.png and /dev/null differ diff --git a/Resources/images/presence_offline@2x.png b/Resources/images/presence_offline@2x.png deleted file mode 100644 index 5683041d9..000000000 Binary files a/Resources/images/presence_offline@2x.png and /dev/null differ diff --git a/Resources/images/presence_online.png b/Resources/images/presence_online.png deleted file mode 100644 index c50639c6c..000000000 Binary files a/Resources/images/presence_online.png and /dev/null differ diff --git a/Resources/images/presence_online@2x.png b/Resources/images/presence_online@2x.png deleted file mode 100644 index a6705b5ca..000000000 Binary files a/Resources/images/presence_online@2x.png and /dev/null differ diff --git a/Resources/images/presence_unregistered.png b/Resources/images/presence_unregistered.png deleted file mode 100644 index 03f2a68f1..000000000 Binary files a/Resources/images/presence_unregistered.png and /dev/null differ diff --git a/Resources/images/presence_unregistered@2x.png b/Resources/images/presence_unregistered@2x.png deleted file mode 100644 index 2c40cadbc..000000000 Binary files a/Resources/images/presence_unregistered@2x.png and /dev/null differ diff --git a/Resources/images/rec_off_default.png b/Resources/images/rec_off_default.png deleted file mode 100644 index 55ab37a87..000000000 Binary files a/Resources/images/rec_off_default.png and /dev/null differ diff --git a/Resources/images/rec_off_default@2x.png b/Resources/images/rec_off_default@2x.png deleted file mode 100644 index b41988ca6..000000000 Binary files a/Resources/images/rec_off_default@2x.png and /dev/null differ diff --git a/Resources/images/rec_on_default.png b/Resources/images/rec_on_default.png deleted file mode 100644 index a2db83deb..000000000 Binary files a/Resources/images/rec_on_default.png and /dev/null differ diff --git a/Resources/images/rec_on_default@2x.png b/Resources/images/rec_on_default@2x.png deleted file mode 100644 index 2a01c5973..000000000 Binary files a/Resources/images/rec_on_default@2x.png and /dev/null differ diff --git a/Resources/images/recording.png b/Resources/images/recording.png deleted file mode 100644 index a214abd94..000000000 Binary files a/Resources/images/recording.png and /dev/null differ diff --git a/Resources/images/recording@2x.png b/Resources/images/recording@2x.png deleted file mode 100644 index a8827fef9..000000000 Binary files a/Resources/images/recording@2x.png and /dev/null differ diff --git a/Resources/images/reply_cancel.png b/Resources/images/reply_cancel.png deleted file mode 100644 index 8156bd629..000000000 Binary files a/Resources/images/reply_cancel.png and /dev/null differ diff --git a/Resources/images/route_bluetooth_default.png b/Resources/images/route_bluetooth_default.png deleted file mode 100644 index 4d6cdd279..000000000 Binary files a/Resources/images/route_bluetooth_default.png and /dev/null differ diff --git a/Resources/images/route_bluetooth_default@2x.png b/Resources/images/route_bluetooth_default@2x.png deleted file mode 100644 index 1096856a0..000000000 Binary files a/Resources/images/route_bluetooth_default@2x.png and /dev/null differ diff --git a/Resources/images/route_bluetooth_disabled.png b/Resources/images/route_bluetooth_disabled.png deleted file mode 100644 index 29650c968..000000000 Binary files a/Resources/images/route_bluetooth_disabled.png and /dev/null differ diff --git a/Resources/images/route_bluetooth_disabled@2x.png b/Resources/images/route_bluetooth_disabled@2x.png deleted file mode 100644 index c6a041fed..000000000 Binary files a/Resources/images/route_bluetooth_disabled@2x.png and /dev/null differ diff --git a/Resources/images/route_bluetooth_selected.png b/Resources/images/route_bluetooth_selected.png deleted file mode 100644 index 35fa48395..000000000 Binary files a/Resources/images/route_bluetooth_selected.png and /dev/null differ diff --git a/Resources/images/route_bluetooth_selected@2x.png b/Resources/images/route_bluetooth_selected@2x.png deleted file mode 100644 index 42db039aa..000000000 Binary files a/Resources/images/route_bluetooth_selected@2x.png and /dev/null differ diff --git a/Resources/images/route_earpiece_default.png b/Resources/images/route_earpiece_default.png deleted file mode 100644 index c39fe06e0..000000000 Binary files a/Resources/images/route_earpiece_default.png and /dev/null differ diff --git a/Resources/images/route_earpiece_default@2x.png b/Resources/images/route_earpiece_default@2x.png deleted file mode 100644 index 7de006643..000000000 Binary files a/Resources/images/route_earpiece_default@2x.png and /dev/null differ diff --git a/Resources/images/route_earpiece_disabled.png b/Resources/images/route_earpiece_disabled.png deleted file mode 100644 index b432a8408..000000000 Binary files a/Resources/images/route_earpiece_disabled.png and /dev/null differ diff --git a/Resources/images/route_earpiece_disabled@2x.png b/Resources/images/route_earpiece_disabled@2x.png deleted file mode 100644 index e0cb3af8d..000000000 Binary files a/Resources/images/route_earpiece_disabled@2x.png and /dev/null differ diff --git a/Resources/images/route_earpiece_selected.png b/Resources/images/route_earpiece_selected.png deleted file mode 100644 index e44b80cc9..000000000 Binary files a/Resources/images/route_earpiece_selected.png and /dev/null differ diff --git a/Resources/images/route_earpiece_selected@2x.png b/Resources/images/route_earpiece_selected@2x.png deleted file mode 100644 index d30cc7852..000000000 Binary files a/Resources/images/route_earpiece_selected@2x.png and /dev/null differ diff --git a/Resources/images/route_speaker_default.png b/Resources/images/route_speaker_default.png deleted file mode 100644 index a61d89478..000000000 Binary files a/Resources/images/route_speaker_default.png and /dev/null differ diff --git a/Resources/images/route_speaker_default@2x.png b/Resources/images/route_speaker_default@2x.png deleted file mode 100644 index d5747f5d6..000000000 Binary files a/Resources/images/route_speaker_default@2x.png and /dev/null differ diff --git a/Resources/images/route_speaker_disabled.png b/Resources/images/route_speaker_disabled.png deleted file mode 100644 index c64f73534..000000000 Binary files a/Resources/images/route_speaker_disabled.png and /dev/null differ diff --git a/Resources/images/route_speaker_disabled@2x.png b/Resources/images/route_speaker_disabled@2x.png deleted file mode 100644 index 8f6a165ad..000000000 Binary files a/Resources/images/route_speaker_disabled@2x.png and /dev/null differ diff --git a/Resources/images/route_speaker_selected.png b/Resources/images/route_speaker_selected.png deleted file mode 100644 index 8f09449e6..000000000 Binary files a/Resources/images/route_speaker_selected.png and /dev/null differ diff --git a/Resources/images/route_speaker_selected@2x.png b/Resources/images/route_speaker_selected@2x.png deleted file mode 100644 index 39bebfc4e..000000000 Binary files a/Resources/images/route_speaker_selected@2x.png and /dev/null differ diff --git a/Resources/images/routes_default.png b/Resources/images/routes_default.png deleted file mode 100644 index f1b99cb17..000000000 Binary files a/Resources/images/routes_default.png and /dev/null differ diff --git a/Resources/images/routes_default@2x.png b/Resources/images/routes_default@2x.png deleted file mode 100644 index bdcd07438..000000000 Binary files a/Resources/images/routes_default@2x.png and /dev/null differ diff --git a/Resources/images/routes_disabled.png b/Resources/images/routes_disabled.png deleted file mode 100644 index 9f0235d12..000000000 Binary files a/Resources/images/routes_disabled.png and /dev/null differ diff --git a/Resources/images/routes_disabled@2x.png b/Resources/images/routes_disabled@2x.png deleted file mode 100644 index 2b2bb47b5..000000000 Binary files a/Resources/images/routes_disabled@2x.png and /dev/null differ diff --git a/Resources/images/routes_selected.png b/Resources/images/routes_selected.png deleted file mode 100644 index 41ee121f4..000000000 Binary files a/Resources/images/routes_selected.png and /dev/null differ diff --git a/Resources/images/routes_selected@2x.png b/Resources/images/routes_selected@2x.png deleted file mode 100644 index 9343021fc..000000000 Binary files a/Resources/images/routes_selected@2x.png and /dev/null differ diff --git a/Resources/images/scroll_to_bottom_default.png b/Resources/images/scroll_to_bottom_default.png deleted file mode 100644 index 3be410ae1..000000000 Binary files a/Resources/images/scroll_to_bottom_default.png and /dev/null differ diff --git a/Resources/images/security_1_indicator.png b/Resources/images/security_1_indicator.png deleted file mode 100644 index 0aa4a2e04..000000000 Binary files a/Resources/images/security_1_indicator.png and /dev/null differ diff --git a/Resources/images/security_1_indicator@2x.png b/Resources/images/security_1_indicator@2x.png deleted file mode 100644 index 0aa4a2e04..000000000 Binary files a/Resources/images/security_1_indicator@2x.png and /dev/null differ diff --git a/Resources/images/security_2_indicator.png b/Resources/images/security_2_indicator.png deleted file mode 100644 index 910e3d124..000000000 Binary files a/Resources/images/security_2_indicator.png and /dev/null differ diff --git a/Resources/images/security_2_indicator@2x.png b/Resources/images/security_2_indicator@2x.png deleted file mode 100644 index 910e3d124..000000000 Binary files a/Resources/images/security_2_indicator@2x.png and /dev/null differ diff --git a/Resources/images/security_alert_indicator.png b/Resources/images/security_alert_indicator.png deleted file mode 100644 index 54a340667..000000000 Binary files a/Resources/images/security_alert_indicator.png and /dev/null differ diff --git a/Resources/images/security_alert_indicator@2x.png b/Resources/images/security_alert_indicator@2x.png deleted file mode 100644 index 54a340667..000000000 Binary files a/Resources/images/security_alert_indicator@2x.png and /dev/null differ diff --git a/Resources/images/security_ko.png b/Resources/images/security_ko.png deleted file mode 100644 index 310239d52..000000000 Binary files a/Resources/images/security_ko.png and /dev/null differ diff --git a/Resources/images/security_ko@2x.png b/Resources/images/security_ko@2x.png deleted file mode 100644 index 9a8f162f0..000000000 Binary files a/Resources/images/security_ko@2x.png and /dev/null differ diff --git a/Resources/images/security_ok.png b/Resources/images/security_ok.png deleted file mode 100644 index 4e1715143..000000000 Binary files a/Resources/images/security_ok.png and /dev/null differ diff --git a/Resources/images/security_ok@2x.png b/Resources/images/security_ok@2x.png deleted file mode 100644 index c85e3f47c..000000000 Binary files a/Resources/images/security_ok@2x.png and /dev/null differ diff --git a/Resources/images/security_pending.png b/Resources/images/security_pending.png deleted file mode 100644 index abbc975c6..000000000 Binary files a/Resources/images/security_pending.png and /dev/null differ diff --git a/Resources/images/security_pending@2x.png b/Resources/images/security_pending@2x.png deleted file mode 100644 index 84771cf5f..000000000 Binary files a/Resources/images/security_pending@2x.png and /dev/null differ diff --git a/Resources/images/security_toogle_background_green.png b/Resources/images/security_toogle_background_green.png deleted file mode 100644 index 2a01da72e..000000000 Binary files a/Resources/images/security_toogle_background_green.png and /dev/null differ diff --git a/Resources/images/security_toogle_background_green@2x.png b/Resources/images/security_toogle_background_green@2x.png deleted file mode 100644 index 2a01da72e..000000000 Binary files a/Resources/images/security_toogle_background_green@2x.png and /dev/null differ diff --git a/Resources/images/security_toogle_background_grey.png b/Resources/images/security_toogle_background_grey.png deleted file mode 100644 index 6ff74ca8b..000000000 Binary files a/Resources/images/security_toogle_background_grey.png and /dev/null differ diff --git a/Resources/images/security_toogle_background_grey@2x.png b/Resources/images/security_toogle_background_grey@2x.png deleted file mode 100644 index 6ff74ca8b..000000000 Binary files a/Resources/images/security_toogle_background_grey@2x.png and /dev/null differ diff --git a/Resources/images/security_toogle_button.png b/Resources/images/security_toogle_button.png deleted file mode 100644 index b2d565561..000000000 Binary files a/Resources/images/security_toogle_button.png and /dev/null differ diff --git a/Resources/images/security_toogle_button@2x.png b/Resources/images/security_toogle_button@2x.png deleted file mode 100644 index b2d565561..000000000 Binary files a/Resources/images/security_toogle_button@2x.png and /dev/null differ diff --git a/Resources/images/security_toogle_icon_green.png b/Resources/images/security_toogle_icon_green.png deleted file mode 100644 index c8b537fe2..000000000 Binary files a/Resources/images/security_toogle_icon_green.png and /dev/null differ diff --git a/Resources/images/security_toogle_icon_green@2x.png b/Resources/images/security_toogle_icon_green@2x.png deleted file mode 100644 index 320dd4570..000000000 Binary files a/Resources/images/security_toogle_icon_green@2x.png and /dev/null differ diff --git a/Resources/images/security_toogle_icon_grey.png b/Resources/images/security_toogle_icon_grey.png deleted file mode 100644 index 61514c02b..000000000 Binary files a/Resources/images/security_toogle_icon_grey.png and /dev/null differ diff --git a/Resources/images/security_toogle_icon_grey@2x.png b/Resources/images/security_toogle_icon_grey@2x.png deleted file mode 100644 index 8627c1ab9..000000000 Binary files a/Resources/images/security_toogle_icon_grey@2x.png and /dev/null differ diff --git a/Resources/images/select_all_default.png b/Resources/images/select_all_default.png deleted file mode 100644 index eec578227..000000000 Binary files a/Resources/images/select_all_default.png and /dev/null differ diff --git a/Resources/images/select_all_default@2x.png b/Resources/images/select_all_default@2x.png deleted file mode 100644 index 24557bdd4..000000000 Binary files a/Resources/images/select_all_default@2x.png and /dev/null differ diff --git a/Resources/images/select_all_disabled.png b/Resources/images/select_all_disabled.png deleted file mode 100644 index a7cb3e387..000000000 Binary files a/Resources/images/select_all_disabled.png and /dev/null differ diff --git a/Resources/images/select_all_disabled@2x.png b/Resources/images/select_all_disabled@2x.png deleted file mode 100644 index a153faabe..000000000 Binary files a/Resources/images/select_all_disabled@2x.png and /dev/null differ diff --git a/Resources/images/side_menu_voip_meeting_schedule.png b/Resources/images/side_menu_voip_meeting_schedule.png deleted file mode 100644 index f3b77655f..000000000 Binary files a/Resources/images/side_menu_voip_meeting_schedule.png and /dev/null differ diff --git a/Resources/images/side_menu_voip_meeting_schedule@2x.png b/Resources/images/side_menu_voip_meeting_schedule@2x.png deleted file mode 100644 index c714829bb..000000000 Binary files a/Resources/images/side_menu_voip_meeting_schedule@2x.png and /dev/null differ diff --git a/Resources/images/speaker_default.png b/Resources/images/speaker_default.png deleted file mode 100644 index a61d89478..000000000 Binary files a/Resources/images/speaker_default.png and /dev/null differ diff --git a/Resources/images/speaker_default@2x.png b/Resources/images/speaker_default@2x.png deleted file mode 100644 index d5747f5d6..000000000 Binary files a/Resources/images/speaker_default@2x.png and /dev/null differ diff --git a/Resources/images/speaker_disabled.png b/Resources/images/speaker_disabled.png deleted file mode 100644 index 3e6230eb7..000000000 Binary files a/Resources/images/speaker_disabled.png and /dev/null differ diff --git a/Resources/images/speaker_disabled@2x.png b/Resources/images/speaker_disabled@2x.png deleted file mode 100644 index 7ab9b5b64..000000000 Binary files a/Resources/images/speaker_disabled@2x.png and /dev/null differ diff --git a/Resources/images/speaker_selected.png b/Resources/images/speaker_selected.png deleted file mode 100644 index 6e9a447b1..000000000 Binary files a/Resources/images/speaker_selected.png and /dev/null differ diff --git a/Resources/images/speaker_selected@2x.png b/Resources/images/speaker_selected@2x.png deleted file mode 100644 index 598b63a47..000000000 Binary files a/Resources/images/speaker_selected@2x.png and /dev/null differ diff --git a/Resources/images/splashscreen.png b/Resources/images/splashscreen.png deleted file mode 100644 index e6f98a8d6..000000000 Binary files a/Resources/images/splashscreen.png and /dev/null differ diff --git a/Resources/images/splashscreen@2x.png b/Resources/images/splashscreen@2x.png deleted file mode 100644 index 1319b26c9..000000000 Binary files a/Resources/images/splashscreen@2x.png and /dev/null differ diff --git a/Resources/images/valid_default.png b/Resources/images/valid_default.png deleted file mode 100644 index 268f6454c..000000000 Binary files a/Resources/images/valid_default.png and /dev/null differ diff --git a/Resources/images/valid_default@2x.png b/Resources/images/valid_default@2x.png deleted file mode 100644 index 74b701dd8..000000000 Binary files a/Resources/images/valid_default@2x.png and /dev/null differ diff --git a/Resources/images/valid_disabled.png b/Resources/images/valid_disabled.png deleted file mode 100644 index 0da05c2ea..000000000 Binary files a/Resources/images/valid_disabled.png and /dev/null differ diff --git a/Resources/images/valid_disabled@2x.png b/Resources/images/valid_disabled@2x.png deleted file mode 100644 index e12c02d44..000000000 Binary files a/Resources/images/valid_disabled@2x.png and /dev/null differ diff --git a/Resources/images/voicemail.png b/Resources/images/voicemail.png deleted file mode 100644 index 26949d26e..000000000 Binary files a/Resources/images/voicemail.png and /dev/null differ diff --git a/Resources/images/voicemail@2x.png b/Resources/images/voicemail@2x.png deleted file mode 100644 index 8ccd54ffc..000000000 Binary files a/Resources/images/voicemail@2x.png and /dev/null differ diff --git a/Resources/images/voip_audio_routes.png b/Resources/images/voip_audio_routes.png deleted file mode 100644 index fae4e84e3..000000000 Binary files a/Resources/images/voip_audio_routes.png and /dev/null differ diff --git a/Resources/images/voip_bluetooth.png b/Resources/images/voip_bluetooth.png deleted file mode 100644 index 3010fb418..000000000 Binary files a/Resources/images/voip_bluetooth.png and /dev/null differ diff --git a/Resources/images/voip_call.png b/Resources/images/voip_call.png deleted file mode 100644 index 1a95c052e..000000000 Binary files a/Resources/images/voip_call.png and /dev/null differ diff --git a/Resources/images/voip_call_add.png b/Resources/images/voip_call_add.png deleted file mode 100644 index f4d80e5f5..000000000 Binary files a/Resources/images/voip_call_add.png and /dev/null differ diff --git a/Resources/images/voip_call_chat.png b/Resources/images/voip_call_chat.png deleted file mode 100644 index 4ff01de6f..000000000 Binary files a/Resources/images/voip_call_chat.png and /dev/null differ diff --git a/Resources/images/voip_call_forward.png b/Resources/images/voip_call_forward.png deleted file mode 100644 index 46a319028..000000000 Binary files a/Resources/images/voip_call_forward.png and /dev/null differ diff --git a/Resources/images/voip_call_header_active.png b/Resources/images/voip_call_header_active.png deleted file mode 100644 index 3ef0106bc..000000000 Binary files a/Resources/images/voip_call_header_active.png and /dev/null differ diff --git a/Resources/images/voip_call_header_incoming.png b/Resources/images/voip_call_header_incoming.png deleted file mode 100644 index 7a8d458ad..000000000 Binary files a/Resources/images/voip_call_header_incoming.png and /dev/null differ diff --git a/Resources/images/voip_call_header_outgoing.png b/Resources/images/voip_call_header_outgoing.png deleted file mode 100644 index 474abe754..000000000 Binary files a/Resources/images/voip_call_header_outgoing.png and /dev/null differ diff --git a/Resources/images/voip_call_header_paused.png b/Resources/images/voip_call_header_paused.png deleted file mode 100644 index fdcfaf5d2..000000000 Binary files a/Resources/images/voip_call_header_paused.png and /dev/null differ diff --git a/Resources/images/voip_call_list_menu.png b/Resources/images/voip_call_list_menu.png deleted file mode 100644 index b4e2ff3bf..000000000 Binary files a/Resources/images/voip_call_list_menu.png and /dev/null differ diff --git a/Resources/images/voip_call_more.png b/Resources/images/voip_call_more.png deleted file mode 100644 index 73bb13b36..000000000 Binary files a/Resources/images/voip_call_more.png and /dev/null differ diff --git a/Resources/images/voip_call_numpad.png b/Resources/images/voip_call_numpad.png deleted file mode 100644 index a0fd33835..000000000 Binary files a/Resources/images/voip_call_numpad.png and /dev/null differ diff --git a/Resources/images/voip_call_participants.png b/Resources/images/voip_call_participants.png deleted file mode 100644 index b2b766b14..000000000 Binary files a/Resources/images/voip_call_participants.png and /dev/null differ diff --git a/Resources/images/voip_call_record.png b/Resources/images/voip_call_record.png deleted file mode 100644 index 9c392dc47..000000000 Binary files a/Resources/images/voip_call_record.png and /dev/null differ diff --git a/Resources/images/voip_call_stats.png b/Resources/images/voip_call_stats.png deleted file mode 100644 index 3dd39d43b..000000000 Binary files a/Resources/images/voip_call_stats.png and /dev/null differ diff --git a/Resources/images/voip_calls_list.png b/Resources/images/voip_calls_list.png deleted file mode 100644 index a832384ca..000000000 Binary files a/Resources/images/voip_calls_list.png and /dev/null differ diff --git a/Resources/images/voip_camera_off.png b/Resources/images/voip_camera_off.png deleted file mode 100644 index dd41c338b..000000000 Binary files a/Resources/images/voip_camera_off.png and /dev/null differ diff --git a/Resources/images/voip_camera_on.png b/Resources/images/voip_camera_on.png deleted file mode 100644 index 7109c577d..000000000 Binary files a/Resources/images/voip_camera_on.png and /dev/null differ diff --git a/Resources/images/voip_cancel.png b/Resources/images/voip_cancel.png deleted file mode 100644 index 493b35e79..000000000 Binary files a/Resources/images/voip_cancel.png and /dev/null differ diff --git a/Resources/images/voip_change_camera.png b/Resources/images/voip_change_camera.png deleted file mode 100644 index d6dc15cb8..000000000 Binary files a/Resources/images/voip_change_camera.png and /dev/null differ diff --git a/Resources/images/voip_chat_rooms_list.png b/Resources/images/voip_chat_rooms_list.png deleted file mode 100644 index edf722c7e..000000000 Binary files a/Resources/images/voip_chat_rooms_list.png and /dev/null differ diff --git a/Resources/images/voip_checkbox_checked.png b/Resources/images/voip_checkbox_checked.png deleted file mode 100644 index 042f73d9d..000000000 Binary files a/Resources/images/voip_checkbox_checked.png and /dev/null differ diff --git a/Resources/images/voip_checkbox_unchecked.png b/Resources/images/voip_checkbox_unchecked.png deleted file mode 100644 index b01cbcb1e..000000000 Binary files a/Resources/images/voip_checkbox_unchecked.png and /dev/null differ diff --git a/Resources/images/voip_conference_active_speaker.png b/Resources/images/voip_conference_active_speaker.png deleted file mode 100644 index 18f21106a..000000000 Binary files a/Resources/images/voip_conference_active_speaker.png and /dev/null differ diff --git a/Resources/images/voip_conference_audio_only.png b/Resources/images/voip_conference_audio_only.png deleted file mode 100644 index fd57a3f27..000000000 Binary files a/Resources/images/voip_conference_audio_only.png and /dev/null differ diff --git a/Resources/images/voip_conference_mosaic.png b/Resources/images/voip_conference_mosaic.png deleted file mode 100644 index 8fa0137b7..000000000 Binary files a/Resources/images/voip_conference_mosaic.png and /dev/null differ diff --git a/Resources/images/voip_conference_new.png b/Resources/images/voip_conference_new.png deleted file mode 100644 index 8985782ae..000000000 Binary files a/Resources/images/voip_conference_new.png and /dev/null differ diff --git a/Resources/images/voip_conference_new_selected.png b/Resources/images/voip_conference_new_selected.png deleted file mode 100644 index 54ea3e2b0..000000000 Binary files a/Resources/images/voip_conference_new_selected.png and /dev/null differ diff --git a/Resources/images/voip_conference_paused_big.png b/Resources/images/voip_conference_paused_big.png deleted file mode 100644 index 745f17220..000000000 Binary files a/Resources/images/voip_conference_paused_big.png and /dev/null differ diff --git a/Resources/images/voip_conference_play_big.png b/Resources/images/voip_conference_play_big.png deleted file mode 100644 index 303d05faa..000000000 Binary files a/Resources/images/voip_conference_play_big.png and /dev/null differ diff --git a/Resources/images/voip_copy.png b/Resources/images/voip_copy.png deleted file mode 100644 index 43639693e..000000000 Binary files a/Resources/images/voip_copy.png and /dev/null differ diff --git a/Resources/images/voip_delete.png b/Resources/images/voip_delete.png deleted file mode 100644 index 3022d156d..000000000 Binary files a/Resources/images/voip_delete.png and /dev/null differ diff --git a/Resources/images/voip_dropdown.png b/Resources/images/voip_dropdown.png deleted file mode 100644 index d9fccac91..000000000 Binary files a/Resources/images/voip_dropdown.png and /dev/null differ diff --git a/Resources/images/voip_earpiece.png b/Resources/images/voip_earpiece.png deleted file mode 100644 index e95a30801..000000000 Binary files a/Resources/images/voip_earpiece.png and /dev/null differ diff --git a/Resources/images/voip_edit.png b/Resources/images/voip_edit.png deleted file mode 100644 index c24930212..000000000 Binary files a/Resources/images/voip_edit.png and /dev/null differ diff --git a/Resources/images/voip_export.png b/Resources/images/voip_export.png deleted file mode 100644 index 3fdfa078a..000000000 Binary files a/Resources/images/voip_export.png and /dev/null differ diff --git a/Resources/images/voip_hangup.png b/Resources/images/voip_hangup.png deleted file mode 100644 index a2ceab5d8..000000000 Binary files a/Resources/images/voip_hangup.png and /dev/null differ diff --git a/Resources/images/voip_info.png b/Resources/images/voip_info.png deleted file mode 100644 index ae8dd86f8..000000000 Binary files a/Resources/images/voip_info.png and /dev/null differ diff --git a/Resources/images/voip_mandatory.png b/Resources/images/voip_mandatory.png deleted file mode 100644 index 4be37f7e4..000000000 Binary files a/Resources/images/voip_mandatory.png and /dev/null differ diff --git a/Resources/images/voip_meeting_schedule.png b/Resources/images/voip_meeting_schedule.png deleted file mode 100644 index 168e3460f..000000000 Binary files a/Resources/images/voip_meeting_schedule.png and /dev/null differ diff --git a/Resources/images/voip_menu_more.png b/Resources/images/voip_menu_more.png deleted file mode 100644 index 7f7f7d8fd..000000000 Binary files a/Resources/images/voip_menu_more.png and /dev/null differ diff --git a/Resources/images/voip_merge_calls.png b/Resources/images/voip_merge_calls.png deleted file mode 100644 index 6c4da5988..000000000 Binary files a/Resources/images/voip_merge_calls.png and /dev/null differ diff --git a/Resources/images/voip_micro_off.png b/Resources/images/voip_micro_off.png deleted file mode 100644 index 57569b4f2..000000000 Binary files a/Resources/images/voip_micro_off.png and /dev/null differ diff --git a/Resources/images/voip_micro_on.png b/Resources/images/voip_micro_on.png deleted file mode 100644 index 6552d35d5..000000000 Binary files a/Resources/images/voip_micro_on.png and /dev/null differ diff --git a/Resources/images/voip_multiple_contacts_avatar.png b/Resources/images/voip_multiple_contacts_avatar.png deleted file mode 100644 index 78b10f11b..000000000 Binary files a/Resources/images/voip_multiple_contacts_avatar.png and /dev/null differ diff --git a/Resources/images/voip_numpad_0.png b/Resources/images/voip_numpad_0.png deleted file mode 100644 index 115bdb17d..000000000 Binary files a/Resources/images/voip_numpad_0.png and /dev/null differ diff --git a/Resources/images/voip_numpad_1.png b/Resources/images/voip_numpad_1.png deleted file mode 100644 index 4d8b7f5cc..000000000 Binary files a/Resources/images/voip_numpad_1.png and /dev/null differ diff --git a/Resources/images/voip_numpad_2.png b/Resources/images/voip_numpad_2.png deleted file mode 100644 index 6b561c468..000000000 Binary files a/Resources/images/voip_numpad_2.png and /dev/null differ diff --git a/Resources/images/voip_numpad_3.png b/Resources/images/voip_numpad_3.png deleted file mode 100644 index 386715586..000000000 Binary files a/Resources/images/voip_numpad_3.png and /dev/null differ diff --git a/Resources/images/voip_numpad_4.png b/Resources/images/voip_numpad_4.png deleted file mode 100644 index e3dfdcc51..000000000 Binary files a/Resources/images/voip_numpad_4.png and /dev/null differ diff --git a/Resources/images/voip_numpad_5.png b/Resources/images/voip_numpad_5.png deleted file mode 100644 index a18af28e5..000000000 Binary files a/Resources/images/voip_numpad_5.png and /dev/null differ diff --git a/Resources/images/voip_numpad_6.png b/Resources/images/voip_numpad_6.png deleted file mode 100644 index 79279cb99..000000000 Binary files a/Resources/images/voip_numpad_6.png and /dev/null differ diff --git a/Resources/images/voip_numpad_7.png b/Resources/images/voip_numpad_7.png deleted file mode 100644 index c68656fd3..000000000 Binary files a/Resources/images/voip_numpad_7.png and /dev/null differ diff --git a/Resources/images/voip_numpad_8.png b/Resources/images/voip_numpad_8.png deleted file mode 100644 index 8d84c96ba..000000000 Binary files a/Resources/images/voip_numpad_8.png and /dev/null differ diff --git a/Resources/images/voip_numpad_9.png b/Resources/images/voip_numpad_9.png deleted file mode 100644 index af3e0e0bf..000000000 Binary files a/Resources/images/voip_numpad_9.png and /dev/null differ diff --git a/Resources/images/voip_numpad_hash.png b/Resources/images/voip_numpad_hash.png deleted file mode 100644 index 790e7d12e..000000000 Binary files a/Resources/images/voip_numpad_hash.png and /dev/null differ diff --git a/Resources/images/voip_numpad_star.png b/Resources/images/voip_numpad_star.png deleted file mode 100644 index 5a2649de4..000000000 Binary files a/Resources/images/voip_numpad_star.png and /dev/null differ diff --git a/Resources/images/voip_pause.png b/Resources/images/voip_pause.png deleted file mode 100644 index e888da937..000000000 Binary files a/Resources/images/voip_pause.png and /dev/null differ diff --git a/Resources/images/voip_radio_off.png b/Resources/images/voip_radio_off.png deleted file mode 100644 index b703dea80..000000000 Binary files a/Resources/images/voip_radio_off.png and /dev/null differ diff --git a/Resources/images/voip_radio_on.png b/Resources/images/voip_radio_on.png deleted file mode 100644 index feaf00e11..000000000 Binary files a/Resources/images/voip_radio_on.png and /dev/null differ diff --git a/Resources/images/voip_remote_recording.png b/Resources/images/voip_remote_recording.png deleted file mode 100644 index 3e4e94009..000000000 Binary files a/Resources/images/voip_remote_recording.png and /dev/null differ diff --git a/Resources/images/voip_single_contact_avatar.png b/Resources/images/voip_single_contact_avatar.png deleted file mode 100644 index 5d158fa49..000000000 Binary files a/Resources/images/voip_single_contact_avatar.png and /dev/null differ diff --git a/Resources/images/voip_speaker_off.png b/Resources/images/voip_speaker_off.png deleted file mode 100644 index c018c9899..000000000 Binary files a/Resources/images/voip_speaker_off.png and /dev/null differ diff --git a/Resources/images/voip_speaker_on.png b/Resources/images/voip_speaker_on.png deleted file mode 100644 index 07f13c9b6..000000000 Binary files a/Resources/images/voip_speaker_on.png and /dev/null differ diff --git a/Resources/images/voip_spinner.png b/Resources/images/voip_spinner.png deleted file mode 100644 index 8238de56b..000000000 Binary files a/Resources/images/voip_spinner.png and /dev/null differ diff --git a/Resources/images/vr_off.png b/Resources/images/vr_off.png deleted file mode 100644 index 5f319e5c8..000000000 Binary files a/Resources/images/vr_off.png and /dev/null differ diff --git a/Resources/images/vr_on.png b/Resources/images/vr_on.png deleted file mode 100644 index 9fd24b67c..000000000 Binary files a/Resources/images/vr_on.png and /dev/null differ diff --git a/Resources/images/vr_pause.png b/Resources/images/vr_pause.png deleted file mode 100644 index af2d89acc..000000000 Binary files a/Resources/images/vr_pause.png and /dev/null differ diff --git a/Resources/images/vr_play.png b/Resources/images/vr_play.png deleted file mode 100644 index 6de2686f0..000000000 Binary files a/Resources/images/vr_play.png and /dev/null differ diff --git a/Resources/images/vr_stop.png b/Resources/images/vr_stop.png deleted file mode 100644 index 6574a7d56..000000000 Binary files a/Resources/images/vr_stop.png and /dev/null differ diff --git a/Resources/images/vr_wave.png b/Resources/images/vr_wave.png deleted file mode 100644 index 26d7f1be7..000000000 Binary files a/Resources/images/vr_wave.png and /dev/null differ diff --git a/Resources/images/waiting_time.png b/Resources/images/waiting_time.png deleted file mode 100644 index bd9d66d47..000000000 Binary files a/Resources/images/waiting_time.png and /dev/null differ diff --git a/Resources/images/waiting_time@2x.png b/Resources/images/waiting_time@2x.png deleted file mode 100644 index d604ce27e..000000000 Binary files a/Resources/images/waiting_time@2x.png and /dev/null differ diff --git a/Resources/it.lproj/Localizable.strings b/Resources/it.lproj/Localizable.strings deleted file mode 100644 index ed4cd0380..000000000 Binary files a/Resources/it.lproj/Localizable.strings and /dev/null differ diff --git a/Resources/ja.lproj/Localizable.strings b/Resources/ja.lproj/Localizable.strings deleted file mode 100644 index cc86bf100..000000000 Binary files a/Resources/ja.lproj/Localizable.strings and /dev/null differ diff --git a/Resources/ka.lproj/Localizable.strings b/Resources/ka.lproj/Localizable.strings deleted file mode 100644 index 484d6eebb..000000000 Binary files a/Resources/ka.lproj/Localizable.strings and /dev/null differ diff --git a/Resources/linphonerc b/Resources/linphonerc deleted file mode 100644 index e9646664c..000000000 --- a/Resources/linphonerc +++ /dev/null @@ -1,116 +0,0 @@ -[app] -animations_preference=1 -autoanswer_notif_preference=1 -backgroundmode_preference=1 -edge_opt_preference=0 -enable_log_collect=0 -file_transfer_migration_done=1 -ice_preference=1 -turn_preference=1 -preview_preference=0 -random_port_preference=1 -start_at_boot_preference=1 -stun_preference=stun.linphone.org -voiceproc_preference=1 -repeat_call_notification=1 -display_phone_only=0 -auto_download_incoming_files_max_size=0 -lime_migration_done=0 -use_rls_presence=1 -use_callkit=1 -use_in_app_file_viewer_for_non_encrypted_files=0 -unexpected_pushkit=0 -force_lime_chat_rooms=0 -disable_chat_feature=0 -disable_video_feature=0 - -enable_native_address_book=1 -read_only_native_address_book=0 -only_show_sip_contacts_list=0 -hide_sip_contacts_list=0 - -enable_broadcast_conference_feature=0 - -[in_app_purchase] -#set to 1 if in-app purchases are to be shown in the application -enabled=0 - -#specify here the id of the sip account in-app purchase service to be shown in the shop section of the app -paid_account_id=sipAccount_12m - -#the url of the inapp/account management server, for submitting the receipt and validating the account. -receipt_validation_url=https://subscribe.linphone.org:444/inapp.php - -#for future use, to specify the full list of paying services to show in the shop view -products_list=sipAccount_12m,sipAccount_6m - -#minimum period of time between notifications to the user about his expiring/expired account, in seconds. -expiry_check_period=30 - -#period of time before account expiry, to start notifying the user about expiration arriving, in seconds. -warn_before_expiry_period=160 - -#for test only, simulate an account expiry after the specified number of seconds -expiry_time_test=180 - -#save temporarily the receipt for any purchase in case of XMLRPC server error -save_tmp_receipt=0 - -[default_values] -reg_expires=1314000 - -[misc] -file_transfer_server_url=https://www.linphone.org:444/lft.php -log_collection_upload_server_url=https://www.linphone.org:444/lft.php -real_early_media=1 -prefer_basic_chat_room=-1 -conference_layout=1 - -[net] -edge_bw=10 -edge_ping_time=10 -firewall_policy=ice -mtu=1300 -stun_server=stun.linphone.org - -[rtp] -audio_jitt_comp=60 -audio_rtp_port=7200-7299 -nortp_timeout=30 -video_jitt_comp=60 -video_rtp_port=9200-9299 - -[sip] -update_presence_model_timestamp_before_publish_expires_refresh=1 -contact="Linphone iPhone" -guess_hostname=1 -inc_timeout=45 -keepalive_period=30000 -ping_with_options=0 -register_only_when_network_is_up=1 -rtcp_xr_enabled=1 -rtcp_xr_rcvr_rtt_max_size=10000 -rtcp_xr_rcvr_rtt_mode=all -rtcp_xr_stat_summary_enabled=1 -rtcp_xr_voip_metrics_enabled=1 -sip_port=-1 -sip_tcp_port=-1 -use_info=0 -deliver_imdn=1 - -[sound] -capture_dev_id=AU: Audio Unit Receiver -eq_active=0 -playback_dev_id=AU: Audio Unit Receiver - -[video] -automatically_accept=0 -automatically_initiate=0 -capture=1 -display=1 -enabled=1 -show_local=0 -size=vga - -[account_creator] -backend=1 diff --git a/Resources/linphonerc-factory b/Resources/linphonerc-factory deleted file mode 100644 index 5a31c8a98..000000000 --- a/Resources/linphonerc-factory +++ /dev/null @@ -1,61 +0,0 @@ -[app] -#time in second between each link account popup -link_account_popup_time=86400 - -#Hide in the assistant the button to configure an external SIP account. -hide_assistant_custom_account=0 - -#Hide in the assistant the button to create a new SIP account -hide_assistant_create_account=0 - -#Hide in the assistant the logo -show_assistant_logo_in_choice_view_preference=0 - -#Hide in the assistant the button to fetch a remote configuration -show_remote_provisioning_in_assistant=0 - -#contact_display_username_only=1 -#contact_filter_on_default_domain=1 -#debug_popup_magic=**00** -debug_popup_email=linphone-iphone@belledonne-communications.com -send_logs_include_linphonerc_and_chathistory=0 -#use_phone_number=0 -publish_presence=0 -backgroundmode_preference=1 -use_rls_presence=1 -use_callkit=1 -use_in_app_file_viewer_for_non_encrypted_files=0 - -accept_early_media=0 - -force_lime_chat_rooms=0 -disable_chat_feature=0 -enable_native_address_book=1 - -hide_link_phone_number=0 -send_db=0 - -[rtp] -accept_any_encryption=1 - -[sip] -deliver_imdn=1 -linphone_specs=groupchat,lime -zrtp_key_agreements_suites=MS_ZRTP_KEY_AGREEMENT_K255_KYB512 - -[misc] -version_check_url_root=https://linphone.org/releases -prefer_basic_chat_room=-1 - - -[sound] -eq_location=mic - -[account_creator] -backend=1 -url=https://subscribe.linphone.org/api/ -# TODO: replace above URL by https://subscribe.linphone.org/api/ - -[video] -max_conference_size=vga - diff --git a/Resources/linphonerc~ipad b/Resources/linphonerc~ipad deleted file mode 100644 index 5f624a5ee..000000000 --- a/Resources/linphonerc~ipad +++ /dev/null @@ -1,69 +0,0 @@ -[app] -animations_preference=1 -autoanswer_notif_preference=1 -backgroundmode_preference=1 -edge_opt_preference=0 -enable_log_collect=0 -file_transfer_migration_done=1 -ice_preference=1 -turn_preference=1 -preview_preference=1 -random_port_preference=1 -start_at_boot_preference=1 -stun_preference=stun.linphone.org -voiceproc_preference=1 -repeat_call_notification=1 -use_callkit=1 -use_in_app_file_viewer_for_non_encrypted_files=0 -unexpected_pushkit=0 - -[default_values] -reg_expires=1314000 - -[misc] -file_transfer_server_url=https://www.linphone.org:444/lft.php -max_calls=3 - -[net] -edge_bw=10 -edge_ping_time=10 -firewall_policy=ice -mtu=1300 -stun_server=stun.linphone.org - -[rtp] -audio_jitt_comp=60 -audio_rtp_port=7200-7299 -nortp_timeout=30 -video_jitt_comp=60 -video_rtp_port=9200-9299 - -[sip] -contact="Linphone iPhone" -guess_hostname=1 -inc_timeout=45 -keepalive_period=30000 -ping_with_options=0 -register_only_when_network_is_up=1 -rtcp_xr_enabled=1 -rtcp_xr_rcvr_rtt_max_size=10000 -rtcp_xr_rcvr_rtt_mode=all -rtcp_xr_stat_summary_enabled=1 -rtcp_xr_voip_metrics_enabled=1 -sip_port=-1 -sip_tcp_port=-1 -use_info=0 - -[sound] -capture_dev_id=AU: Audio Unit Receiver -eq_active=0 -playback_dev_id=AU: Audio Unit Receiver - -[video] -automatically_accept=0 -automatically_initiate=0 -capture=1 -display=1 -enabled=1 -show_local=1 -size=vga diff --git a/Resources/nl.lproj/Localizable.strings b/Resources/nl.lproj/Localizable.strings deleted file mode 100644 index 53dc2d1ce..000000000 Binary files a/Resources/nl.lproj/Localizable.strings and /dev/null differ diff --git a/Resources/pl.lproj/Localizable.strings b/Resources/pl.lproj/Localizable.strings deleted file mode 100644 index f2105694a..000000000 Binary files a/Resources/pl.lproj/Localizable.strings and /dev/null differ diff --git a/Resources/pt_BR.lproj/Localizable.strings b/Resources/pt_BR.lproj/Localizable.strings deleted file mode 100644 index 29da40d06..000000000 Binary files a/Resources/pt_BR.lproj/Localizable.strings and /dev/null differ diff --git a/Resources/ru.lproj/Localizable.strings b/Resources/ru.lproj/Localizable.strings deleted file mode 100644 index 09e3d692b..000000000 Binary files a/Resources/ru.lproj/Localizable.strings and /dev/null differ diff --git a/Resources/sounds/hold.mkv b/Resources/sounds/hold.mkv deleted file mode 100644 index a3e00966f..000000000 Binary files a/Resources/sounds/hold.mkv and /dev/null differ diff --git a/Resources/sounds/msg.caf b/Resources/sounds/msg.caf deleted file mode 100644 index 9810a0390..000000000 Binary files a/Resources/sounds/msg.caf and /dev/null differ diff --git a/Resources/sounds/ringback.wav b/Resources/sounds/ringback.wav deleted file mode 100644 index 21f4b5bfb..000000000 Binary files a/Resources/sounds/ringback.wav and /dev/null differ diff --git a/Resources/sounds/ringtones/notes_of_the_optimistic.caf b/Resources/sounds/ringtones/notes_of_the_optimistic.caf deleted file mode 100644 index b9b42fee1..000000000 Binary files a/Resources/sounds/ringtones/notes_of_the_optimistic.caf and /dev/null differ diff --git a/Resources/sounds/shortring.caf b/Resources/sounds/shortring.caf deleted file mode 100644 index fb0b6205f..000000000 Binary files a/Resources/sounds/shortring.caf and /dev/null differ diff --git a/Resources/sv.lproj/Localizable.strings b/Resources/sv.lproj/Localizable.strings deleted file mode 100644 index f49e2e22b..000000000 Binary files a/Resources/sv.lproj/Localizable.strings and /dev/null differ diff --git a/Resources/tr.lproj/Localizable.strings b/Resources/tr.lproj/Localizable.strings deleted file mode 100644 index 763c44788..000000000 Binary files a/Resources/tr.lproj/Localizable.strings and /dev/null differ diff --git a/Resources/uk.lproj/Localizable.strings b/Resources/uk.lproj/Localizable.strings deleted file mode 100644 index 922fe1f1e..000000000 Binary files a/Resources/uk.lproj/Localizable.strings and /dev/null differ diff --git a/Resources/zh_CN.lproj/Localizable.strings b/Resources/zh_CN.lproj/Localizable.strings deleted file mode 100644 index 2368e0b97..000000000 Binary files a/Resources/zh_CN.lproj/Localizable.strings and /dev/null differ diff --git a/Resources/zh_TW.lproj/Localizable.strings b/Resources/zh_TW.lproj/Localizable.strings deleted file mode 100644 index 6bc719931..000000000 Binary files a/Resources/zh_TW.lproj/Localizable.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/Account.plist b/Settings/InAppSettings.bundle/Account.plist deleted file mode 100644 index 3e7005173..000000000 --- a/Settings/InAppSettings.bundle/Account.plist +++ /dev/null @@ -1,319 +0,0 @@ - - - - - PreferenceSpecifiers - - - Type - PSToggleSwitchSpecifier - Title - More options - Key - account_mandatory_advanced_preference - DefaultValue - - - - Type - PSToggleSwitchSpecifier - Title - Account enabled - Key - account_is_enabled_preference - DefaultValue - - - - Type - PSToggleSwitchSpecifier - Title - Default account - Key - account_is_default_preference - DefaultValue - - - - Title - Push Notification - Key - account_pushnotification_preference - Type - PSToggleSwitchSpecifier - DefaultValue - - - - AutocapitalizationType - None - AutocorrectionType - No - DefaultValue - - IASKTextAlignment - IASKUITextAlignmentRight - IsSecure - - Key - account_mandatory_username_preference - KeyboardType - Alphabet - Title - Username - Type - PSTextFieldSpecifier - - - AutocapitalizationType - None - AutocorrectionType - No - IASKTextAlignment - IASKUITextAlignmentRight - DefaultValue - - IsSecure - - Key - account_display_name_preference - KeyboardType - Alphabet - Title - Display name - Type - PSTextFieldSpecifier - - - AutocapitalizationType - None - AutocorrectionType - No - DefaultValue - - IASKTextAlignment - IASKUITextAlignmentRight - IsSecure - - Key - account_userid_preference - KeyboardType - Alphabet - Title - User ID - Type - PSTextFieldSpecifier - - - IASKTextAlignment - IASKUITextAlignmentRight - AutocapitalizationType - None - AutocorrectionType - No - DefaultValue - - IsSecure - - Key - account_mandatory_password_preference - KeyboardType - Alphabet - Title - Password - Type - PSTextFieldSpecifier - - - AutocapitalizationType - None - IASKTextAlignment - IASKUITextAlignmentRight - AutocorrectionType - No - DefaultValue - - IsSecure - - Key - account_mandatory_domain_preference - KeyboardType - URL - Title - Domain - Type - PSTextFieldSpecifier - - - AutocapitalizationType - None - IASKTextAlignment - IASKUITextAlignmentRight - AutocorrectionType - No - DefaultValue - - IsSecure - - Key - account_proxy_preference - KeyboardType - URL - Title - Proxy - Type - PSTextFieldSpecifier - - - DefaultValue - udp - Key - account_transport_preference - Title - Transport - Titles - - UDP - TCP - TLS - - Type - PSMultiValueSpecifier - Values - - udp - tcp - tls - - - - Key - account_stun_preference - Title - Stun Server - Type - PSTextFieldSpecifier - AutocapitalizationType - None - AutocorrectionType - No - DefaultValue - - IASKTextAlignment - IASKUITextAlignmentRight - - - Title - ICE - Key - account_ice_preference - Type - PSToggleSwitchSpecifier - DefaultValue - - - - Title - Outbound proxy - DefaultValue - - Key - account_outbound_proxy_preference - Type - PSToggleSwitchSpecifier - - - Title - AVPF - DefaultValue - - Key - account_avpf_preference - Type - PSToggleSwitchSpecifier - - - Key - account_expire_preference - Title - Expire - Type - PSTextFieldSpecifier - AutocapitalizationType - None - AutocorrectionType - No - KeyboardType - NumberPad - DefaultValue - 600 - IASKTextAlignment - IASKUITextAlignmentRight - - - AutocapitalizationType - None - AutocorrectionType - No - DefaultValue - - IsSecure - - Key - account_prefix_preference - Title - Country code prefix - Type - PSTextFieldSpecifier - IASKTextAlignment - IASKUITextAlignmentRight - - - DefaultValue - - Key - apply_international_prefix_for_calls_and_chats - Title - Apply prefix for outgoing calls and chat - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - account_substitute_+_by_00_preference - Title - Substitute + in phone numbers - Type - PSToggleSwitchSpecifier - - - Title - Bundle Mode - Key - account_bundle_mode_preference - Type - PSToggleSwitchSpecifier - DefaultValue - - - - Key - account_mandatory_change_password - Title - Change password - Type - IASKButtonSpecifier - - - Key - account_mandatory_remove_button - Title - Remove Account - Type - IASKButtonSpecifier - - - - diff --git a/Settings/InAppSettings.bundle/Advanced.plist b/Settings/InAppSettings.bundle/Advanced.plist deleted file mode 100644 index 5c2c5b8f3..000000000 --- a/Settings/InAppSettings.bundle/Advanced.plist +++ /dev/null @@ -1,217 +0,0 @@ - - - - - PreferenceSpecifiers - - - Title - Presence - Type - PSGroupSpecifier - - - Type - PSToggleSwitchSpecifier - Title - Enable smart address book - Key - use_rls_presence - DefaultValue - YES - - - Title - Debug - Type - PSGroupSpecifier - - - DefaultValue - 0 - Key - debugenable_preference - Title - Debug - Titles - - None - Application only - Application and libraries warnings - All - - Type - PSMultiValueSpecifier - Values - - 0 - 32 - 8 - 1 - - - - Key - send_logs_button - Title - Send Logs - Type - IASKButtonSpecifier - - - Key - reset_logs_button - Title - Clear Logs - Type - IASKButtonSpecifier - - - Key - send_db_button - Title - Send Databases - Type - IASKButtonSpecifier - - - Title - Notifications - Type - PSGroupSpecifier - - - DefaultValue - - Key - show_msg_in_notif - Title - Show message in notification - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - autoanswer_notif_preference - Title - Auto-answer after notification - Type - PSToggleSwitchSpecifier - - - Title - Other - Type - PSGroupSpecifier - - - DefaultValue - - Key - animations_preference - Title - Animations - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - vfs_enabled_mode - Title - Encrypt everything - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - vfs_enabled - Title - File encryption is enabled - - - DefaultValue - - Key - start_at_boot_preference - Title - Start at boot - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - screenshot_preference - Title - Disable UI's secure mode (Screenshot) - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - enable_first_login_view_preference - Title - First login view - Type - PSToggleSwitchSpecifier - - - Title - Primary account - Type - PSGroupSpecifier - - - AutocapitalizationType - None - AutocorrectionType - No - DefaultValue - - IsSecure - - Key - primary_displayname_preference - New item - - KeyboardType - Alphabet - Title - Display name - Type - PSTextFieldSpecifier - IASKTextAlignment - IASKUITextAlignmentRight - - - AutocapitalizationType - None - AutocorrectionType - No - DefaultValue - - IsSecure - - Key - primary_username_preference - KeyboardType - Alphabet - Title - Username - Type - PSTextFieldSpecifier - IASKTextAlignment - IASKUITextAlignmentRight - - - - diff --git a/Settings/InAppSettings.bundle/Audio.plist b/Settings/InAppSettings.bundle/Audio.plist deleted file mode 100644 index 6a2b70e36..000000000 --- a/Settings/InAppSettings.bundle/Audio.plist +++ /dev/null @@ -1,301 +0,0 @@ - - - - - PreferenceSpecifiers - - - Title - Codecs - Type - PSGroupSpecifier - - - DefaultValue - - Key - speex_16k_preference - Title - Speex 16kHz - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - speex_8k_preference - Title - Speex 8kHz - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - opus_preference - Title - Opus 48kHz - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - silk_24k_preference - Title - Silk 24kHz - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - silk_16k_preference - Title - Silk 16kHz - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - aaceld_16k_preference - Title - AAC-ELD 16kHz - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - aaceld_22k_preference - Title - AAC-ELD 22kHz - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - aaceld_32k_preference - Title - AAC-ELD 32kHz - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - aaceld_44k_preference - Title - AAC-ELD 44kHz - Type - PSToggleSwitchSpecifier - - - New item - - DefaultValue - - Key - aaceld_48k_preference - Title - AAC-ELD 48kHz - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - amr_preference - Title - AMR - Type - PSToggleSwitchSpecifier - - - Title - BV16 - Key - bv16_preference - Type - PSToggleSwitchSpecifier - DefaultValue - NO - - - DefaultValue - - Key - g722_preference - Title - G.722 - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - g729_preference - Title - G.729 - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - gsm_preference - Title - GSM - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - ilbc_preference - Title - iLBC - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - isac_preference - Title - iSAC - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - pcmu_preference - Title - PCMU - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - pcma_preference - Title - PCMA - Type - PSToggleSwitchSpecifier - - - Key - codec2_preference - Title - codec2 - Type - PSToggleSwitchSpecifier - DefaultValue - - - - Key - audio_advanced_group - Title - Advanced - Type - PSGroupSpecifier - - - Key - playback_gain_preference - Title - Playback gain - Type - PSTextFieldSpecifier - KeyboardType - NumbersAndPunctuation - DefaultValue - 0 - IASKTextAlignment - IASKUITextAlignmentRight - - - Key - microphone_gain_preference - Title - Microphone gain - Type - PSTextFieldSpecifier - KeyboardType - NumbersAndPunctuation - DefaultValue - 0 - IASKTextAlignment - IASKUITextAlignmentRight - - - DefaultValue - 36 - Key - audio_codec_bitrate_limit_preference - Title - Codec bitrate limit - Titles - - 10 kbits/s - 15 kbits/s - 20 kbits/s - 36 kbits/s - 64 kbits/s - 128 kbits/s - - Type - PSMultiValueSpecifier - Values - - 10 - 15 - 20 - 36 - 64 - 128 - - - - DefaultValue - - Key - voiceproc_preference - Title - Enable Voice Processing - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - eq_active - Title - Enable Bass Boost - Type - PSToggleSwitchSpecifier - - - - diff --git a/Settings/InAppSettings.bundle/Call.plist b/Settings/InAppSettings.bundle/Call.plist deleted file mode 100644 index fe4541a0c..000000000 --- a/Settings/InAppSettings.bundle/Call.plist +++ /dev/null @@ -1,171 +0,0 @@ - - - - - PreferenceSpecifiers - - - Type - PSToggleSwitchSpecifier - Title - Use device ringtone - Key - use_device_ringtone - DefaultValue - - - - Type - PSToggleSwitchSpecifier - Title - Send inband DTMFs - Key - rfc_dtmf_preference - DefaultValue - - - - Type - PSToggleSwitchSpecifier - Title - Send SIP INFO DTMFs - Key - sipinfo_dtmf_preference - DefaultValue - - - - Key - incoming_call_timeout_preference - Title - Incoming call timeout - Type - PSTextFieldSpecifier - AutocapitalizationType - None - AutocorrectionType - No - KeyboardType - NumberPad - DefaultValue - 30 - IASKTextAlignment - IASKUITextAlignmentRight - - - Key - in_call_timeout_preference - Title - In call timeout - Type - PSTextFieldSpecifier - AutocapitalizationType - None - AutocorrectionType - No - KeyboardType - NumberPad - DefaultValue - 0 - IASKTextAlignment - IASKUITextAlignmentRight - - - Key - voice_mail_uri_preference - Title - Voice mail URI - AutocapitalizationType - None - AutocorrectionType - No - DefaultValue - - IsSecure - - Type - PSTextFieldSpecifier - IASKTextAlignment - IASKUITextAlignmentRight - - - DefaultValue - - Key - repeat_call_notification_preference - Title - Repeat call notification - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - media_encrption_mandatory_preference - Title - Media Encryption mandatory - Type - PSToggleSwitchSpecifier - - - DefaultValue - None - Key - media_encryption_preference - Title - Media Encryption - Titles - - None - SRTP - ZRTP - DTLS - - Type - PSMultiValueSpecifier - Values - - None - SRTP - ZRTP - DTLS - - - - DefaultValue - None - Key - media_encryption_preference_pq_enabled - Title - Media Encryption - Titles - - None - SRTP - ZRTP Post Quantum - DTLS - - Type - PSMultiValueSpecifier - Values - - None - SRTP - ZRTP - DTLS - - - - DefaultValue - - Key - pref_accept_early_media_preference - Title - Accept early-media - Type - PSToggleSwitchSpecifier - - - - diff --git a/Settings/InAppSettings.bundle/Chat.plist b/Settings/InAppSettings.bundle/Chat.plist deleted file mode 100644 index 498152fe4..000000000 --- a/Settings/InAppSettings.bundle/Chat.plist +++ /dev/null @@ -1,77 +0,0 @@ - - - - - PreferenceSpecifiers - - - DefaultValue - Never - Key - auto_download_mode - Title - Auto download incoming files policy - Titles - - Never - Always - If lighter than max size - - Type - PSMultiValueSpecifier - Values - - Never - Always - Customize - - - - DefaultValue - - Key - auto_write_to_gallery_mode - Title - Auto write to gallery - Type - PSToggleSwitchSpecifier - - - Key - auto_download_incoming_files_max_size - Title - Max size (in bytes) - DefaultValue - -1 - Type - PSTextFieldSpecifier - KeyboardType - NumbersAndPunctuation - IASKTextAlignment - IASKUITextAlignmentRight - - - Type - PSGroupSpecifier - Title - File sharing - - - AutocapitalizationType - None - AutocorrectionType - No - KeyboardType - URL - Type - PSTextFieldSpecifier - Title - Server URL - Key - file_transfer_server_url_preference - IASKTextAlignment - IASKUITextAlignmentRight - - - - diff --git a/Settings/InAppSettings.bundle/Contacts.plist b/Settings/InAppSettings.bundle/Contacts.plist deleted file mode 100644 index 4cbb1e6d1..000000000 --- a/Settings/InAppSettings.bundle/Contacts.plist +++ /dev/null @@ -1,83 +0,0 @@ - - - - - PreferenceSpecifiers - - - Title - Push Presence - Key - account_push_presence_preference - Type - PSToggleSwitchSpecifier - DefaultValue - - - - Title - LDAP configs - Type - PSGroupSpecifier - - - Key - new_ldap_button - Title - Add new LDAP config (5 max) - Type - IASKButtonSpecifier - - - Key - ldap_1 - File - LDAP - Title - LDAP 1 - Type - PSChildPaneSpecifier - - - Key - ldap_2 - File - LDAP - Title - LDAP 2 - Type - PSChildPaneSpecifier - - - Key - ldap_3 - File - LDAP - Title - LDAP 3 - Type - PSChildPaneSpecifier - - - Key - ldap_4 - File - LDAP - Title - LDAP 4 - Type - PSChildPaneSpecifier - - - Key - ldap_5 - File - LDAP - Title - LDAP 5 - Type - PSChildPaneSpecifier - - - - diff --git a/Settings/InAppSettings.bundle/LDAP.plist b/Settings/InAppSettings.bundle/LDAP.plist deleted file mode 100644 index 2e8ae294e..000000000 --- a/Settings/InAppSettings.bundle/LDAP.plist +++ /dev/null @@ -1,318 +0,0 @@ - - - - - PreferenceSpecifiers - - - Type - PSToggleSwitchSpecifier - Title - Enabled - Key - ldap_enabled - DefaultValue - - - - Key - ldap_remove_button - Title - Delete this LDAP config - Type - IASKButtonSpecifier - - - Title - Connexion - Type - PSGroupSpecifier - - - Key - ldap_server - Title - Server URL - Type - PSTextFieldSpecifier - AutocapitalizationType - None - AutocorrectionType - No - DefaultValue - - IASKTextAlignment - IASKUITextAlignmentRight - - - Key - ldap_bind_dn - Title - Bind DN - Type - PSTextFieldSpecifier - AutocapitalizationType - None - AutocorrectionType - No - DefaultValue - - IASKTextAlignment - IASKUITextAlignmentRight - - - IASKTextAlignment - IASKUITextAlignmentRight - AutocapitalizationType - None - AutocorrectionType - No - DefaultValue - - IsSecure - - Key - ldap_password - KeyboardType - Alphabet - Title - Password - Type - PSTextFieldSpecifier - - - DefaultValue - simple - Key - ldap_auth_method - Title - Authentication Method - Titles - - Simple - Anonymous - - Type - PSMultiValueSpecifier - Values - - simple - anonymous - - - - Type - PSToggleSwitchSpecifier - Title - Use TLS - Key - ldap_tls_enabled - DefaultValue - - - - DefaultValue - simple - Key - ldap_certificates_verification_mode - Title - Certificate Verification - Titles - - Auto - Enabled - Disabled - - Type - PSMultiValueSpecifier - Values - - default - enabled - disabled - - - - Title - Research - Type - PSGroupSpecifier - - - Key - ldap_base_object - Title - Research Base - Type - PSTextFieldSpecifier - AutocapitalizationType - None - AutocorrectionType - No - DefaultValue - - IASKTextAlignment - IASKUITextAlignmentRight - - - Key - ldap_filter - Title - Filter - Type - PSTextFieldSpecifier - AutocapitalizationType - None - AutocorrectionType - No - DefaultValue - - IASKTextAlignment - IASKUITextAlignmentRight - - - Key - ldap_max_results - Title - Max results - Type - PSTextFieldSpecifier - AutocapitalizationType - None - AutocorrectionType - No - KeyboardType - NumberPad - DefaultValue - 50 - IASKTextAlignment - IASKUITextAlignmentRight - - - Key - ldap_timeout - Title - Timeout (seconds) - Type - PSTextFieldSpecifier - AutocapitalizationType - None - AutocorrectionType - No - KeyboardType - NumberPad - DefaultValue - 5 - IASKTextAlignment - IASKUITextAlignmentRight - - - Key - ldap_delay - Title - Delay (milliseconds) - Type - PSTextFieldSpecifier - AutocapitalizationType - None - AutocorrectionType - No - KeyboardType - NumberPad - DefaultValue - 500 - IASKTextAlignment - IASKUITextAlignmentRight - - - Key - ldap_min_chars - Title - Min chars - Type - PSTextFieldSpecifier - AutocapitalizationType - None - AutocorrectionType - No - KeyboardType - NumberPad - DefaultValue - 3 - IASKTextAlignment - IASKUITextAlignmentRight - - - - Title - Analysis - Type - PSGroupSpecifier - - - Key - ldap_name_attribute - Title - Name Attributes - Type - PSTextFieldSpecifier - AutocapitalizationType - None - AutocorrectionType - No - DefaultValue - - IASKTextAlignment - IASKUITextAlignmentRight - - - Key - ldap_sip_attribute - Title - SIP Attributes - Type - PSTextFieldSpecifier - AutocapitalizationType - None - AutocorrectionType - No - DefaultValue - - IASKTextAlignment - IASKUITextAlignmentRight - - - Key - ldap_sip_domain - Title - Domain - Type - PSTextFieldSpecifier - AutocapitalizationType - None - AutocorrectionType - No - DefaultValue - - IASKTextAlignment - IASKUITextAlignmentRight - - - Title - Miscellaneous - Type - PSGroupSpecifier - - - Type - PSToggleSwitchSpecifier - Title - Enabled - Key - ldap_logs_enabled - DefaultValue - - - - - diff --git a/Settings/InAppSettings.bundle/Meetings.plist b/Settings/InAppSettings.bundle/Meetings.plist deleted file mode 100644 index c8eb2c99c..000000000 --- a/Settings/InAppSettings.bundle/Meetings.plist +++ /dev/null @@ -1,19 +0,0 @@ - - - - - PreferenceSpecifiers - - - Type - PSToggleSwitchSpecifier - Title - Allow broadcasts (Beta) - Key - enable_broadcast_conference_feature - DefaultValue - - - - - diff --git a/Settings/InAppSettings.bundle/Network.plist b/Settings/InAppSettings.bundle/Network.plist deleted file mode 100644 index 65fa5e8a6..000000000 --- a/Settings/InAppSettings.bundle/Network.plist +++ /dev/null @@ -1,203 +0,0 @@ - - - - - PreferenceSpecifiers - - - Title - Edge optimization - DefaultValue - - Key - edge_opt_preference - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - wifi_only_preference - Title - Wifi only - Type - PSToggleSwitchSpecifier - - - Key - stun_preference - Title - Stun Server - Type - PSTextFieldSpecifier - AutocapitalizationType - None - AutocorrectionType - No - DefaultValue - - IASKTextAlignment - IASKUITextAlignmentRight - - - Title - ICE - Key - ice_preference - Type - PSToggleSwitchSpecifier - DefaultValue - - - - Title - TURN - Key - turn_preference - Type - PSToggleSwitchSpecifier - DefaultValue - - - - Key - turn_username - Title - TURN's Username - Type - PSTextFieldSpecifier - AutocapitalizationType - None - AutocorrectionType - No - DefaultValue - - IASKTextAlignment - IASKUITextAlignmentRight - - - Key - turn_password - Title - TURN's Password - Type - PSTextFieldSpecifier - IsSecure - - AutocapitalizationType - None - AutocorrectionType - No - DefaultValue - - IASKTextAlignment - IASKUITextAlignmentRight - - - Type - PSToggleSwitchSpecifier - Title - Random Port - Key - random_port_preference - DefaultValue - - - - Key - port_preference - Title - Port - Type - PSTextFieldSpecifier - KeyboardType - NumberPad - DefaultValue - 5060 - IASKTextAlignment - IASKUITextAlignmentRight - - - Key - audio_port_preference - Title - Audio Port(s) - Type - PSTextFieldSpecifier - KeyboardType - NumbersAndPunctuation - DefaultValue - 7076 - IASKTextAlignment - IASKUITextAlignmentRight - - - Key - video_port_preference - Title - Video Port(s) - Type - PSTextFieldSpecifier - KeyboardType - NumbersAndPunctuation - DefaultValue - 9078 - IASKTextAlignment - IASKUITextAlignmentRight - - - Title - Allow IPv6 - Key - use_ipv6 - Type - PSToggleSwitchSpecifier - DefaultValue - - - - Key - network_limit_group - Title - Limits - Type - PSGroupSpecifier - - - Key - dns_server_preference - Title - DNS Server - Type - PSTextFieldSpecifier - AutocapitalizationType - None - AutocorrectionType - No - DefaultValue - - IASKTextAlignment - IASKUITextAlignmentRight - - - Key - adaptive_rate_control_group - Title - Adaptive rate control - Type - PSGroupSpecifier - - - DefaultValue - - Key - adaptive_rate_control_preference - Title - Adaptive rate control - Type - PSToggleSwitchSpecifier - - - - diff --git a/Settings/InAppSettings.bundle/Root.plist b/Settings/InAppSettings.bundle/Root.plist deleted file mode 100644 index c211444ee..000000000 --- a/Settings/InAppSettings.bundle/Root.plist +++ /dev/null @@ -1,229 +0,0 @@ - - - - - PreferenceSpecifiers - - - Title - SIP accounts - Type - PSGroupSpecifier - - - Key - assistant_button - Title - Run assistant - Type - IASKButtonSpecifier - - - Key - menu_account_1 - File - Account - Title - Account 1 - Type - PSChildPaneSpecifier - - - Key - menu_account_2 - File - Account - Title - Account 2 - Type - PSChildPaneSpecifier - - - Key - menu_account_3 - File - Account - Title - Account 3 - Type - PSChildPaneSpecifier - - - Key - menu_account_4 - File - Account - Title - Account 4 - Type - PSChildPaneSpecifier - - - Key - menu_account_5 - File - Account - Title - Account 5 - Type - PSChildPaneSpecifier - - - Title - Settings - Type - PSGroupSpecifier - - - Type - PSToggleSwitchSpecifier - Title - Enable video - Key - enable_video_preference - DefaultValue - - - - Key - audio_menu - File - Audio - Title - Audio - Type - PSChildPaneSpecifier - - - Key - video_menu - File - Video - Title - Video - Type - PSChildPaneSpecifier - - - Key - call_menu - File - Call - Title - Call - Type - PSChildPaneSpecifier - - - Key - meeting_menu - File - Meetings - Title - Meetings - Type - PSChildPaneSpecifier - - - Type - PSChildPaneSpecifier - Key - message_menu - Title - Chat - File - Chat - - - Key - network_menu - File - Network - Title - Network - Type - PSChildPaneSpecifier - - - Key - tunnel_menu - File - Tunnel - Title - Tunnel - Type - PSChildPaneSpecifier - - - Key - contacts_menu - File - Contacts - Title - Contacts - Type - PSChildPaneSpecifier - - - File - Advanced - Title - Advanced - Type - PSChildPaneSpecifier - - - Title - Development debug actions - Key - debug_actions_group - Type - PSGroupSpecifier - - - Key - release_button - Title - Release core - Type - IASKButtonSpecifier - - - Key - clear_cache_button - Title - Clear cache - Type - IASKButtonSpecifier - - - Key - battery_alert_button - Title - Battery alert - Type - IASKButtonSpecifier - - - Key - flush_images_button - Title - Flush downloaded images - Type - IASKButtonSpecifier - - - Type - PSToggleSwitchSpecifier - Title - Auto answer call immediately - Key - enable_auto_answer_preference - DefaultValue - - - - StringsTable - Root - - diff --git a/Settings/InAppSettings.bundle/Tunnel.plist b/Settings/InAppSettings.bundle/Tunnel.plist deleted file mode 100644 index aee4e8bec..000000000 --- a/Settings/InAppSettings.bundle/Tunnel.plist +++ /dev/null @@ -1,53 +0,0 @@ - - - - - PreferenceSpecifiers - - - DefaultValue - off - Titles - - Off - On - Auto - - Key - tunnel_mode_preference - Title - Mode - Type - PSMultiValueSpecifier - Values - - off - on - auto - - - - Key - tunnel_address_preference - Title - Address - Type - PSTextFieldSpecifier - IASKTextAlignment - IASKUITextAlignmentRight - - - Key - tunnel_port_preference - Title - Port - Type - PSTextFieldSpecifier - KeyboardType - NumbersAndPunctuation - IASKTextAlignment - IASKUITextAlignmentRight - - - - diff --git a/Settings/InAppSettings.bundle/Video.plist b/Settings/InAppSettings.bundle/Video.plist deleted file mode 100644 index 8e6dca3eb..000000000 --- a/Settings/InAppSettings.bundle/Video.plist +++ /dev/null @@ -1,183 +0,0 @@ - - - - - PreferenceSpecifiers - - - Type - PSToggleSwitchSpecifier - Title - Automatically start - Key - start_video_preference - DefaultValue - - - - Type - PSToggleSwitchSpecifier - Title - Automatically accept - Key - accept_video_preference - DefaultValue - - - - Type - PSToggleSwitchSpecifier - Title - Show self view - Key - self_video_preference - - - Type - PSToggleSwitchSpecifier - Title - Show preview - Key - preview_preference - - - Key - video_preset_preference - Title - Video preset - Titles - - Default - High FPS - Custom - - Type - PSMultiValueSpecifier - Values - - default - high-fps - custom - - DefaultValue - default - - - Key - video_preferred_size_preference - Title - Preferred video size - Titles - - HD (960x720) - VGA (640x480) - QVGA (320x240) - - Type - PSMultiValueSpecifier - Values - - 0 - 1 - 2 - - DefaultValue - 1 - - - Key - video_preferred_fps_preference - Title - Preferred FPS - Type - PSMultiValueSpecifier - Titles - - No preference - 5 - 10 - 15 - 20 - 25 - 30 - - Values - - 0 - 5 - 10 - 15 - 20 - 25 - 30 - - DefaultValue - 0 - - - Key - download_bandwidth_preference - Title - Bandwidth limit in kbits/s - Type - PSTextFieldSpecifier - AutocapitalizationType - None - AutocorrectionType - No - KeyboardType - NumberPad - DefaultValue - 380 - IASKTextAlignment - IASKUITextAlignmentRight - - - Title - Codecs - Type - PSGroupSpecifier - - - DefaultValue - - Key - vp8_preference - Title - VP8 - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - h264_preference - Title - H.264 - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - h265_preference - Title - H.265 - Type - PSToggleSwitchSpecifier - - - DefaultValue - - Key - mp4v-es_preference - Title - MPEG-4 - Type - PSToggleSwitchSpecifier - - - - diff --git a/Settings/InAppSettings.bundle/ar.lproj/Account.strings b/Settings/InAppSettings.bundle/ar.lproj/Account.strings deleted file mode 100644 index c7d0de614..000000000 Binary files a/Settings/InAppSettings.bundle/ar.lproj/Account.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ar.lproj/Advanced.strings b/Settings/InAppSettings.bundle/ar.lproj/Advanced.strings deleted file mode 100644 index ef75e2440..000000000 Binary files a/Settings/InAppSettings.bundle/ar.lproj/Advanced.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ar.lproj/Audio.strings b/Settings/InAppSettings.bundle/ar.lproj/Audio.strings deleted file mode 100644 index 362258a40..000000000 Binary files a/Settings/InAppSettings.bundle/ar.lproj/Audio.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ar.lproj/Call.strings b/Settings/InAppSettings.bundle/ar.lproj/Call.strings deleted file mode 100644 index 278363358..000000000 Binary files a/Settings/InAppSettings.bundle/ar.lproj/Call.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ar.lproj/Chat.strings b/Settings/InAppSettings.bundle/ar.lproj/Chat.strings deleted file mode 100644 index 669e88953..000000000 Binary files a/Settings/InAppSettings.bundle/ar.lproj/Chat.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ar.lproj/Network.strings b/Settings/InAppSettings.bundle/ar.lproj/Network.strings deleted file mode 100644 index cc0b81a2c..000000000 Binary files a/Settings/InAppSettings.bundle/ar.lproj/Network.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ar.lproj/Root.strings b/Settings/InAppSettings.bundle/ar.lproj/Root.strings deleted file mode 100644 index 9693ddf1b..000000000 Binary files a/Settings/InAppSettings.bundle/ar.lproj/Root.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ar.lproj/Tunnel.strings b/Settings/InAppSettings.bundle/ar.lproj/Tunnel.strings deleted file mode 100644 index e9565b65d..000000000 Binary files a/Settings/InAppSettings.bundle/ar.lproj/Tunnel.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ar.lproj/Video.strings b/Settings/InAppSettings.bundle/ar.lproj/Video.strings deleted file mode 100644 index 072ab4225..000000000 Binary files a/Settings/InAppSettings.bundle/ar.lproj/Video.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/cs.lproj/Account.strings b/Settings/InAppSettings.bundle/cs.lproj/Account.strings deleted file mode 100644 index 42292c13f..000000000 Binary files a/Settings/InAppSettings.bundle/cs.lproj/Account.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/cs.lproj/Advanced.strings b/Settings/InAppSettings.bundle/cs.lproj/Advanced.strings deleted file mode 100644 index 95348f837..000000000 Binary files a/Settings/InAppSettings.bundle/cs.lproj/Advanced.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/cs.lproj/Root.strings b/Settings/InAppSettings.bundle/cs.lproj/Root.strings deleted file mode 100644 index 459566bcf..000000000 Binary files a/Settings/InAppSettings.bundle/cs.lproj/Root.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/de.lproj/Account.strings b/Settings/InAppSettings.bundle/de.lproj/Account.strings deleted file mode 100644 index 8733cff0b..000000000 Binary files a/Settings/InAppSettings.bundle/de.lproj/Account.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/de.lproj/Advanced.strings b/Settings/InAppSettings.bundle/de.lproj/Advanced.strings deleted file mode 100644 index cb79cdb26..000000000 Binary files a/Settings/InAppSettings.bundle/de.lproj/Advanced.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/de.lproj/Audio.strings b/Settings/InAppSettings.bundle/de.lproj/Audio.strings deleted file mode 100644 index af729d7dc..000000000 Binary files a/Settings/InAppSettings.bundle/de.lproj/Audio.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/de.lproj/Call.strings b/Settings/InAppSettings.bundle/de.lproj/Call.strings deleted file mode 100644 index ec40d3f39..000000000 Binary files a/Settings/InAppSettings.bundle/de.lproj/Call.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/de.lproj/Chat.strings b/Settings/InAppSettings.bundle/de.lproj/Chat.strings deleted file mode 100644 index 091ab6724..000000000 Binary files a/Settings/InAppSettings.bundle/de.lproj/Chat.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/de.lproj/Network.strings b/Settings/InAppSettings.bundle/de.lproj/Network.strings deleted file mode 100644 index 22c40dfaa..000000000 Binary files a/Settings/InAppSettings.bundle/de.lproj/Network.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/de.lproj/Root.strings b/Settings/InAppSettings.bundle/de.lproj/Root.strings deleted file mode 100644 index a8ab5f489..000000000 Binary files a/Settings/InAppSettings.bundle/de.lproj/Root.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/de.lproj/Tunnel.strings b/Settings/InAppSettings.bundle/de.lproj/Tunnel.strings deleted file mode 100644 index 4ff7fc16b..000000000 Binary files a/Settings/InAppSettings.bundle/de.lproj/Tunnel.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/de.lproj/Video.strings b/Settings/InAppSettings.bundle/de.lproj/Video.strings deleted file mode 100644 index a95779d89..000000000 Binary files a/Settings/InAppSettings.bundle/de.lproj/Video.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/en.lproj/Account.strings b/Settings/InAppSettings.bundle/en.lproj/Account.strings deleted file mode 100644 index a904fc5fe..000000000 Binary files a/Settings/InAppSettings.bundle/en.lproj/Account.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/en.lproj/Advanced.strings b/Settings/InAppSettings.bundle/en.lproj/Advanced.strings deleted file mode 100644 index 3e7cdcc25..000000000 Binary files a/Settings/InAppSettings.bundle/en.lproj/Advanced.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/en.lproj/Audio.strings b/Settings/InAppSettings.bundle/en.lproj/Audio.strings deleted file mode 100644 index d3571c9a5..000000000 Binary files a/Settings/InAppSettings.bundle/en.lproj/Audio.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/en.lproj/Call.strings b/Settings/InAppSettings.bundle/en.lproj/Call.strings deleted file mode 100644 index 841da9c05..000000000 Binary files a/Settings/InAppSettings.bundle/en.lproj/Call.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/en.lproj/Chat.strings b/Settings/InAppSettings.bundle/en.lproj/Chat.strings deleted file mode 100644 index 2aebbf99b..000000000 Binary files a/Settings/InAppSettings.bundle/en.lproj/Chat.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/en.lproj/Network.strings b/Settings/InAppSettings.bundle/en.lproj/Network.strings deleted file mode 100644 index 3daa14822..000000000 Binary files a/Settings/InAppSettings.bundle/en.lproj/Network.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/en.lproj/Root.strings b/Settings/InAppSettings.bundle/en.lproj/Root.strings deleted file mode 100644 index fc23ec16d..000000000 Binary files a/Settings/InAppSettings.bundle/en.lproj/Root.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/en.lproj/Tunnel.strings b/Settings/InAppSettings.bundle/en.lproj/Tunnel.strings deleted file mode 100644 index f235665a9..000000000 Binary files a/Settings/InAppSettings.bundle/en.lproj/Tunnel.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/en.lproj/Video.strings b/Settings/InAppSettings.bundle/en.lproj/Video.strings deleted file mode 100644 index 533b5eb72..000000000 Binary files a/Settings/InAppSettings.bundle/en.lproj/Video.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/es.lproj/Account.strings b/Settings/InAppSettings.bundle/es.lproj/Account.strings deleted file mode 100644 index 4cfc435f6..000000000 Binary files a/Settings/InAppSettings.bundle/es.lproj/Account.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/es.lproj/Advanced.strings b/Settings/InAppSettings.bundle/es.lproj/Advanced.strings deleted file mode 100644 index 5283840e8..000000000 Binary files a/Settings/InAppSettings.bundle/es.lproj/Advanced.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/es.lproj/Audio.strings b/Settings/InAppSettings.bundle/es.lproj/Audio.strings deleted file mode 100644 index e61f535a3..000000000 Binary files a/Settings/InAppSettings.bundle/es.lproj/Audio.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/es.lproj/Call.strings b/Settings/InAppSettings.bundle/es.lproj/Call.strings deleted file mode 100644 index 952c4053e..000000000 Binary files a/Settings/InAppSettings.bundle/es.lproj/Call.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/es.lproj/Chat.strings b/Settings/InAppSettings.bundle/es.lproj/Chat.strings deleted file mode 100644 index 4cebaec84..000000000 Binary files a/Settings/InAppSettings.bundle/es.lproj/Chat.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/es.lproj/Network.strings b/Settings/InAppSettings.bundle/es.lproj/Network.strings deleted file mode 100644 index 61f9c3e43..000000000 Binary files a/Settings/InAppSettings.bundle/es.lproj/Network.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/es.lproj/Root.strings b/Settings/InAppSettings.bundle/es.lproj/Root.strings deleted file mode 100644 index f3ed1332f..000000000 Binary files a/Settings/InAppSettings.bundle/es.lproj/Root.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/es.lproj/Tunnel.strings b/Settings/InAppSettings.bundle/es.lproj/Tunnel.strings deleted file mode 100644 index 011a6e911..000000000 Binary files a/Settings/InAppSettings.bundle/es.lproj/Tunnel.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/es.lproj/Video.strings b/Settings/InAppSettings.bundle/es.lproj/Video.strings deleted file mode 100644 index 125d843eb..000000000 Binary files a/Settings/InAppSettings.bundle/es.lproj/Video.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/es_AR.lproj/Account.strings b/Settings/InAppSettings.bundle/es_AR.lproj/Account.strings deleted file mode 100644 index 4cfc435f6..000000000 Binary files a/Settings/InAppSettings.bundle/es_AR.lproj/Account.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/es_AR.lproj/Advanced.strings b/Settings/InAppSettings.bundle/es_AR.lproj/Advanced.strings deleted file mode 100644 index 5283840e8..000000000 Binary files a/Settings/InAppSettings.bundle/es_AR.lproj/Advanced.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/es_AR.lproj/Audio.strings b/Settings/InAppSettings.bundle/es_AR.lproj/Audio.strings deleted file mode 100644 index d16c350c5..000000000 Binary files a/Settings/InAppSettings.bundle/es_AR.lproj/Audio.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/es_AR.lproj/Call.strings b/Settings/InAppSettings.bundle/es_AR.lproj/Call.strings deleted file mode 100644 index 952c4053e..000000000 Binary files a/Settings/InAppSettings.bundle/es_AR.lproj/Call.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/es_AR.lproj/Chat.strings b/Settings/InAppSettings.bundle/es_AR.lproj/Chat.strings deleted file mode 100644 index 4cebaec84..000000000 Binary files a/Settings/InAppSettings.bundle/es_AR.lproj/Chat.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/es_AR.lproj/Network.strings b/Settings/InAppSettings.bundle/es_AR.lproj/Network.strings deleted file mode 100644 index 61f9c3e43..000000000 Binary files a/Settings/InAppSettings.bundle/es_AR.lproj/Network.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/es_AR.lproj/Root.strings b/Settings/InAppSettings.bundle/es_AR.lproj/Root.strings deleted file mode 100644 index f3ed1332f..000000000 Binary files a/Settings/InAppSettings.bundle/es_AR.lproj/Root.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/es_AR.lproj/Tunnel.strings b/Settings/InAppSettings.bundle/es_AR.lproj/Tunnel.strings deleted file mode 100644 index 011a6e911..000000000 Binary files a/Settings/InAppSettings.bundle/es_AR.lproj/Tunnel.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/es_AR.lproj/Video.strings b/Settings/InAppSettings.bundle/es_AR.lproj/Video.strings deleted file mode 100644 index 125d843eb..000000000 Binary files a/Settings/InAppSettings.bundle/es_AR.lproj/Video.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/fr.lproj/Account.strings b/Settings/InAppSettings.bundle/fr.lproj/Account.strings deleted file mode 100644 index 383b2164e..000000000 Binary files a/Settings/InAppSettings.bundle/fr.lproj/Account.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/fr.lproj/Advanced.strings b/Settings/InAppSettings.bundle/fr.lproj/Advanced.strings deleted file mode 100644 index 8d469ddf1..000000000 Binary files a/Settings/InAppSettings.bundle/fr.lproj/Advanced.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/fr.lproj/Audio.strings b/Settings/InAppSettings.bundle/fr.lproj/Audio.strings deleted file mode 100644 index c67473a28..000000000 Binary files a/Settings/InAppSettings.bundle/fr.lproj/Audio.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/fr.lproj/Call.strings b/Settings/InAppSettings.bundle/fr.lproj/Call.strings deleted file mode 100644 index 349b828da..000000000 Binary files a/Settings/InAppSettings.bundle/fr.lproj/Call.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/fr.lproj/Chat.strings b/Settings/InAppSettings.bundle/fr.lproj/Chat.strings deleted file mode 100644 index 012f016b3..000000000 Binary files a/Settings/InAppSettings.bundle/fr.lproj/Chat.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/fr.lproj/Network.strings b/Settings/InAppSettings.bundle/fr.lproj/Network.strings deleted file mode 100644 index 8e19eec41..000000000 Binary files a/Settings/InAppSettings.bundle/fr.lproj/Network.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/fr.lproj/Root.strings b/Settings/InAppSettings.bundle/fr.lproj/Root.strings deleted file mode 100644 index 29f3697ea..000000000 Binary files a/Settings/InAppSettings.bundle/fr.lproj/Root.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/fr.lproj/Tunnel.strings b/Settings/InAppSettings.bundle/fr.lproj/Tunnel.strings deleted file mode 100644 index 91c6ad49d..000000000 Binary files a/Settings/InAppSettings.bundle/fr.lproj/Tunnel.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/fr.lproj/Video.strings b/Settings/InAppSettings.bundle/fr.lproj/Video.strings deleted file mode 100644 index 56f07a118..000000000 Binary files a/Settings/InAppSettings.bundle/fr.lproj/Video.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/hu.lproj/Account.strings b/Settings/InAppSettings.bundle/hu.lproj/Account.strings deleted file mode 100644 index e8fded361..000000000 Binary files a/Settings/InAppSettings.bundle/hu.lproj/Account.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/hu.lproj/Advanced.strings b/Settings/InAppSettings.bundle/hu.lproj/Advanced.strings deleted file mode 100644 index 436cf4dd9..000000000 Binary files a/Settings/InAppSettings.bundle/hu.lproj/Advanced.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/hu.lproj/Audio.strings b/Settings/InAppSettings.bundle/hu.lproj/Audio.strings deleted file mode 100644 index 160947e65..000000000 Binary files a/Settings/InAppSettings.bundle/hu.lproj/Audio.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/hu.lproj/Call.strings b/Settings/InAppSettings.bundle/hu.lproj/Call.strings deleted file mode 100644 index 75b1832d2..000000000 Binary files a/Settings/InAppSettings.bundle/hu.lproj/Call.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/hu.lproj/Chat.strings b/Settings/InAppSettings.bundle/hu.lproj/Chat.strings deleted file mode 100644 index b9992ccaf..000000000 Binary files a/Settings/InAppSettings.bundle/hu.lproj/Chat.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/hu.lproj/Network.strings b/Settings/InAppSettings.bundle/hu.lproj/Network.strings deleted file mode 100644 index 0290c26d4..000000000 Binary files a/Settings/InAppSettings.bundle/hu.lproj/Network.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/hu.lproj/Root.strings b/Settings/InAppSettings.bundle/hu.lproj/Root.strings deleted file mode 100644 index f97291f0f..000000000 Binary files a/Settings/InAppSettings.bundle/hu.lproj/Root.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/hu.lproj/Tunnel.strings b/Settings/InAppSettings.bundle/hu.lproj/Tunnel.strings deleted file mode 100644 index 67335eff1..000000000 Binary files a/Settings/InAppSettings.bundle/hu.lproj/Tunnel.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/hu.lproj/Video.strings b/Settings/InAppSettings.bundle/hu.lproj/Video.strings deleted file mode 100644 index 8c5ba5c86..000000000 Binary files a/Settings/InAppSettings.bundle/hu.lproj/Video.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/it.lproj/Account.strings b/Settings/InAppSettings.bundle/it.lproj/Account.strings deleted file mode 100644 index f3def01a9..000000000 Binary files a/Settings/InAppSettings.bundle/it.lproj/Account.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/it.lproj/Advanced.strings b/Settings/InAppSettings.bundle/it.lproj/Advanced.strings deleted file mode 100644 index 82353b72a..000000000 Binary files a/Settings/InAppSettings.bundle/it.lproj/Advanced.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/it.lproj/Audio.strings b/Settings/InAppSettings.bundle/it.lproj/Audio.strings deleted file mode 100644 index 4fcc0a5b0..000000000 Binary files a/Settings/InAppSettings.bundle/it.lproj/Audio.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/it.lproj/Call.strings b/Settings/InAppSettings.bundle/it.lproj/Call.strings deleted file mode 100644 index 9832ebf74..000000000 Binary files a/Settings/InAppSettings.bundle/it.lproj/Call.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/it.lproj/Chat.strings b/Settings/InAppSettings.bundle/it.lproj/Chat.strings deleted file mode 100644 index c0ff702ed..000000000 Binary files a/Settings/InAppSettings.bundle/it.lproj/Chat.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/it.lproj/Network.strings b/Settings/InAppSettings.bundle/it.lproj/Network.strings deleted file mode 100644 index 8f2014838..000000000 Binary files a/Settings/InAppSettings.bundle/it.lproj/Network.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/it.lproj/Root.strings b/Settings/InAppSettings.bundle/it.lproj/Root.strings deleted file mode 100644 index f90311ef3..000000000 Binary files a/Settings/InAppSettings.bundle/it.lproj/Root.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/it.lproj/Tunnel.strings b/Settings/InAppSettings.bundle/it.lproj/Tunnel.strings deleted file mode 100644 index fa7385fe5..000000000 Binary files a/Settings/InAppSettings.bundle/it.lproj/Tunnel.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/it.lproj/Video.strings b/Settings/InAppSettings.bundle/it.lproj/Video.strings deleted file mode 100644 index f4ea4d485..000000000 Binary files a/Settings/InAppSettings.bundle/it.lproj/Video.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ja.lproj/Account.strings b/Settings/InAppSettings.bundle/ja.lproj/Account.strings deleted file mode 100644 index 638eee172..000000000 Binary files a/Settings/InAppSettings.bundle/ja.lproj/Account.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ja.lproj/Advanced.strings b/Settings/InAppSettings.bundle/ja.lproj/Advanced.strings deleted file mode 100644 index 10ff11498..000000000 Binary files a/Settings/InAppSettings.bundle/ja.lproj/Advanced.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ja.lproj/Audio.strings b/Settings/InAppSettings.bundle/ja.lproj/Audio.strings deleted file mode 100644 index e9838e26d..000000000 Binary files a/Settings/InAppSettings.bundle/ja.lproj/Audio.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ja.lproj/Call.strings b/Settings/InAppSettings.bundle/ja.lproj/Call.strings deleted file mode 100644 index 65f8d8c4e..000000000 Binary files a/Settings/InAppSettings.bundle/ja.lproj/Call.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ja.lproj/Chat.strings b/Settings/InAppSettings.bundle/ja.lproj/Chat.strings deleted file mode 100644 index d4fd6d644..000000000 Binary files a/Settings/InAppSettings.bundle/ja.lproj/Chat.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ja.lproj/Network.strings b/Settings/InAppSettings.bundle/ja.lproj/Network.strings deleted file mode 100644 index ea5a782b9..000000000 Binary files a/Settings/InAppSettings.bundle/ja.lproj/Network.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ja.lproj/Root.strings b/Settings/InAppSettings.bundle/ja.lproj/Root.strings deleted file mode 100644 index 896e85ab8..000000000 Binary files a/Settings/InAppSettings.bundle/ja.lproj/Root.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ja.lproj/Tunnel.strings b/Settings/InAppSettings.bundle/ja.lproj/Tunnel.strings deleted file mode 100644 index 7ee10729b..000000000 Binary files a/Settings/InAppSettings.bundle/ja.lproj/Tunnel.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ja.lproj/Video.strings b/Settings/InAppSettings.bundle/ja.lproj/Video.strings deleted file mode 100644 index 4dc69d4b8..000000000 Binary files a/Settings/InAppSettings.bundle/ja.lproj/Video.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ka.lproj/Account.strings b/Settings/InAppSettings.bundle/ka.lproj/Account.strings deleted file mode 100644 index 6caca4bfa..000000000 Binary files a/Settings/InAppSettings.bundle/ka.lproj/Account.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ka.lproj/Advanced.strings b/Settings/InAppSettings.bundle/ka.lproj/Advanced.strings deleted file mode 100644 index 445cfa02c..000000000 Binary files a/Settings/InAppSettings.bundle/ka.lproj/Advanced.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ka.lproj/Audio.strings b/Settings/InAppSettings.bundle/ka.lproj/Audio.strings deleted file mode 100644 index 028099a27..000000000 Binary files a/Settings/InAppSettings.bundle/ka.lproj/Audio.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ka.lproj/Call.strings b/Settings/InAppSettings.bundle/ka.lproj/Call.strings deleted file mode 100644 index bb7735a00..000000000 Binary files a/Settings/InAppSettings.bundle/ka.lproj/Call.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ka.lproj/Chat.strings b/Settings/InAppSettings.bundle/ka.lproj/Chat.strings deleted file mode 100644 index 66984f5b5..000000000 Binary files a/Settings/InAppSettings.bundle/ka.lproj/Chat.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ka.lproj/Network.strings b/Settings/InAppSettings.bundle/ka.lproj/Network.strings deleted file mode 100644 index 622759b1d..000000000 Binary files a/Settings/InAppSettings.bundle/ka.lproj/Network.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ka.lproj/Root.strings b/Settings/InAppSettings.bundle/ka.lproj/Root.strings deleted file mode 100644 index e113e3e13..000000000 Binary files a/Settings/InAppSettings.bundle/ka.lproj/Root.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ka.lproj/Tunnel.strings b/Settings/InAppSettings.bundle/ka.lproj/Tunnel.strings deleted file mode 100644 index afbdeadbc..000000000 Binary files a/Settings/InAppSettings.bundle/ka.lproj/Tunnel.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ka.lproj/Video.strings b/Settings/InAppSettings.bundle/ka.lproj/Video.strings deleted file mode 100644 index d3933e77a..000000000 Binary files a/Settings/InAppSettings.bundle/ka.lproj/Video.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/nl.lproj/Account.strings b/Settings/InAppSettings.bundle/nl.lproj/Account.strings deleted file mode 100644 index 1afaf680d..000000000 Binary files a/Settings/InAppSettings.bundle/nl.lproj/Account.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/nl.lproj/Advanced.strings b/Settings/InAppSettings.bundle/nl.lproj/Advanced.strings deleted file mode 100644 index 927fe7784..000000000 Binary files a/Settings/InAppSettings.bundle/nl.lproj/Advanced.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/nl.lproj/Audio.strings b/Settings/InAppSettings.bundle/nl.lproj/Audio.strings deleted file mode 100644 index eecff866a..000000000 Binary files a/Settings/InAppSettings.bundle/nl.lproj/Audio.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/nl.lproj/Call.strings b/Settings/InAppSettings.bundle/nl.lproj/Call.strings deleted file mode 100644 index 6903a5422..000000000 Binary files a/Settings/InAppSettings.bundle/nl.lproj/Call.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/nl.lproj/Chat.strings b/Settings/InAppSettings.bundle/nl.lproj/Chat.strings deleted file mode 100644 index 2a3697347..000000000 Binary files a/Settings/InAppSettings.bundle/nl.lproj/Chat.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/nl.lproj/Network.strings b/Settings/InAppSettings.bundle/nl.lproj/Network.strings deleted file mode 100644 index f9eeebf57..000000000 Binary files a/Settings/InAppSettings.bundle/nl.lproj/Network.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/nl.lproj/Root.strings b/Settings/InAppSettings.bundle/nl.lproj/Root.strings deleted file mode 100644 index 652663377..000000000 Binary files a/Settings/InAppSettings.bundle/nl.lproj/Root.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/nl.lproj/Tunnel.strings b/Settings/InAppSettings.bundle/nl.lproj/Tunnel.strings deleted file mode 100644 index fbbea5667..000000000 Binary files a/Settings/InAppSettings.bundle/nl.lproj/Tunnel.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/nl.lproj/Video.strings b/Settings/InAppSettings.bundle/nl.lproj/Video.strings deleted file mode 100644 index 533b5eb72..000000000 Binary files a/Settings/InAppSettings.bundle/nl.lproj/Video.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/pl.lproj/Account.strings b/Settings/InAppSettings.bundle/pl.lproj/Account.strings deleted file mode 100644 index 987600547..000000000 Binary files a/Settings/InAppSettings.bundle/pl.lproj/Account.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/pl.lproj/Advanced.strings b/Settings/InAppSettings.bundle/pl.lproj/Advanced.strings deleted file mode 100644 index 0b570028c..000000000 Binary files a/Settings/InAppSettings.bundle/pl.lproj/Advanced.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/pl.lproj/Audio.strings b/Settings/InAppSettings.bundle/pl.lproj/Audio.strings deleted file mode 100644 index bee4538d5..000000000 Binary files a/Settings/InAppSettings.bundle/pl.lproj/Audio.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/pl.lproj/Call.strings b/Settings/InAppSettings.bundle/pl.lproj/Call.strings deleted file mode 100644 index 930805bda..000000000 Binary files a/Settings/InAppSettings.bundle/pl.lproj/Call.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/pl.lproj/Chat.strings b/Settings/InAppSettings.bundle/pl.lproj/Chat.strings deleted file mode 100644 index 0f3fe9178..000000000 Binary files a/Settings/InAppSettings.bundle/pl.lproj/Chat.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/pl.lproj/Network.strings b/Settings/InAppSettings.bundle/pl.lproj/Network.strings deleted file mode 100644 index 568da346a..000000000 Binary files a/Settings/InAppSettings.bundle/pl.lproj/Network.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/pl.lproj/Root.strings b/Settings/InAppSettings.bundle/pl.lproj/Root.strings deleted file mode 100644 index cd44a197a..000000000 Binary files a/Settings/InAppSettings.bundle/pl.lproj/Root.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/pl.lproj/Tunnel.strings b/Settings/InAppSettings.bundle/pl.lproj/Tunnel.strings deleted file mode 100644 index 17169cd48..000000000 Binary files a/Settings/InAppSettings.bundle/pl.lproj/Tunnel.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/pl.lproj/Video.strings b/Settings/InAppSettings.bundle/pl.lproj/Video.strings deleted file mode 100644 index 1a4693cd5..000000000 Binary files a/Settings/InAppSettings.bundle/pl.lproj/Video.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/pt_BR.lproj/Account.strings b/Settings/InAppSettings.bundle/pt_BR.lproj/Account.strings deleted file mode 100644 index 1f5230596..000000000 Binary files a/Settings/InAppSettings.bundle/pt_BR.lproj/Account.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/pt_BR.lproj/Advanced.strings b/Settings/InAppSettings.bundle/pt_BR.lproj/Advanced.strings deleted file mode 100644 index 1baf7d350..000000000 Binary files a/Settings/InAppSettings.bundle/pt_BR.lproj/Advanced.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/pt_BR.lproj/Audio.strings b/Settings/InAppSettings.bundle/pt_BR.lproj/Audio.strings deleted file mode 100644 index 0215bd55c..000000000 Binary files a/Settings/InAppSettings.bundle/pt_BR.lproj/Audio.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/pt_BR.lproj/Call.strings b/Settings/InAppSettings.bundle/pt_BR.lproj/Call.strings deleted file mode 100644 index 07709b6f2..000000000 Binary files a/Settings/InAppSettings.bundle/pt_BR.lproj/Call.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/pt_BR.lproj/Chat.strings b/Settings/InAppSettings.bundle/pt_BR.lproj/Chat.strings deleted file mode 100644 index ef4434f19..000000000 Binary files a/Settings/InAppSettings.bundle/pt_BR.lproj/Chat.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/pt_BR.lproj/Network.strings b/Settings/InAppSettings.bundle/pt_BR.lproj/Network.strings deleted file mode 100644 index 43f379e07..000000000 Binary files a/Settings/InAppSettings.bundle/pt_BR.lproj/Network.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/pt_BR.lproj/Root.strings b/Settings/InAppSettings.bundle/pt_BR.lproj/Root.strings deleted file mode 100644 index 5c7b64033..000000000 Binary files a/Settings/InAppSettings.bundle/pt_BR.lproj/Root.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/pt_BR.lproj/Tunnel.strings b/Settings/InAppSettings.bundle/pt_BR.lproj/Tunnel.strings deleted file mode 100644 index 47c5fe2ae..000000000 Binary files a/Settings/InAppSettings.bundle/pt_BR.lproj/Tunnel.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/pt_BR.lproj/Video.strings b/Settings/InAppSettings.bundle/pt_BR.lproj/Video.strings deleted file mode 100644 index f4a60a062..000000000 Binary files a/Settings/InAppSettings.bundle/pt_BR.lproj/Video.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ru.lproj/Account.strings b/Settings/InAppSettings.bundle/ru.lproj/Account.strings deleted file mode 100644 index f1126856b..000000000 Binary files a/Settings/InAppSettings.bundle/ru.lproj/Account.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ru.lproj/Advanced.strings b/Settings/InAppSettings.bundle/ru.lproj/Advanced.strings deleted file mode 100644 index 452c4e0ca..000000000 Binary files a/Settings/InAppSettings.bundle/ru.lproj/Advanced.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ru.lproj/Audio.strings b/Settings/InAppSettings.bundle/ru.lproj/Audio.strings deleted file mode 100644 index d343f1229..000000000 Binary files a/Settings/InAppSettings.bundle/ru.lproj/Audio.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ru.lproj/Call.strings b/Settings/InAppSettings.bundle/ru.lproj/Call.strings deleted file mode 100644 index af07c512c..000000000 Binary files a/Settings/InAppSettings.bundle/ru.lproj/Call.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ru.lproj/Chat.strings b/Settings/InAppSettings.bundle/ru.lproj/Chat.strings deleted file mode 100644 index f52617f9d..000000000 Binary files a/Settings/InAppSettings.bundle/ru.lproj/Chat.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ru.lproj/Network.strings b/Settings/InAppSettings.bundle/ru.lproj/Network.strings deleted file mode 100644 index 79e933a52..000000000 Binary files a/Settings/InAppSettings.bundle/ru.lproj/Network.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ru.lproj/Root.strings b/Settings/InAppSettings.bundle/ru.lproj/Root.strings deleted file mode 100644 index 74631aa1f..000000000 Binary files a/Settings/InAppSettings.bundle/ru.lproj/Root.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ru.lproj/Tunnel.strings b/Settings/InAppSettings.bundle/ru.lproj/Tunnel.strings deleted file mode 100644 index 73d270b3a..000000000 Binary files a/Settings/InAppSettings.bundle/ru.lproj/Tunnel.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/ru.lproj/Video.strings b/Settings/InAppSettings.bundle/ru.lproj/Video.strings deleted file mode 100644 index 53c428c75..000000000 Binary files a/Settings/InAppSettings.bundle/ru.lproj/Video.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/sv.lproj/Account.strings b/Settings/InAppSettings.bundle/sv.lproj/Account.strings deleted file mode 100644 index 8b43f49ec..000000000 Binary files a/Settings/InAppSettings.bundle/sv.lproj/Account.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/sv.lproj/Advanced.strings b/Settings/InAppSettings.bundle/sv.lproj/Advanced.strings deleted file mode 100644 index cfe08faa6..000000000 Binary files a/Settings/InAppSettings.bundle/sv.lproj/Advanced.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/sv.lproj/Audio.strings b/Settings/InAppSettings.bundle/sv.lproj/Audio.strings deleted file mode 100644 index c0e7eb516..000000000 Binary files a/Settings/InAppSettings.bundle/sv.lproj/Audio.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/sv.lproj/Call.strings b/Settings/InAppSettings.bundle/sv.lproj/Call.strings deleted file mode 100644 index 6692e23e5..000000000 Binary files a/Settings/InAppSettings.bundle/sv.lproj/Call.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/sv.lproj/Chat.strings b/Settings/InAppSettings.bundle/sv.lproj/Chat.strings deleted file mode 100644 index 3de550c8a..000000000 Binary files a/Settings/InAppSettings.bundle/sv.lproj/Chat.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/sv.lproj/Network.strings b/Settings/InAppSettings.bundle/sv.lproj/Network.strings deleted file mode 100644 index be81e7de2..000000000 Binary files a/Settings/InAppSettings.bundle/sv.lproj/Network.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/sv.lproj/Root.strings b/Settings/InAppSettings.bundle/sv.lproj/Root.strings deleted file mode 100644 index 636b256c6..000000000 Binary files a/Settings/InAppSettings.bundle/sv.lproj/Root.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/sv.lproj/Tunnel.strings b/Settings/InAppSettings.bundle/sv.lproj/Tunnel.strings deleted file mode 100644 index 05b9e2914..000000000 Binary files a/Settings/InAppSettings.bundle/sv.lproj/Tunnel.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/sv.lproj/Video.strings b/Settings/InAppSettings.bundle/sv.lproj/Video.strings deleted file mode 100644 index 34256b495..000000000 Binary files a/Settings/InAppSettings.bundle/sv.lproj/Video.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/tr.lproj/Account.strings b/Settings/InAppSettings.bundle/tr.lproj/Account.strings deleted file mode 100644 index 176ad8a2b..000000000 Binary files a/Settings/InAppSettings.bundle/tr.lproj/Account.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/tr.lproj/Advanced.strings b/Settings/InAppSettings.bundle/tr.lproj/Advanced.strings deleted file mode 100644 index d9f14d963..000000000 Binary files a/Settings/InAppSettings.bundle/tr.lproj/Advanced.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/tr.lproj/Audio.strings b/Settings/InAppSettings.bundle/tr.lproj/Audio.strings deleted file mode 100644 index 2f9a1a4b3..000000000 Binary files a/Settings/InAppSettings.bundle/tr.lproj/Audio.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/tr.lproj/Call.strings b/Settings/InAppSettings.bundle/tr.lproj/Call.strings deleted file mode 100644 index 070a8f607..000000000 Binary files a/Settings/InAppSettings.bundle/tr.lproj/Call.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/tr.lproj/Chat.strings b/Settings/InAppSettings.bundle/tr.lproj/Chat.strings deleted file mode 100644 index 58310adda..000000000 Binary files a/Settings/InAppSettings.bundle/tr.lproj/Chat.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/tr.lproj/Network.strings b/Settings/InAppSettings.bundle/tr.lproj/Network.strings deleted file mode 100644 index 9fcd0ef14..000000000 Binary files a/Settings/InAppSettings.bundle/tr.lproj/Network.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/tr.lproj/Root.strings b/Settings/InAppSettings.bundle/tr.lproj/Root.strings deleted file mode 100644 index 2872a4e99..000000000 Binary files a/Settings/InAppSettings.bundle/tr.lproj/Root.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/tr.lproj/Tunnel.strings b/Settings/InAppSettings.bundle/tr.lproj/Tunnel.strings deleted file mode 100644 index 3e6670369..000000000 Binary files a/Settings/InAppSettings.bundle/tr.lproj/Tunnel.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/tr.lproj/Video.strings b/Settings/InAppSettings.bundle/tr.lproj/Video.strings deleted file mode 100644 index b6f430d2a..000000000 Binary files a/Settings/InAppSettings.bundle/tr.lproj/Video.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/uk.lproj/Account.strings b/Settings/InAppSettings.bundle/uk.lproj/Account.strings deleted file mode 100644 index 0a3a5cca1..000000000 Binary files a/Settings/InAppSettings.bundle/uk.lproj/Account.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/uk.lproj/Advanced.strings b/Settings/InAppSettings.bundle/uk.lproj/Advanced.strings deleted file mode 100644 index f97e771a3..000000000 Binary files a/Settings/InAppSettings.bundle/uk.lproj/Advanced.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/uk.lproj/Audio.strings b/Settings/InAppSettings.bundle/uk.lproj/Audio.strings deleted file mode 100644 index c0b68a11a..000000000 Binary files a/Settings/InAppSettings.bundle/uk.lproj/Audio.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/uk.lproj/Call.strings b/Settings/InAppSettings.bundle/uk.lproj/Call.strings deleted file mode 100644 index 0bee7934b..000000000 Binary files a/Settings/InAppSettings.bundle/uk.lproj/Call.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/uk.lproj/Chat.strings b/Settings/InAppSettings.bundle/uk.lproj/Chat.strings deleted file mode 100644 index 105846208..000000000 Binary files a/Settings/InAppSettings.bundle/uk.lproj/Chat.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/uk.lproj/Network.strings b/Settings/InAppSettings.bundle/uk.lproj/Network.strings deleted file mode 100644 index 4c3b876d5..000000000 Binary files a/Settings/InAppSettings.bundle/uk.lproj/Network.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/uk.lproj/Root.strings b/Settings/InAppSettings.bundle/uk.lproj/Root.strings deleted file mode 100644 index 4d1eea03a..000000000 Binary files a/Settings/InAppSettings.bundle/uk.lproj/Root.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/uk.lproj/Tunnel.strings b/Settings/InAppSettings.bundle/uk.lproj/Tunnel.strings deleted file mode 100644 index 8089ce91d..000000000 Binary files a/Settings/InAppSettings.bundle/uk.lproj/Tunnel.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/uk.lproj/Video.strings b/Settings/InAppSettings.bundle/uk.lproj/Video.strings deleted file mode 100644 index 1cbb0ce9d..000000000 Binary files a/Settings/InAppSettings.bundle/uk.lproj/Video.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/zh_CN.lproj/Account.strings b/Settings/InAppSettings.bundle/zh_CN.lproj/Account.strings deleted file mode 100644 index b3c031589..000000000 Binary files a/Settings/InAppSettings.bundle/zh_CN.lproj/Account.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/zh_CN.lproj/Advanced.strings b/Settings/InAppSettings.bundle/zh_CN.lproj/Advanced.strings deleted file mode 100644 index 53319ada2..000000000 Binary files a/Settings/InAppSettings.bundle/zh_CN.lproj/Advanced.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/zh_CN.lproj/Audio.strings b/Settings/InAppSettings.bundle/zh_CN.lproj/Audio.strings deleted file mode 100644 index 127055761..000000000 Binary files a/Settings/InAppSettings.bundle/zh_CN.lproj/Audio.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/zh_CN.lproj/Call.strings b/Settings/InAppSettings.bundle/zh_CN.lproj/Call.strings deleted file mode 100644 index 9e233c3f3..000000000 Binary files a/Settings/InAppSettings.bundle/zh_CN.lproj/Call.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/zh_CN.lproj/Chat.strings b/Settings/InAppSettings.bundle/zh_CN.lproj/Chat.strings deleted file mode 100644 index 513757feb..000000000 Binary files a/Settings/InAppSettings.bundle/zh_CN.lproj/Chat.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/zh_CN.lproj/Network.strings b/Settings/InAppSettings.bundle/zh_CN.lproj/Network.strings deleted file mode 100644 index 71fa34d22..000000000 Binary files a/Settings/InAppSettings.bundle/zh_CN.lproj/Network.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/zh_CN.lproj/Root.strings b/Settings/InAppSettings.bundle/zh_CN.lproj/Root.strings deleted file mode 100644 index da3b128c5..000000000 Binary files a/Settings/InAppSettings.bundle/zh_CN.lproj/Root.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/zh_CN.lproj/Tunnel.strings b/Settings/InAppSettings.bundle/zh_CN.lproj/Tunnel.strings deleted file mode 100644 index 3e4230538..000000000 Binary files a/Settings/InAppSettings.bundle/zh_CN.lproj/Tunnel.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/zh_CN.lproj/Video.strings b/Settings/InAppSettings.bundle/zh_CN.lproj/Video.strings deleted file mode 100644 index 09b1c54b6..000000000 Binary files a/Settings/InAppSettings.bundle/zh_CN.lproj/Video.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/zh_TW.lproj/Account.strings b/Settings/InAppSettings.bundle/zh_TW.lproj/Account.strings deleted file mode 100644 index 8cc9dabd4..000000000 Binary files a/Settings/InAppSettings.bundle/zh_TW.lproj/Account.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/zh_TW.lproj/Advanced.strings b/Settings/InAppSettings.bundle/zh_TW.lproj/Advanced.strings deleted file mode 100644 index 756296fc3..000000000 Binary files a/Settings/InAppSettings.bundle/zh_TW.lproj/Advanced.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/zh_TW.lproj/Audio.strings b/Settings/InAppSettings.bundle/zh_TW.lproj/Audio.strings deleted file mode 100644 index b383682d5..000000000 Binary files a/Settings/InAppSettings.bundle/zh_TW.lproj/Audio.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/zh_TW.lproj/Call.strings b/Settings/InAppSettings.bundle/zh_TW.lproj/Call.strings deleted file mode 100644 index ebc68bf93..000000000 Binary files a/Settings/InAppSettings.bundle/zh_TW.lproj/Call.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/zh_TW.lproj/Chat.strings b/Settings/InAppSettings.bundle/zh_TW.lproj/Chat.strings deleted file mode 100644 index c7a37469d..000000000 Binary files a/Settings/InAppSettings.bundle/zh_TW.lproj/Chat.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/zh_TW.lproj/Network.strings b/Settings/InAppSettings.bundle/zh_TW.lproj/Network.strings deleted file mode 100644 index 854e06541..000000000 Binary files a/Settings/InAppSettings.bundle/zh_TW.lproj/Network.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/zh_TW.lproj/Root.strings b/Settings/InAppSettings.bundle/zh_TW.lproj/Root.strings deleted file mode 100644 index b68e2e27c..000000000 Binary files a/Settings/InAppSettings.bundle/zh_TW.lproj/Root.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/zh_TW.lproj/Tunnel.strings b/Settings/InAppSettings.bundle/zh_TW.lproj/Tunnel.strings deleted file mode 100644 index ae9372de9..000000000 Binary files a/Settings/InAppSettings.bundle/zh_TW.lproj/Tunnel.strings and /dev/null differ diff --git a/Settings/InAppSettings.bundle/zh_TW.lproj/Video.strings b/Settings/InAppSettings.bundle/zh_TW.lproj/Video.strings deleted file mode 100644 index 085e40d1f..000000000 Binary files a/Settings/InAppSettings.bundle/zh_TW.lproj/Video.strings and /dev/null differ diff --git a/TestsUI/AssistantTester.h b/TestsUI/AssistantTester.h deleted file mode 100644 index 9a4878587..000000000 --- a/TestsUI/AssistantTester.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2010-2019 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "LinphoneTestCase.h" - -@interface AssistantTester : LinphoneTestCase - -@end diff --git a/TestsUI/AssistantTester.m b/TestsUI/AssistantTester.m deleted file mode 100644 index 2afd916c2..000000000 --- a/TestsUI/AssistantTester.m +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (c) 2010-2019 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "AssistantTester.h" -#import -#import "LinphoneManager.h" - -@implementation AssistantTester - -- (void)beforeEach { - [super beforeEach]; - [UIView setAnimationsEnabled:false]; - - [tester tapViewWithAccessibilityLabel:@"Side menu button"]; - [tester tapViewWithAccessibilityLabel:@"Assistant"]; -} - -- (void)afterEach { - [super afterEach]; - [LinphoneManager.instance removeAllAccounts]; - if ([tester tryFindingTappableViewWithAccessibilityLabel:@"Cancel" error:nil]) { - [tester tapViewWithAccessibilityLabel:@"Cancel"]; - } - [tester tapViewWithAccessibilityLabel:@"Dialer"]; -} - -#pragma mark - Utilities - -- (void)_linphoneLogin:(NSString *)username withPW:(NSString *)pw { - [tester tapViewWithAccessibilityLabel:@"Use Linphone account"]; - - [tester enterText:username intoViewWithAccessibilityLabel:@"Username"]; - [tester enterText:pw intoViewWithAccessibilityLabel:@"Password"]; - - [tester tapViewWithAccessibilityLabel:@"Login"]; -} - -- (void)_externalLoginWithProtocol:(NSString *)protocol { - [tester tapViewWithAccessibilityLabel:@"Use SIP account"]; - - [tester enterText:[self me] intoViewWithAccessibilityLabel:@"Username"]; - [tester enterText:[self me] intoViewWithAccessibilityLabel:@"Password"]; - [tester clearTextFromViewWithAccessibilityLabel:@"Domain"]; - [tester enterText:[self accountDomain] intoViewWithAccessibilityLabel:@"Domain"]; - [tester tapViewWithAccessibilityLabel:protocol]; - - [tester tapViewWithAccessibilityLabel:@"Login"]; -} - -#pragma mark - Tests - -- (void)testAccountCreation { - NSString *username = [NSString stringWithFormat:@"%@-%.2f", [self getUUID], [[NSDate date] timeIntervalSince1970]]; - [tester tapViewWithAccessibilityLabel:@"Create account" traits:UIAccessibilityTraitButton]; - - [tester enterText:username intoViewWithAccessibilityLabel:@"Username"]; - [tester enterText:username intoViewWithAccessibilityLabel:@"Password "]; - [tester enterText:username intoViewWithAccessibilityLabel:@"Password confirmation"]; - [tester enterText:@"testios@.dev.null" intoViewWithAccessibilityLabel:@"Email"]; - - [tester tapViewWithAccessibilityLabel:@"Create account" traits:UIAccessibilityTraitButton]; - - [tester waitForViewWithAccessibilityLabel:@"Finish configuration" traits:UIAccessibilityTraitButton]; - [tester tapViewWithAccessibilityLabel:@"Finish configuration"]; - - [tester waitForViewWithAccessibilityLabel:@"Account validation failed"]; - [tester tapViewWithAccessibilityLabel:@"Skip verification"]; -} - -- (void)testExternalLoginWithTCP { - [self _externalLoginWithProtocol:@"TCP"]; - [self waitForRegistration]; -} - -- (void)testExternalLoginWithTLS { - [self _externalLoginWithProtocol:@"TLS"]; - [self waitForRegistration]; -} - -- (void)testExternalLoginWithUDP { - [self _externalLoginWithProtocol:@"UDP"]; - [self waitForRegistration]; -} - -- (void)testLinphoneLogin { - [self _linphoneLogin:@"testios" withPW:@"testtest"]; - [self waitForRegistration]; -} - -- (void)testLinphoneLoginWithBadPassword { - [self _linphoneLogin:@"testios" withPW:@"badPass"]; - - [self setInvalidAccountSet:true]; - - UIView *alertViewText = - [tester waitForViewWithAccessibilityLabel:@"Connection failure" traits:UIAccessibilityTraitStaticText]; - if (alertViewText) { - UIView *reason = [tester waitForViewWithAccessibilityLabel:@"Bad credentials, check your account settings" - traits:UIAccessibilityTraitStaticText]; - if (reason == nil) { - [tester fail]; - } else { - [tester tapViewWithAccessibilityLabel:@"Continue"]; - } - } else { - [tester fail]; - } -} - -- (void)testRemoteProvisioning { - [tester tapViewWithAccessibilityLabel:@"Fetch remote configuration"]; - [tester enterText:@"smtp.linphone.org/testios_xml" intoViewWithAccessibilityLabel:@"URL"]; - [tester tapViewWithAccessibilityLabel:@"Fetch and apply"]; - [self waitForRegistration]; -} -@end diff --git a/TestsUI/CallTester.h b/TestsUI/CallTester.h deleted file mode 100644 index 244293d75..000000000 --- a/TestsUI/CallTester.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2010-2019 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "LinphoneTestCase.h" - -@interface CallTester : LinphoneTestCase - -@end diff --git a/TestsUI/CallTester.m b/TestsUI/CallTester.m deleted file mode 100644 index 8226981be..000000000 --- a/TestsUI/CallTester.m +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2010-2019 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "CallTester.h" - -@implementation CallTester - -#pragma mark - Setup - -- (void)beforeAll { - [super beforeAll]; - [self switchToValidAccountIfNeeded]; -} - -- (void)beforeEach { - [super beforeEach]; - if ([tester tryFindingTappableViewWithAccessibilityLabel:@"Back" error:nil]) { - [tester tapViewWithAccessibilityLabel:@"Back"]; - } - [tester tapViewWithAccessibilityLabel:@"Dialer"]; -} - -#pragma mark - Tests - -- (void)testCallPhoneNumberEscaped { - LinphoneProxyConfig *cfg = linphone_core_get_default_proxy_config(LC); - linphone_proxy_config_set_dial_escape_plus(cfg, TRUE); - NSString *num = @"+3312345-6789"; - [tester enterText:num intoViewWithAccessibilityLabel:@"Enter an address"]; - [tester tapViewWithAccessibilityLabel:@"Call" traits:UIAccessibilityTraitButton]; - [tester waitForViewWithAccessibilityLabel:@"0033123456789 is not registered."]; - [tester tapViewWithAccessibilityLabel:@"Cancel"]; - linphone_proxy_config_set_dial_escape_plus(cfg, FALSE); -} - -- (void)testCallSIPNotEscaped { - LinphoneProxyConfig *cfg = linphone_core_get_default_proxy_config(LC); - linphone_proxy_config_set_dial_escape_plus(cfg, FALSE); - NSString *num = @"+3312345-6789"; - [tester enterText:num intoViewWithAccessibilityLabel:@"Enter an address"]; - [tester tapViewWithAccessibilityLabel:@"Call" traits:UIAccessibilityTraitButton]; - [tester waitForViewWithAccessibilityLabel:@"+3312345-6789 is not registered."]; - [tester tapViewWithAccessibilityLabel:@"Cancel"]; -} - -@end diff --git a/TestsUI/ChatTester.h b/TestsUI/ChatTester.h deleted file mode 100644 index 0e79e4162..000000000 --- a/TestsUI/ChatTester.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2010-2019 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "LinphoneTestCase.h" - -@interface ChatTester : LinphoneTestCase - -@end diff --git a/TestsUI/ChatTester.m b/TestsUI/ChatTester.m deleted file mode 100644 index 078f176c7..000000000 --- a/TestsUI/ChatTester.m +++ /dev/null @@ -1,335 +0,0 @@ -/* - * Copyright (c) 2010-2019 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "ChatTester.h" -#include "LinphoneManager.h" - -@implementation ChatTester - -#pragma mark - setup - -- (void)beforeAll { - [super beforeAll]; - [self switchToValidAccountIfNeeded]; -} - -- (void)beforeEach { - [super beforeEach]; - [self goBackFromChat]; - [tester tapViewWithAccessibilityLabel:@"Chat"]; - [self removeAllRooms]; -} - -- (void)afterAll { - [super afterAll]; - // at the end of tests, go back to chat rooms to display main bar - [self goBackFromChat]; - ASSERT_EQ([LinphoneManager instance].fileTransferDelegates.count, 0) -} - -#pragma mark - tools - -- (void)dismissKeyboard { - [tester tapScreenAtPoint:CGPointMake(0, 0)]; // dismiss keyboard, if any -} -- (void)goBackFromChat { - [self dismissKeyboard]; - if ([tester tryFindingTappableViewWithAccessibilityLabel:@"Back" error:nil]) { - [tester tapViewWithAccessibilityLabel:@"Back"]; - } -} - -- (void)startChatWith:(NSString *)user { - [tester tapViewWithAccessibilityLabel:@"New discussion"]; - [tester clearTextFromFirstResponder]; - [tester enterTextIntoCurrentFirstResponder:user]; - [tester tapRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] - inTableViewWithAccessibilityIdentifier:@"Suggested addresses"]; -} - -- (void)sendMessage:(NSString *)message { - [tester enterText:message.uppercaseString intoViewWithAccessibilityLabel:@"Message field"]; - [tester tapViewWithAccessibilityLabel:@"Send"]; -} - -- (void)uploadImageWithQuality:(NSString *)quality { - static int ind = 0; - [tester tapViewWithAccessibilityLabel:@"Send picture"]; - [tester tapViewWithAccessibilityLabel:@"Photo library"]; -// if popup "Linphone would access your photo" pops up, click OK. -#if TARGET_IPHONE_SIMULATOR - if ([tester acknowledgeSystemAlert]) { - [tester waitForTimeInterval:1]; - } -#endif - - // select random photo to avoid having the same multiple times. - // There are 9 photos by default, so lets use just 8 (2 rows, 4 columns). - LOGI(@"Selecting photo at row %d, column %d", 1 + (ind / 4) % 2, 1 + ind % 4); - [tester choosePhotoInAlbum:@"Camera Roll" atRow:1 + (ind / 4) % 2 column:1 + ind % 4]; - ind++; - [[UIApplication sharedApplication] writeScreenshotForLine:__LINE__ inFile:@__FILE__ description:nil error:NULL]; - - // wait for the quality popup to show up - UIAccessibilityElement *element = nil; - float timeout = 10; - while (!element && timeout > 0.f) { - [tester waitForTimeInterval:.5]; - timeout -= .5f; - element = - [[UIApplication sharedApplication] accessibilityElementMatchingBlock:^BOOL(UIAccessibilityElement *e) { - return [e.accessibilityLabel containsSubstring:quality]; - }]; - } - XCTAssertNotNil(element); - [tester tapViewWithAccessibilityLabel:element.accessibilityLabel]; -} - -- (void)downloadImageWithQuality:(NSString *)quality { - [self startChatWith:[self me]]; - [self uploadImageWithQuality:quality]; - // wait for the upload to terminate... - for (int i = 0; i < 180; i++) { - [tester waitForTimeInterval:1.f]; - if (LinphoneManager.instance.fileTransferDelegates.count == 0) - break; - } - [tester waitForViewWithAccessibilityLabel:@"Download"]; - [tester tapViewWithAccessibilityLabel:@"Download"]; - [tester waitForTimeInterval:.1f]; // just wait a few msecs to start download - ASSERT_EQ(LinphoneManager.instance.fileTransferDelegates.count, 1); -} - -#pragma mark - tests - -- (void)testChatFromContactPhoneNumber { - [tester tapViewWithAccessibilityLabel:@"Contacts"]; - NSString *name = [UIDevice.currentDevice.identifierForVendor.UUIDString - substringFromIndex:UIDevice.currentDevice.identifierForVendor.UUIDString.length - 6]; - NSString *fullName = [NSString stringWithFormat:@"Anna %@", name]; - [self createContact:@"Anna" lastName:name phoneNumber:@"555-522-8243" SIPAddress:nil]; - - [tester tapViewWithAccessibilityLabel:@"Back"]; - [tester tapViewWithAccessibilityLabel:@"All contacts filter"]; - [tester tapViewWithAccessibilityLabel:fullName]; - [tester tapViewWithAccessibilityLabel:@"Chat with 5555228243"]; - [self goBackFromChat]; - UITableView *tv = [self findTableView:@"Chat list"]; - ASSERT_EQ([tv numberOfRowsInSection:0], 1); - [tester waitForViewWithAccessibilityLabel:@"Contact name, Message" - value:[NSString stringWithFormat:@"%@ (0)", fullName] - traits:UIAccessibilityTraitStaticText]; -} - -- (void)testInvalidSIPAddress { - [self startChatWith:@"sip://toto"]; - - [tester waitForViewWithAccessibilityLabel:@"Invalid address" traits:UIAccessibilityTraitStaticText]; - [tester tapViewWithAccessibilityLabel:@"OK"]; -} - -- (void)testMessageRemoval { - NSString *user = [self getUUID]; - - [self startChatWith:user]; - [self sendMessage:user]; - [tester waitForViewWithAccessibilityLabel:@"Delivery failed" traits:UIAccessibilityTraitImage]; - [self dismissKeyboard]; - - [tester tapViewWithAccessibilityLabel:@"Edit" traits:UIAccessibilityTraitButton]; - [tester waitForViewWithAccessibilityLabel:@"Checkbox" value:@"Deselected" traits:UIAccessibilityTraitButton]; - [tester tapRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] - inTableViewWithAccessibilityIdentifier:@"ChatRoom list"]; - [tester waitForViewWithAccessibilityLabel:@"Checkbox" value:@"Selected" traits:UIAccessibilityTraitButton]; - [tester tapViewWithAccessibilityLabel:@"Delete all"]; - [tester tapViewWithAccessibilityLabel:@"DELETE" traits:UIAccessibilityTraitButton]; - - // check that the tableview is empty - UITableView *tv = [self findTableView:@"ChatRoom list"]; - ASSERT_EQ([tv numberOfRowsInSection:0], 0); // no more messages - - [self goBackFromChat]; -} - -- (void)testPerformanceHugeChatList { - [tester tapViewWithAccessibilityLabel:@"Dialer"]; - - // create lots of chat rooms... - LinphoneCore *lc = [LinphoneManager getLc]; - for (int i = 0; i < 100; i++) { - linphone_core_get_chat_room_from_uri(lc, [[NSString stringWithFormat:@"%@ - %d", [self me], i] UTF8String]); - } - - NSTimeInterval before = [[NSDate date] timeIntervalSince1970]; - [tester tapViewWithAccessibilityLabel:@"Chat"]; - NSTimeInterval after = [[NSDate date] timeIntervalSince1970]; - - XCTAssertEqual([[self findTableView:@"Chat list"] numberOfRowsInSection:0], 100); - // conversation loading MUST be less than 1 sec - XCTAssertLessThan(after - before, 1.); -} - -- (void)testPerformanceHugeConversation { - size_t count = 0; - LinphoneCore *lc = [LinphoneManager getLc]; - LinphoneChatRoom *room = linphone_core_get_chat_room_from_uri(lc, [[self me] UTF8String]); - - NSTimeInterval beforeEmpty = [[NSDate date] timeIntervalSince1970]; - [self startChatWith:[self me]]; - NSTimeInterval afterEmpty = [[NSDate date] timeIntervalSince1970]; - [self goBackFromChat]; - - // generate lots of messages... - for (; count < 50; count++) { - LinphoneChatMessage *msg = - linphone_chat_room_create_message(room, [[NSString stringWithFormat:@"Message %lu", count + 1] UTF8String]); - linphone_chat_room_send_chat_message(room, msg); - } - - for (int i = 0; i < 50; i++) { - [tester waitForTimeInterval:.5f]; - - if (bctbx_list_size(linphone_chat_room_get_history_events(room, 0)) == count) { - break; - } - } - - [tester - waitForViewWithAccessibilityLabel:@"Contact name, Message" - value:[NSString stringWithFormat:@"%@, Message %lu (%lu)", self.me, count, count] - traits:UIAccessibilityTraitStaticText]; - - NSTimeInterval before = [[NSDate date] timeIntervalSince1970]; - [tester tapRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] - inTableViewWithAccessibilityIdentifier:@"Chat list"]; - NSTimeInterval after = [[NSDate date] timeIntervalSince1970]; - - // conversation loading MUST be less than 1 sec - loading messages only - XCTAssertLessThan(after - before, afterEmpty - beforeEmpty + 1.); -} - -- (void)testRemoveAllChats { - NSArray *uuids = [self getUUIDArrayOfSize:3]; - - for (NSString *uuid in uuids) { - [self startChatWith:uuid]; - [self sendMessage:@"Test"]; - [self goBackFromChat]; - } - - UITableView *tv = [self findTableView:@"Chat list"]; - - ASSERT_EQ([tv numberOfRowsInSection:0], uuids.count); - - [self removeAllRooms]; - - // check that the tableview is empty - ASSERT_EQ([tv numberOfRowsInSection:0], 0); - - // test that there's no more chatrooms in the core - ASSERT_EQ(linphone_core_get_chat_rooms([LinphoneManager getLc]), NULL); -} - -- (void)testSendMessageToMyself { - [self startChatWith:[self me]]; - - [self sendMessage:@"HELLO"]; - [tester waitForViewWithAccessibilityLabel:@"Outgoing message" value:@"HELLO" traits:UIAccessibilityTraitStaticText]; - [tester waitForViewWithAccessibilityLabel:@"Incoming message" value:@"HELLO" traits:UIAccessibilityTraitStaticText]; - [tester waitForAbsenceOfViewWithAccessibilityLabel:@"Message status"]; - - [self goBackFromChat]; -} - -- (void)testSendToSIPAddress { - NSString *sipAddr = [NSString stringWithFormat:@"sip:%@@%@", [self me], [self accountDomain]]; - - [self startChatWith:sipAddr]; - - [tester waitForViewWithAccessibilityLabel:@"Contact name" value:[self me] traits:0]; - - [self goBackFromChat]; -} - -- (void)testTransferCancelDownloadImage { - [self downloadImageWithQuality:@"Maximum"]; - [tester tapViewWithAccessibilityLabel:@"Cancel"]; - ASSERT_EQ([[[LinphoneManager instance] fileTransferDelegates] count], 0); -} - -- (void)testTransferCancelUploadImage { - [self startChatWith:[self me]]; - [self uploadImageWithQuality:@"Minimum"]; - [tester tapViewWithAccessibilityLabel:@"Cancel"]; - ASSERT_EQ([[[LinphoneManager instance] fileTransferDelegates] count], 0); -} - -- (void)testTransferDestroyRoomWhileUploading { - [self startChatWith:[self me]]; - [self uploadImageWithQuality:@"Maximum"]; - [self goBackFromChat]; - [self removeAllRooms]; -} - -- (void)testTransferDownloadImage { - [self downloadImageWithQuality:@"Minimum"]; - [tester waitForAbsenceOfViewWithAccessibilityLabel:@"Cancel"]; - ASSERT_EQ([[[LinphoneManager instance] fileTransferDelegates] count], 0); -} - -- (void)testTransferSimultanouslyDownload { -// wait for bugfix -#if 0 - [self startChatWith:[self me]]; - [self uploadImageWithQuality:@"Minimum"]; - [self uploadImageWithQuality:@"Minimum"]; - UITableView *tv = [self findTableView:@"ChatRoom list"]; - int timeout = 3; - // wait for ALL uploads to terminate... - for (int i = 0; i < 90; i++) { - [tester waitForTimeInterval:1.f]; - if ([tv numberOfRowsInSection:0] == 4) - break; - } - [tester waitForTimeInterval:.5f]; - ASSERT_EQ([[LinphoneManager instance] fileTransferDelegates].count, 0); - [tester scrollViewWithAccessibilityIdentifier:@"ChatRoom list" byFractionOfSizeHorizontal:0.f vertical:1.f]; - for (int i = 0; i < 2; i++) { - // messages order is not known: if upload bitrate is huge, first image can be uploaded before last started - timeout = 3; - while (![tester tryFindingTappableViewWithAccessibilityLabel:@"Download" error:nil] && timeout) { - [tester scrollViewWithAccessibilityIdentifier:@"ChatRoom list" - byFractionOfSizeHorizontal:0.f - vertical:-.1f]; - timeout--; - } - [tester waitForViewWithAccessibilityLabel:@"Download"]; - [tester tapViewWithAccessibilityLabel:@"Download"]; - [tester waitForTimeInterval:.2f]; // just wait a few secs to start download - } - timeout = 30; - while ([LinphoneManager instance].fileTransferDelegates.count > 0 && timeout) { - [tester waitForTimeInterval:.5]; - timeout--; - } - [self goBackFromChat]; -#endif -} - -@end diff --git a/TestsUI/ContactsTester.h b/TestsUI/ContactsTester.h deleted file mode 100644 index a344267e5..000000000 --- a/TestsUI/ContactsTester.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2010-2019 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "LinphoneTestCase.h" - -@interface ContactsTester : LinphoneTestCase - -@end diff --git a/TestsUI/ContactsTester.m b/TestsUI/ContactsTester.m deleted file mode 100644 index 67c168c65..000000000 --- a/TestsUI/ContactsTester.m +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (c) 2010-2019 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "ContactsTester.h" - -#import "ContactDetailsTableView.h" -#import "UIContactCell.h" - -@implementation ContactsTester - -#pragma mark - Setup - -- (void)beforeAll { - [self switchToValidAccountIfNeeded]; -} - -- (void)beforeEach { - [super beforeEach]; - if ([tester tryFindingTappableViewWithAccessibilityLabel:@"Back" error:nil]) { - [tester tapViewWithAccessibilityLabel:@"Back"]; - } - [tester tapViewWithAccessibilityLabel:@"Contacts"]; -} - -#pragma mark - Utils - -- (void)tapCellForRowAtIndexPath:(NSInteger)idx inSection:(NSInteger)section atX:(CGFloat)x { - UITableView *tv = [self findTableView:@"Contact table"]; - NSIndexPath *path = [NSIndexPath indexPathForRow:idx inSection:section]; - UITableViewCell *cell = - [tester waitForCellAtIndexPath:path inTableViewWithAccessibilityIdentifier:@"Contact table"]; - XCTAssertNotNil(cell); - - CGRect cellFrame = [cell.contentView convertRect:cell.contentView.frame toView:tv]; - [tv tapAtPoint:CGPointMake(x > 0 ? x : tv.superview.frame.size.width + x, - cellFrame.origin.y + cellFrame.size.height / 2.)]; - [tester waitForAnimationsToFinish]; -} - -- (void)tapRemoveButtonForRowAtIndexPath:(NSInteger)idx inSection:(NSInteger)section { - [self tapCellForRowAtIndexPath:idx inSection:section atX:-7]; -} - -- (void)setText:(NSString *)text forIndex:(NSInteger)idx inSection:(NSInteger)section { - [tester tapRowAtIndexPath:[NSIndexPath indexPathForRow:idx inSection:section] - inTableViewWithAccessibilityIdentifier:@"Contact table"]; - [tester clearTextFromAndThenEnterTextIntoCurrentFirstResponder:text]; -} - -- (void)addEntries:(NSArray *)numbers inSection:(NSInteger)section { - [tester tapViewWithAccessibilityLabel:@"Edit"]; - NSString *name = (section == ContactSections_Sip) ? @"Add new SIP address" : @"Add new phone number"; - [self setText:[numbers objectAtIndex:0] forIndex:0 inSection:section]; - for (NSInteger i = 1; i < numbers.count; i++) { - [tester tapViewWithAccessibilityLabel:name traits:UIAccessibilityTraitButton]; - [self setText:[numbers objectAtIndex:i] forIndex:i inSection:section]; - } - [tester tapViewWithAccessibilityLabel:@"Edit"]; - - for (NSInteger i = 0; i < numbers.count; i++) { - [tester waitForViewWithAccessibilityLabel:[@"Call " stringByAppendingString:[numbers objectAtIndex:i]] - traits:UIAccessibilityTraitButton]; - } -} - -- (void)deleteContactEntryForRowAtIndexPath:(NSInteger)idx inSection:(NSInteger)section { - // if ([tester tryFindingTappableViewWithAccessibilityLabel:@"Delete" error:nil]) { - // [tester tapViewWithAccessibilityLabel:@"Delete"]; - // } else { - // hack: Travis seems to be unable to click on delete for what ever reason - [self tapRemoveButtonForRowAtIndexPath:idx inSection:section]; - // } -} - -#pragma mark - Tests - -- (void)testCallContactWithInvalidPhoneNumber { - NSString *contactName = [self getUUID]; - NSString *phone = @"+5 15 #0664;447*46"; - [self createContact:contactName lastName:@"dummy" phoneNumber:phone SIPAddress:nil]; - [tester tapViewWithAccessibilityLabel:[@"Call " stringByAppendingString:phone]]; - [tester waitForViewWithAccessibilityLabel:[phone stringByAppendingString:@" is not connected."]]; - [tester tapViewWithAccessibilityLabel:@"Cancel"]; -} - -- (void)testDeleteContact { - NSString *contactName = [self getUUID]; - [self createContact:contactName lastName:@"dummy" phoneNumber:@"0102030405" SIPAddress:[self me]]; - [tester tapViewWithAccessibilityLabel:@"Back"]; - - NSString *fullName = [contactName stringByAppendingString:@" dummy"]; - - [tester tapViewWithAccessibilityLabel:fullName traits:UIAccessibilityTraitStaticText]; - - [tester tapViewWithAccessibilityLabel:@"Edit"]; - - [tester tapViewWithAccessibilityLabel:@"Delete" traits:UIAccessibilityTraitButton]; - [tester tapViewWithAccessibilityLabel:@"DELETE" traits:UIAccessibilityTraitButton]; -} - -- (void)testDeleteContactWithSwipe { - NSString *contactName = [self getUUID]; - [self createContact:contactName lastName:@"dummy" phoneNumber:@"123" SIPAddress:@"ola"]; - [tester tapViewWithAccessibilityLabel:@"Back"]; - NSString *fullName = [contactName stringByAppendingString:@" dummy"]; - - [tester swipeViewWithAccessibilityLabel:fullName inDirection:KIFSwipeDirectionLeft]; - [tester tapViewWithAccessibilityLabel:@"Delete"]; - - // we should not find this contact anymore - XCTAssert([tester tryFindingViewWithAccessibilityLabel:fullName error:nil] == NO); -} - -- (void)testEditContact { - NSString *contactName = [self getUUID]; - [self createContact:contactName lastName:@"dummy" phoneNumber:@"111" SIPAddress:nil]; - - /* Phone number */ - NSArray *phones = @[ @"01234", @"56789" ]; - [self addEntries:phones inSection:ContactSections_Number]; - NSArray *SIPs = @[ @"sip1", @"sip2" ]; - [self addEntries:SIPs inSection:ContactSections_Sip]; - - [tester tapViewWithAccessibilityLabel:@"Edit"]; - // remove all numbers - for (NSInteger i = 0; i < phones.count; i++) { - [self deleteContactEntryForRowAtIndexPath:0 inSection:ContactSections_Number]; - } - // remove all SIPs - for (NSInteger i = 0; i < SIPs.count; i++) { - [self deleteContactEntryForRowAtIndexPath:0 inSection:ContactSections_Sip]; - } - [tester tapViewWithAccessibilityLabel:@"Edit"]; - - // then remove the contact - [tester tapViewWithAccessibilityLabel:@"Edit"]; - - [tester scrollViewWithAccessibilityIdentifier:@"Contact table" byFractionOfSizeHorizontal:0 vertical:-0.9]; - - [tester tapViewWithAccessibilityLabel:@"Delete" traits:UIAccessibilityTraitButton]; - [tester tapViewWithAccessibilityLabel:@"DELETE" traits:UIAccessibilityTraitButton]; -} - -@end diff --git a/TestsUI/Info.plist b/TestsUI/Info.plist deleted file mode 100644 index ba72822e8..000000000 --- a/TestsUI/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/TestsUI/LinphoneTestCase.h b/TestsUI/LinphoneTestCase.h deleted file mode 100644 index 8e3dba274..000000000 --- a/TestsUI/LinphoneTestCase.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2010-2019 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import - -#import "Utils.h" -#import "Log.h" - -@interface LinphoneTestCase : KIFTestCase -@property BOOL invalidAccountSet; - -- (void)switchToValidAccountIfNeeded; -- (NSString *)me; -- (NSString *)accountDomain; - -- (NSString *)getUUID; -- (NSArray *)getUUIDArrayOfSize:(size_t)size; - -- (UITableView *)findTableView:(NSString *)table; - -- (void)waitForRegistration; - -- (void)removeAllRooms; -- (void)createContact:(NSString *)firstName - lastName:(NSString *)lastName - phoneNumber:(NSString *)phone - SIPAddress:(NSString *)sip; - -@end - -#define ASSERT_EQ(actual, expected) \ - { \ - if ((actual) != (expected)) { \ - [[UIApplication sharedApplication] writeScreenshotForLine:__LINE__ \ - inFile:@__FILE__ \ - description:nil \ - error:NULL]; \ - } \ - XCTAssertEqual(actual, expected); \ - } diff --git a/TestsUI/LinphoneTestCase.m b/TestsUI/LinphoneTestCase.m deleted file mode 100644 index b1ca25fa0..000000000 --- a/TestsUI/LinphoneTestCase.m +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright (c) 2010-2019 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "LinphoneTestCase.h" - -#import "LinphoneManager.h" - -#import "KIF/KIFTypist.h" -#import "Log.h" -#import "Utils.h" -#import "ContactDetailsTableView.h" - -@implementation LinphoneTestCase - -+ (void)initialize { - // default is 0.01, which sometimes confuses the simulator to the point that - // it will miss some keys - [KIFTypist setKeystrokeDelay:0.05]; - - NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0]; - if (!([language isEqualToString:@"en"] || [language containsSubstring:@"en-"])) { - LOGF(@"Language must be 'en' (English) instead of %@", language); - } -} - -- (void)beforeAll { - [super beforeAll]; - - // turn off logs since jenkins fails to parse output otherwise. If - // you want to debug a specific test, comment this temporary - [Log enableLogs:ORTP_WARNING]; - -#if TARGET_IPHONE_SIMULATOR - while ([tester acknowledgeSystemAlert]) { - [tester waitForTimeInterval:.5f]; - }; -#endif - // remove any account - [LinphoneManager.instance removeAllAccounts]; - - // go to dialer - for (NSString *button in @[ @"Cancel", @"Back", @"Hangup", @"Continue", @"Dialer" ]) { - if ([tester tryFindingTappableViewWithAccessibilityLabel:button error:nil]) { - [tester tapViewWithAccessibilityLabel:button traits:UIAccessibilityTraitButton]; - } - } -} - -- (void)afterEach { - for (NSString *button in @[ @"Cancel", @"Back", @"Hangup", @"Continue", @"Dialer" ]) { - if ([tester tryFindingTappableViewWithAccessibilityLabel:button error:nil]) { - [tester tapViewWithAccessibilityLabel:button traits:UIAccessibilityTraitButton]; - } - } - [super afterEach]; -} - -- (void)beforeEach { - [[LinphoneManager instance] lpConfigSetInt:ORTP_WARNING forKey:@"debugenable_preference"]; - [[LinphoneManager instance] lpConfigSetInt:NO forKey:@"animations_preference"]; -} - -- (NSString *)me { - return [NSString stringWithFormat:@"testios-%@", - [[UIDevice currentDevice].identifierForVendor.UUIDString substringToIndex:6]] - .lowercaseString; -} - -- (NSString *)accountDomain { - return @"test.linphone.org"; -} - -- (NSString *)accountProxyRoute { - return [[self accountDomain] stringByAppendingString:@";transport=tcp"]; -} - -- (NSString *)getUUID { - return [[[NSUUID UUID] UUIDString] substringToIndex:8].lowercaseString; -} - -- (NSArray *)getUUIDArrayOfSize:(size_t)size { - NSMutableArray *array = [NSMutableArray arrayWithCapacity:size]; - for (NSInteger i = 0; i < size; i++) { - [array setObject:[self getUUID] atIndexedSubscript:i]; - } - return array; -} - -- (BOOL)hasValidProxyConfig { - LinphoneCore *lc = [LinphoneManager getLc]; - const MSList *proxies = linphone_core_get_proxy_config_list(lc); - BOOL isOK = false; - while (proxies) { - LinphoneProxyConfig *cfg = (LinphoneProxyConfig *)proxies->data; - const char *domain = linphone_proxy_config_get_domain(cfg); - const LinphoneAddress *addr = linphone_proxy_config_get_identity_address(cfg); - const char *username = linphone_address_get_username(addr); - - if (addr && (username && strcmp(username, [[self me] UTF8String]) == 0) && - (domain && strcmp(domain, [[self accountDomain] UTF8String]) == 0) && - linphone_proxy_config_get_state(cfg) == LinphoneRegistrationOk) { - isOK = true; - break; - } - - proxies = proxies->next; - } - return isOK; -} - -- (void)switchToValidAccountIfNeeded { - [UIView setAnimationsEnabled:false]; - - if (![self hasValidProxyConfig]) { - LOGI(@"Switching to a test account..."); - - LinphoneCore *lc = [LinphoneManager getLc]; - [[LinphoneManager instance] removeAllAccounts]; - - LinphoneAddress *testAddr = linphone_core_interpret_url( - LC, [[NSString stringWithFormat:@"sip:%@@%@", [self me], [self accountDomain]] UTF8String]); - linphone_address_set_header(testAddr, "X-Create-Account", "yes"); - linphone_address_set_transport(testAddr, LinphoneTransportTcp); - linphone_address_set_port(testAddr, 0); - LinphoneProxyConfig *testProxy = linphone_core_create_proxy_config(lc); - linphone_proxy_config_set_identity_address(testProxy, testAddr); - linphone_proxy_config_set_server_addr(testProxy, [self accountProxyRoute].UTF8String); - linphone_proxy_config_set_route(testProxy, [self accountProxyRoute].UTF8String); - linphone_proxy_config_set_push_notification_allowed(testProxy, true); - - LinphoneAuthInfo *testAuth = linphone_auth_info_new(linphone_address_get_username(testAddr), NULL, - linphone_address_get_username(testAddr), NULL, NULL, - linphone_address_get_domain(testAddr)); - - linphone_proxy_config_enable_register(testProxy, true); - linphone_core_add_auth_info(lc, testAuth); - linphone_core_add_proxy_config(lc, testProxy); - linphone_core_set_default_proxy_config(lc, testProxy); - [[LinphoneManager instance] configurePushTokenForProxyConfig:testProxy]; - - linphone_proxy_config_unref(testProxy); - linphone_auth_info_unref(testAuth); - linphone_address_unref(testAddr); - - linphone_core_set_file_transfer_server(lc, "https://www.linphone.org:444/lft.php"); - - // reload address book to prepend proxy config domain to contacts' phone number - [[[LinphoneManager instance] fastAddressBook] fetchContactsInBackGroundThread]; - - [self waitForRegistration]; - [[LinphoneManager instance] lpConfigSetInt:NO forKey:@"animations_preference"]; - } -} - -- (UITableView *)findTableView:(NSString *)table { - UITableView *tv = nil; - NSError *err = nil; - if ([tester tryFindingAccessibilityElement:nil view:&tv withIdentifier:table tappable:false error:&err]) { - XCTAssertNotNil(tv); - } else { - XCTFail(@"Error: %@", err); - } - return tv; -} - -- (void)waitForRegistration { - // wait for account to be connected - int timeout = 15; - while (timeout && - ![tester tryFindingViewWithAccessibilityLabel:@"Registration state" - value:@"Connected" - traits:UIAccessibilityTraitButton - error:nil]) { - [tester waitForTimeInterval:1]; - timeout--; - } - [tester waitForViewWithAccessibilityLabel:@"Registration state" - value:@"Connected" - traits:UIAccessibilityTraitButton]; -} - -- (void)removeAllRooms { - if (![tester tryFindingTappableViewWithAccessibilityLabel:@"Edit" error:nil]) - return; - - [tester tapViewWithAccessibilityLabel:@"Edit" traits:UIAccessibilityTraitButton]; - [tester tapViewWithAccessibilityLabel:@"Select all" traits:UIAccessibilityTraitButton]; - [tester tapViewWithAccessibilityLabel:@"Delete all" traits:UIAccessibilityTraitButton]; - [tester tapViewWithAccessibilityLabel:@"DELETE" traits:UIAccessibilityTraitButton]; -} - -- (void)setText:(NSString *)text forIndex:(NSInteger)idx inSection:(NSInteger)section { - [tester tapRowAtIndexPath:[NSIndexPath indexPathForRow:idx inSection:section] - inTableViewWithAccessibilityIdentifier:@"Contact table"]; - [tester enterTextIntoCurrentFirstResponder:text]; -} - -- (void)createContact:(NSString *)firstName - lastName:(NSString *)lastName - phoneNumber:(NSString *)phone - SIPAddress:(NSString *)sip { - - XCTAssert(firstName != nil); - [tester tapViewWithAccessibilityLabel:@"Add contact"]; - - // check that the OK button is disabled - [tester waitForViewWithAccessibilityLabel:@"Edit" - traits:UIAccessibilityTraitButton | UIAccessibilityTraitNotEnabled | - UIAccessibilityTraitSelected]; - - [self setText:firstName forIndex:0 inSection:ContactSections_FirstName]; - - // entering text should enable the "edit" button - [tester waitForViewWithAccessibilityLabel:@"Edit" traits:UIAccessibilityTraitButton | UIAccessibilityTraitSelected]; - - if (lastName) { - [self setText:lastName forIndex:0 inSection:ContactSections_LastName]; - } - - if (phone) { - [self setText:phone forIndex:0 inSection:ContactSections_Number]; - } - - if (sip) { - [self setText:sip forIndex:0 inSection:ContactSections_Sip]; - } - - [tester tapViewWithAccessibilityLabel:@"Edit"]; -} - -@end diff --git a/TestsUI/NotificationTester.h b/TestsUI/NotificationTester.h deleted file mode 100644 index 1598643b2..000000000 --- a/TestsUI/NotificationTester.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2010-2019 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "LinphoneTestCase.h" - -@interface NotificationTester : LinphoneTestCase - -@end diff --git a/TestsUI/NotificationTester.m b/TestsUI/NotificationTester.m deleted file mode 100644 index 2440d8d60..000000000 --- a/TestsUI/NotificationTester.m +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2010-2019 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "NotificationTester.h" - -@implementation NotificationTester - -#if !TARGET_IPHONE_SIMULATOR - -- (void)beforeAll { - [super beforeAll]; - [self switchToValidAccountIfNeeded]; -} - -- (void)testChatRemoteNotification { - [tester tapViewWithAccessibilityLabel:@"Chat"]; - [self removeAllRooms]; - - const LinphoneAddress *addr = - linphone_proxy_config_get_identity_address(linphone_core_get_default_proxy_config(LC)); - LinphoneChatMessage *msg = linphone_chat_room_create_message(linphone_core_get_chat_room(LC, addr), "hello my own"); - linphone_chat_room_send_chat_message(linphone_core_get_chat_room(LC, addr), msg); - linphone_core_set_network_reachable(LC, NO); - - [tester tapViewWithAccessibilityLabel:@"Chat"]; - - // it can take several seconds to receive the remote push notification... - int timeout = 35; - while (timeout > 0) { - [tester tryFindingViewWithAccessibilityLabel:@"Contact name, Message" error:nil]; - timeout--; - } - [tester waitForViewWithAccessibilityLabel:@"Contact name, Message" - value:[NSString stringWithFormat:@"%@, hello my own (1)", self.me] - traits:UIAccessibilityTraitStaticText]; -} - -#endif - -@end diff --git a/Tools/change_ios_custom_font.sh b/Tools/change_ios_custom_font.sh deleted file mode 100755 index b1e7f9d63..000000000 --- a/Tools/change_ios_custom_font.sh +++ /dev/null @@ -1,102 +0,0 @@ -#!/bin/bash - -## -## Copyright (c) 2010-2019 Belledonne Communications SARL. -## -## This file is part of linphone-iphone -## -## This program is free software: you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published by -## the Free Software Foundation, either version 3 of the License, or -## (at your option) any later version. -## -## This program is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with this program. If not, see . -## - -# Created by Gautier Pelloux-Prayer on 2014/10/07. -# This script can be used to replace default font with a custom one in every xib -# Please note that it changes only .xib files and not hardcoded fonts in .m/.h files. -# It creates a backup file with .backup_font extension. - -if [ $# != 0 ]; then - echo "Usage: $0" - echo "To avoid reentering input, you can preset values, for intance:" - echo 'repository=. newfont_family="Movistar Text" newregular_font=MovistarText newbold_font=MovistarText-Bold newitalic_font=MovistarText-Italic' $0 - exit 0 -fi - -# quit on first error -set -e - -#################################### Input values ######################### -# read $2 from stdin if it is not already set. Works also for multiple reads, but -# only check that the first read variable is not set -function readv { - prompt=$1 - shift - if [ -z "${!1}" ]; then - echo "$prompt" - read "$@" #cannot use read -p because unknown on MacOS - else - echo "$1 already set ($1=${!1}). Skipping $@" - fi - - for arg in "$@"; do - echo "$arg=${!arg}" - done -} -echo $repository -readv '# Your git repository where we must apply changes like $HOME/code/linphone-iphone' repository -readv '# The font family name like "Helvetica"' newfont_family -readv '# The normal font like "Helvetica"' newregular_font -readv '# The bold font like "Helvetica-Bold"' newbold_font -readv '# The italic font like "Helvetica-Italic"' newitalic_font -readv '# RGB values for new text color like "255 255 255" for white' newred newgreen newblue -newred=$(echo $newred / 255.0 | bc -l) -newgreen=$(echo $newgreen / 255.0 | bc -l) -newblue=$(echo $newblue / 255.0 | bc -l) -################################################################################ - -# This is default Linphone text color ("gray") -oldred="\"0.35" -oldgreen="\"0.39" -oldblue="\"0.43" - -if [ ! -d "$repository" ]; then - echo "Invalid repository '$repository': it does not exist" - exit 1 -elif [ ! -d "$repository/Classes/" ]; then - echo "Invalid repository '$repository': expected subfolder Classses/ does not exist" - exit 2 -fi - - -cd $repository/Classes - -fonts=( "system:$newregular_font" -"boldSystem:$newbold_font" -"italicSystem:$newitalic_font" ) - - -for font in "${fonts[@]}"; do - system_font=${font%:*} - new_font=${font#*:} - echo "$system_font -> $new_font" - - find . -name '*.xib' -exec \ - sed -E -i.font_backup \ - -e "s|\"|g" \ - -e "s||g" {} \; -done - -echo "********************** -Done. Created .backup_font files. If you are OK with the change, you can remove them with: -find $repository -name '*.font_backup' -exec rm {} \; -If you are NOT ok with change, you can put them back. -**********************" diff --git a/Tools/check_tools.sh b/Tools/check_tools.sh deleted file mode 100755 index 2e1c7af1a..000000000 --- a/Tools/check_tools.sh +++ /dev/null @@ -1,68 +0,0 @@ -#!/bin/bash - -error_on_quit=0 - -echo_err() { - echo "$@" >&2 - error_on_quit=1 -} - -check_installed() { - if [ -z "$(which $1)" ]; then - echo_err "Could not find $1. Please install $2." - return 1 - fi - return 0 -} - -cd $(dirname $0)/.. - -if grep -q ' ' <<< $PWD; then - echo_err "Invalid location: your location should not contain spaces" -fi - -for prog in autoconf automake pkg-config doxygen java nasm gettext wget yasm optipng; do - check_installed "$prog" "it" -done - -check_installed "ginstall" "coreutils" -check_installed "intltoolize" "intltool" -check_installed "convert" "imagemagick" - -if [ -z "$(which libtoolize)" ]; then - glibtoolize=$(which glibtoolize) - if [ ! -z "$glibtoolize" ]; then - echo_err "Please do a symbolic link from glibtoolize to libtoolize: 'ln -s $glibtoolize ${glibtoolize/glibtoolize/libtoolize}'" - else - echo_err "Could not find libtoolize. Please install libtool." - fi -fi - -# just ensure that JDK is installed - if not, it will display user a popup -if ! java -version &>/dev/null; then - echo_err "Please install Java JDK (not just JRE)" -fi - -# needed by x264 -check_installed "gas-preprocessor.pl" "it following the README.md" - -if nasm -f elf32 2>&1 | grep -q "fatal: unrecognised output format"; then - echo_err "Invalid version of nasm: your version does not support elf32 output format. If you have installed nasm, please check that your PATH env variable is set correctly." -fi - -if ! (find submodules/linphone/mediastreamer2 -mindepth 1 2>/dev/null | grep -q . \ - || find submodules/linphone/oRTP -mindepth 1 2>/dev/null | grep -q .); then - echo_err "Missing some git submodules. Did you run 'git submodule update --init --recursive'?" -fi - -if ! xcrun --sdk iphoneos --show-sdk-path &>/dev/null; then - echo_err "iOS SDK not found, please install Xcode from AppStore or equivalent" -elif [ ! -f $(xcrun --sdk iphonesimulator --show-sdk-platform-path)/Developer/usr/bin/strings ]; then - echo_err "strings binary missing, please run 'sudo ln -s $(which strings) $(xcrun --sdk iphonesimulator --show-sdk-platform-path)/Developer/usr/bin/strings'" -fi - -if [ $error_on_quit != 0 ]; then - echo "Failed to detect required tools, aborting. Please run 'make very-clean' before rerunning 'make'" -fi - -exit $error_on_quit diff --git a/Tools/deploy.sh b/Tools/deploy.sh deleted file mode 100755 index 2e04a5946..000000000 --- a/Tools/deploy.sh +++ /dev/null @@ -1,28 +0,0 @@ -APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}" - -# This script loops through the frameworks embedded in the application and -# removes unused architectures. -find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK -do - FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable) - FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME" - echo "Executable is $FRAMEWORK_EXECUTABLE_PATH" - - EXTRACTED_ARCHS=() - - for ARCH in $ARCHS - do - echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME" - lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH" - EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH") - done - - echo "Merging extracted architectures: ${ARCHS}" - lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}" - rm "${EXTRACTED_ARCHS[@]}" - - echo "Replacing original executable with thinned version" - rm "$FRAMEWORK_EXECUTABLE_PATH" - mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH" - -done \ No newline at end of file diff --git a/Tools/exportOptions.plist b/Tools/exportOptions.plist deleted file mode 100644 index e93a5d1b3..000000000 --- a/Tools/exportOptions.plist +++ /dev/null @@ -1,18 +0,0 @@ - - - - - method - app-store - signingStyle - automatic - stripSwiftSymbols - - teamID - Z2V957B3D6 - uploadBitcode - - uploadSymbols - - - diff --git a/Tools/git_version.sh b/Tools/git_version.sh deleted file mode 100755 index 6f2c6a0b5..000000000 --- a/Tools/git_version.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/sh - -# git_version.sh -# -# Copyright (C) 2012 Belledonne Comunications, Grenoble, France -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Created by Gautier Pelloux-Prayer on 2014/11/03. -# Generate Classes/git_version.h which contains GIT_VERSION preprocessor macro - -linphone_ios_version=$(git describe --always) - -printf "/* LinphoneIOSVersion.h - * - * Copyright (C) 2012 Belledonne Comunications, Grenoble, France - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#define LINPHONE_IOS_VERSION \"$linphone_ios_version\" -" > $(dirname $0)/../Classes/LinphoneIOSVersion.h diff --git a/Tools/i18n_generate_strings_files.sh b/Tools/i18n_generate_strings_files.sh deleted file mode 100755 index f626ca7d3..000000000 --- a/Tools/i18n_generate_strings_files.sh +++ /dev/null @@ -1,120 +0,0 @@ -#!/bin/sh - -# Copyright (C) 2012 Belledonne Comunications, Grenoble, France -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Created by Gautier Pelloux-Prayer on 2014. -# Generate English translation files so that they can be pushed to Transifex -# for translation - -root_directory=$(cd "$(dirname $0)" && pwd)/../ - -set -e - -if [ $# != 0 ]; then - echo "No argument needed. This script will (re)generate .strings file from .xib files and register them in the transifex config file located in .tx/config." - exit 0 -fi - -function generate_transifex_config { - res_name=$1 - file_filter=$2 - source_file=$(test -f ${file_filter//en}&&echo ${file_filter//en}||echo ${file_filter//Base}) - if ! grep -q $res_name $root_directory/.tx/config; then - echo "not found in .tx/config, adding it" - echo " -[linphone-ios.$res_name] -source_lang = en -file_filter = $file_filter" >> $root_directory/.tx/config - if [ ! -z "$source_file" ]; then - echo "source_file = $source_file" >> $root_directory/.tx/config - fi - fi -} - -##### 1. Generate Localizable.strings from source files (.m) -function generate_localizable_from_sources { - #WARNING: in case of sed issue "extra characters at the end of g command", it means that - # we are trying to modify an UTF-16 file which is not supported.. - - localizable_en=$root_directory/Resources/en.lproj/Localizable.strings - # The 2 only specific cases of the application: since we are length limited for push - # notifications, the ID is not matching the English translation... so we must keep - # the translations! - iconv -f utf-16 -t utf-8 $localizable_en > $localizable_en.tmp - IC_MSG_EN=$(sed -nE 's/"IC_MSG" = "(.*)";/\1/p' $localizable_en.tmp) - IM_MSG_EN=$(sed -nE 's/"IM_MSG" = "(.*)";/\1/p' $localizable_en.tmp) - IM_FULLMSG_EN=$(sed -nE 's/"IM_FULLMSG" = "(.*)";/\1/p' $localizable_en.tmp) - rm -f $localizable_en $localizable_en.tmp - - find $root_directory/Classes -name '*.m' | xargs genstrings -u -a -o $(dirname $localizable_en) - iconv -f utf-16LE -t utf-8 $localizable_en > $localizable_en.tmp - sed -i.bak "s/= \"IC_MSG\";/= \"$IC_MSG_EN\";/" $localizable_en.tmp - sed -i.bak "s/= \"IM_MSG\";/= \"$IM_MSG_EN\";/" $localizable_en.tmp - sed -i.bak "s/= \"IM_FULLMSG\";/= \"$IM_FULLMSG_EN\";/" $localizable_en.tmp - iconv -f utf-8 -t utf-16LE $localizable_en.tmp > $localizable_en - rm $localizable_en.tmp.bak $localizable_en.tmp - - generate_transifex_config localizablestrings "Resources/.lproj/Localizable.strings" -} - -##### 2. Generate .strings for all XIB files -function generate_strings_from_xib { - to_utf8_file=$(mktemp -t linphone) - find $root_directory/Classes -not -path "$root_directory/Classes/KIF/*" -name Base.lproj -exec find {} -name '*.xib' \; | while read -r xibfile; do - stringsfile="${xibfile/.xib/.strings}" - - ibtool --generate-strings-file "$stringsfile" "$xibfile" - - # remove if empty - iconv -f utf-16 -t utf-8 "$stringsfile" > "$to_utf8_file" - if [ $(stat -f '%z' $to_utf8_file) -le 1 ]; then - echo "$(basename "$stringsfile") is empty, removing" - rm "$stringsfile" - else - echo "$(basename "$xibfile")->$(basename "$stringsfile")" - - res_name=$(basename "$stringsfile" | tr -d '_.~-' | tr '[:upper:]' '[:lower:]') - dir_name=$(echo $(dirname "$stringsfile") | sed -E "s|$root_directory/||") - - - generate_transifex_config $res_name $(echo $dir_name| sed 's/Base.lproj/.lproj/')/$(basename "$stringsfile") - fi - done - rm $to_utf8_file -} - -##### 3. Generate .strings for all InAppSettings PLIST files -function generate_strings_from_inappsettings_plist { - tmp_file=$(mktemp -t linphone) - find $root_directory/Settings/InAppSettings.bundle -name '*.plist' | while read -r plistfile; do - echo $plistfile - plistfilestrings="$(basename ${plistfile/.plist/.strings})" - printf '' > $tmp_file - while read title; do - echo "\"$title\" = \"$title\";" >> $tmp_file - done <<< "$(grep -e '>Title<' $plistfile -A 1 | sed -nE 's|.*(.*).*|\1|p')" - - mv $tmp_file $root_directory/Settings/InAppSettings.bundle/en.lproj/$plistfilestrings - - res_name=inappsettings$(echo "$plistfilestrings" | tr -d '_.~-' | tr '[:upper:]' '[:lower:]') - generate_transifex_config $res_name "Settings/InAppSettings.bundle/.lproj/$plistfilestrings" - done -} - -generate_localizable_from_sources -generate_strings_from_xib -generate_strings_from_inappsettings_plist diff --git a/Tools/i18n_update_strings_files.py b/Tools/i18n_update_strings_files.py deleted file mode 100755 index 966923c5c..000000000 --- a/Tools/i18n_update_strings_files.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (C) 2012 Belledonne Comunications, Grenoble, France -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Created by Gautier Pelloux-Prayer on 2014. -# Update non-English translation by regenerating .strings files and reapplying -# existing translations after that - -import codecs -import re -import sys -import shutil - -kvpattern = re.compile('^(.*) = (.*);$') - - -def find_english_for_key(file, key): - with codecs.open(file, 'r', 'utf-16') as fp: - for line in fp: - match = kvpattern.match(line) - - if match is None: - continue - - if key == match.groups()[0]: - return match.groups()[1] - - return None - - -def update_messages_for_file(old_file, new_file): - translations = {} - with codecs.open(old_file, 'r', 'utf-16') as fp: - for line in fp: - match = kvpattern.match(line) - - if match is None: - continue - - english_value = find_english_for_key(new_file, match.groups()[0]) - foreign_value = match.groups()[1] - - translations[english_value] = foreign_value - with codecs.open(new_file, 'r', 'utf-16') as f: - lines = f.read() - for english_value, foreign_value in translations.items(): - print("replace {} with {}".format(english_value, foreign_value)) - lines = lines.replace("{};".format(english_value), "{};".format(foreign_value)) - with codecs.open(new_file, 'w', 'utf-16') as f1: - f1.write(lines) - return True - - return False - -if len(sys.argv) != 3: - print("Usage: {} English.strings CustomLanguage.strings".format(sys.argv[0])) - print("CustomLanguage.strings will be modified to take all English strings with its own translations") -else: - new_file = sys.argv[2] + ".new" - shutil.copyfile(sys.argv[1], new_file) - if (update_messages_for_file(sys.argv[2], new_file)): - shutil.move(new_file, sys.argv[2]) diff --git a/Tools/imgur_upload.sh b/Tools/imgur_upload.sh deleted file mode 100755 index a73ab699c..000000000 --- a/Tools/imgur_upload.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash - -if [ ! -z "$KIF_SCREENSHOTS" ]; then - cd $KIF_SCREENSHOTS - - if [ ! -z "$(find . -name "*.png" -maxdepth 1)" ]; then - # Prepare location to collect delete commands - if test "$TRAVIS_BUILD_NUMBER" = ""; then - TRAVIS_BUILD_NUMBER="dev" - fi - download_cmds="" - - # curl from http://imgur.com/tools/imgurbash.sh via http://imgur.com/tools - # Documentation: http://code.google.com/p/imgur-api/source/browse/wiki/ImageUploading.wiki?r=82 - api_key=$IMGUR_KEY - for filepath in *.png; do - # echo "File $filepath" - # echo "Command: curl https://api.imgur.com/3/upload.json -H \"Authorization: Client-ID $api_key\" -F "image=@\"$filepath\""" - result="$(curl -s https://api.imgur.com/3/upload.json -H "Authorization: Client-ID $api_key" -F "image=@\"$filepath\"" )" - - # result='{"rsp":{"stat":"ok","image":{"image_hash":"dKZ0YK9","delete_hash":"r0MsZp11K9vawLf","original_image":"http:\/\/i.imgur.com\/dKZ0YK9.png","large_thumbnail":"http:\/\/i.imgur.com\/dKZ0YK9l.jpg","small_thumbnail":"http:\/\/i.imgur.com\/dKZ0YK9s.jpg","imgur_page":"http:\/\/imgur.com\/dKZ0YK9","delete_page":"http:\/\/imgur.com\/delete\/r0MsZp11K9vawLf"}}}' - if ! grep -q '"success":true' <<< $result; then - echo "There was a problem uploading \"$filepath\": $result" - exit 1 - else - url=$(echo "$result" | tr ',' '\n' | grep '"link":"http' | cut -d '"' -f 4) - download_cmds="${download_cmds}\nwget $url" - fi - done - echo "All uploads complete!" - printf "Download via: $download_cmds\n" - else - echo "Could not find any PNG in $PWD, something must be broken!" - fi -else - echo "Please initialize KIF_SCREENSHOTS env variable first!" -fi diff --git a/Tools/liblinphone.podspec b/Tools/liblinphone.podspec deleted file mode 100644 index 496ba154c..000000000 --- a/Tools/liblinphone.podspec +++ /dev/null @@ -1,13 +0,0 @@ -Pod::Spec.new do |s| - - s.name = "liblinphone" - s.version = "FRAMEWORK_VERSION" - s.summary = "This is liblinphone, a free (GPL) video voip library based on the SIP protocol" - s.homepage = "https://github.com/BelledonneCommunications/linphone-iphone" - s.license = "GNU GPL 2" - s.author = "employees@belledonne-communications.com" - s.platform = :ios, "9.0" - s.source = { :http => "https://www.linphone.org/releases/ios/liblinphone-iphone-sdk-FRAMEWORK_VERSION.zip" } - s.vendored_frameworks = "liblinphone-sdk/apple-darwin/Frameworks/**" - -end diff --git a/Tools/sdk_download.sh b/Tools/sdk_download.sh deleted file mode 100755 index 2e303ba8e..000000000 --- a/Tools/sdk_download.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash -x - -function die { - echo "$@" - exit 1 -} - -if [ $# != 2 ]; then - die "error: please provide what kind of SDK (for instance release and liblinphone SDK version to download (for instance 3.16.1)" -fi - -root_path="$(dirname $0)/.." -sdk_version=liblinphone-iphone-sdk-$2 -filename=$(find . -name liblinphone-iphone-sdk-*.zip) -version=$(echo $filename| cut -d'-' -f 4) -version=$(echo "${version:0:${#version}-4}") -if [ -z "$version" ]; then - version="0"; -fi - -if [ $(expr ${version} \< ${2}) -eq 1 ]; then - for f in ./liblinphone-iphone-sdk* - do - rm -r -f "$f" - done - - echo "Downloading SDK" - sdk_dir=$1 - sdk_path="$root_path/$sdk_version" - if [ -L "$root_path/liblinphone-sdk" ]; then - rm "$root_path/liblinphone-sdk" - fi - - if [ ! -d "$sdk_path" ]; then - if which wget &>/dev/null; then - wget https://www.linphone.org/$sdk_dir/ios/$sdk_version.zip -O "$sdk_path".zip - elif which curl &>/dev/null; then - curl -# https://www.linphone.org/$sdk_dir/ios/$sdk_version.zip > "$sdk_path".zip - else - return 1 - fi || die "error: cannot download liblinphone SDK from linphone.org. Please check the README.md" - - echo "info: liblinphone SDK successfully downloaded." - fi - - unzip -x $sdk_path.zip - mv liblinphone-sdk $sdk_path - ln -s $sdk_path liblinphone-sdk -fi diff --git a/Tools/sync_resources_android.py b/Tools/sync_resources_android.py deleted file mode 100755 index 0c402a6cb..000000000 --- a/Tools/sync_resources_android.py +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2012 Belledonne Comunications, Grenoble, France -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Created by Gautier Pelloux-Prayer on 2014/10/23. -# Create the correspondence map between iOS resources name and Android ones. - - -import os -import sys -import hashlib -import fnmatch - - -def file_md5(file): - hasher = hashlib.md5() - with open(file, 'rb') as afile: - buf = afile.read() - hasher.update(buf) - return hasher.hexdigest() - - -def list_glob_png(dir): - matches = [] - for root, dirnames, filenames in os.walk(dir): - for filename in fnmatch.filter(filenames, '*.png'): - matches.append(os.path.join(root, filename)) - return matches - - -def _halt(message, code): - sys.stderr.write("[ERROR] %s\n" % message) - sys.exit(0 << code) - - -def compare_md5(ios_dir, android_dir): - ios_images = list_glob_png(ios_dir) - android_images = list_glob_png(android_dir) - - ios_md5 = {} - for image in ios_images: - ios_md5[file_md5(image)] = image - - android_md5 = {} - for image in android_images: - android_md5[file_md5(image)] = image - - common_list = [] - ios_list = [] - android_list = [] - - for key in ios_md5: - if key in android_md5: - common_list.append(key) - else: - ios_list.append(key) - for key in android_md5: - if key not in ios_md5: - android_list.append(key) - - print("Common:") - for key in common_list: - print("{} = {}".format(ios_md5[key], android_md5[key])) - print("ios only:") - for key in ios_list: - print(ios_md5[key]) - print("android only:") - for key in android_list: - print(android_md5[key]) - - -if __name__ == '__main__': - if len(sys.argv) < 3: - _halt('Usage: {} iOS-repo android-repo'.format(sys.argv[0]), 1) - ios_dir = sys.argv[1] + "/Resources/" - android_dir = sys.argv[2] + "/res/" - - if not os.path.exists(ios_dir): - _halt("The directory '%s' does not exist" % - ios_dir, 2) - if not os.path.exists(android_dir): - _halt("The directory '%s' does not exist" % - android_dir, 2) - - compare_md5(ios_dir, android_dir) diff --git a/Tools/tag_missing_resources.sh b/Tools/tag_missing_resources.sh deleted file mode 100755 index 93a2df735..000000000 --- a/Tools/tag_missing_resources.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/sh - -# tag_missing_resources.sh -# -# Copyright (C) 2012 Belledonne Comunications, Grenoble, France -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Created by Gautier Pelloux-Prayer on 2014/10/09. -# This script will search for resources contained in Resources/ folder but not -# present in xcode build project project.pbxproj. Since we do not use folder -# references (because of http://vocaro.com/trevor/blog/2012/10/21/xcode-groups-vs-folder-references/), -# it helps keeping resources synced. -# Basically, the script will set a red tag to every files not added in the xcode project. User will then -# have to drag&drop these into xcode project. Red tags are automatically reset by the script on execution - - -if [ $# != 0 ]; then - echo "Usage: $0" - exit 0 -fi - -if ! which tag &>/dev/null; then - echo "Please install tag: port install tag or brew install tag" - exit 1 -fi - -# quit on first error -set -e - -# go where the script is -cd $(dirname $0) - -already_sync=$(mktemp -t tag_missing_resources) -to_sync=$(mktemp -t tag_missing_resources) - -grep -oE '([^ /"])*.png' ../linphone.xcodeproj/project.pbxproj | sort -u > $already_sync -find ../Resources/ -not -path '*/Images.xcassets/*' -name '*.png' -exec basename {} \; | sort -u > $to_sync - -# clean red tags -for file in $to_sync $already_sync; do - find ../Resources -name $file -exec tag -r red {} \; -done - -# 'comm' command output files contained in second file but not in first nor in common -non_synced_files=$(comm -13 $already_sync $to_sync) - -for file in $non_synced_files; do - find ../Resources -name $file -exec tag -a red {} \; -done - -rm $already_sync $to_sync - -echo "********************** -Done. Created red tags for non-synced files: -${non_synced_files}. - -Drag and drop these files into your xcode project. You can go to the folder using: - open $PWD/../Resources -Then use search feature and type 'red', select the red tag and go! -**********************" diff --git a/UITests/CallUITests/ActiveCallUITests.swift b/UITests/CallUITests/ActiveCallUITests.swift deleted file mode 100644 index 44733cc49..000000000 --- a/UITests/CallUITests/ActiveCallUITests.swift +++ /dev/null @@ -1,96 +0,0 @@ -import XCTest - -class ActiveCallUITests: XCTestCase { - var methods: ActiveCallViewUITestsMethods! - - override func setUpWithError() throws { - continueAfterFailure = true - UITestsUtils.testAppSetup() - methods = ActiveCallViewUITestsMethods() //to reload accounts infos if testAppSetup change them - } - - - func testViewDisplay() throws { - methods.startActiveCall() - methods.endCall() - } - - func testOpenCallStats() throws { - methods.startActiveCall() - methods.openCallStatsFromStatusBar() - methods.endCall() - } - - func testCloseCallStats() throws { - methods.startActiveCall() - methods.openCallStatsFromStatusBar() - methods.closeCallStatsFromStatusBar() - methods.endCall() - } - - func testCallRecord() throws { - methods.startActiveCall() - methods.startCallRecord() - methods.stopCallRecord() - methods.endCall() - } - - func testRemoteCallRecord() throws { - methods.startActiveCall() - methods.startCallRecord(remote: true) - methods.stopCallRecord(remote: true) - methods.endCall() - } - - func testPauseCall() throws { - methods.startActiveCall() - methods.pauseActiveCall() - methods.endCall() - } - - func testResumeCall() throws { - methods.startActiveCall() - methods.pauseActiveCall() - methods.resumeActiveCall() - methods.endCall() - } - - func testRemotePauseCall() throws { - methods.startActiveCall() - methods.pauseRemoteCall() - methods.endCall() - } - - func testRemoteResumeCall() throws { - methods.startActiveCall() - methods.pauseRemoteCall() - methods.resumeRemoteCall() - methods.endCall() - } - - func testToggleControls() throws { - methods.startActiveCall() - methods.toggleCallControls(buttonTag: "speaker", parentView: methods.app.activeCallView) - methods.toggleCallControls(buttonTag: "mute",parentView: methods.app.activeCallView) - methods.endCall() - } - - func testOpenExtraMenu() throws { - methods.startActiveCall() - methods.openExtraButtonMenu() - methods.endCall() - } - - func testCloseExtraMenu() throws { - methods.startActiveCall() - methods.openExtraButtonMenu() - methods.closeExtraButtonMenu() - methods.endCall() - } - - func testHangup() throws { - methods.startActiveCall() - methods.hangupActiveCall() - } -} - diff --git a/UITests/CallUITests/ExtraMenuUITests.swift b/UITests/CallUITests/ExtraMenuUITests.swift deleted file mode 100644 index 7026b0e50..000000000 --- a/UITests/CallUITests/ExtraMenuUITests.swift +++ /dev/null @@ -1,53 +0,0 @@ -import XCTest - -class ExtraMenuUITests: XCTestCase { - var methods: ExtraMenuActiveCallActionsUITestsMethods! - - override func setUpWithError() throws { - continueAfterFailure = true - UITestsUtils.testAppSetup() - methods = ExtraMenuActiveCallActionsUITestsMethods() //to reload accounts infos if testAppSetup change them - } - - - func testViewDisplay() throws { - methods.displayExtraMenuButtonView() - methods.endCall() - } - - func testOpenCallStats() throws { - methods.displayExtraMenuButtonView() - methods.openCallStatsFromExtraMenuButtonView() - methods.endCall() - } - - func testCloseCallStats() throws { - methods.displayExtraMenuButtonView() - methods.openCallStatsFromExtraMenuButtonView() - methods.closeCallStatsFromItself() - methods.endCall() - } - - func testOpenCallNumpad() throws { - methods.displayExtraMenuButtonView() - methods.openCallNumpad() - methods.endCall() - } - - func testCloseCallNumpad() throws { - methods.displayExtraMenuButtonView() - methods.openCallNumpad() - methods.closeCallNumpad() - methods.endCall() - } - - func testNumpadtyping() { - methods.displayExtraMenuButtonView() - methods.openCallNumpad() - methods.composeNumpadNumbers() - methods.endCall() - } - - - //to complete with other buttons -} diff --git a/UITests/CallUITests/IncomingCallUITests.swift b/UITests/CallUITests/IncomingCallUITests.swift deleted file mode 100644 index 81036d30d..000000000 --- a/UITests/CallUITests/IncomingCallUITests.swift +++ /dev/null @@ -1,36 +0,0 @@ -import XCTest - -class IncomingCallUITests: XCTestCase { - var methods: IncomingOutgoingCallViewUITestsMethods! - - override func setUpWithError() throws { - continueAfterFailure = true - UITestsUtils.testAppSetup() - methods = IncomingOutgoingCallViewUITestsMethods() //to reload accounts infos if testAppSetup changes them - } - - func testViewDisplay() throws { - methods.startIncomingCall() - methods.endCall() - } - - func testNoAnswer() throws { - methods.startIncomingCall() - methods.noAnswerIncomingCall() - } - - func testDecline() throws { - methods.startIncomingCall() - methods.declineIncomingCall() - methods.endCall() - } - - func testAccept() throws { - methods.startIncomingCall() - methods.acceptIncomingCall() - methods.endCall() - } -} - - - diff --git a/UITests/CallUITests/OutgoingCallUITests.swift b/UITests/CallUITests/OutgoingCallUITests.swift deleted file mode 100644 index 247ac06c0..000000000 --- a/UITests/CallUITests/OutgoingCallUITests.swift +++ /dev/null @@ -1,39 +0,0 @@ -import XCTest - -class OutgoingCallUITests: XCTestCase { - var methods: IncomingOutgoingCallViewUITestsMethods! - - override func setUpWithError() throws { - continueAfterFailure = true - UITestsUtils.testAppSetup() - methods = IncomingOutgoingCallViewUITestsMethods() //to reload accounts infos if testAppSetup change them - } - - func testViewDisplay() throws { - methods.startOutgoingCall() - methods.endCall() - } - - func testNoAnswer() throws { - methods.startOutgoingCall() - methods.noAnswerOutgoingCall() - - } - - func testToggleMute() throws { - methods.startOutgoingCall() - methods.toggleCallControls(buttonTag: "mute", parentView: methods.app.callView) - methods.endCall() - } - - func testToggleSpeaker() throws { - methods.startOutgoingCall() - methods.toggleCallControls(buttonTag: "speaker", parentView: methods.app.callView) - methods.endCall() - } - - func testCancel() throws { - methods.startOutgoingCall() - methods.cancelOutgoingCall() - } -} diff --git a/UITests/Methods/ActiveCallViewUITestsMethods.swift b/UITests/Methods/ActiveCallViewUITestsMethods.swift deleted file mode 100644 index 4f95d5727..000000000 --- a/UITests/Methods/ActiveCallViewUITestsMethods.swift +++ /dev/null @@ -1,120 +0,0 @@ -import XCTest - -class ActiveCallViewUITestsMethods : IncomingOutgoingCallViewUITestsMethods { - - func startActiveCall() { - XCTContext.runActivity(named: "Start Active Call") { _ in - startIncomingCall() - acceptIncomingCall() - } - } - - func openCallStatsFromStatusBar() { - XCTContext.runActivity(named: "Display Call Stats From Status Bar") { _ in - app.representationWithElements.makeBackup(named: "call_stats_closed") - app.statusBar.buttons["status_bar_incall_quality"].tap() - - //app.callStatsView.representation.reMake() - app.representationWithElements.otherElement = app.callStatsView - app.representationWithElements.withElementVariations(mainView: ["shadow"], statusBar: ["call_view"], tabBar: []).check() - - } - } - - func closeCallStatsFromStatusBar() { - XCTContext.runActivity(named: "Hide Call Stats From Status Bar") { _ in - app.statusBar.buttons["status_bar_incall_quality"].tap() - app.representationWithElements.reloadBackup(named: "call_stats_closed").check() - } - } - - func startCallRecord(remote: Bool = false) { - XCTContext.runActivity(named: "Start \(remote ? "Remote" : "") Call Record") { _ in - app.representationWithElements.makeBackup(named: "record_end") - if (!remote) { - app.activeCallView.buttons["active_call_center_section_record"].tap() - //app.activeCallView.representation.withVariations(named: ["record"]).reMake() - app.representationWithElements.updateElementVariations(mainView: ["record"], statusBar: [], tabBar: []).check() - } else { - ghostAccount.startRecording() - //app.activeCallView.representation.withVariations(named: ["remote_record"]).reMake() - app.representationWithElements.updateElementVariations(mainView: ["remote_record"], statusBar: [], tabBar: []).check() - } - ghostAccount.waitForRecordingState(recording: true, onRemote: !remote, timeout: 5) - } - } - - func stopCallRecord(remote: Bool = false) { - XCTContext.runActivity(named: "Stop \(remote ? "Remote" : "") Call Record") { _ in - if (!remote) { - app.activeCallView.buttons["active_call_center_section_record"].tap() - } else { - ghostAccount.mCore.currentCall?.stopRecording() - } - ghostAccount.waitForRecordingState(recording: false, onRemote: !remote, timeout: 5) - app.representationWithElements.reloadBackup(named: "record_end").check() - } - } - - func pauseActiveCall() { - XCTContext.runActivity(named: "Pause Active Call") { _ in - app.representationWithElements.makeBackup(named: "pause_end") - app.activeCallView.buttons["active_call_center_section_pause"].tap() - //app.activeCallView.representation.withVariations(named: ["pause"]).reMake() - app.representationWithElements.updateElementVariations(mainView: ["pause_shadow","pause"], statusBar: [], tabBar: []).check() - ghostAccount.waitForCallState(callState: .PausedByRemote, timeout: 5) - } - } - - func resumeActiveCall() { - XCTContext.runActivity(named: "Resume Active Call") { _ in - app.activeCallView.images["paused_call_view_icon"].tap() - app.representationWithElements.reloadBackup(named: "pause_end").check() - ghostAccount.waitForCallState(callState: .StreamsRunning, timeout: 5) - } - } - - func pauseRemoteCall() { - XCTContext.runActivity(named: "Pause Remote Call") { _ in - app.representationWithElements.makeBackup(named: "pause_end") - ghostAccount.pauseCall() - ghostAccount.waitForCallState(callState: .Paused, timeout: 5) - //app.activeCallView.representation.withVariations(named: ["remote_pause"]).reMake() - app.representationWithElements.updateElementVariations(mainView: ["pause_shadow","remote_pause"], statusBar: [], tabBar: []).check() - } - } - - func resumeRemoteCall() { - XCTContext.runActivity(named: "Resume Remote Call") { _ in - ghostAccount.resumeCall() - ghostAccount.waitForCallState(callState: .StreamsRunning, timeout: 5) - app.representationWithElements.reloadBackup(named: "pause_end").check() - } - } - - func openExtraButtonMenu() { - XCTContext.runActivity(named: "Open Extra Menu Button") { _ in - app.representationWithElements.makeBackup(named: "extra_menu_closed") - app.activeCallView.buttons["active_call_view_extra_buttons"].tap() - //app.activeCallView.representation.withVariations(named: ["extra_menu"]).reMake() - app.representationWithElements.updateElementVariations(mainView: ["shadow","extra_menu"], statusBar: [], tabBar: []).check() - } - } - - func closeExtraButtonMenu() { - XCTContext.runActivity(named: "Check Extra Menu View Integrity") { _ in - app.activeCallView.otherElements["active_call_view_shading_mask"].tap() - app.representationWithElements.reloadBackup(named: "extra_menu_closed").check() - } - } - - func hangupActiveCall() { - XCTContext.runActivity(named: "Hangup Active Call") { _ in - app.activeCallView.buttons["active_call_view_hangup"].tap() - app.representationWithElements.reloadBackup(named: "call_end").check() - ghostAccount.waitForCallState(callState: .Released, timeout: 5) - } - } - -} - diff --git a/UITests/Methods/ConferenceCallViewUITestsMethods.swift b/UITests/Methods/ConferenceCallViewUITestsMethods.swift deleted file mode 100644 index 18e25a476..000000000 --- a/UITests/Methods/ConferenceCallViewUITestsMethods.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// ConferenceCallViewUITestsMethods.swift -// ConferenceUITests -// -// Created by Quentin Monnier on 05/08/2022. -// - -import XCTest -import linphonesw - -class ConferrenceCallViewUITestsMethods { - - let app: XCUIApplication - let appAccountAuthInfo = UITestsCoreManager.instance.appAccountAuthInfo! - let ghostAccounts = UITestsCoreManager.instance.ghostAccounts - - init(app: XCUIApplication) { - self.app = app - } - - func startOutgoingConference() { - - } -} diff --git a/UITests/Methods/ExtraMenuActiveCallActionsUITestsMethods.swift b/UITests/Methods/ExtraMenuActiveCallActionsUITestsMethods.swift deleted file mode 100644 index 988728198..000000000 --- a/UITests/Methods/ExtraMenuActiveCallActionsUITestsMethods.swift +++ /dev/null @@ -1,87 +0,0 @@ -import XCTest - -class ExtraMenuActiveCallActionsUITestsMethods : ActiveCallViewUITestsMethods { - - func displayExtraMenuButtonView() { - startActiveCall() - openExtraButtonMenu() - } - - func openCallStatsFromExtraMenuButtonView() { - app.extraMenuView.buttons["active_call_extra_buttons_stats"].tap() - - app.representationWithElements.otherElement = app.callStatsView - app.representationWithElements.withElementVariations(mainView: ["shadow"], statusBar: ["call_view"], tabBar: []).check() - } - - func closeCallStatsFromItself() { - app.callStatsView.buttons["call_stats_view_hide"].tap() - - app.representationWithElements.reloadBackup(named: "extra_menu_closed").check() - } - - func openCallNumpad() { - app.extraMenuView.buttons["active_call_extra_buttons_numpad"].tap() - - //app.numpadCallView.representation.reMake() - app.representationWithElements.otherElement = app.numpadCallView - app.representationWithElements.withElementVariations(mainView: ["shadow"], statusBar: ["call_view"], tabBar: []).check() - } - - func closeCallNumpad() { - app.numpadCallView.buttons["call_numpad_view_hide"].tap() - - app.representationWithElements.reloadBackup(named: "extra_menu_closed").check() - } - - func composeNumpadNumbers() { - - let textField = app.staticTexts["call_numpad_view_text_field"] - var digitsLabel = ["1","2","3","4","5","6","7","8","9","*","0","#"] - digitsLabel += digitsLabel - digitsLabel.shuffle() - for label in digitsLabel { - app.numpadCallView.buttons["call_numpad_view_digit_\(label)"].tap() - - } - - XCTAssertEqual(textField.label, digitsLabel.joined(), "Text Field value differs from the sequence typed (is equal to \"\(textField.label)\")") - } - - /* - func openView(buttonTag: String, view: View) { - let button = app.extraMenuView.buttons["active_call_extra_buttons_\(buttonTag)"].tap() - //button.tap(action: .displayView, on: view) - } - - func closeView(contextView: View) { - let hide = UIObject(identifier: "\(contextView.rawValue)_hide", type: .button, contextView: contextView) - //hide.tap(action: .hideView, on: contextView) - } - - func backToCall(contextView: View) { - let button = UIObject(identifier: "back_to_call", type: .button, contextView: contextView) - //button.tap(action: .displayView, on: .ActiveCallView) - } - - func checkNumpadView() { - - UIObject(identifier: "call_numpad_view_hide", type: .button, contextView: .NumpadView) - let textField = UIObject(identifier: "call_numpad_view_text_field", type: .staticText, contextView: .NumpadView).element - - var digitsLabel = ["1","2","3","4","5","6","7","8","9","*","0","#"] - digitsLabel += digitsLabel - digitsLabel.shuffle() - for label in digitsLabel { - UIObject(identifier: "call_numpad_view_digit_\(label)", type: .button, contextView: .NumpadView).element.tap() - } - - XCTAssertEqual(textField.label, digitsLabel.joined(), "Text Field value differs from the sequence typed (is equal to \"\(textField.label)\")") - } - - func closeCallsList() { - let hide = UIObject(identifier: "dismissable_view_close", type: .button, contextView: .CallsListView) - //hide.tap(action: .hideView, on: .CallsListView) - }*/ -} - diff --git a/UITests/Methods/IncomingOutgoingCallViewUITestsMethods.swift b/UITests/Methods/IncomingOutgoingCallViewUITestsMethods.swift deleted file mode 100644 index fa3aff06c..000000000 --- a/UITests/Methods/IncomingOutgoingCallViewUITestsMethods.swift +++ /dev/null @@ -1,133 +0,0 @@ -import XCTest -import linphonesw - -class IncomingOutgoingCallViewUITestsMethods { - - let app = XCUIApplication() - let manager = UITestsCoreManager.instance - let appAccountAuthInfo: AuthInfo = UITestsCoreManager.instance.appAccountAuthInfo! - let ghostAccount: UITestsRegisteredLinphoneCore = UITestsCoreManager.instance.ghostAccounts[0] - - func startIncomingCall() { - XCTContext.runActivity(named: "Start Incoming Call") { _ in - if (ghostAccount.callState != .Released) {ghostAccount.terminateCall()} - app.representationWithElements.makeBackup(named: "call_end") - - ghostAccount.startCall(adress: manager.createAdress(authInfo: appAccountAuthInfo)) - ghostAccount.waitForCallState(callState: .OutgoingRinging, timeout: 5) - - _ = app.callView.waitForExistence(timeout: 5) - checkCallTime(element: app.callView.staticTexts["IO_call_view_duration"]) - app.callView.images["IO_call_view_spinner"].representation.isAnimated(timeInterval: 0.5) - - //app.callView.representation.reMake() - //app.statusBar.representation.withVariations(named: ["call_view"]).reMake() - app.representationWithElements.mainView = app.callView - app.representationWithElements.withElementVariations(mainView: [], statusBar: ["call_view"], tabBar: []).check() - } - } - - func startOutgoingCall() { - XCTContext.runActivity(named: "Start Outgoing Call") { _ in - if (ghostAccount.callState != .Released) {ghostAccount.terminateCall()} - if (!app.dialerView.exists) { app.launch()} - app.representationWithElements.makeBackup(named: "call_end") - - app.dialerView.textFields["adress_field"].fillTextField(ghostAccount.mAuthInfo.username) - checkCallTime(element: app.callView.staticTexts["IO_call_view_duration"]) - - //app.callView.representation.withVariations(named: ["outgoing"]).reMake() - //app.statusBar.representation.withVariations(named: ["call_view"]).reMake() - app.representationWithElements.mainView = app.callView - app.representationWithElements.withElementVariations(mainView: ["outgoing"], statusBar: ["call_view"], tabBar: []).check() - - ghostAccount.waitForCallState(callState: .IncomingReceived, timeout: 5) - } - } - - func endCall() { - XCTContext.runActivity(named: "End Call (from remote)") { _ in - if (ghostAccount.callState == .Released) {return} - - ghostAccount.terminateCall() - ghostAccount.waitForCallState(callState: .Released, timeout: 5) - - app.representationWithElements.reloadBackup(named: "call_end").check() - } - } - - //expected format : "mm:ss" - func checkCallTime(element: XCUIElement) { - XCTContext.runActivity(named: "Check call time increment") { _ in - let timerArray: [Int] = (0..<3).map{_ in - sleep(1) - return Int(element.label.split(separator: ":").last ?? "") ?? 0 - } - XCTAssert(Set(timerArray).count >= 2, "Call Time is not correctly incremented, less than 2 differents values are displayed in 3 seconds") - XCTAssert(timerArray == timerArray.sorted(), "Call Time is not correctly incremented, it is not increasing") - XCTAssert(timerArray.first! <= 3, "Call Time is not correctly initialized, it is more than 3 right after the start (found: \(timerArray.first!))") - } - } - - - func toggleCallControls(buttonTag: String, parentView: XCUIElement) { - XCTContext.runActivity(named: "Toggle call control Button : \"\(buttonTag)\"") { _ in - app.representationWithElements.makeBackup(named: buttonTag) - parentView.buttons["call_control_view_\(buttonTag)"].tap() - app.representationWithElements.updateElementVariations(mainView: [buttonTag], statusBar: [], tabBar: []).check() - - parentView.buttons["call_control_view_\(buttonTag)"].tap() - app.representationWithElements.reloadBackup(named: buttonTag).check() - } - } - - func noAnswerIncomingCall() { - XCTContext.runActivity(named: "Let Incoming Call Ring Until Stop") { _ in - XCTAssert(app.callView.waitForExistence(timeout: 5), "call already abort after less than 10 seconds ringing") - XCTAssert(app.callView.waitForNonExistence(timeout: 30), "call still not abort after 30 seconds ringing") - ghostAccount.waitForCallState(callState: .Released, timeout: 5) - app.representationWithElements.reloadBackup(named: "call_end").check() - } - } - - func noAnswerOutgoingCall() { - XCTContext.runActivity(named: "Check Outgoing Call Failed Popup Integrity And Close") { context in - XCTAssert(app.callView.waitForExistence(timeout: 5), "call already abort after less than 10 seconds ringing") - XCTAssert(app.callView.waitForNonExistence(timeout: 30), "call still not abort after 30 seconds ringing") - ghostAccount.waitForCallState(callState: .Released, timeout: 5) - app.callFailedView.representation.check() - app.callFailedView.buttons["call_failed_error_view_action"].tap() - app.representationWithElements.reloadBackup(named: "call_end").check() - } - - } - - func cancelOutgoingCall() { - XCTContext.runActivity(named: "Cancel Outgoing Call") { _ in - app.callView.buttons["O_call_view_cancel"].tap() - app.representationWithElements.reloadBackup(named: "call_end").check() - ghostAccount.waitForCallState(callState: .Released, timeout: 5) - } - } - - func declineIncomingCall() { - XCTContext.runActivity(named: "Decline Incoming Call") { _ in - app.callView.buttons["I_call_view_decline"].tap() - app.representationWithElements.reloadBackup(named: "call_end").check() - ghostAccount.waitForCallState(callState: .Released, timeout: 5) - } - } - - func acceptIncomingCall() { - XCTContext.runActivity(named: "Accept Incoming Call") { _ in - app.callView.buttons["I_call_view_accept"].tap() - checkCallTime(element: app.activeCallView.staticTexts["active_call_upper_section_duration"]) - app.representationWithElements.mainView = app.activeCallView - //app.activeCallView.representation.reMake() - app.representationWithElements.check() - ghostAccount.waitForCallState(callState: .StreamsRunning, timeout: 5) - } - } - -} - diff --git a/UITests/Methods/UITestsCoreManager.swift b/UITests/Methods/UITestsCoreManager.swift deleted file mode 100644 index b81b9ab6d..000000000 --- a/UITests/Methods/UITestsCoreManager.swift +++ /dev/null @@ -1,380 +0,0 @@ -import XCTest -import linphonesw - - -class UITestsCoreManager { - - private var mCore: Core! - private var coreVersion: String = Core.getVersion - - private var mAccountCreator: AccountCreator! - - var appAccountAuthInfo: AuthInfo! - var ghostAccounts: UITestsGhostAccounts! - let dnsServer = "51.255.123.121" - - static let instance = UITestsCoreManager() - - - init() { - LoggingService.Instance.logLevel = LogLevel.Debug - Core.enableLogCollection(state: .Enabled) - - //Config account creator for flexiapi - let config: Config! = try! Factory.Instance.createConfig(path: "\(Factory.Instance.getConfigDir(context: nil))/linphonerc") - config.setInt(section: "account_creator", key: "backend", value: AccountCreator.Backend.FlexiAPI.rawValue) - config.setString(section: "account_creator", key: "url", value: "http://subscribe.example.org/flexiapi/api/") - try! mCore = Factory.Instance.createCoreWithConfig(config: config, systemContext: nil) - mCore.dnsServersApp = [dnsServer] - mAccountCreator = try! mCore.createAccountCreator(xmlrpcUrl: nil) - - try? mCore.start() - - ghostAccounts = UITestsGhostAccounts(coreCreationFunction: newRegisteredLinphoneCore) - - appAccountAuthInfo = mCore.authInfoList.isEmpty ? createAccount() : mCore.authInfoList[0] - } - - deinit { - mCore.stop() - mCore = nil - } - - func newRegisteredLinphoneCore() -> UITestsRegisteredLinphoneCore { - let authInfo = mCore.authInfoList.indices.contains(ghostAccounts.count+1) ? mCore.authInfoList[ghostAccounts.count+1] : createAccount() - return UITestsRegisteredLinphoneCore(authInfo: authInfo) - } - - func createAccount() -> AuthInfo { - XCTContext.runActivity(named: "Create new account") { _ in - mAccountCreator.username = "uitester_\(String(Int(Date().timeIntervalSince1970*1000)).suffix(5))" - mAccountCreator.password = String((0..<15).map{ _ in mAccountCreator!.username.randomElement()! }) - mAccountCreator.domain = "sip.example.org" - mAccountCreator.email = "\(mAccountCreator!.username)@\(mAccountCreator!.domain)" - mAccountCreator.transport = TransportType.Tcp - _ = try! mAccountCreator.createAccount() - waitForAccountCreationStatus(status: .RequestOk, timeout: 5) - - let authInfo = try! Factory.Instance.createAuthInfo(username: mAccountCreator.username, userid: "", passwd: mAccountCreator.password, ha1: "", realm: "", domain: mAccountCreator.domain) - mCore.addAuthInfo(info: authInfo) - XCTContext.runActivity(named: "username : \(mAccountCreator.username)\npassword : \(mAccountCreator.password)\ndomain : \(mAccountCreator.domain)") { _ in} - return authInfo - } - } - - func accountsReset() { - XCTContext.runActivity(named: "Clear all accounts") { _ in - mCore.clearAllAuthInfo() - ghostAccounts.reset() - appAccountAuthInfo = createAccount() - } - } - - func createAdress(authInfo: AuthInfo) -> Address { - return try! Factory.Instance.createAddress(addr: "sip:\(authInfo.username)@\(authInfo.domain)") - } - - func waitForAccountCreationStatus(status: AccountCreator.Status, timeout: Double) { - let expectation = XCTestExpectation(description: "account status is successfully : \(status)") - XCTContext.runActivity(named: "Waiting for account status : \(status)") { _ in - let accountCreatorDelegate = AccountCreatorDelegateStub(onCreateAccount: { (creator: AccountCreator, status: AccountCreator.Status, response: String) in - if (status == status) { - expectation.fulfill() - } - }) - self.mAccountCreator?.addDelegate(delegate: accountCreatorDelegate) - let result = XCTWaiter().wait(for: [expectation], timeout: timeout) - self.mAccountCreator?.removeDelegate(delegate: accountCreatorDelegate) - XCTAssert(result == .completed, "\"\(status)\" account status still not verified after \(timeout) seconds") - } - } -} - - -class UITestsGhostAccounts { - - private var mCores = [UITestsRegisteredLinphoneCore]() { - didSet { - count = mCores.count - } - } - private(set) var count: Int! - - private let newCore: (()->UITestsRegisteredLinphoneCore)! - - init(coreCreationFunction: @escaping ()->UITestsRegisteredLinphoneCore) { - count = mCores.count - newCore = coreCreationFunction - } - - func reset() { - mCores = [] - } - - subscript (index: Int) -> UITestsRegisteredLinphoneCore { - while (index >= mCores.count) { - mCores.append(newCore()) - } - return mCores[index] - } - -} - - -class UITestsRegisteredLinphoneCore { - - var mCore: Core! - var coreVersion: String = Core.getVersion - var description: String - - private let manager = UITestsCoreManager.instance - - private(set) var mCoreDelegate : CoreDelegate! - private(set) var mAccount: Account! - private(set) var mAuthInfo: AuthInfo! - - private(set) var callState : Call.State = .Released - private(set) var registrationState : RegistrationState = .Cleared - - init(authInfo: AuthInfo) { - - description = "Ghost Account (\(authInfo.username))" - LoggingService.Instance.logLevel = LogLevel.Debug - Core.enableLogCollection(state: .Enabled) - - try! mCore = Factory.Instance.createCore(configPath: "", factoryConfigPath: "", systemContext: nil) - mCore.dnsServers = [manager.dnsServer] - - mCore.videoCaptureEnabled = true - mCore.videoDisplayEnabled = true - mCore.recordAwareEnabled = true - mCore.videoActivationPolicy!.automaticallyAccept = true - - mCoreDelegate = CoreDelegateStub(onCallStateChanged: { (core: Core, call: Call, state: Call.State, message: String) in - self.callState = state - NSLog("\(call.params?.account?.params?.identityAddress) current call state is \(self.callState)\n") - - }, onAccountRegistrationStateChanged: { (core: Core, account: Account, state: RegistrationState, message: String) in - self.registrationState = state - NSLog("New registration state is \(state) for user id \(account.params?.identityAddress)\n") - }) - mCore.addDelegate(delegate: mCoreDelegate) - - mCore.playFile = "sounds/hello8000.wav" - mCore.useFiles = true - - try? mCore.start() - - mAuthInfo = authInfo - login(transport: TransportType.Tcp) - } - - deinit { - mCore.stop() - mCore = nil - mCoreDelegate = nil - } - - func login(transport: TransportType) { - XCTContext.runActivity(named: "\(description) : Login") { _ in - do { - let accountParams = try mCore.createAccountParams() - let identity = manager.createAdress(authInfo: mAuthInfo) - try accountParams.setIdentityaddress(newValue: identity) - let address = try Factory.Instance.createAddress(addr: String("sip:" + mAuthInfo.domain)) - try address.setTransport(newValue: transport) - try accountParams.setServeraddress(newValue: address) - accountParams.registerEnabled = true - let account = try mCore.createAccount(params: accountParams) - mCore.addAuthInfo(info: mAuthInfo) - try mCore.addAccount(account: account) - mAccount = account - mCore.defaultAccount = mAccount - waitForRegistrationState(registrationState: .Ok, timeout: 5) - - } catch { NSLog(error.localizedDescription) } - } - } - - private func makeRecordFilePath() -> String{ - var filePath = "recording_" - let now = Date() - let dateFormat = DateFormatter() - dateFormat.dateFormat = "E-d-MMM-yyyy-HH-mm-ss" - let date = dateFormat.string(from: now) - filePath = filePath.appending("\(date).mkv") - - let paths = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true) - let writablePath = paths[0] - return writablePath.appending("/\(filePath)") - } - - func startCall(adress: Address) { - XCTContext.runActivity(named: "\(description) : Start calling \(adress.username)") { _ in - do { - let params = try mCore.createCallParams(call: nil) - params.mediaEncryption = MediaEncryption.None - params.recordFile = makeRecordFilePath() - let _ = mCore.inviteAddressWithParams(addr: adress, params: params) - } catch { NSLog(error.localizedDescription) } - } - - } - - func terminateCall() { - XCTContext.runActivity(named: "\(description) : End call") { _ in - do { - if (mCore.callsNb == 0) { return } - let coreCall = (mCore.currentCall != nil) ? mCore.currentCall : mCore.calls[0] - if let call = coreCall { - try call.terminate() - } - } catch { NSLog(error.localizedDescription) } - } - } - - func acceptCall() { - XCTContext.runActivity(named: "\(description) : Accept call from \(mAuthInfo.username)") { _ in - // IMPORTANT : Make sure you allowed the use of the microphone (see key "Privacy - Microphone usage description" in Info.plist) ! - do { - // if we wanted, we could create a CallParams object - // and answer using this object to make changes to the call configuration - // (see OutgoingCall tutorial) - try mCore.currentCall?.accept() - } catch { NSLog(error.localizedDescription) } - } - } - - func toggleMicrophone() { - // The following toggles the microphone, disabling completely / enabling the sound capture - // from the device microphone - mCore.micEnabled = !mCore.micEnabled - } - - func toggleSpeaker() { - // Get the currently used audio device - let currentAudioDevice = mCore.currentCall?.outputAudioDevice - let speakerEnabled = currentAudioDevice?.type == AudioDevice.Kind.Speaker - - let test = currentAudioDevice?.deviceName - // We can get a list of all available audio devices using - // Note that on tablets for example, there may be no Earpiece device - for audioDevice in mCore.audioDevices { - - // For IOS, the Speaker is an exception, Linphone cannot differentiate Input and Output. - // This means that the default output device, the earpiece, is paired with the default phone microphone. - // Setting the output audio device to the microphone will redirect the sound to the earpiece. - if (speakerEnabled && audioDevice.type == AudioDevice.Kind.Microphone) { - mCore.currentCall?.outputAudioDevice = audioDevice - return - } else if (!speakerEnabled && audioDevice.type == AudioDevice.Kind.Speaker) { - mCore.currentCall?.outputAudioDevice = audioDevice - return - } - /* If we wanted to route the audio to a bluetooth headset - else if (audioDevice.type == AudioDevice.Type.Bluetooth) { - core.currentCall?.outputAudioDevice = audioDevice - }*/ - } - } - - func toggleVideo() { - do { - if (mCore.callsNb == 0) { return } - let coreCall = (mCore.currentCall != nil) ? mCore.currentCall : mCore.calls[0] - if let call = coreCall { - let params = try mCore.createCallParams(call: call) - params.videoEnabled = !(call.currentParams!.videoEnabled) - try call.update(params: params) - } - } catch { NSLog(error.localizedDescription) } - } - - func toggleCamera() { - do { - let currentDevice = mCore.videoDevice - for camera in mCore.videoDevicesList { - if (camera != currentDevice && camera != "StaticImage: Static picture") { - try mCore.setVideodevice(newValue: camera) - break - } - } - } catch { NSLog(error.localizedDescription) } - } - - func pauseCall() { - do { - if (mCore.callsNb == 0) { return } - let coreCall = (mCore.currentCall != nil) ? mCore.currentCall : mCore.calls[0] - try coreCall!.pause() - } catch { NSLog(error.localizedDescription) } - } - - func resumeCall() { - do { - if (mCore.callsNb == 0) { return } - let coreCall = (mCore.currentCall != nil) ? mCore.currentCall : mCore.calls[0] - try coreCall!.resume() - } catch { NSLog(error.localizedDescription) } - } - - func startRecording() { - mCore.currentCall?.startRecording() - } - - func stopRecording() { - mCore.currentCall?.stopRecording() - } - - func waitForRegistrationState(registrationState: RegistrationState, timeout: TimeInterval) { - let expectation = XCTestExpectation(description: "registration state is successfully : \(registrationState)") - XCTContext.runActivity(named: "Waiting for registration state : \(registrationState)") { _ in - if (registrationState == self.registrationState) { return} - let registeredDelegate = AccountDelegateStub(onRegistrationStateChanged: { (account: Account, state: RegistrationState, message: String) in - if (registrationState == state) { - expectation.fulfill() - } - }) - self.mCore.defaultAccount!.addDelegate(delegate: registeredDelegate) - let result = XCTWaiter().wait(for: [expectation], timeout: timeout) - self.mCore.defaultAccount!.removeDelegate(delegate: registeredDelegate) - XCTAssert(result == .completed, "\"\(registrationState)\" registration state still not verified after \(timeout) seconds") - } - } - - func waitForCallState(callState: Call.State, timeout: TimeInterval) { - let expectation = XCTestExpectation(description: "call state is successfully : \(callState)") - XCTContext.runActivity(named: "Waiting for call state : \(callState)") { _ in - if (callState == self.callState) { return} - let callStateDelegate = CoreDelegateStub(onCallStateChanged: { (lc: Core, call: Call, state: Call.State, message: String) in - if (callState == state) { - expectation.fulfill() - } - }) - self.mCore.addDelegate(delegate: callStateDelegate) - let result = XCTWaiter().wait(for: [expectation], timeout: timeout) - self.mCore.removeDelegate(delegate: callStateDelegate) - XCTAssert(result == .completed, "\"\(callState)\" call state still not verified after \(timeout) seconds") - } - } - - func waitForRecordingState(recording: Bool, onRemote: Bool = false, timeout: TimeInterval) { - XCTContext.runActivity(named: "Waiting for call recording state : \(recording)") { _ in - var result = XCTWaiter.Result.timedOut - for _ in 0...Int(timeout) { - if (!onRemote && recording == mCore.currentCall?.params?.isRecording) { - result = .completed - break - } - if (onRemote && recording == mCore.currentCall?.remoteParams?.isRecording) { - result = .completed - break - } - _ = XCTWaiter().wait(for: [XCTestExpectation()], timeout: 1) - } - let remoteText = onRemote ? "remote" : "" - XCTAssert(result == .completed, "\(remoteText) call recording is still not \(recording) after \(timeout) seconds") - } - } - -} diff --git a/UITests/Methods/UITestsScreenshots.swift b/UITests/Methods/UITestsScreenshots.swift deleted file mode 100644 index 15fbdc5f7..000000000 --- a/UITests/Methods/UITestsScreenshots.swift +++ /dev/null @@ -1,778 +0,0 @@ -import SwiftUI -import XCTest - -extension XCUIElement { - private static var _representation = [String:UITestsScreenshots]() - - // hack to add variable in extensions - var representation: UITestsScreenshots { - get { - let tmpAddress = String(format: "%p", unsafeBitCast(self, to: Int.self)) - if (XCUIElement._representation[tmpAddress] == nil) { - XCUIElement._representation[tmpAddress] = UITestsScreenshots(element: self) - } - return XCUIElement._representation[tmpAddress]! - } - } -} - -extension XCUIApplication { - private static var _representationWithElement = UITestsAppRepresentation() - - var representationWithElements: UITestsAppRepresentation { - get { - return XCUIApplication._representationWithElement - } - } -} - -class UITestsAppRepresentation : UITestsScreenshots { - - var mainView: XCUIElement - var otherElement: XCUIElement? - private let statusBar: XCUIElement - private let tabBar: XCUIElement - private let app = XCUIApplication() - - private(set) var allVariations = [[String](),[String](),[String](),[String]()] - - private static var backup: [String:(XCUIElement,XCUIElement?,[[String]])] = [:] - - private var elementsDescription = "" - override var description: String { - get { - let description = super.description + " (definition = " + elementsDescription + ")" - elementsDescription = "" - return description - } - } - - init() { - self.mainView = app.dialerView - self.statusBar = app.statusBar - self.tabBar = app.tabBar - super.init(element: app) - } - - func withElementVariations(mainView: [String], statusBar: [String], tabBar: [String], other: [String] = []) -> UITestsAppRepresentation { - allVariations = [mainView, statusBar, tabBar, other] - return self - } - - func updateElementVariations(mainView: [String], statusBar: [String], tabBar: [String], other: [String] = []) -> UITestsAppRepresentation { - allVariations[0] += mainView - allVariations[1] += statusBar - allVariations[2] += tabBar - allVariations[3] += other - return self - } - - override func convertForComparaison(screenshot: UIImage) -> UIImage { - let elements = getElements() - if (svgManager.rects["mask"] == nil) {_=svgManager.parse()} - _=elements.map{ - if ($0 != nil) { - if ($0!.representation.svgManager.rects["mask"] == nil) {_=$0!.representation.svgManager.parse()} - svgManager.rects["mask"]! += $0!.representation.svgManager.rects["mask"]! - } - } - return super.convertForComparaison(screenshot: screenshot) - } - - override func getReference() -> UIImage? { - UIGraphicsBeginImageContextWithOptions(UITestsScreenshots.screenSize, false, 1) - guard (super.getReference()?.draw(at: CGPoint(x: 0, y: 0)) != nil) else {return nil} - let elements = getElements() - for i in 0.. [XCUIElement?]{ - return [mainView,statusBar,tabBar,otherElement].map {($0 != nil && self.element.frame.contains($0!.frame)) ? $0! : nil} - } - - func makeBackup(named: String) { - UITestsAppRepresentation.backup[named] = (mainView,otherElement,allVariations) - } - - func reloadBackup(named: String) -> UITestsAppRepresentation { - if let backup = UITestsAppRepresentation.backup[named] { - mainView = backup.0 - allVariations = backup.2 - otherElement = backup.1 - UITestsAppRepresentation.backup.removeValue(forKey: named) - } else { - XCTFail("unable to find an app representation backup named \"\(named)\"") - } - return self - } - -} - -class UITestsScreenshots { - - static let screenshotDelay: TimeInterval = 0.5 - static let pixelTreshold: Int = 3 - static let colorTreshold: Int = 3 - static let screenSize: CGSize = { - var size = XCUIApplication().frame.size - let scaleFactor = 3.0 - size.width.scale(by: scaleFactor) - size.height.scale(by: scaleFactor) - return size - }() - static let defaultPath: String = { - let path = #filePath - return String(path.prefix(path.distance(from: path.startIndex, to: path.range(of: "UITests")!.lowerBound) + "UITests/".count)) + "Screenshots/" - }() - internal var description: String { - get { - return viewName + (variations.isEmpty ? "" : "||\(variations.joined(separator: ","))") - } - } - private(set) var debugHistory: String = "" - - internal let element: XCUIElement - private var _svgManager: SVGManager? - internal var svgManager: SVGManager { - get{ - if (_svgManager == nil) {_svgManager = SVGManager(path: "\(UITestsScreenshots.defaultPath + viewName).svg")} - return _svgManager! - } - } - internal var _viewName: String? - var viewName: String { - get { - if (_viewName == nil) { - _viewName = element.identifier - if (_viewName!.isEmpty) {_viewName = element.label} //for elements wich don't have identifier - debugHistory = "UITestsScreenshots : \(_viewName!) : " - } - return _viewName! - } - } - private(set) var variations = [String]() - - init(element: XCUIElement) { - self.element = element - } - - // public functions - - func withVariations(named: [String]) -> UITestsScreenshots { - variations = named - debugHistory += " with varitions named \"\(named.joined(separator: "\", \""))\" -> " - return self - } - - func make(after time: TimeInterval = screenshotDelay) { - XCTContext.runActivity(named: "Make \"\(viewName)\" reference screenshot") { context in - debugHistory += "make reference -> " - guard checkVariationNonDefinition(), referenceExist(expectedValue: false), var screenshot = takeScreenshot(after: time) else {return} - saveImage(image: screenshot, path: getPath(name: viewName)) - svgManager.createFile(referenceName: viewName, referenceArea: getElementArea(), svgSize: UITestsScreenshots.screenSize) - screenshot = UITestsScreenshots.imageInScreenAcrea(image: screenshot, area: getElementArea()) - let preview = UITestsScreenshots.createPreview(title: "Reference", image: screenshot) - context.add(UITestsScreenshots.createAttachement(image: preview, name: description)) - debugHistory += "done." - } - } - - func reMake(after time: TimeInterval = screenshotDelay) { - XCTContext.runActivity(named: "Remake \"\(viewName)\" reference screenshot") { context in - debugHistory += "re make reference -> " - guard referenceImagesExist(names: [viewName]+variations, expectedValue: true), var screenshot = takeScreenshot(after: time) else {return} - _ = (variations.isEmpty ? [viewName] : variations).map{ - saveImage(image: screenshot, path: getPath(name: $0)) - _ = svgManager.updateImage(name: $0, area: getElementArea()) - } - screenshot = UITestsScreenshots.imageInScreenAcrea(image: screenshot, area: getElementArea()) - let preview = UITestsScreenshots.createPreview(title: "Reference", image: screenshot) - context.add(UITestsScreenshots.createAttachement(image: preview, name: description)) - debugHistory += "done." - XCTFail("\"\(#function)\" is a temporary function, you can't succeed a test with it\nafter remaking a reference you have to use \"check()\" if you want to compare") - } - } - - func check(after time: TimeInterval = screenshotDelay) { - XCTContext.runActivity(named: "Check \"\(viewName)\" screenshot with his reference") { context in - debugHistory += "compare screenshot to reference -> " - guard var screenshot = takeScreenshot(after: time), let reference = getReference() else {return} - screenshot = convertForComparaison(screenshot: screenshot) - guard let variances = UITestsScreenshots.getVarianceAreas(reference, screenshot) else {return} - if (!variances.areas.isEmpty) { - let errorMsg = "variances found with the reference view in \(variances.areas.count) areas." - debugHistory += errorMsg - XCTFail(errorMsg) - } else { - debugHistory += "done." - } - let preview = UITestsScreenshots.comparativePreview(reference: reference, screenshot: screenshot, difference: variances.image, areas: variances.areas) - context.add(UITestsScreenshots.createAttachement(image: preview, name: description)) - - } - } - - func addNewVariation(named name: String, after time: TimeInterval = screenshotDelay) { - XCTContext.runActivity(named: "Add \"\(viewName)\" reference screenshot new varation named \(name)") { context in - debugHistory += "add variances to a new variation named \(name) -> " - guard referenceImagesExist(names: [name], expectedValue: false), let screenshot = takeScreenshot(after: time), let reference = getReference() else {return} - guard let variances = UITestsScreenshots.getVarianceAreas(reference, convertForComparaison(screenshot: screenshot)) else {return} - guard !variances.areas.isEmpty else { - XCTFail(debugHistory + "error! : no variances found with the reference view") - return - } - saveImage(image: screenshot, path: getPath(name: name)) - _ = svgManager.addVariation(referenceName: viewName, name: name, area: getElementArea(), rects: variances.areas) - let preview = UITestsScreenshots.variationPreview(reference: reference, areas: variances.areas) - context.add(UITestsScreenshots.createAttachement(image: preview, name: description)) - debugHistory += "done." - } - } - - func addNewFilterVariation(named name: String, color: UIColor, areas: [CGRect]) { - XCTContext.runActivity(named: "Add \"\(viewName)\" reference screenshot new filter varation named \(name)") { context in - let size = UITestsScreenshots.screenSize - UIGraphicsBeginImageContextWithOptions(size, false, 1) - color.setFill() - UIRectFillUsingBlendMode(CGRect(x: 0, y: 0, width: size.width, height: size.height), .normal) - let image = UIGraphicsGetImageFromCurrentImageContext()! - UIGraphicsEndImageContext() - saveImage(image: image, path: getPath(name: name)) - _ = svgManager.addVariation(referenceName: viewName, name: name, area: getElementArea(), rects: areas) - context.add(UITestsScreenshots.createAttachement(image: image, name: description)) - debugHistory += "done." - } - } - - func addToMask(after time: TimeInterval = screenshotDelay) { - XCTContext.runActivity(named: "Add new areas to \"\(viewName)\" mask") { context in - debugHistory += "add variances to mask -> " - guard let screenshot = takeScreenshot(after: time), let reference = getReference() else {return} - guard let variances = UITestsScreenshots.getVarianceAreas(reference, convertForComparaison(screenshot: screenshot)) else {return} - guard !variances.areas.isEmpty else { - XCTFail(debugHistory + "error! : no variances found with the reference view") - return - } - _ = svgManager.addToMask(rects: variances.areas) - let preview = UITestsScreenshots.variationPreview(reference: reference, areas: variances.areas) - context.add(UITestsScreenshots.createAttachement(image: preview, name: description)) - debugHistory += "done." - } - } - - func isAnimated(timeInterval: TimeInterval) { - XCTContext.runActivity(named: "Check \"\(viewName)\" animation") { context in - debugHistory += "check if element is animated -> " - if (takeScreenshot(after: UITestsScreenshots.screenshotDelay)?.pngData() == takeScreenshot(after: timeInterval)?.pngData()) { - XCTFail("no animation detected for \"\(viewName)\"") - } - debugHistory += "done." - } - } - - func takeScreenshot(after time: TimeInterval) -> UIImage? { - XCTContext.runActivity(named: "take screenshot") { context in - debugHistory += "take screenshot -> " - _=XCTWaiter.wait(for: [XCTestExpectation()], timeout: time) - return UIImage(data: element.screenshot().pngRepresentation) - } - } - - func getReference() -> UIImage? { - debugHistory += "get reference -> " - guard svgManager.parse(withVariations: variations), referenceImagesExist(names: [viewName]+variations, expectedValue: true) == true else {return nil} - let filePaths = [getPath(name: viewName)]+variations.map{getPath(name: $0)} - let imagesName = [viewName] + variations.map{viewName+"_"+$0} - var images = [UIImage]() - for i in 0...imagesName.count-1 { - let image = getImage(path: filePaths[i])! - let area = svgManager.images[imagesName[i]]!.area - var clip = [CGRect]() - if (i>0) {clip = svgManager.rects[variations[i-1]]!} - images.append(UITestsScreenshots.imageInScreenAcrea(image: image, area: area, clip: clip)) - - } - - UIGraphicsBeginImageContextWithOptions(UITestsScreenshots.screenSize, false, 1) - _ = images.map{$0.draw(at: CGPoint(x: 0,y: 0))} - let reference = UIGraphicsGetImageFromCurrentImageContext()! - UIGraphicsEndImageContext() - return imageWithMask(image: reference, mask: svgManager.rects["mask"]!) - } - - //create attachement to return when calling public functions - - static func createAttachement(image: UIImage, name: String, lifetime: XCTAttachment.Lifetime = .deleteOnSuccess) -> XCTAttachment { - let attachment = XCTAttachment(image: image) - attachment.lifetime = lifetime - attachment.name = name - return attachment - } - - //image operations to prepare comparison - - static func imageInScreenAcrea(image: UIImage, area: CGRect, clip: [CGRect] = []) -> UIImage { - UIGraphicsBeginImageContextWithOptions(UITestsScreenshots.screenSize, false, 1) - if (!clip.isEmpty) {UIGraphicsGetCurrentContext()!.clip(to: clip)} - image.draw(at: CGPoint(x: area.minX, y: area.minY)) - let screenImage = UIGraphicsGetImageFromCurrentImageContext()! - UIGraphicsEndImageContext() - return screenImage - } - - static func setBackground(image: UIImage, color: UIColor) -> UIImage { - let size = UITestsScreenshots.screenSize - UIGraphicsBeginImageContextWithOptions(size, false, 1) - color.setFill() - UIRectFill(CGRect(x: 0, y: 0, width: size.width, height: size.height)) - image.draw(at: CGPoint(x: 0,y: 0)) - let newImage = UIGraphicsGetImageFromCurrentImageContext()! - UIGraphicsEndImageContext() - return newImage - } - - internal func imageWithMask(image: UIImage, mask: [CGRect]) -> UIImage { - UIGraphicsBeginImageContextWithOptions(UITestsScreenshots.screenSize, false, 1) - image.draw(at: CGPoint(x: 0, y: 0)) - _ = mask.map{UIRectFill($0)} - let maskedImage = UIGraphicsGetImageFromCurrentImageContext()! - UIGraphicsEndImageContext() - return maskedImage - } - - func convertForComparaison(screenshot: UIImage) -> UIImage { - var area = getElementArea() - if (svgManager.rects["mask"] == nil) {_=svgManager.parse()} - var image = UITestsScreenshots.imageInScreenAcrea(image: screenshot, area: area) - image = imageWithMask(image: image, mask: svgManager.rects["mask"]!) - return image - } - - func getElementArea() -> CGRect { - XCTContext.runActivity(named: "get element coordinates") { _ in - let area = element.frame - let rect = CGRect(x: area.minX*3, y: area.minY*3, width: area.width*3, height: area.height*3) - return rect - } - } - - //comparison functions - static func getVarianceAreas(_ image1: UIImage, _ image2: UIImage) -> (image: UIImage, areas: [CGRect])? { - - let margin: CGFloat = 20 - let replacementColor: UInt8 = 255 - var areas = [CGRect]() - - //compare images - UIGraphicsBeginImageContextWithOptions(image1.size, false, 1) - setBackground(image: image1, color: UIColor.black).draw(at: CGPoint(x: 0, y: 0)) - setBackground(image: image2, color: UIColor.black).draw(at: CGPoint(x: 0, y: 0), blendMode: .difference, alpha: 1) - let image = UIGraphicsGetImageFromCurrentImageContext()! - UIGraphicsEndImageContext() - - //findRects - let exeptMsg = "error! : unexpected error during image conversion for comparison" - guard let inputCGImage = image.cgImage else { - XCTFail(exeptMsg) - return nil - } - - let colorSpace = CGColorSpaceCreateDeviceGray() - let width = inputCGImage.width - let height = inputCGImage.height - let bytesPerPixel = 1 - let bitsPerComponent = 8 - let bytesPerRow = bytesPerPixel * width - let bitmapInfo = CGImageAlphaInfo.none.rawValue - - guard let context = CGContext(data: nil, width: width, height: height, bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo) else { - XCTFail(exeptMsg) - return nil - } - context.draw(inputCGImage, in: CGRect(x: 0, y: 0, width: width, height: height)) - - guard let buffer = context.data else { - XCTFail(exeptMsg) - return nil - } - - let pixelBuffer = buffer.bindMemory(to: UInt8.self, capacity: width * height) - - var rects: [Int:[CGRect]] = [:] - - for row in 0 ..< Int(height) { - for column in 0 ..< Int(width) { - let offset = row * width + column - if (pixelBuffer[offset] > UInt8(colorTreshold)) { - pixelBuffer[offset] = replacementColor - let point = CGPoint(x: column, y: row) - - var rect = CGRect(x: point.x, y: point.y, width: 1, height: 1) - for i in 0...1 { - if let prevRects = rects[row-i] { - for j in 0..= CGFloat(pixelTreshold) && rect.height >= CGFloat(pixelTreshold)) { - areas.append(rect) - } - mergeCloseAreas(&areas, withMargin: margin) - - } - } - } - - let diff = UIImage(cgImage: (CGContext(data: pixelBuffer, width: width, height: height, bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo)?.makeImage())!) - return (diff,areas) - } - - private static func mergeCloseAreas(_ areas: inout [CGRect], withMargin margin: CGFloat) { - guard (areas.count >= 1) else {return} - let areaSize = areas.count - for i in 1...areaSize { - if (i != 1 && areas.last!.intersects(areas[areaSize-i].insetBy(dx: -margin, dy: -margin))) { - areas[areas.count-1] = areas.last!.union(areas[areaSize-i]) - areas.remove(at: areaSize-i) - mergeCloseAreas(&areas, withMargin: margin) - break - } - } - } - - //preview functions - - static func comparativePreview(reference: UIImage, screenshot: UIImage, difference: UIImage, areas: [CGRect]) -> UIImage { - let realPreview = createPreview(title: "Real", image: screenshot, areas: areas, strokeColor: UIColor.red) - let refPreview = createPreview(title: "Reference", image: reference, areas: areas, strokeColor: UIColor.red) - let difPreview = createPreview(title: "Difference", image: difference) - return createPreviewTable(images: refPreview,realPreview,difPreview) - } - - static func variationPreview(reference: UIImage, areas: [CGRect]) -> UIImage { - let variationPreview = createPreview(title: "Reference", image: reference, areas: areas, fillColor: UIColor.blue.withAlphaComponent(0.3),strokeColor: UIColor.blue) - return variationPreview - } - - static func createPreviewTable(images: UIImage...) -> UIImage { - let sideMargin: CGFloat = 6 - let imageSize = images.first!.size - let globalSize = CGSize(width: (imageSize.width+sideMargin)*CGFloat(images.count), height: imageSize.height+sideMargin) - UIGraphicsBeginImageContextWithOptions(globalSize, false, 1) - - for i in 0...images.count-1 { - images[i].draw(at: CGPoint(x: CGFloat(i)*(imageSize.width+sideMargin), y: sideMargin)) - } - - let tableImage = UIGraphicsGetImageFromCurrentImageContext()! - UIGraphicsEndImageContext() - return tableImage - } - - static func createPreview(title: String, image: UIImage, areas: [CGRect] = [], fillColor: UIColor? = nil, strokeColor: UIColor? = nil) -> UIImage { - let lineWidth: CGFloat = 3 - let bottomMargin = image.size.height*0.05 - let allSize = CGSize(width: image.size.width + lineWidth*2, height: image.size.height + bottomMargin + lineWidth*2) - - UIGraphicsBeginImageContextWithOptions(allSize, false, 1) - - //image - image.draw(at: CGPoint(x: lineWidth, y: lineWidth), blendMode: .normal, alpha: 1) - - //rects - UIGraphicsGetCurrentContext()?.setLineWidth(lineWidth) - for area in areas { - let newArea = area.offsetBy(dx: lineWidth, dy: lineWidth) - if (fillColor != nil) { - fillColor?.setFill() - UIRectFillUsingBlendMode(newArea,.normal) - } - if (strokeColor != nil) { - strokeColor?.setStroke() - UIRectFrameUsingBlendMode(newArea.insetBy(dx: -3, dy: -3),.normal) - } - } - - //title - let textFont = UIFont(name: "Helvetica Bold", size: bottomMargin/2) ?? UIFont() - let textStyle=NSMutableParagraphStyle() - textStyle.alignment=NSTextAlignment.center - let textColor = UIColor.black - let textAttributes = [NSAttributedString.Key.font: textFont, NSAttributedString.Key.paragraphStyle: textStyle, NSAttributedString.Key.foregroundColor: textColor] as [NSAttributedString.Key : Any] - let text_h = textFont.lineHeight - let text_y = allSize.height-bottomMargin + (bottomMargin-text_h)/2 - let text_rect = CGRect(x: 0, y: text_y, width: allSize.width, height: bottomMargin) - title.draw(in: text_rect, withAttributes: textAttributes) - - let preview = UIGraphicsGetImageFromCurrentImageContext()! - UIGraphicsEndImageContext() - return preview - } - - //util functions - - private func referenceExist(expectedValue: Bool) -> Bool { - guard (FileManager.default.fileExists(atPath: svgManager.path) == expectedValue) else { - XCTFail(debugHistory + "error! : \(svgManager.path+(expectedValue ? " does not" : " already")) exist") - return false - } - return true - } - - private func referenceImagesExist(names: [String], expectedValue: Bool) -> Bool { - guard svgManager.parse() else {return false} - for name in names { - let realName = viewName + (name != viewName ? "_"+name : "") - if ((svgManager.images[realName] == nil) == expectedValue) { - XCTFail(debugHistory + "error! : \(realName) image \(expectedValue ? "does not" : "already") exist") - return false - } - } - return true - } - - private func checkVariationNonDefinition(caller: String = #function) -> Bool { - guard variations.isEmpty else { - XCTFail(debugHistory + "error : \"\(caller)\" function works only for views, not for views variations") - return false - } - return true - } - - //disk operation functions - - private func getPath(name: String) -> String{ - return "\(UITestsScreenshots.defaultPath)images/\(viewName+((name != viewName) ? "_"+name : "")).png" - } - - private func saveImage(image: UIImage, path: String) { - guard let data = image.pngData() else { - XCTFail("error != unable to save image at \(path)") - return - } - do { - try data.write(to: URL(fileURLWithPath: path)) - } catch { - NSLog(error.localizedDescription) - XCTFail(debugHistory + "error != unable to save image at \(path)") - } - } - - private func getImage(path: String) -> UIImage? { - guard let image = UIImage(contentsOfFile: path) else { - XCTFail(debugHistory + "error != unable to get image at \(path)") - return nil - } - return image - } - -} - - -class SVGManager : NSObject { - var path: String - var parentPath: String - var rects: [String : [CGRect]] = [:] - var images: [String : (area: CGRect, line: Int)] = [:] - private var parser: XMLParser? - private var current: String? - - private var defaultMask = [CGRect(x: 376, y: 2492, width: 418, height: 16)] - - private var referenceStart: Int? - private var maskStart: Int? - private var clipPathStart: Int? - private var variationsStart: Int? - private var selectedVariationStarts: [String : Int]? - - init(path: String) { - self.path = path - let index = path.lastIndex(of: "/") - self.parentPath = (index != nil) ? String(path.prefix(path.distance(from: path.startIndex, to: index!)+1)) : "" - - } - - func svgRect(_ rect: CGRect, lock: Bool) -> String { - return "" - } - - func svgImage(name: String, area: CGRect, lock: Bool) -> String { - return "" - } - - func createFile(referenceName name: String, referenceArea area: CGRect, svgSize: CGSize) { - let width = svgSize.width - let height = svgSize.height - var content = [String]() - content.append("") - content.append("") - content.append(" \(svgImage(name: name, area: area, lock: true))") - content.append("") - content.append("\n \n") - content.append("") - content.append("") - _ = defaultMask.map{content.append(" \(svgRect($0, lock: true))")} - content.append("") - content.append("") - let svg = content.joined(separator: "\n") - try! svg.write(toFile: path, atomically: true, encoding: String.Encoding.utf8) - } - - func updateImage(name: String, area: CGRect) -> Bool { - guard parse(), images[name] != nil else {return false} - - var svgData = try! String(contentsOf: URL(fileURLWithPath: path)).split(separator: "\n") - var lineIndex = images[name]!.line-1 - var line = svgData[lineIndex] - while line.firstIndex(of: "<") == nil { - svgData.remove(at: lineIndex) - lineIndex += -1 - line = svgData[lineIndex] - } - svgData[lineIndex] = line.prefix(line.distance(from: line.startIndex, to: line.firstIndex(of: "<")!)) + Substring(svgImage(name: name, area: area, lock: true)) - try! String(svgData.joined(separator: "\n")).write(toFile: path, atomically: true, encoding: String.Encoding.utf8) - return true - } - - func addToMask(rects: [CGRect]) -> Bool { - guard parse() else {return false} - var content = "" - for rect in rects { - content += "\(svgRect(rect, lock: false))\n" - } - svgInsert(content, at: maskStart!) - return true - } - - func addVariation(referenceName: String, name: String, area: CGRect, rects: [CGRect]) -> Bool { - guard parse() else {return false} - - var content = "\n" - content += " \(svgImage(name: "\(referenceName)_\(name)", area: area, lock: true))\n" - for rect in rects { - content += " \(svgRect(rect, lock: false))\n" - } - content += "\n" - svgInsert(content, at: variationsStart!) - - content = "" - svgInsert(content, at: clipPathStart!, parentElement: "clipPath") - return true - } - - //if some variations are delete with a svg editor like Inkscape, this variations are copied in the clipPath wich break some functionalities. - //this function is called at eeach parse to clean the clipPath if needed. - func removeClipPathAnomalies() { - guard (clipPathStart ?? 0 < (variationsStart ?? 0 )-2) else {return} - var svgData = try! String(contentsOf: URL(fileURLWithPath: path)).split(separator: "\n") - var index = clipPathStart! - var use = false - var line = svgData[index] - while !line.contains("") && !line.contains("") { - if (use == true) { - if (line.contains("/>")) {use = false} - } else { - if (line.range(of: " Bool { - rects["mask"] = [] - _ = headers.map{rects[$0] = []} - parser = XMLParser(contentsOf: URL(fileURLWithPath: path)) - guard (parser != nil) else {return false} - parser!.delegate = self - parser!.parse() - removeClipPathAnomalies() - return true - } - - func svgInsert(_ content: String, at index: Int, parentElement: String = "g") { - var svgData = try! String(contentsOf: URL(fileURLWithPath: path)).split(separator: "\n") - let line = svgData[index-1] - let prefix = line.prefix(line.distance(from: line.startIndex, to: line.firstIndex(of: "<") ?? line.startIndex)) - if (line.suffix(2) == "/>") { - svgData[index-1] = line.prefix(line.count-2)+">" - svgData.insert(prefix+"", at: index) - } - svgData.insert(prefix+Substring(" "+content), at: index) - - try! String(svgData.joined(separator: "\n")).write(toFile: path, atomically: true, encoding: String.Encoding.utf8) - } -} - -extension SVGManager : XMLParserDelegate { - - func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) { - - if (elementName == "g") { - if (rects[attributeDict["id"] ?? ""] != nil) { - current = attributeDict["id"] - } - if (attributeDict["id"] == "reference") { - referenceStart = parser.lineNumber - } else if (attributeDict["id"] == "mask") { - maskStart = parser.lineNumber - } else if (attributeDict["id"] == "variations") { - variationsStart = parser.lineNumber - } - } - - if (elementName == "clipPath" && attributeDict["id"] == "clipPath") { - clipPathStart = parser.lineNumber - } - - if (elementName == "rect" && current != nil) { - if current != nil { rects[current!]?.append(getRect(attributes: attributeDict))} - } - - if (elementName == "image") { - guard var imageName = attributeDict["xlink:href"] else {return} - guard FileManager.default.fileExists(atPath: imageName) || FileManager.default.fileExists(atPath: parentPath+imageName) else { - return - } - imageName = String(imageName.suffix(imageName.distance(from: imageName.lastIndex(of: "/") ?? imageName.startIndex, to: imageName.endIndex)-1)) - imageName = String(imageName.prefix(imageName.distance(from: imageName.startIndex, to: imageName.lastIndex(of: ".") ?? imageName.endIndex))) - images[imageName] = (getRect(attributes: attributeDict),parser.lineNumber) - } - } - - func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { - if (elementName == "g") { - current = nil - } - } - - private func getRect(attributes: [String:String]) -> CGRect { - var values = [Int]() - for header in ["x","y","width","height"] { - if let val = NumberFormatter().number(from: attributes[header] ?? "0") { - values.append(Int(truncating: val)) - } - } - return CGRect(x: values[0], y: values[1], width: values[2], height: values[3]) - } -} diff --git a/UITests/Methods/UITestsUtils.swift b/UITests/Methods/UITestsUtils.swift deleted file mode 100644 index 30fae7ca1..000000000 --- a/UITests/Methods/UITestsUtils.swift +++ /dev/null @@ -1,204 +0,0 @@ -import XCTest - -// -// Definition of some main views usually used in tests. -// -// Real utility in order to have more explicit test failed reports when child elements -// are defined with them. When an element will be not find, the error message will specify -// if it was because of the element non-display or its parent view non-display. -// -// It Allow to really simplify the screenshot comparison too. -// - -extension XCUIApplication { - - private static let _phoneView = XCUIApplication().descendants(matching: .other)["phone_view"] - private static let _mainView = _phoneView.otherElements["main_view"] - - var phoneView: XCUIElement {get{return XCUIApplication._phoneView}} - - //SubViews - private static let _callStatsView = _activeCallView.otherElements["call_stats_view"] - private static let _extraMenuView = _activeCallView.otherElements["active_call_extra_buttons_view"] - private static let _numpadCallView = _activeCallView.otherElements["call_numpad_view"] - private static let _pauseCallView = _activeCallView.otherElements["paused_call_view"] - - var callStatsView: XCUIElement {get{return XCUIApplication._callStatsView}} - var extraMenuView: XCUIElement {get{return XCUIApplication._extraMenuView}} - var numpadCallView: XCUIElement {get{return XCUIApplication._numpadCallView}} - var pauseCallView: XCUIElement {get{return XCUIApplication._pauseCallView}} - - //MainViews - private static let _activeCallView = _mainView.otherElements["active_call_view"] - private static let _assistantLinkView = _mainView.otherElements["assistant_link_view"] - private static let _assistantView = _mainView.otherElements["assistant_view"] - private static let _callView = _mainView.otherElements["IO_call_view"] - private static let _callsListView = _mainView.otherElements["calls_list_view"] - private static let _chatsListView = _mainView.otherElements["chats_list_view"] - private static let _dialerView = _mainView.otherElements["dialer_view"] - private static let _loginView = _mainView.otherElements["assistant_login_view"] - private static let _loginWarningView = _mainView.otherElements["assistant_login_warning_view"] - private static let _settingsView = _mainView.otherElements["settings_view"] - - var activeCallView: XCUIElement {get{return XCUIApplication._activeCallView}} - var assistantLinkView: XCUIElement {get{return XCUIApplication._assistantLinkView}} - var assistantView: XCUIElement {get{return XCUIApplication._assistantView}} - var callView: XCUIElement {get{return XCUIApplication._callView}} - var callsListView: XCUIElement {get{return XCUIApplication._callsListView}} - var chatsListView: XCUIElement {get{return XCUIApplication._chatsListView}} - var dialerView: XCUIElement {get{return XCUIApplication._dialerView}} - var loginView: XCUIElement {get{return XCUIApplication._loginView}} - var loginWarningView: XCUIElement {get{return XCUIApplication._loginWarningView}} - var settingsView: XCUIElement {get{return XCUIApplication._settingsView}} - - //StatusBar - private static let _statusBar = _phoneView.otherElements["status_bar"] - var statusBar: XCUIElement {get{return XCUIApplication._statusBar}} - - //TabBar - private static let _tabBar = _phoneView.otherElements["tab_bar"] - var tabBar: XCUIElement {get{return XCUIApplication._tabBar}} - - //SideMenuView - private static let _sideMenuView: XCUIElement = _phoneView.otherElements["side_menu_view"] - var sideMenuView: XCUIElement {get{return XCUIApplication._sideMenuView}} - - //AlertPopups - private static let _callFailedView: XCUIElement = XCUIApplication().otherElements["call_failed_error_view"] - - var callFailedView: XCUIElement {get{return XCUIApplication._callFailedView}} -} - - - -class UITestsUtils { - static let app = XCUIApplication() - - // function which is launched before every tests to setup - // it checks and fix account connection status and checks the view displayed (Dialer View) - static func testAppSetup() { - if (app.state != .runningForeground && !app.sideMenuView.staticTexts["side_menu_view_sip_adress"].exists) { - app.launch() - } - if (!rightAccountConnected() || !accountIsConnected()) { - deleteApp() // easiest methods to clear configured accounts and reset the app - app.launch() - removeSystemAlerts() // accept all initial permissions - connectAccount() - XCTAssert(accountIsConnected(), "registration state on the Status Bar is still not : Connected after 5 seconds") - } - - //app.representation.reMake() - //app.dialerView.representation.reMake() - app.representationWithElements.mainView = app.dialerView - app.representationWithElements.withElementVariations(mainView: [], statusBar: [], tabBar: []).check() - } - - static func accountIsConnected() -> Bool { - XCTContext.runActivity(named: "Check connection state") { _ in - let connection = app.statusBar.buttons["status_bar_registration_state"] - for i in 1...5 { - if (connection.value as? String == "Connected") {return true} - if (connection.value as? String == "Connecté") {app.launch()} //relauch the app if it is in French to fix (happen when the app is launch manually) - else if (i>1 && connection.value as? String != "Connection in progress") {break} // wait only if connection is in progress - _ = XCTWaiter.wait(for: [XCTestExpectation()], timeout: 1) - } - return false - } - } - - static func rightAccountConnected() -> Bool { - let manager = UITestsCoreManager.instance - return XCTContext.runActivity(named: "Check connected adress") { _ -> Bool in - let sipAdress = "sip:\(manager.appAccountAuthInfo.username)@\(manager.appAccountAuthInfo.domain)" - let sipLabel = app.sideMenuView.staticTexts["side_menu_view_sip_adress"].label - XCTContext.runActivity(named: "expected adress : \(sipAdress) \nfound adress: \(sipLabel)") {_ in} - return sipLabel == sipAdress - } - } - - static func connectAccount() { - let manager = UITestsCoreManager.instance - XCTContext.runActivity(named: "Login \(manager.appAccountAuthInfo.username) in \(app)") { _ in - manager.accountsReset() - - let sideMenu = app.statusBar.buttons["side_menu_button"] - sideMenu.tap() - app.sideMenuView.staticTexts["Settings"].tap() - app.settingsView.staticTexts["Network"].tap() - app.settingsView.tables.cells.containing(.staticText, identifier:"DNS Server").children(matching: .textField).element.fillTextField(manager.dnsServer) - app.settingsView.buttons["settings_view_back"].tap() - - sideMenu.tap() - app.sideMenuView.staticTexts["Assistant"].tap() - app.assistantView.buttons["assistant_view_accept"].tap() - app.assistantView.buttons["assistant_view_sip_login"].tap() - app.loginWarningView.buttons["assistant_login_warning_view_skip"].tap() - app.loginView.textFields["assistant_login_view_username_field"].fillTextField(manager.appAccountAuthInfo.username) - app.loginView.secureTextFields["assistant_login_view_password_field"].fillTextField(manager.appAccountAuthInfo.password) - app.loginView.textFields["assistant_login_view_domain_field"].fillTextField(manager.appAccountAuthInfo.domain) - app.loginView.buttons["TCP"].tap() - app.loginView.buttons["assistant_login_view_login"].tap() - } - } - - static func deleteApp() { - XCTContext.runActivity(named: "Delete \(app)") { _ in - app.terminate() - let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard") - let linphoneApp = springboard/*@START_MENU_TOKEN@*/.icons["Linphone"]/*[[".otherElements[\"Home screen icons\"]",".icons.icons[\"Linphone\"]",".icons[\"Linphone\"]"],[[[-1,2],[-1,1],[-1,0,1]],[[-1,2],[-1,1]]],[0]]@END_MENU_TOKEN@*/ - if (linphoneApp.waitForExistence(timeout: 2)) { - linphoneApp.press(forDuration: 2) - for i in [2,0,1] { - let button = springboard.buttons.element(boundBy: i) - if (button.exists || button.waitForExistence(timeout: 2)) { - button.tap() - } - } - } - } - } - - static func removeSystemAlerts() { - XCTContext.runActivity(named: "Remove all system alerts \(app)") { _ in - var alertsEnd = false - while (!alertsEnd) { - let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard") - let alertAllowButton = springboard.buttons.element(boundBy: 1) - if (alertAllowButton.exists || alertAllowButton.waitForExistence(timeout: 3)) { - alertAllowButton.tap() - } else { - alertsEnd = true - } - } - } - } - -} - -// -// Adding some features to XCUIElement like an UITestsScreenshots object called "representaion" -// to simplify the screenshot comparison integration, a custom and complete fillTextFill methods -// and the opposite of the native method XCUIElement.waitForExistence(timeout: TimeInterval) -> Bool -// -extension XCUIElement { - - func fillTextField(_ text: String) { - tap() - let initValue = String(value as? String ?? "") - if (initValue != text) { - let deleteString = (0.. Bool { - let doesNotExistPredicate = NSPredicate(format: "exists == false") - let exept = XCTNSPredicateExpectation(predicate: doesNotExistPredicate, object: self) - let result = XCTWaiter.wait(for: [exept], timeout: timeout) - return result == .completed - } -} - diff --git a/UITests/Screenshots/IO_call_view.svg b/UITests/Screenshots/IO_call_view.svg deleted file mode 100644 index 55297d3d1..000000000 --- a/UITests/Screenshots/IO_call_view.svg +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/UITests/Screenshots/Linphone.svg b/UITests/Screenshots/Linphone.svg deleted file mode 100644 index 43005376b..000000000 --- a/UITests/Screenshots/Linphone.svg +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/UITests/Screenshots/active_call_view.svg b/UITests/Screenshots/active_call_view.svg deleted file mode 100644 index de7508ac2..000000000 --- a/UITests/Screenshots/active_call_view.svg +++ /dev/null @@ -1,369 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/UITests/Screenshots/call_failed_error_view.svg b/UITests/Screenshots/call_failed_error_view.svg deleted file mode 100644 index 975fc24ea..000000000 --- a/UITests/Screenshots/call_failed_error_view.svg +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/UITests/Screenshots/call_numpad_view.svg b/UITests/Screenshots/call_numpad_view.svg deleted file mode 100644 index 2c575de20..000000000 --- a/UITests/Screenshots/call_numpad_view.svg +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/UITests/Screenshots/call_stats_view.svg b/UITests/Screenshots/call_stats_view.svg deleted file mode 100644 index 79361fe94..000000000 --- a/UITests/Screenshots/call_stats_view.svg +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/UITests/Screenshots/dialer_view.svg b/UITests/Screenshots/dialer_view.svg deleted file mode 100644 index 5c17914c8..000000000 --- a/UITests/Screenshots/dialer_view.svg +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/UITests/Screenshots/images/IO_call_view.png b/UITests/Screenshots/images/IO_call_view.png deleted file mode 100644 index bbb76c4e9..000000000 Binary files a/UITests/Screenshots/images/IO_call_view.png and /dev/null differ diff --git a/UITests/Screenshots/images/IO_call_view_mute.png b/UITests/Screenshots/images/IO_call_view_mute.png deleted file mode 100644 index d76e97a2b..000000000 Binary files a/UITests/Screenshots/images/IO_call_view_mute.png and /dev/null differ diff --git a/UITests/Screenshots/images/IO_call_view_outgoing.png b/UITests/Screenshots/images/IO_call_view_outgoing.png deleted file mode 100644 index b447283c4..000000000 Binary files a/UITests/Screenshots/images/IO_call_view_outgoing.png and /dev/null differ diff --git a/UITests/Screenshots/images/IO_call_view_speaker.png b/UITests/Screenshots/images/IO_call_view_speaker.png deleted file mode 100644 index 6d91f4030..000000000 Binary files a/UITests/Screenshots/images/IO_call_view_speaker.png and /dev/null differ diff --git a/UITests/Screenshots/images/Linphone.png b/UITests/Screenshots/images/Linphone.png deleted file mode 100644 index da4517c65..000000000 Binary files a/UITests/Screenshots/images/Linphone.png and /dev/null differ diff --git a/UITests/Screenshots/images/active_call_view.png b/UITests/Screenshots/images/active_call_view.png deleted file mode 100644 index 7739b1502..000000000 Binary files a/UITests/Screenshots/images/active_call_view.png and /dev/null differ diff --git a/UITests/Screenshots/images/active_call_view_call_stats.png b/UITests/Screenshots/images/active_call_view_call_stats.png deleted file mode 100644 index ee2d1494d..000000000 Binary files a/UITests/Screenshots/images/active_call_view_call_stats.png and /dev/null differ diff --git a/UITests/Screenshots/images/active_call_view_extra_menu.png b/UITests/Screenshots/images/active_call_view_extra_menu.png deleted file mode 100644 index 295a342f8..000000000 Binary files a/UITests/Screenshots/images/active_call_view_extra_menu.png and /dev/null differ diff --git a/UITests/Screenshots/images/active_call_view_mute.png b/UITests/Screenshots/images/active_call_view_mute.png deleted file mode 100644 index 553fff92f..000000000 Binary files a/UITests/Screenshots/images/active_call_view_mute.png and /dev/null differ diff --git a/UITests/Screenshots/images/active_call_view_pause.png b/UITests/Screenshots/images/active_call_view_pause.png deleted file mode 100644 index e90cdbcb7..000000000 Binary files a/UITests/Screenshots/images/active_call_view_pause.png and /dev/null differ diff --git a/UITests/Screenshots/images/active_call_view_pause_shadow.png b/UITests/Screenshots/images/active_call_view_pause_shadow.png deleted file mode 100644 index 3791659f4..000000000 Binary files a/UITests/Screenshots/images/active_call_view_pause_shadow.png and /dev/null differ diff --git a/UITests/Screenshots/images/active_call_view_record.png b/UITests/Screenshots/images/active_call_view_record.png deleted file mode 100644 index 9dc21090d..000000000 Binary files a/UITests/Screenshots/images/active_call_view_record.png and /dev/null differ diff --git a/UITests/Screenshots/images/active_call_view_remote_pause.png b/UITests/Screenshots/images/active_call_view_remote_pause.png deleted file mode 100644 index 740eb754e..000000000 Binary files a/UITests/Screenshots/images/active_call_view_remote_pause.png and /dev/null differ diff --git a/UITests/Screenshots/images/active_call_view_remote_record.png b/UITests/Screenshots/images/active_call_view_remote_record.png deleted file mode 100644 index 01b45d37d..000000000 Binary files a/UITests/Screenshots/images/active_call_view_remote_record.png and /dev/null differ diff --git a/UITests/Screenshots/images/active_call_view_shadow.png b/UITests/Screenshots/images/active_call_view_shadow.png deleted file mode 100644 index 3791659f4..000000000 Binary files a/UITests/Screenshots/images/active_call_view_shadow.png and /dev/null differ diff --git a/UITests/Screenshots/images/active_call_view_speaker.png b/UITests/Screenshots/images/active_call_view_speaker.png deleted file mode 100644 index 1720d62d8..000000000 Binary files a/UITests/Screenshots/images/active_call_view_speaker.png and /dev/null differ diff --git a/UITests/Screenshots/images/call_failed_error_view.png b/UITests/Screenshots/images/call_failed_error_view.png deleted file mode 100644 index a8300918d..000000000 Binary files a/UITests/Screenshots/images/call_failed_error_view.png and /dev/null differ diff --git a/UITests/Screenshots/images/call_numpad_view.png b/UITests/Screenshots/images/call_numpad_view.png deleted file mode 100644 index ab18aa18e..000000000 Binary files a/UITests/Screenshots/images/call_numpad_view.png and /dev/null differ diff --git a/UITests/Screenshots/images/call_stats_view.png b/UITests/Screenshots/images/call_stats_view.png deleted file mode 100644 index a8de3aad5..000000000 Binary files a/UITests/Screenshots/images/call_stats_view.png and /dev/null differ diff --git a/UITests/Screenshots/images/call_stats_view_pause.png b/UITests/Screenshots/images/call_stats_view_pause.png deleted file mode 100644 index cea2fedc1..000000000 Binary files a/UITests/Screenshots/images/call_stats_view_pause.png and /dev/null differ diff --git a/UITests/Screenshots/images/call_stats_view_remote_pause.png b/UITests/Screenshots/images/call_stats_view_remote_pause.png deleted file mode 100644 index fc3cccf7c..000000000 Binary files a/UITests/Screenshots/images/call_stats_view_remote_pause.png and /dev/null differ diff --git a/UITests/Screenshots/images/dialer_view.png b/UITests/Screenshots/images/dialer_view.png deleted file mode 100644 index fc1228667..000000000 Binary files a/UITests/Screenshots/images/dialer_view.png and /dev/null differ diff --git a/UITests/Screenshots/images/dialer_view_popup.png b/UITests/Screenshots/images/dialer_view_popup.png deleted file mode 100644 index 2cd270793..000000000 Binary files a/UITests/Screenshots/images/dialer_view_popup.png and /dev/null differ diff --git a/UITests/Screenshots/images/forErrors/no_preview.png b/UITests/Screenshots/images/forErrors/no_preview.png deleted file mode 100644 index 703a2cad5..000000000 Binary files a/UITests/Screenshots/images/forErrors/no_preview.png and /dev/null differ diff --git a/UITests/Screenshots/images/side_menu_view.png b/UITests/Screenshots/images/side_menu_view.png deleted file mode 100644 index 70200a0b2..000000000 Binary files a/UITests/Screenshots/images/side_menu_view.png and /dev/null differ diff --git a/UITests/Screenshots/images/status_bar.png b/UITests/Screenshots/images/status_bar.png deleted file mode 100644 index ec2cb3325..000000000 Binary files a/UITests/Screenshots/images/status_bar.png and /dev/null differ diff --git a/UITests/Screenshots/images/status_bar_call_view.png b/UITests/Screenshots/images/status_bar_call_view.png deleted file mode 100644 index a6adae0b7..000000000 Binary files a/UITests/Screenshots/images/status_bar_call_view.png and /dev/null differ diff --git a/UITests/Screenshots/images/tab_bar.png b/UITests/Screenshots/images/tab_bar.png deleted file mode 100644 index 640ff7d2a..000000000 Binary files a/UITests/Screenshots/images/tab_bar.png and /dev/null differ diff --git a/UITests/Screenshots/side_menu_view.svg b/UITests/Screenshots/side_menu_view.svg deleted file mode 100644 index 110b7c680..000000000 --- a/UITests/Screenshots/side_menu_view.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/UITests/Screenshots/status_bar.svg b/UITests/Screenshots/status_bar.svg deleted file mode 100644 index 3e2630bb0..000000000 --- a/UITests/Screenshots/status_bar.svg +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/UITests/Screenshots/tab_bar.svg b/UITests/Screenshots/tab_bar.svg deleted file mode 100644 index 5a21254f8..000000000 --- a/UITests/Screenshots/tab_bar.svg +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/UITests/TestPlans/Debug.xctestplan b/UITests/TestPlans/Debug.xctestplan deleted file mode 100644 index 7dd4854fe..000000000 --- a/UITests/TestPlans/Debug.xctestplan +++ /dev/null @@ -1,47 +0,0 @@ -{ - "configurations" : [ - { - "id" : "F802CEE6-B0E3-4B17-A13A-993A541A3D18", - "name" : "Configuration 1", - "options" : { - - } - } - ], - "defaultOptions" : { - "commandLineArgumentEntries" : [ - - ], - "environmentVariableEntries" : [ - { - "key" : "CGBITMAP_CONTEXT_LOG_ERRORS", - "value" : "" - } - ], - "language" : "en", - "region" : "GB", - "testTimeoutsEnabled" : true, - "userAttachmentLifetime" : "keepAlways" - }, - "testTargets" : [ - { - "skippedTests" : [ - "ActiveCallUITests", - "ExtraMenuUITests" - ], - "target" : { - "containerPath" : "container:linphone.xcodeproj", - "identifier" : "6637AF8C288593AF00965733", - "name" : "CallUITests" - } - }, - { - "target" : { - "containerPath" : "container:linphone.xcodeproj", - "identifier" : "66B77EB6289C0B4F007D9C25", - "name" : "ConferenceUITests" - } - } - ], - "version" : 1 -} diff --git a/UITests/TestPlans/Default.xctestplan b/UITests/TestPlans/Default.xctestplan deleted file mode 100644 index 04054f7a7..000000000 --- a/UITests/TestPlans/Default.xctestplan +++ /dev/null @@ -1,36 +0,0 @@ -{ - "configurations" : [ - { - "id" : "21D0F563-6C94-4DE8-9A9F-D90DA7237F5A", - "name" : "Configuration 1", - "options" : { - "uiTestingScreenshotsLifetime" : "keepNever" - } - } - ], - "defaultOptions" : { - "environmentVariableEntries" : [ - { - "key" : "CGBITMAP_CONTEXT_LOG_ERRORS", - "value" : "" - } - ], - "language" : "en", - "region" : "GB", - "testExecutionOrdering" : "random", - "testTimeoutsEnabled" : true - }, - "testTargets" : [ - { - "skippedTests" : [ - "ActiveCallUITests_withVideo" - ], - "target" : { - "containerPath" : "container:linphone.xcodeproj", - "identifier" : "6637AF8C288593AF00965733", - "name" : "CallUITests" - } - } - ], - "version" : 1 -} diff --git a/UITests/TestPlans/PauseMode_extended.xctestplan b/UITests/TestPlans/PauseMode_extended.xctestplan deleted file mode 100644 index 6d31a6760..000000000 --- a/UITests/TestPlans/PauseMode_extended.xctestplan +++ /dev/null @@ -1,56 +0,0 @@ -{ - "configurations" : [ - { - "id" : "0CE85DD8-6489-4B3B-8B9C-CC72AB27D7FA", - "name" : "pause mode", - "options" : { - "commandLineArgumentEntries" : [ - { - "argument" : "pause" - } - ] - } - }, - { - "id" : "AB4C412C-D536-4088-A22F-3BF027F7BC75", - "name" : "remote pause mode", - "options" : { - "commandLineArgumentEntries" : [ - { - "argument" : "remote" - }, - { - "argument" : "pause" - } - ] - } - } - ], - "defaultOptions" : { - "language" : "en", - "region" : "GB", - "testExecutionOrdering" : "random", - "testTimeoutsEnabled" : true - }, - "testTargets" : [ - { - "skippedTests" : [ - "ActiveCallUITests\/testCallRecord()", - "ActiveCallUITests\/testPauseCall()", - "ActiveCallUITests\/testRemoteCallRecord()", - "ActiveCallUITests\/testRemotePauseCall()", - "ActiveCallUITests\/testRemoteResumeCall()", - "ActiveCallUITests\/testResumeCall()", - "ActiveCallUITests_withVideo", - "IncomingCallUITests", - "OutgoingCallUITests" - ], - "target" : { - "containerPath" : "container:linphone.xcodeproj", - "identifier" : "6637AF8C288593AF00965733", - "name" : "CallUITests" - } - } - ], - "version" : 1 -} diff --git a/doc/CUSTOMIZING.txt b/doc/CUSTOMIZING.txt deleted file mode 100644 index 6fa0a155f..000000000 --- a/doc/CUSTOMIZING.txt +++ /dev/null @@ -1,20 +0,0 @@ -# Assistant configuration - -The assistant allows to create a new sip account on a pre-defined SIP service using an xml-rpc connection, -as well as configuring an existing SIP account. -The files Resources/assistant_linphone_create.rc and Resources/assistant_linphone_existing.rc contain the -information necessary to create and configure the SIP accounts, most notabily: - * proxy_default_values/reg_identity to define the SIP identity - * sip/rls_uri to define the SIP URI of the presence server - * assistant/domain to specify the SIP domain - * assistant/xmlrpc_url to specify the https url of the account creation service - -# In-app purchase configuration - -The Resources/linphonerc.factory, section [in_app_purchase] is the entry point for configuring -the in-app purchases available in the application, as well as parameters for account expiry notifications. -Refer to the inlined comments in this configuration for description of all configurables. - - - - diff --git a/iTunesArtwork b/iTunesArtwork deleted file mode 100644 index 1901f505a..000000000 Binary files a/iTunesArtwork and /dev/null differ diff --git a/linphone-Info.plist b/linphone-Info.plist deleted file mode 100644 index 8b3e9df4e..000000000 --- a/linphone-Info.plist +++ /dev/null @@ -1,187 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleDisplayName - Linphone - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIcons~ipad - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleLocalizations - - en - fr - - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - $(MARKETING_VERSION) - CFBundleURLTypes - - - CFBundleTypeRole - Viewer - CFBundleURLIconFile - linphone_icon_72@2x - CFBundleURLName - org.linphone.phone - CFBundleURLSchemes - - sip - - - - CFBundleTypeRole - Viewer - CFBundleURLIconFile - linphone_icon_72@2x - CFBundleURLName - org.linphone.phone - CFBundleURLSchemes - - linphone-config - - - - CFBundleTypeRole - Editor - CFBundleURLIconFile - linphone_icon_72@2x - CFBundleURLName - org.linphone.phone - CFBundleURLSchemes - - message-linphone - - - - CFBundleTypeRole - Viewer - CFBundleURLIconFile - linphone_icon_72@2x - CFBundleURLName - org.linphone.phone - CFBundleURLSchemes - - linphone-widget - - - - CFBundleTypeRole - Viewer - CFBundleURLIconFile - linphone_icon_72@2x - CFBundleURLName - org.linphone.phone - CFBundleURLSchemes - - sips - - - - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - ITSAppUsesNonExemptEncryption - - ITSEncryptionExportComplianceCode - b5cb085f-772a-4a4f-8c77-5d1332b1f93f - LSRequiresIPhoneOS - - NSBluetoothPeripheralUsageDescription - Use your BT headset - NSCalendarsUsageDescription - Add Conference invitations to calendar - NSCameraUsageDescription - 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 - Use microphone to make audio calls - NSPhotoLibraryAddUsageDescription - Add tranfered files to your library - NSPhotoLibraryUsageDescription - Share photos with your friends and customize avatars - NSUbiquitousContainers - - iCloud.org.linphone.phone - - NSUbiquitousContainerIsDocumentScopePublic - - NSUbiquitousContainerName - Linphone - NSUbiquitousContainerSupportedFolderLevels - Any - - - NSVoIPUsageDescription - Make audio/video calls - UIAppFonts - - Roboto-Regular.ttf - Roboto-Bold.ttf - Roboto-Italic.ttf - - UIApplicationShortcutItems - - - UIApplicationShortcutItemIconType - UIApplicationShortcutIconTypeCompose - UIApplicationShortcutItemTitle - New Message - UIApplicationShortcutItemType - linphone.phone.action.newMessage - - - UIBackgroundModes - - audio - fetch - remote-notification - voip - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - MainStoryboard - UIRequiredDeviceCapabilities - - wifi - microphone - - UIRequiresFullScreen - - UIRequiresPersistentWiFi - - UIStatusBarStyle - UIStatusBarStyleLightContent - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationLandscapeRight - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationPortrait - - UISupportsDocumentBrowser - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/linphone-adhoc.plist b/linphone-adhoc.plist deleted file mode 100644 index c2c9b185f..000000000 --- a/linphone-adhoc.plist +++ /dev/null @@ -1,13 +0,0 @@ - - - - - method - ad-hoc - iCloudContainerEnvironment - Production -compileBitcode - - - - diff --git a/linphone.entitlements b/linphone.entitlements deleted file mode 100644 index 9e64877db..000000000 --- a/linphone.entitlements +++ /dev/null @@ -1,34 +0,0 @@ - - - - - aps-environment - development - com.apple.developer.icloud-container-identifiers - - iCloud.$(CFBundleIdentifier) - - com.apple.developer.icloud-services - - CloudDocuments - - com.apple.developer.networking.wifi-info - - com.apple.developer.ubiquity-container-identifiers - - iCloud.$(CFBundleIdentifier) - - com.apple.developer.ubiquity-kvstore-identifier - $(TeamIdentifierPrefix)$(CFBundleIdentifier) - com.apple.security.application-groups - - group.org.linphone.phone.linphoneExtension - group.belledonne-communications.linphone.widget - group.org.linphone.phone.msgNotification - - keychain-access-groups - - $(AppIdentifierPrefix)org.linphone.phone - - - diff --git a/linphone.xcodeproj/.gitignore b/linphone.xcodeproj/.gitignore deleted file mode 100644 index 7f42cdded..000000000 --- a/linphone.xcodeproj/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -project.xcworkspace -xcuserdata diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj deleted file mode 100644 index f8e400d03..000000000 --- a/linphone.xcodeproj/project.pbxproj +++ /dev/null @@ -1,7167 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 152F22361B15E889008C0621 /* libxml2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 152F22351B15E889008C0621 /* libxml2.dylib */; }; - 1D3623260D0F684500981E51 /* LinphoneAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* LinphoneAppDelegate.m */; }; - 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 2214EB7A12F846B1002A5394 /* UICallButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 2214EB7912F846B1002A5394 /* UICallButton.m */; }; - 22276E8913C73DC000210156 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8813C73DC000210156 /* CoreMedia.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 22405EEE1600B4E400B92522 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22405EED1600B4E400B92522 /* AssetsLibrary.framework */; }; - 22405F001601C19200B92522 /* ImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 22405EFE1601C19100B92522 /* ImageView.m */; }; - 224567C2107B968500F10948 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 224567C1107B968500F10948 /* AVFoundation.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 2248E90E12F7E4CF00220D9C /* UIDigitButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 2248E90D12F7E4CF00220D9C /* UIDigitButton.m */; }; - 2264B6D211200342002C2C53 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2264B6D111200342002C2C53 /* SystemConfiguration.framework */; }; - 226EF06C15FA256B005865C7 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 226EF06B15FA256B005865C7 /* MobileCoreServices.framework */; }; - 2274401A106F31BD006EC466 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22744019106F31BD006EC466 /* CoreAudio.framework */; }; - 2274402F106F335E006EC466 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2274402E106F335E006EC466 /* AudioToolbox.framework */; }; - 228697C411AC29B800E9E0CA /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 228697C311AC29B800E9E0CA /* CFNetwork.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 22AA8B0113D83F6300B30535 /* UICamSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = 22AA8B0013D83F6300B30535 /* UICamSwitch.m */; }; - 22D1B68112A3E0BE001AE361 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 22D1B68012A3E0BE001AE361 /* libresolv.dylib */; }; - 22E0A822111C44E100B04932 /* AboutView.m in Sources */ = {isa = PBXBuildFile; fileRef = 22E0A81C111C44E100B04932 /* AboutView.m */; }; - 22F2508E107141E100AC9B3F /* DialerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 22F2508C107141E100AC9B3F /* DialerView.m */; }; - 244523AF1E8266CC0037A187 /* chat_delivered.png in Resources */ = {isa = PBXBuildFile; fileRef = 244523AC1E8266CC0037A187 /* chat_delivered.png */; }; - 244523B01E8266CC0037A187 /* chat_error.png in Resources */ = {isa = PBXBuildFile; fileRef = 244523AD1E8266CC0037A187 /* chat_error.png */; }; - 244523B11E8266CC0037A187 /* chat_read.png in Resources */ = {isa = PBXBuildFile; fileRef = 244523AE1E8266CC0037A187 /* chat_read.png */; }; - 244523BE1E8D3A6C0037A187 /* chat_unsecure.png in Resources */ = {isa = PBXBuildFile; fileRef = 244523BC1E8D3A6C0037A187 /* chat_unsecure.png */; }; - 249660951FD6A35F001D55AA /* Photos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 249660941FD6A359001D55AA /* Photos.framework */; }; - 24A3459E1D95797700881A5C /* UIShopTableCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 24A3459D1D95797700881A5C /* UIShopTableCell.xib */; }; - 24A345A61D95798A00881A5C /* UIShopTableCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 24A345A51D95798A00881A5C /* UIShopTableCell.m */; }; - 24BFAA9E209B0630004F47A7 /* dialer_background.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA8C209B062B004F47A7 /* dialer_background.png */; }; - 24BFAA9F209B0630004F47A7 /* linphone_user.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA93209B062C004F47A7 /* linphone_user.png */; }; - 24BFAAA0209B0630004F47A7 /* contacts_sip_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA94209B062C004F47A7 /* contacts_sip_default@2x.png */; }; - 24BFAAA1209B0630004F47A7 /* linphone_user@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA95209B062D004F47A7 /* linphone_user@2x.png */; }; - 24BFAAA2209B0630004F47A7 /* linphone_user~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA96209B062D004F47A7 /* linphone_user~ipad@2x.png */; }; - 24BFAAA3209B0630004F47A7 /* contacts_sip_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA97209B062E004F47A7 /* contacts_sip_selected.png */; }; - 24BFAAA4209B0630004F47A7 /* linphone_logo.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA98209B062E004F47A7 /* linphone_logo.png */; }; - 24BFAAA5209B0630004F47A7 /* contacts_sip_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA99209B062E004F47A7 /* contacts_sip_default.png */; }; - 24BFAAA6209B0630004F47A7 /* linphone_user~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA9A209B062F004F47A7 /* linphone_user~ipad.png */; }; - 24BFAAA7209B0630004F47A7 /* callkit_logo.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA9B209B062F004F47A7 /* callkit_logo.png */; }; - 24BFAAA8209B0630004F47A7 /* contacts_sip_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA9C209B062F004F47A7 /* contacts_sip_selected@2x.png */; }; - 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 */; }; - 340751971506459A00B89C47 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 340751961506459A00B89C47 /* CoreTelephony.framework */; }; - 344ABDF114850AE9007420B6 /* libc++.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 344ABDEF14850AE9007420B6 /* libc++.1.dylib */; settings = {ATTRIBUTES = (Weak, ); }; }; - 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 */; }; - 6112A01C243B31A700DBD5F5 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 6112A01B243B31A600DBD5F5 /* GoogleService-Info.plist */; }; - 6112A01E243B5FD500DBD5F5 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 6112A01D243B5FD500DBD5F5 /* GoogleService-Info.plist */; }; - 6135761C240E81BB005304D4 /* UIInterfaceStyleButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 6135761B240E81BA005304D4 /* UIInterfaceStyleButton.m */; }; - 6135761F240E81D0005304D4 /* UIInterfaceStyleToggleButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 6135761E240E81D0005304D4 /* UIInterfaceStyleToggleButton.m */; }; - 614D09CE21E74D5400C43EDF /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 614D09CD21E74D5400C43EDF /* GoogleService-Info.plist */; }; - 61586B81217A16EE0038AC45 /* menu_about.png in Resources */ = {isa = PBXBuildFile; fileRef = 61586B7A217A16EE0038AC45 /* menu_about.png */; }; - 61586B83217A16FD0038AC45 /* menu_about@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 61586B82217A16FD0038AC45 /* menu_about@2x.png */; }; - 61586B85217A17070038AC45 /* menu_assistant.png in Resources */ = {isa = PBXBuildFile; fileRef = 61586B84217A17070038AC45 /* menu_assistant.png */; }; - 61586B87217A17160038AC45 /* menu_assistant@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 61586B86217A17150038AC45 /* menu_assistant@2x.png */; }; - 61586B89217A17220038AC45 /* menu_link_account.png in Resources */ = {isa = PBXBuildFile; fileRef = 61586B88217A17220038AC45 /* menu_link_account.png */; }; - 61586B8B217A17320038AC45 /* menu_link_account@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 61586B8A217A17320038AC45 /* menu_link_account@2x.png */; }; - 61586B8D217A173F0038AC45 /* menu_options.png in Resources */ = {isa = PBXBuildFile; fileRef = 61586B8C217A173F0038AC45 /* menu_options.png */; }; - 61586B8F217A174F0038AC45 /* menu_options@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 61586B8E217A174F0038AC45 /* menu_options@2x.png */; }; - 61586B91217A175D0038AC45 /* menu_recordings.png in Resources */ = {isa = PBXBuildFile; fileRef = 61586B90217A175C0038AC45 /* menu_recordings.png */; }; - 61586B93217A17700038AC45 /* menu_recordings@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 61586B92217A176F0038AC45 /* menu_recordings@2x.png */; }; - 615A280F217F1FD50060F920 /* chat_add_group.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A2808217F1FD40060F920 /* chat_add_group.png */; }; - 615A2811217F1FDE0060F920 /* chat_add_group@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A2810217F1FDE0060F920 /* chat_add_group@2x.png */; }; - 615A2813217F24D40060F920 /* security_1_indicator.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A2812217F24D40060F920 /* security_1_indicator.png */; }; - 615A2815217F24E00060F920 /* security_1_indicator@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A2814217F24E00060F920 /* security_1_indicator@2x.png */; }; - 615A2817217F280C0060F920 /* chat_list_indicator.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A2816217F280C0060F920 /* chat_list_indicator.png */; }; - 615A2819217F28160060F920 /* chat_list_indicator@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A2818217F28160060F920 /* chat_list_indicator@2x.png */; }; - 615A281B217F6F9C0060F920 /* security_2_indicator.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A281A217F6F9B0060F920 /* security_2_indicator.png */; }; - 615A281D217F6FA80060F920 /* security_2_indicator@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A281C217F6FA80060F920 /* security_2_indicator@2x.png */; }; - 615A281F217F6FB40060F920 /* security_alert_indicator.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A281E217F6FB30060F920 /* security_alert_indicator.png */; }; - 615A2821217F6FBF0060F920 /* security_alert_indicator@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A2820217F6FBF0060F920 /* security_alert_indicator@2x.png */; }; - 615A282421805B260060F920 /* security_toogle_icon_green.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A282321805B250060F920 /* security_toogle_icon_green.png */; }; - 615A282621805B320060F920 /* security_toogle_icon_green@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A282521805B320060F920 /* security_toogle_icon_green@2x.png */; }; - 615A282821805B400060F920 /* security_toogle_icon_grey.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A282721805B400060F920 /* security_toogle_icon_grey.png */; }; - 615A282A21805B4C0060F920 /* security_toogle_icon_grey@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A282921805B4C0060F920 /* security_toogle_icon_grey@2x.png */; }; - 615A2830218071E80060F920 /* security_toogle_background_green.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A282F218071E80060F920 /* security_toogle_background_green.png */; }; - 615A2832218071F30060F920 /* security_toogle_background_green@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A2831218071F30060F920 /* security_toogle_background_green@2x.png */; }; - 615A2834218071FF0060F920 /* security_toogle_background_grey.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A2833218071FF0060F920 /* security_toogle_background_grey.png */; }; - 615A28362180720D0060F920 /* security_toogle_background_grey@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A28352180720D0060F920 /* security_toogle_background_grey@2x.png */; }; - 615A283A2180788E0060F920 /* security_toogle_button.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A28392180788E0060F920 /* security_toogle_button.png */; }; - 615A283C2180789C0060F920 /* security_toogle_button@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A283B2180789C0060F920 /* security_toogle_button@2x.png */; }; - 615A283E2180A2560060F920 /* invite_linphone.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A283D2180A2550060F920 /* invite_linphone.png */; }; - 615A28402180A2620060F920 /* invite_linphone@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A283F2180A2620060F920 /* invite_linphone@2x.png */; }; - 615A28422180C0870060F920 /* recording.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A28412180C0820060F920 /* recording.png */; }; - 615A28442180C0900060F920 /* recording@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A28432180C08F0060F920 /* recording@2x.png */; }; - 617B4A60260A2B7800A87337 /* RecordingsListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 617B4A62260A2B7800A87337 /* RecordingsListView.xib */; }; - 617C242A263022690042FB4A /* UIChatContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = 617C2429263022690042FB4A /* UIChatContentView.m */; }; - 6180D6FE21EE41A800AD9CB6 /* QuickLook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6180D6FD21EE41A800AD9CB6 /* QuickLook.framework */; }; - 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, ); }; }; - 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 */; }; - 61AEBEC82191E48400F35E7F /* chevron_list_close@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 61AEBEC72191E48400F35E7F /* chevron_list_close@2x.png */; }; - 61AEBECA2191E49300F35E7F /* chevron_list_open.png in Resources */ = {isa = PBXBuildFile; fileRef = 61AEBEC92191E49200F35E7F /* chevron_list_open.png */; }; - 61AEBECC2191E4A300F35E7F /* chevron_list_open@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 61AEBECB2191E4A300F35E7F /* chevron_list_open@2x.png */; }; - 61CCC3DF21933B580060EDEA /* UIDeviceCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 61CCC3DE21933B580060EDEA /* UIDeviceCell.m */; }; - 61CCC3E121933B660060EDEA /* UIDeviceCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 61CCC3E021933B660060EDEA /* UIDeviceCell.xib */; }; - 61DD7E1F2372E88F001BDD01 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61DD7E1E2372E88F001BDD01 /* CoreLocation.framework */; }; - 61F1997520C6B1D5006B069A /* AVKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61F1996E20C6B1D5006B069A /* AVKit.framework */; }; - 6306440E1BECB08500134C72 /* FirstLoginView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6306440C1BECB08500134C72 /* FirstLoginView.m */; }; - 6308F9C51BF0DD6600D1234B /* XMLRPCHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 6308F9C41BF0DD6600D1234B /* XMLRPCHelper.m */; }; - 630CF5571AF7CE1500539F7A /* UITextField+DoneButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 630CF5561AF7CE1500539F7A /* UITextField+DoneButton.m */; }; - 631098491D4660580041F2B3 /* CountryListView.m in Sources */ = {isa = PBXBuildFile; fileRef = 631098481D4660580041F2B3 /* CountryListView.m */; }; - 631098521D4660630041F2B3 /* CountryListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 631098501D4660630041F2B3 /* CountryListView.xib */; }; - 63130FB21C1ED06900371918 /* SideMenuView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 63130FB01C1ED06900371918 /* SideMenuView~ipad.xib */; }; - 631348301B6F7B6600C6BDCB /* UIRoundBorderedButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 6313482F1B6F7B6600C6BDCB /* UIRoundBorderedButton.m */; }; - 63177FBF1C86E68C00ADE58D /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8613C73D8A00210156 /* CoreVideo.framework */; }; - 6334DDFA1BBAC97C00631900 /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = D32B6E2E15A5C0AC0033019F /* libsqlite3.dylib */; settings = {ATTRIBUTES = (Required, ); }; }; - 633671611BCBAAD200BFCBDE /* ChatConversationCreateView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6336715F1BCBAAD200BFCBDE /* ChatConversationCreateView.m */; }; - 633756391B67BAF400E21BAD /* SideMenuTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 633756381B67BAF400E21BAD /* SideMenuTableView.m */; }; - 633756451B67D2B200E21BAD /* SideMenuView.m in Sources */ = {isa = PBXBuildFile; fileRef = 633756431B67D2B100E21BAD /* SideMenuView.m */; }; - 633888451BFB2C49001D5E7B /* HPGrowingTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 633888421BFB2C49001D5E7B /* HPGrowingTextView.m */; }; - 633888461BFB2C49001D5E7B /* HPTextViewInternal.m in Sources */ = {isa = PBXBuildFile; fileRef = 633888441BFB2C49001D5E7B /* HPTextViewInternal.m */; }; - 633E41821D74259000320475 /* AssistantLinkView.m in Sources */ = {isa = PBXBuildFile; fileRef = 633E41801D74258F00320475 /* AssistantLinkView.m */; }; - 633FED9C1D3CD5590014B822 /* add_field_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBE21D3CD5570014B822 /* add_field_default.png */; }; - 633FED9D1D3CD5590014B822 /* add_field_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBE31D3CD5570014B822 /* add_field_default@2x.png */; }; - 633FED9E1D3CD5590014B822 /* add_field_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBE41D3CD5570014B822 /* add_field_over.png */; }; - 633FED9F1D3CD5590014B822 /* add_field_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBE51D3CD5570014B822 /* add_field_over@2x.png */; }; - 633FEDA01D3CD5590014B822 /* avatar.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBE61D3CD5570014B822 /* avatar.png */; }; - 633FEDA11D3CD5590014B822 /* avatar@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBE71D3CD5570014B822 /* avatar@2x.png */; }; - 633FEDA21D3CD5590014B822 /* avatar~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBE81D3CD5570014B822 /* avatar~ipad.png */; }; - 633FEDA31D3CD5590014B822 /* avatar~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBE91D3CD5570014B822 /* avatar~ipad@2x.png */; }; - 633FEDA41D3CD5590014B822 /* back_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBEA1D3CD5570014B822 /* back_default.png */; }; - 633FEDA51D3CD5590014B822 /* back_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBEB1D3CD5570014B822 /* back_default@2x.png */; }; - 633FEDA61D3CD5590014B822 /* back_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBEC1D3CD5570014B822 /* back_disabled.png */; }; - 633FEDA71D3CD5590014B822 /* back_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBED1D3CD5570014B822 /* back_disabled@2x.png */; }; - 633FEDA81D3CD5590014B822 /* backspace_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBEE1D3CD5570014B822 /* backspace_default.png */; }; - 633FEDA91D3CD5590014B822 /* backspace_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBEF1D3CD5570014B822 /* backspace_default@2x.png */; }; - 633FEDAA1D3CD5590014B822 /* backspace_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBF01D3CD5570014B822 /* backspace_disabled.png */; }; - 633FEDAB1D3CD5590014B822 /* backspace_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBF11D3CD5570014B822 /* backspace_disabled@2x.png */; }; - 633FEDAC1D3CD5590014B822 /* backspace_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBF21D3CD5570014B822 /* backspace_over.png */; }; - 633FEDAD1D3CD5590014B822 /* backspace_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBF31D3CD5570014B822 /* backspace_over@2x.png */; }; - 633FEDAE1D3CD5590014B822 /* call_add_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBF41D3CD5570014B822 /* call_add_default.png */; }; - 633FEDAF1D3CD5590014B822 /* call_add_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBF51D3CD5570014B822 /* call_add_default@2x.png */; }; - 633FEDB01D3CD5590014B822 /* call_add_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBF61D3CD5570014B822 /* call_add_disabled.png */; }; - 633FEDB11D3CD5590014B822 /* call_add_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBF71D3CD5570014B822 /* call_add_disabled@2x.png */; }; - 633FEDB21D3CD5590014B822 /* call_alt_back_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBF81D3CD5570014B822 /* call_alt_back_default.png */; }; - 633FEDB31D3CD5590014B822 /* call_alt_back_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBF91D3CD5570014B822 /* call_alt_back_default@2x.png */; }; - 633FEDB41D3CD5590014B822 /* call_alt_back_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBFA1D3CD5570014B822 /* call_alt_back_disabled.png */; }; - 633FEDB51D3CD5590014B822 /* call_alt_back_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBFB1D3CD5570014B822 /* call_alt_back_disabled@2x.png */; }; - 633FEDB61D3CD5590014B822 /* call_alt_start_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBFC1D3CD5570014B822 /* call_alt_start_default.png */; }; - 633FEDB71D3CD5590014B822 /* call_alt_start_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBFD1D3CD5570014B822 /* call_alt_start_default@2x.png */; }; - 633FEDB81D3CD5590014B822 /* call_alt_start_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBFE1D3CD5570014B822 /* call_alt_start_disabled.png */; }; - 633FEDB91D3CD5590014B822 /* call_alt_start_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBFF1D3CD5570014B822 /* call_alt_start_disabled@2x.png */; }; - 633FEDBA1D3CD5590014B822 /* call_audio_start_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC001D3CD5570014B822 /* call_audio_start_default.png */; }; - 633FEDBB1D3CD5590014B822 /* call_audio_start_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC011D3CD5570014B822 /* call_audio_start_default@2x.png */; }; - 633FEDBC1D3CD5590014B822 /* call_audio_start_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC021D3CD5570014B822 /* call_audio_start_disabled.png */; }; - 633FEDBD1D3CD5590014B822 /* call_audio_start_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC031D3CD5570014B822 /* call_audio_start_disabled@2x.png */; }; - 633FEDBE1D3CD5590014B822 /* call_back_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC041D3CD5570014B822 /* call_back_default.png */; }; - 633FEDBF1D3CD5590014B822 /* call_back_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC051D3CD5570014B822 /* call_back_default@2x.png */; }; - 633FEDC01D3CD5590014B822 /* call_back_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC061D3CD5570014B822 /* call_back_disabled.png */; }; - 633FEDC11D3CD5590014B822 /* call_back_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC071D3CD5570014B822 /* call_back_disabled@2x.png */; }; - 633FEDC21D3CD5590014B822 /* call_hangup_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC081D3CD5570014B822 /* call_hangup_default.png */; }; - 633FEDC31D3CD5590014B822 /* call_hangup_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC091D3CD5570014B822 /* call_hangup_default@2x.png */; }; - 633FEDC41D3CD5590014B822 /* call_hangup_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC0A1D3CD5570014B822 /* call_hangup_disabled.png */; }; - 633FEDC51D3CD5590014B822 /* call_hangup_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC0B1D3CD5570014B822 /* call_hangup_disabled@2x.png */; }; - 633FEDC61D3CD5590014B822 /* call_incoming.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC0C1D3CD5570014B822 /* call_incoming.png */; }; - 633FEDC71D3CD5590014B822 /* call_incoming@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC0D1D3CD5570014B822 /* call_incoming@2x.png */; }; - 633FEDC81D3CD5590014B822 /* call_missed.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC0E1D3CD5570014B822 /* call_missed.png */; }; - 633FEDC91D3CD5590014B822 /* call_missed@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC0F1D3CD5570014B822 /* call_missed@2x.png */; }; - 633FEDCA1D3CD5590014B822 /* call_outgoing.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC101D3CD5570014B822 /* call_outgoing.png */; }; - 633FEDCB1D3CD5590014B822 /* call_outgoing@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC111D3CD5570014B822 /* call_outgoing@2x.png */; }; - 633FEDCC1D3CD5590014B822 /* call_quality_indicator_0.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC121D3CD5570014B822 /* call_quality_indicator_0.png */; }; - 633FEDCD1D3CD5590014B822 /* call_quality_indicator_0@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC131D3CD5570014B822 /* call_quality_indicator_0@2x.png */; }; - 633FEDCE1D3CD5590014B822 /* call_quality_indicator_1.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC141D3CD5570014B822 /* call_quality_indicator_1.png */; }; - 633FEDCF1D3CD5590014B822 /* call_quality_indicator_1@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC151D3CD5570014B822 /* call_quality_indicator_1@2x.png */; }; - 633FEDD01D3CD5590014B822 /* call_quality_indicator_2.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC161D3CD5570014B822 /* call_quality_indicator_2.png */; }; - 633FEDD11D3CD5590014B822 /* call_quality_indicator_2@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC171D3CD5570014B822 /* call_quality_indicator_2@2x.png */; }; - 633FEDD21D3CD5590014B822 /* call_quality_indicator_3.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC181D3CD5570014B822 /* call_quality_indicator_3.png */; }; - 633FEDD31D3CD5590014B822 /* call_quality_indicator_3@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC191D3CD5570014B822 /* call_quality_indicator_3@2x.png */; }; - 633FEDD41D3CD5590014B822 /* call_quality_indicator_4.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC1A1D3CD5570014B822 /* call_quality_indicator_4.png */; }; - 633FEDD51D3CD5590014B822 /* call_quality_indicator_4@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC1B1D3CD5570014B822 /* call_quality_indicator_4@2x.png */; }; - 633FEDD61D3CD5590014B822 /* call_start_body_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC1C1D3CD5570014B822 /* call_start_body_default.png */; }; - 633FEDD71D3CD5590014B822 /* call_start_body_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC1D1D3CD5570014B822 /* call_start_body_default@2x.png */; }; - 633FEDD81D3CD5590014B822 /* call_start_body_default~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC1E1D3CD5570014B822 /* call_start_body_default~ipad.png */; }; - 633FEDD91D3CD5590014B822 /* call_start_body_default~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC1F1D3CD5570014B822 /* call_start_body_default~ipad@2x.png */; }; - 633FEDDA1D3CD5590014B822 /* call_start_body_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC201D3CD5570014B822 /* call_start_body_disabled.png */; }; - 633FEDDB1D3CD5590014B822 /* call_start_body_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC211D3CD5570014B822 /* call_start_body_disabled@2x.png */; }; - 633FEDDC1D3CD5590014B822 /* call_start_body_disabled~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC221D3CD5570014B822 /* call_start_body_disabled~ipad.png */; }; - 633FEDDD1D3CD5590014B822 /* call_start_body_disabled~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC231D3CD5570014B822 /* call_start_body_disabled~ipad@2x.png */; }; - 633FEDDE1D3CD5590014B822 /* call_start_body_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC241D3CD5570014B822 /* call_start_body_over.png */; }; - 633FEDDF1D3CD5590014B822 /* call_start_body_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC251D3CD5570014B822 /* call_start_body_over@2x.png */; }; - 633FEDE01D3CD5590014B822 /* call_start_body_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC261D3CD5570014B822 /* call_start_body_over~ipad.png */; }; - 633FEDE11D3CD5590014B822 /* call_start_body_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC271D3CD5570014B822 /* call_start_body_over~ipad@2x.png */; }; - 633FEDE21D3CD5590014B822 /* call_status_incoming.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC281D3CD5570014B822 /* call_status_incoming.png */; }; - 633FEDE31D3CD5590014B822 /* call_status_incoming@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC291D3CD5570014B822 /* call_status_incoming@2x.png */; }; - 633FEDE41D3CD5590014B822 /* call_status_incoming~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC2A1D3CD5570014B822 /* call_status_incoming~ipad.png */; }; - 633FEDE51D3CD5590014B822 /* call_status_incoming~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC2B1D3CD5570014B822 /* call_status_incoming~ipad@2x.png */; }; - 633FEDE61D3CD5590014B822 /* call_status_missed.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC2C1D3CD5570014B822 /* call_status_missed.png */; }; - 633FEDE71D3CD5590014B822 /* call_status_missed@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC2D1D3CD5570014B822 /* call_status_missed@2x.png */; }; - 633FEDE81D3CD5590014B822 /* call_status_missed~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC2E1D3CD5570014B822 /* call_status_missed~ipad.png */; }; - 633FEDE91D3CD5590014B822 /* call_status_missed~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC2F1D3CD5570014B822 /* call_status_missed~ipad@2x.png */; }; - 633FEDEA1D3CD5590014B822 /* call_status_outgoing.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC301D3CD5570014B822 /* call_status_outgoing.png */; }; - 633FEDEB1D3CD5590014B822 /* call_status_outgoing@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC311D3CD5570014B822 /* call_status_outgoing@2x.png */; }; - 633FEDEC1D3CD5590014B822 /* call_status_outgoing~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC321D3CD5570014B822 /* call_status_outgoing~ipad.png */; }; - 633FEDED1D3CD5590014B822 /* call_status_outgoing~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC331D3CD5570014B822 /* call_status_outgoing~ipad@2x.png */; }; - 633FEDEE1D3CD5590014B822 /* call_transfer_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC341D3CD5570014B822 /* call_transfer_default.png */; }; - 633FEDEF1D3CD5590014B822 /* call_transfer_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC351D3CD5570014B822 /* call_transfer_default@2x.png */; }; - 633FEDF01D3CD5590014B822 /* call_transfer_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC361D3CD5570014B822 /* call_transfer_disabled.png */; }; - 633FEDF11D3CD5590014B822 /* call_transfer_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC371D3CD5570014B822 /* call_transfer_disabled@2x.png */; }; - 633FEDF21D3CD5590014B822 /* call_video_start_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC381D3CD5570014B822 /* call_video_start_default.png */; }; - 633FEDF31D3CD5590014B822 /* call_video_start_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC391D3CD5570014B822 /* call_video_start_default@2x.png */; }; - 633FEDF41D3CD5590014B822 /* call_video_start_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC3A1D3CD5570014B822 /* call_video_start_disabled.png */; }; - 633FEDF51D3CD5590014B822 /* call_video_start_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC3B1D3CD5570014B822 /* call_video_start_disabled@2x.png */; }; - 633FEDF61D3CD5590014B822 /* camera_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC3C1D3CD5570014B822 /* camera_default.png */; }; - 633FEDF71D3CD5590014B822 /* camera_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC3D1D3CD5570014B822 /* camera_default@2x.png */; }; - 633FEDF81D3CD5590014B822 /* camera_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC3E1D3CD5570014B822 /* camera_disabled.png */; }; - 633FEDF91D3CD5590014B822 /* camera_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC3F1D3CD5570014B822 /* camera_disabled@2x.png */; }; - 633FEDFA1D3CD5590014B822 /* camera_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC401D3CD5570014B822 /* camera_selected.png */; }; - 633FEDFB1D3CD5590014B822 /* camera_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC411D3CD5570014B822 /* camera_selected@2x.png */; }; - 633FEDFC1D3CD5590014B822 /* camera_switch_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC421D3CD5570014B822 /* camera_switch_default.png */; }; - 633FEDFD1D3CD5590014B822 /* camera_switch_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC431D3CD5570014B822 /* camera_switch_default@2x.png */; }; - 633FEDFE1D3CD5590014B822 /* camera_switch_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC441D3CD5570014B822 /* camera_switch_disabled.png */; }; - 633FEDFF1D3CD5590014B822 /* camera_switch_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC451D3CD5570014B822 /* camera_switch_disabled@2x.png */; }; - 633FEE001D3CD5590014B822 /* camera_switch_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC461D3CD5570014B822 /* camera_switch_over.png */; }; - 633FEE011D3CD5590014B822 /* camera_switch_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC471D3CD5570014B822 /* camera_switch_over@2x.png */; }; - 633FEE021D3CD5590014B822 /* cancel_edit_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC481D3CD5570014B822 /* cancel_edit_default.png */; }; - 633FEE031D3CD5590014B822 /* cancel_edit_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC491D3CD5570014B822 /* cancel_edit_default@2x.png */; }; - 633FEE041D3CD5590014B822 /* cancel_edit_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC4A1D3CD5570014B822 /* cancel_edit_disabled.png */; }; - 633FEE051D3CD5590014B822 /* cancel_edit_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC4B1D3CD5570014B822 /* cancel_edit_disabled@2x.png */; }; - 633FEE061D3CD5590014B822 /* chat_add_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC4C1D3CD5570014B822 /* chat_add_default.png */; }; - 633FEE071D3CD5590014B822 /* chat_add_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC4D1D3CD5570014B822 /* chat_add_default@2x.png */; }; - 633FEE081D3CD5590014B822 /* chat_add_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC4E1D3CD5570014B822 /* chat_add_disabled.png */; }; - 633FEE091D3CD5590014B822 /* chat_add_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC4F1D3CD5570014B822 /* chat_add_disabled@2x.png */; }; - 633FEE0A1D3CD5590014B822 /* chat_attachment_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC501D3CD5570014B822 /* chat_attachment_default.png */; }; - 633FEE0B1D3CD5590014B822 /* chat_attachment_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC511D3CD5570014B822 /* chat_attachment_default@2x.png */; }; - 633FEE0C1D3CD5590014B822 /* chat_attachment_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC521D3CD5570014B822 /* chat_attachment_disabled.png */; }; - 633FEE0D1D3CD5590014B822 /* chat_attachment_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC531D3CD5570014B822 /* chat_attachment_disabled@2x.png */; }; - 633FEE0E1D3CD5590014B822 /* chat_attachment_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC541D3CD5570014B822 /* chat_attachment_over.png */; }; - 633FEE0F1D3CD5590014B822 /* chat_attachment_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC551D3CD5570014B822 /* chat_attachment_over@2x.png */; }; - 633FEE101D3CD5590014B822 /* chat_list_indicator~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC561D3CD5570014B822 /* chat_list_indicator~ipad.png */; }; - 633FEE111D3CD5590014B822 /* chat_list_indicator~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC571D3CD5570014B822 /* chat_list_indicator~ipad@2x.png */; }; - 633FEE121D3CD5590014B822 /* chat_message_not_delivered.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC581D3CD5570014B822 /* chat_message_not_delivered.png */; }; - 633FEE131D3CD5590014B822 /* chat_message_not_delivered@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC591D3CD5570014B822 /* chat_message_not_delivered@2x.png */; }; - 633FEE141D3CD5590014B822 /* chat_send_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC5A1D3CD5570014B822 /* chat_send_default.png */; }; - 633FEE151D3CD5590014B822 /* chat_send_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC5B1D3CD5570014B822 /* chat_send_default@2x.png */; }; - 633FEE161D3CD5590014B822 /* chat_send_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC5C1D3CD5570014B822 /* chat_send_disabled.png */; }; - 633FEE171D3CD5590014B822 /* chat_send_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC5D1D3CD5570014B822 /* chat_send_disabled@2x.png */; }; - 633FEE181D3CD5590014B822 /* chat_send_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC5E1D3CD5570014B822 /* chat_send_over.png */; }; - 633FEE191D3CD5590014B822 /* chat_send_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC5F1D3CD5570014B822 /* chat_send_over@2x.png */; }; - 633FEE1A1D3CD5590014B822 /* chat_start_body_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC601D3CD5570014B822 /* chat_start_body_default.png */; }; - 633FEE1B1D3CD5590014B822 /* chat_start_body_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC611D3CD5570014B822 /* chat_start_body_default@2x.png */; }; - 633FEE1C1D3CD5590014B822 /* chat_start_body_default~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC621D3CD5570014B822 /* chat_start_body_default~ipad.png */; }; - 633FEE1D1D3CD5590014B822 /* chat_start_body_default~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC631D3CD5570014B822 /* chat_start_body_default~ipad@2x.png */; }; - 633FEE1E1D3CD5590014B822 /* chat_start_body_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC641D3CD5570014B822 /* chat_start_body_disabled.png */; }; - 633FEE1F1D3CD5590014B822 /* chat_start_body_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC651D3CD5570014B822 /* chat_start_body_disabled@2x.png */; }; - 633FEE201D3CD5590014B822 /* chat_start_body_disabled~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC661D3CD5570014B822 /* chat_start_body_disabled~ipad.png */; }; - 633FEE211D3CD5590014B822 /* chat_start_body_disabled~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC671D3CD5570014B822 /* chat_start_body_disabled~ipad@2x.png */; }; - 633FEE221D3CD5590014B822 /* chat_start_body_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC681D3CD5570014B822 /* chat_start_body_over.png */; }; - 633FEE231D3CD5590014B822 /* chat_start_body_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC691D3CD5570014B822 /* chat_start_body_over@2x.png */; }; - 633FEE241D3CD5590014B822 /* chat_start_body_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC6A1D3CD5570014B822 /* chat_start_body_over~ipad.png */; }; - 633FEE251D3CD5590014B822 /* chat_start_body_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC6B1D3CD5570014B822 /* chat_start_body_over~ipad@2x.png */; }; - 633FEE261D3CD5590014B822 /* checkbox_checked.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC6C1D3CD5570014B822 /* checkbox_checked.png */; }; - 633FEE271D3CD5590014B822 /* checkbox_checked@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC6D1D3CD5570014B822 /* checkbox_checked@2x.png */; }; - 633FEE281D3CD5590014B822 /* checkbox_unchecked.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC6E1D3CD5570014B822 /* checkbox_unchecked.png */; }; - 633FEE291D3CD5590014B822 /* checkbox_unchecked@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC6F1D3CD5570014B822 /* checkbox_unchecked@2x.png */; }; - 633FEE2A1D3CD5590014B822 /* color_A.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC701D3CD5570014B822 /* color_A.png */; }; - 633FEE2B1D3CD5590014B822 /* color_C.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC711D3CD5570014B822 /* color_C.png */; }; - 633FEE2C1D3CD5590014B822 /* color_D.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC721D3CD5570014B822 /* color_D.png */; }; - 633FEE2D1D3CD5590014B822 /* color_E.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC731D3CD5570014B822 /* color_E.png */; }; - 633FEE2E1D3CD5590014B822 /* color_F.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC741D3CD5570014B822 /* color_F.png */; }; - 633FEE2F1D3CD5590014B822 /* color_G.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC751D3CD5570014B822 /* color_G.png */; }; - 633FEE301D3CD5590014B822 /* color_H.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC761D3CD5570014B822 /* color_H.png */; }; - 633FEE311D3CD5590014B822 /* color_I.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC771D3CD5570014B822 /* color_I.png */; }; - 633FEE321D3CD5590014B822 /* color_L.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC781D3CD5570014B822 /* color_L.png */; }; - 633FEE331D3CD5590014B822 /* color_M.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC791D3CD5570014B822 /* color_M.png */; }; - 633FEE341D3CD5590014B822 /* conference_exit_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC7A1D3CD5570014B822 /* conference_exit_default.png */; }; - 633FEE351D3CD5590014B822 /* conference_exit_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC7B1D3CD5570014B822 /* conference_exit_default@2x.png */; }; - 633FEE361D3CD5590014B822 /* conference_exit_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC7C1D3CD5570014B822 /* conference_exit_over.png */; }; - 633FEE371D3CD5590014B822 /* conference_exit_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC7D1D3CD5570014B822 /* conference_exit_over@2x.png */; }; - 633FEE381D3CD5590014B822 /* contact_add_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC7E1D3CD5570014B822 /* contact_add_default.png */; }; - 633FEE391D3CD5590014B822 /* contact_add_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC7F1D3CD5570014B822 /* contact_add_default@2x.png */; }; - 633FEE3A1D3CD5590014B822 /* contact_add_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC801D3CD5570014B822 /* contact_add_disabled.png */; }; - 633FEE3B1D3CD5590014B822 /* contact_add_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC811D3CD5570014B822 /* contact_add_disabled@2x.png */; }; - 633FEE3C1D3CD5590014B822 /* contacts_all_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC821D3CD5570014B822 /* contacts_all_default.png */; }; - 633FEE3D1D3CD5590014B822 /* contacts_all_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC831D3CD5570014B822 /* contacts_all_default@2x.png */; }; - 633FEE3E1D3CD5590014B822 /* contacts_all_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC841D3CD5570014B822 /* contacts_all_disabled.png */; }; - 633FEE3F1D3CD5590014B822 /* contacts_all_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC851D3CD5570014B822 /* contacts_all_disabled@2x.png */; }; - 633FEE401D3CD5590014B822 /* contacts_all_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC861D3CD5570014B822 /* contacts_all_selected.png */; }; - 633FEE411D3CD5590014B822 /* contacts_all_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC871D3CD5570014B822 /* contacts_all_selected@2x.png */; }; - 633FEE481D3CD5590014B822 /* delete_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC8E1D3CD5570014B822 /* delete_default.png */; }; - 633FEE491D3CD5590014B822 /* delete_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC8F1D3CD5570014B822 /* delete_default@2x.png */; }; - 633FEE4A1D3CD5590014B822 /* delete_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC901D3CD5570014B822 /* delete_disabled.png */; }; - 633FEE4B1D3CD5590014B822 /* delete_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC911D3CD5570014B822 /* delete_disabled@2x.png */; }; - 633FEE4C1D3CD5590014B822 /* delete_field_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC921D3CD5570014B822 /* delete_field_default.png */; }; - 633FEE4D1D3CD5590014B822 /* delete_field_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC931D3CD5570014B822 /* delete_field_default@2x.png */; }; - 633FEE4E1D3CD5590014B822 /* delete_field_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC941D3CD5570014B822 /* delete_field_over.png */; }; - 633FEE4F1D3CD5590014B822 /* delete_field_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC951D3CD5570014B822 /* delete_field_over@2x.png */; }; - 633FEE501D3CD5590014B822 /* deselect_all.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC961D3CD5570014B822 /* deselect_all.png */; }; - 633FEE511D3CD5590014B822 /* deselect_all@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC971D3CD5570014B822 /* deselect_all@2x.png */; }; - 633FEE521D3CD5590014B822 /* dialer_alt_back.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC981D3CD5570014B822 /* dialer_alt_back.png */; }; - 633FEE531D3CD5590014B822 /* dialer_alt_back@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC991D3CD5570014B822 /* dialer_alt_back@2x.png */; }; - 633FEE541D3CD5590014B822 /* dialer_back_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC9A1D3CD5570014B822 /* dialer_back_default.png */; }; - 633FEE551D3CD5590014B822 /* dialer_back_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC9B1D3CD5570014B822 /* dialer_back_default@2x.png */; }; - 633FEE561D3CD5590014B822 /* dialer_back_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC9C1D3CD5570014B822 /* dialer_back_disabled.png */; }; - 633FEE571D3CD5590014B822 /* dialer_back_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC9D1D3CD5570014B822 /* dialer_back_disabled@2x.png */; }; - 633FEE5A1D3CD5590014B822 /* edit_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECA01D3CD5570014B822 /* edit_default.png */; }; - 633FEE5B1D3CD5590014B822 /* edit_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECA11D3CD5570014B822 /* edit_default@2x.png */; }; - 633FEE5C1D3CD5590014B822 /* edit_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECA21D3CD5570014B822 /* edit_disabled.png */; }; - 633FEE5D1D3CD5590014B822 /* edit_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECA31D3CD5570014B822 /* edit_disabled@2x.png */; }; - 633FEE5E1D3CD5590014B822 /* edit_list_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECA41D3CD5570014B822 /* edit_list_default.png */; }; - 633FEE5F1D3CD5590014B822 /* edit_list_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECA51D3CD5570014B822 /* edit_list_default@2x.png */; }; - 633FEE601D3CD5590014B822 /* edit_list_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECA61D3CD5570014B822 /* edit_list_disabled.png */; }; - 633FEE611D3CD5590014B822 /* edit_list_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECA71D3CD5570014B822 /* edit_list_disabled@2x.png */; }; - 633FEE621D3CD5590014B822 /* footer_chat_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECA81D3CD5570014B822 /* footer_chat_default.png */; }; - 633FEE631D3CD5590014B822 /* footer_chat_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECA91D3CD5570014B822 /* footer_chat_default@2x.png */; }; - 633FEE641D3CD5590014B822 /* footer_chat_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECAA1D3CD5570014B822 /* footer_chat_disabled.png */; }; - 633FEE651D3CD5590014B822 /* footer_chat_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECAB1D3CD5570014B822 /* footer_chat_disabled@2x.png */; }; - 633FEE661D3CD5590014B822 /* footer_contacts_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECAC1D3CD5570014B822 /* footer_contacts_default.png */; }; - 633FEE671D3CD5590014B822 /* footer_contacts_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECAD1D3CD5570014B822 /* footer_contacts_default@2x.png */; }; - 633FEE681D3CD5590014B822 /* footer_contacts_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECAE1D3CD5570014B822 /* footer_contacts_disabled.png */; }; - 633FEE691D3CD5590014B822 /* footer_contacts_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECAF1D3CD5570014B822 /* footer_contacts_disabled@2x.png */; }; - 633FEE6A1D3CD5590014B822 /* footer_dialer_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECB01D3CD5570014B822 /* footer_dialer_default.png */; }; - 633FEE6B1D3CD5590014B822 /* footer_dialer_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECB11D3CD5570014B822 /* footer_dialer_default@2x.png */; }; - 633FEE6C1D3CD5590014B822 /* footer_dialer_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECB21D3CD5570014B822 /* footer_dialer_disabled.png */; }; - 633FEE6D1D3CD5590014B822 /* footer_dialer_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECB31D3CD5570014B822 /* footer_dialer_disabled@2x.png */; }; - 633FEE6E1D3CD5590014B822 /* footer_history_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECB41D3CD5570014B822 /* footer_history_default.png */; }; - 633FEE6F1D3CD5590014B822 /* footer_history_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECB51D3CD5570014B822 /* footer_history_default@2x.png */; }; - 633FEE701D3CD5590014B822 /* footer_history_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECB61D3CD5570014B822 /* footer_history_disabled.png */; }; - 633FEE711D3CD5590014B822 /* footer_history_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECB71D3CD5570014B822 /* footer_history_disabled@2x.png */; }; - 633FEE721D3CD5590014B822 /* history_all_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECB81D3CD5570014B822 /* history_all_default.png */; }; - 633FEE731D3CD5590014B822 /* history_all_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECB91D3CD5570014B822 /* history_all_default@2x.png */; }; - 633FEE741D3CD5590014B822 /* history_all_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECBA1D3CD5570014B822 /* history_all_disabled.png */; }; - 633FEE751D3CD5590014B822 /* history_all_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECBB1D3CD5570014B822 /* history_all_disabled@2x.png */; }; - 633FEE761D3CD5590014B822 /* history_all_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECBC1D3CD5570014B822 /* history_all_selected.png */; }; - 633FEE771D3CD5590014B822 /* history_all_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECBD1D3CD5570014B822 /* history_all_selected@2x.png */; }; - 633FEE781D3CD5590014B822 /* history_chat_indicator.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECBE1D3CD5570014B822 /* history_chat_indicator.png */; }; - 633FEE791D3CD5590014B822 /* history_chat_indicator@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECBF1D3CD5570014B822 /* history_chat_indicator@2x.png */; }; - 633FEE7A1D3CD5590014B822 /* history_missed_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECC01D3CD5570014B822 /* history_missed_default.png */; }; - 633FEE7B1D3CD5590014B822 /* history_missed_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECC11D3CD5570014B822 /* history_missed_default@2x.png */; }; - 633FEE7C1D3CD5590014B822 /* history_missed_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECC21D3CD5570014B822 /* history_missed_disabled.png */; }; - 633FEE7D1D3CD5590014B822 /* history_missed_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECC31D3CD5570014B822 /* history_missed_disabled@2x.png */; }; - 633FEE7E1D3CD5590014B822 /* history_missed_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECC41D3CD5570014B822 /* history_missed_selected.png */; }; - 633FEE7F1D3CD5590014B822 /* history_missed_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECC51D3CD5570014B822 /* history_missed_selected@2x.png */; }; - 633FEE801D3CD5590014B822 /* led_connected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECC61D3CD5570014B822 /* led_connected.png */; }; - 633FEE811D3CD5590014B822 /* led_connected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECC71D3CD5570014B822 /* led_connected@2x.png */; }; - 633FEE821D3CD5590014B822 /* led_disconnected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECC81D3CD5570014B822 /* led_disconnected.png */; }; - 633FEE831D3CD5590014B822 /* led_disconnected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECC91D3CD5570014B822 /* led_disconnected@2x.png */; }; - 633FEE841D3CD5590014B822 /* led_error.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECCA1D3CD5570014B822 /* led_error.png */; }; - 633FEE851D3CD5590014B822 /* led_error@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECCB1D3CD5570014B822 /* led_error@2x.png */; }; - 633FEE861D3CD5590014B822 /* led_inprogress.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECCC1D3CD5570014B822 /* led_inprogress.png */; }; - 633FEE871D3CD5590014B822 /* led_inprogress@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECCD1D3CD5570014B822 /* led_inprogress@2x.png */; }; - 633FEE8E1D3CD55A0014B822 /* list_details_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECD41D3CD5580014B822 /* list_details_default.png */; }; - 633FEE8F1D3CD55A0014B822 /* list_details_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECD51D3CD5580014B822 /* list_details_default@2x.png */; }; - 633FEE901D3CD55A0014B822 /* list_details_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECD61D3CD5580014B822 /* list_details_over.png */; }; - 633FEE911D3CD55A0014B822 /* list_details_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECD71D3CD5580014B822 /* list_details_over@2x.png */; }; - 633FEE921D3CD55A0014B822 /* menu.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECD81D3CD5580014B822 /* menu.png */; }; - 633FEE931D3CD55A0014B822 /* menu@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECD91D3CD5580014B822 /* menu@2x.png */; }; - 633FEE941D3CD55A0014B822 /* micro_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECDA1D3CD5580014B822 /* micro_default.png */; }; - 633FEE951D3CD55A0014B822 /* micro_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECDB1D3CD5580014B822 /* micro_default@2x.png */; }; - 633FEE961D3CD55A0014B822 /* micro_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECDC1D3CD5580014B822 /* micro_disabled.png */; }; - 633FEE971D3CD55A0014B822 /* micro_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECDD1D3CD5580014B822 /* micro_disabled@2x.png */; }; - 633FEE981D3CD55A0014B822 /* micro_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECDE1D3CD5580014B822 /* micro_selected.png */; }; - 633FEE991D3CD55A0014B822 /* micro_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECDF1D3CD5580014B822 /* micro_selected@2x.png */; }; - 633FEE9A1D3CD55A0014B822 /* nowebcamCIF.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 633FECE01D3CD5580014B822 /* nowebcamCIF.jpg */; }; - 633FEE9B1D3CD55A0014B822 /* numpad_0_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECE11D3CD5580014B822 /* numpad_0_default.png */; }; - 633FEE9C1D3CD55A0014B822 /* numpad_0_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECE21D3CD5580014B822 /* numpad_0_default@2x.png */; }; - 633FEE9D1D3CD55A0014B822 /* numpad_0_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECE31D3CD5580014B822 /* numpad_0_over.png */; }; - 633FEE9E1D3CD55A0014B822 /* numpad_0_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECE41D3CD5580014B822 /* numpad_0_over@2x.png */; }; - 633FEE9F1D3CD55A0014B822 /* numpad_0_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECE51D3CD5580014B822 /* numpad_0_over~ipad.png */; }; - 633FEEA01D3CD55A0014B822 /* numpad_0_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECE61D3CD5580014B822 /* numpad_0_over~ipad@2x.png */; }; - 633FEEA11D3CD55A0014B822 /* numpad_0~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECE71D3CD5580014B822 /* numpad_0~ipad.png */; }; - 633FEEA21D3CD55A0014B822 /* numpad_0~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECE81D3CD5580014B822 /* numpad_0~ipad@2x.png */; }; - 633FEEA31D3CD55A0014B822 /* numpad_1_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECE91D3CD5580014B822 /* numpad_1_default.png */; }; - 633FEEA41D3CD55A0014B822 /* numpad_1_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECEA1D3CD5580014B822 /* numpad_1_default@2x.png */; }; - 633FEEA51D3CD55A0014B822 /* numpad_1_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECEB1D3CD5580014B822 /* numpad_1_over.png */; }; - 633FEEA61D3CD55A0014B822 /* numpad_1_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECEC1D3CD5580014B822 /* numpad_1_over@2x.png */; }; - 633FEEA71D3CD55A0014B822 /* numpad_1_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECED1D3CD5580014B822 /* numpad_1_over~ipad.png */; }; - 633FEEA81D3CD55A0014B822 /* numpad_1_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECEE1D3CD5580014B822 /* numpad_1_over~ipad@2x.png */; }; - 633FEEA91D3CD55A0014B822 /* numpad_1~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECEF1D3CD5580014B822 /* numpad_1~ipad.png */; }; - 633FEEAA1D3CD55A0014B822 /* numpad_1~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECF01D3CD5580014B822 /* numpad_1~ipad@2x.png */; }; - 633FEEAB1D3CD55A0014B822 /* numpad_2_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECF11D3CD5580014B822 /* numpad_2_default.png */; }; - 633FEEAC1D3CD55A0014B822 /* numpad_2_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECF21D3CD5580014B822 /* numpad_2_default@2x.png */; }; - 633FEEAD1D3CD55A0014B822 /* numpad_2_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECF31D3CD5580014B822 /* numpad_2_over.png */; }; - 633FEEAE1D3CD55A0014B822 /* numpad_2_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECF41D3CD5580014B822 /* numpad_2_over@2x.png */; }; - 633FEEAF1D3CD55A0014B822 /* numpad_2_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECF51D3CD5580014B822 /* numpad_2_over~ipad.png */; }; - 633FEEB01D3CD55A0014B822 /* numpad_2_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECF61D3CD5580014B822 /* numpad_2_over~ipad@2x.png */; }; - 633FEEB11D3CD55A0014B822 /* numpad_2~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECF71D3CD5580014B822 /* numpad_2~ipad.png */; }; - 633FEEB21D3CD55A0014B822 /* numpad_2~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECF81D3CD5580014B822 /* numpad_2~ipad@2x.png */; }; - 633FEEB31D3CD55A0014B822 /* numpad_3_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECF91D3CD5580014B822 /* numpad_3_default.png */; }; - 633FEEB41D3CD55A0014B822 /* numpad_3_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECFA1D3CD5580014B822 /* numpad_3_default@2x.png */; }; - 633FEEB51D3CD55A0014B822 /* numpad_3_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECFB1D3CD5580014B822 /* numpad_3_over.png */; }; - 633FEEB61D3CD55A0014B822 /* numpad_3_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECFC1D3CD5580014B822 /* numpad_3_over@2x.png */; }; - 633FEEB71D3CD55A0014B822 /* numpad_3_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECFD1D3CD5580014B822 /* numpad_3_over~ipad.png */; }; - 633FEEB81D3CD55A0014B822 /* numpad_3_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECFE1D3CD5580014B822 /* numpad_3_over~ipad@2x.png */; }; - 633FEEB91D3CD55A0014B822 /* numpad_3~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECFF1D3CD5580014B822 /* numpad_3~ipad.png */; }; - 633FEEBA1D3CD55A0014B822 /* numpad_3~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED001D3CD5580014B822 /* numpad_3~ipad@2x.png */; }; - 633FEEBB1D3CD55A0014B822 /* numpad_4_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED011D3CD5580014B822 /* numpad_4_default.png */; }; - 633FEEBC1D3CD55A0014B822 /* numpad_4_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED021D3CD5580014B822 /* numpad_4_default@2x.png */; }; - 633FEEBD1D3CD55A0014B822 /* numpad_4_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED031D3CD5580014B822 /* numpad_4_over.png */; }; - 633FEEBE1D3CD55A0014B822 /* numpad_4_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED041D3CD5580014B822 /* numpad_4_over@2x.png */; }; - 633FEEBF1D3CD55A0014B822 /* numpad_4_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED051D3CD5580014B822 /* numpad_4_over~ipad.png */; }; - 633FEEC01D3CD55A0014B822 /* numpad_4_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED061D3CD5580014B822 /* numpad_4_over~ipad@2x.png */; }; - 633FEEC11D3CD55A0014B822 /* numpad_4~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED071D3CD5580014B822 /* numpad_4~ipad.png */; }; - 633FEEC21D3CD55A0014B822 /* numpad_4~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED081D3CD5580014B822 /* numpad_4~ipad@2x.png */; }; - 633FEEC31D3CD55A0014B822 /* numpad_5_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED091D3CD5580014B822 /* numpad_5_default.png */; }; - 633FEEC41D3CD55A0014B822 /* numpad_5_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED0A1D3CD5580014B822 /* numpad_5_default@2x.png */; }; - 633FEEC51D3CD55A0014B822 /* numpad_5_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED0B1D3CD5580014B822 /* numpad_5_over.png */; }; - 633FEEC61D3CD55A0014B822 /* numpad_5_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED0C1D3CD5580014B822 /* numpad_5_over@2x.png */; }; - 633FEEC71D3CD55A0014B822 /* numpad_5_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED0D1D3CD5580014B822 /* numpad_5_over~ipad.png */; }; - 633FEEC81D3CD55A0014B822 /* numpad_5_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED0E1D3CD5580014B822 /* numpad_5_over~ipad@2x.png */; }; - 633FEEC91D3CD55A0014B822 /* numpad_5~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED0F1D3CD5580014B822 /* numpad_5~ipad.png */; }; - 633FEECA1D3CD55A0014B822 /* numpad_5~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED101D3CD5580014B822 /* numpad_5~ipad@2x.png */; }; - 633FEECB1D3CD55A0014B822 /* numpad_6_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED111D3CD5580014B822 /* numpad_6_default.png */; }; - 633FEECC1D3CD55A0014B822 /* numpad_6_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED121D3CD5580014B822 /* numpad_6_default@2x.png */; }; - 633FEECD1D3CD55A0014B822 /* numpad_6_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED131D3CD5580014B822 /* numpad_6_over.png */; }; - 633FEECE1D3CD55A0014B822 /* numpad_6_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED141D3CD5580014B822 /* numpad_6_over@2x.png */; }; - 633FEECF1D3CD55A0014B822 /* numpad_6_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED151D3CD5580014B822 /* numpad_6_over~ipad.png */; }; - 633FEED01D3CD55A0014B822 /* numpad_6_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED161D3CD5580014B822 /* numpad_6_over~ipad@2x.png */; }; - 633FEED11D3CD55A0014B822 /* numpad_6~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED171D3CD5580014B822 /* numpad_6~ipad.png */; }; - 633FEED21D3CD55A0014B822 /* numpad_6~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED181D3CD5580014B822 /* numpad_6~ipad@2x.png */; }; - 633FEED31D3CD55A0014B822 /* numpad_7_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED191D3CD5580014B822 /* numpad_7_default.png */; }; - 633FEED41D3CD55A0014B822 /* numpad_7_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED1A1D3CD5580014B822 /* numpad_7_default@2x.png */; }; - 633FEED51D3CD55A0014B822 /* numpad_7_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED1B1D3CD5580014B822 /* numpad_7_over.png */; }; - 633FEED61D3CD55A0014B822 /* numpad_7_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED1C1D3CD5580014B822 /* numpad_7_over@2x.png */; }; - 633FEED71D3CD55A0014B822 /* numpad_7_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED1D1D3CD5580014B822 /* numpad_7_over~ipad.png */; }; - 633FEED81D3CD55A0014B822 /* numpad_7_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED1E1D3CD5580014B822 /* numpad_7_over~ipad@2x.png */; }; - 633FEED91D3CD55A0014B822 /* numpad_7~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED1F1D3CD5580014B822 /* numpad_7~ipad.png */; }; - 633FEEDA1D3CD55A0014B822 /* numpad_7~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED201D3CD5580014B822 /* numpad_7~ipad@2x.png */; }; - 633FEEDB1D3CD55A0014B822 /* numpad_8_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED211D3CD5580014B822 /* numpad_8_default.png */; }; - 633FEEDC1D3CD55A0014B822 /* numpad_8_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED221D3CD5580014B822 /* numpad_8_default@2x.png */; }; - 633FEEDD1D3CD55A0014B822 /* numpad_8_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED231D3CD5580014B822 /* numpad_8_over.png */; }; - 633FEEDE1D3CD55A0014B822 /* numpad_8_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED241D3CD5580014B822 /* numpad_8_over@2x.png */; }; - 633FEEDF1D3CD55A0014B822 /* numpad_8_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED251D3CD5580014B822 /* numpad_8_over~ipad.png */; }; - 633FEEE01D3CD55A0014B822 /* numpad_8_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED261D3CD5580014B822 /* numpad_8_over~ipad@2x.png */; }; - 633FEEE11D3CD55A0014B822 /* numpad_8~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED271D3CD5580014B822 /* numpad_8~ipad.png */; }; - 633FEEE21D3CD55A0014B822 /* numpad_8~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED281D3CD5580014B822 /* numpad_8~ipad@2x.png */; }; - 633FEEE31D3CD55A0014B822 /* numpad_9_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED291D3CD5580014B822 /* numpad_9_default.png */; }; - 633FEEE41D3CD55A0014B822 /* numpad_9_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED2A1D3CD5580014B822 /* numpad_9_default@2x.png */; }; - 633FEEE51D3CD55A0014B822 /* numpad_9_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED2B1D3CD5580014B822 /* numpad_9_over.png */; }; - 633FEEE61D3CD55A0014B822 /* numpad_9_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED2C1D3CD5580014B822 /* numpad_9_over@2x.png */; }; - 633FEEE71D3CD55A0014B822 /* numpad_9_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED2D1D3CD5580014B822 /* numpad_9_over~ipad.png */; }; - 633FEEE81D3CD55A0014B822 /* numpad_9_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED2E1D3CD5580014B822 /* numpad_9_over~ipad@2x.png */; }; - 633FEEE91D3CD55A0014B822 /* numpad_9~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED2F1D3CD5580014B822 /* numpad_9~ipad.png */; }; - 633FEEEA1D3CD55A0014B822 /* numpad_9~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED301D3CD5580014B822 /* numpad_9~ipad@2x.png */; }; - 633FEEEB1D3CD55A0014B822 /* numpad_hash_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED311D3CD5580014B822 /* numpad_hash_default.png */; }; - 633FEEEC1D3CD55A0014B822 /* numpad_hash_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED321D3CD5580014B822 /* numpad_hash_default@2x.png */; }; - 633FEEED1D3CD55A0014B822 /* numpad_hash_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED331D3CD5580014B822 /* numpad_hash_over.png */; }; - 633FEEEE1D3CD55A0014B822 /* numpad_hash_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED341D3CD5580014B822 /* numpad_hash_over@2x.png */; }; - 633FEEEF1D3CD55A0014B822 /* numpad_hash_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED351D3CD5580014B822 /* numpad_hash_over~ipad.png */; }; - 633FEEF01D3CD55A0014B822 /* numpad_hash_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED361D3CD5580014B822 /* numpad_hash_over~ipad@2x.png */; }; - 633FEEF11D3CD55A0014B822 /* numpad_hash~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED371D3CD5580014B822 /* numpad_hash~ipad.png */; }; - 633FEEF21D3CD55A0014B822 /* numpad_hash~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED381D3CD5580014B822 /* numpad_hash~ipad@2x.png */; }; - 633FEEF31D3CD55A0014B822 /* numpad_over_background.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED391D3CD5580014B822 /* numpad_over_background.png */; }; - 633FEEF41D3CD55A0014B822 /* numpad_star_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED3A1D3CD5580014B822 /* numpad_star_default.png */; }; - 633FEEF51D3CD55A0014B822 /* numpad_star_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED3B1D3CD5580014B822 /* numpad_star_default@2x.png */; }; - 633FEEF61D3CD55A0014B822 /* numpad_star_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED3C1D3CD5580014B822 /* numpad_star_over.png */; }; - 633FEEF71D3CD55A0014B822 /* numpad_star_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED3D1D3CD5580014B822 /* numpad_star_over@2x.png */; }; - 633FEEF81D3CD55A0014B822 /* numpad_star_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED3E1D3CD5580014B822 /* numpad_star_over~ipad.png */; }; - 633FEEF91D3CD55A0014B822 /* numpad_star_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED3F1D3CD5580014B822 /* numpad_star_over~ipad@2x.png */; }; - 633FEEFA1D3CD55A0014B822 /* numpad_star~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED401D3CD5580014B822 /* numpad_star~ipad.png */; }; - 633FEEFB1D3CD55A0014B822 /* numpad_star~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED411D3CD5580014B822 /* numpad_star~ipad@2x.png */; }; - 633FEEFC1D3CD55A0014B822 /* options_add_call_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED421D3CD5580014B822 /* options_add_call_default.png */; }; - 633FEEFD1D3CD55A0014B822 /* options_add_call_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED431D3CD5580014B822 /* options_add_call_default@2x.png */; }; - 633FEEFE1D3CD55A0014B822 /* options_add_call_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED441D3CD5580014B822 /* options_add_call_disabled.png */; }; - 633FEEFF1D3CD55A0014B822 /* options_add_call_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED451D3CD5580014B822 /* options_add_call_disabled@2x.png */; }; - 633FEF001D3CD55A0014B822 /* options_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED461D3CD5580014B822 /* options_default.png */; }; - 633FEF011D3CD55A0014B822 /* options_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED471D3CD5580014B822 /* options_default@2x.png */; }; - 633FEF021D3CD55A0014B822 /* options_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED481D3CD5580014B822 /* options_disabled.png */; }; - 633FEF031D3CD55A0014B822 /* options_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED491D3CD5580014B822 /* options_disabled@2x.png */; }; - 633FEF041D3CD55A0014B822 /* options_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED4A1D3CD5580014B822 /* options_selected.png */; }; - 633FEF051D3CD55A0014B822 /* options_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED4B1D3CD5580014B822 /* options_selected@2x.png */; }; - 633FEF061D3CD55A0014B822 /* options_start_conference_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED4C1D3CD5580014B822 /* options_start_conference_default.png */; }; - 633FEF071D3CD55A0014B822 /* options_start_conference_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED4D1D3CD5580014B822 /* options_start_conference_default@2x.png */; }; - 633FEF081D3CD55A0014B822 /* options_start_conference_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED4E1D3CD5580014B822 /* options_start_conference_disabled.png */; }; - 633FEF091D3CD55A0014B822 /* options_start_conference_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED4F1D3CD5580014B822 /* options_start_conference_disabled@2x.png */; }; - 633FEF0A1D3CD55A0014B822 /* options_transfer_call_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED501D3CD5580014B822 /* options_transfer_call_default.png */; }; - 633FEF0B1D3CD55A0014B822 /* options_transfer_call_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED511D3CD5580014B822 /* options_transfer_call_default@2x.png */; }; - 633FEF0C1D3CD55A0014B822 /* options_transfer_call_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED521D3CD5580014B822 /* options_transfer_call_disabled.png */; }; - 633FEF0D1D3CD55A0014B822 /* options_transfer_call_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED531D3CD5580014B822 /* options_transfer_call_disabled@2x.png */; }; - 633FEF0E1D3CD55A0014B822 /* pause_big_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED541D3CD5580014B822 /* pause_big_default.png */; }; - 633FEF0F1D3CD55A0014B822 /* pause_big_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED551D3CD5580014B822 /* pause_big_default@2x.png */; }; - 633FEF101D3CD55A0014B822 /* pause_big_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED561D3CD5580014B822 /* pause_big_disabled.png */; }; - 633FEF111D3CD55A0014B822 /* pause_big_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED571D3CD5580014B822 /* pause_big_disabled@2x.png */; }; - 633FEF121D3CD55A0014B822 /* pause_big_over_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED581D3CD5580014B822 /* pause_big_over_selected.png */; }; - 633FEF131D3CD55A0014B822 /* pause_big_over_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED591D3CD5580014B822 /* pause_big_over_selected@2x.png */; }; - 633FEF141D3CD55A0014B822 /* pause_small_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED5A1D3CD5580014B822 /* pause_small_default.png */; }; - 633FEF151D3CD55A0014B822 /* pause_small_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED5B1D3CD5590014B822 /* pause_small_default@2x.png */; }; - 633FEF161D3CD55A0014B822 /* pause_small_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED5C1D3CD5590014B822 /* pause_small_disabled.png */; }; - 633FEF171D3CD55A0014B822 /* pause_small_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED5D1D3CD5590014B822 /* pause_small_disabled@2x.png */; }; - 633FEF181D3CD55A0014B822 /* pause_small_over_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED5E1D3CD5590014B822 /* pause_small_over_selected.png */; }; - 633FEF191D3CD55A0014B822 /* pause_small_over_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED5F1D3CD5590014B822 /* pause_small_over_selected@2x.png */; }; - 633FEF1A1D3CD55A0014B822 /* presence_away.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED601D3CD5590014B822 /* presence_away.png */; }; - 633FEF1B1D3CD55A0014B822 /* presence_away@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED611D3CD5590014B822 /* presence_away@2x.png */; }; - 633FEF1C1D3CD55A0014B822 /* presence_offline.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED621D3CD5590014B822 /* presence_offline.png */; }; - 633FEF1D1D3CD55A0014B822 /* presence_offline@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED631D3CD5590014B822 /* presence_offline@2x.png */; }; - 633FEF1E1D3CD55A0014B822 /* presence_online.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED641D3CD5590014B822 /* presence_online.png */; }; - 633FEF1F1D3CD55A0014B822 /* presence_online@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED651D3CD5590014B822 /* presence_online@2x.png */; }; - 633FEF201D3CD55A0014B822 /* presence_unregistered.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED661D3CD5590014B822 /* presence_unregistered.png */; }; - 633FEF211D3CD55A0014B822 /* presence_unregistered@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED671D3CD5590014B822 /* presence_unregistered@2x.png */; }; - 633FEF221D3CD55A0014B822 /* route_bluetooth_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED681D3CD5590014B822 /* route_bluetooth_default.png */; }; - 633FEF231D3CD55A0014B822 /* route_bluetooth_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED691D3CD5590014B822 /* route_bluetooth_default@2x.png */; }; - 633FEF241D3CD55A0014B822 /* route_bluetooth_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED6A1D3CD5590014B822 /* route_bluetooth_disabled.png */; }; - 633FEF251D3CD55A0014B822 /* route_bluetooth_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED6B1D3CD5590014B822 /* route_bluetooth_disabled@2x.png */; }; - 633FEF261D3CD55A0014B822 /* route_bluetooth_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED6C1D3CD5590014B822 /* route_bluetooth_selected.png */; }; - 633FEF271D3CD55A0014B822 /* route_bluetooth_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED6D1D3CD5590014B822 /* route_bluetooth_selected@2x.png */; }; - 633FEF281D3CD55A0014B822 /* route_earpiece_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED6E1D3CD5590014B822 /* route_earpiece_default.png */; }; - 633FEF291D3CD55A0014B822 /* route_earpiece_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED6F1D3CD5590014B822 /* route_earpiece_default@2x.png */; }; - 633FEF2A1D3CD55A0014B822 /* route_earpiece_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED701D3CD5590014B822 /* route_earpiece_disabled.png */; }; - 633FEF2B1D3CD55A0014B822 /* route_earpiece_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED711D3CD5590014B822 /* route_earpiece_disabled@2x.png */; }; - 633FEF2C1D3CD55A0014B822 /* route_earpiece_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED721D3CD5590014B822 /* route_earpiece_selected.png */; }; - 633FEF2D1D3CD55A0014B822 /* route_earpiece_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED731D3CD5590014B822 /* route_earpiece_selected@2x.png */; }; - 633FEF2E1D3CD55A0014B822 /* route_speaker_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED741D3CD5590014B822 /* route_speaker_default.png */; }; - 633FEF2F1D3CD55A0014B822 /* route_speaker_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED751D3CD5590014B822 /* route_speaker_default@2x.png */; }; - 633FEF301D3CD55A0014B822 /* route_speaker_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED761D3CD5590014B822 /* route_speaker_disabled.png */; }; - 633FEF311D3CD55A0014B822 /* route_speaker_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED771D3CD5590014B822 /* route_speaker_disabled@2x.png */; }; - 633FEF321D3CD55A0014B822 /* route_speaker_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED781D3CD5590014B822 /* route_speaker_selected.png */; }; - 633FEF331D3CD55A0014B822 /* route_speaker_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED791D3CD5590014B822 /* route_speaker_selected@2x.png */; }; - 633FEF341D3CD55A0014B822 /* routes_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED7A1D3CD5590014B822 /* routes_default.png */; }; - 633FEF351D3CD55A0014B822 /* routes_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED7B1D3CD5590014B822 /* routes_default@2x.png */; }; - 633FEF361D3CD55A0014B822 /* routes_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED7C1D3CD5590014B822 /* routes_disabled.png */; }; - 633FEF371D3CD55A0014B822 /* routes_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED7D1D3CD5590014B822 /* routes_disabled@2x.png */; }; - 633FEF381D3CD55A0014B822 /* routes_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED7E1D3CD5590014B822 /* routes_selected.png */; }; - 633FEF391D3CD55A0014B822 /* routes_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED7F1D3CD5590014B822 /* routes_selected@2x.png */; }; - 633FEF3A1D3CD55A0014B822 /* security_ko.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED801D3CD5590014B822 /* security_ko.png */; }; - 633FEF3B1D3CD55A0014B822 /* security_ko@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED811D3CD5590014B822 /* security_ko@2x.png */; }; - 633FEF3C1D3CD55A0014B822 /* security_ok.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED821D3CD5590014B822 /* security_ok.png */; }; - 633FEF3D1D3CD55A0014B822 /* security_ok@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED831D3CD5590014B822 /* security_ok@2x.png */; }; - 633FEF3E1D3CD55A0014B822 /* security_pending.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED841D3CD5590014B822 /* security_pending.png */; }; - 633FEF3F1D3CD55A0014B822 /* security_pending@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED851D3CD5590014B822 /* security_pending@2x.png */; }; - 633FEF401D3CD55A0014B822 /* select_all_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED861D3CD5590014B822 /* select_all_default.png */; }; - 633FEF411D3CD55A0014B822 /* select_all_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED871D3CD5590014B822 /* select_all_default@2x.png */; }; - 633FEF421D3CD55A0014B822 /* select_all_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED881D3CD5590014B822 /* select_all_disabled.png */; }; - 633FEF431D3CD55A0014B822 /* select_all_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED891D3CD5590014B822 /* select_all_disabled@2x.png */; }; - 633FEF441D3CD55A0014B822 /* speaker_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED8A1D3CD5590014B822 /* speaker_default.png */; }; - 633FEF451D3CD55A0014B822 /* speaker_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED8B1D3CD5590014B822 /* speaker_default@2x.png */; }; - 633FEF461D3CD55A0014B822 /* speaker_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED8C1D3CD5590014B822 /* speaker_disabled.png */; }; - 633FEF471D3CD55A0014B822 /* speaker_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED8D1D3CD5590014B822 /* speaker_disabled@2x.png */; }; - 633FEF481D3CD55A0014B822 /* speaker_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED8E1D3CD5590014B822 /* speaker_selected.png */; }; - 633FEF491D3CD55A0014B822 /* speaker_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED8F1D3CD5590014B822 /* speaker_selected@2x.png */; }; - 633FEF4E1D3CD55A0014B822 /* valid_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED941D3CD5590014B822 /* valid_default.png */; }; - 633FEF4F1D3CD55A0014B822 /* valid_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED951D3CD5590014B822 /* valid_default@2x.png */; }; - 633FEF501D3CD55A0014B822 /* valid_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED961D3CD5590014B822 /* valid_disabled.png */; }; - 633FEF511D3CD55A0014B822 /* valid_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED971D3CD5590014B822 /* valid_disabled@2x.png */; }; - 633FEF521D3CD55A0014B822 /* voicemail.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED981D3CD5590014B822 /* voicemail.png */; }; - 633FEF531D3CD55A0014B822 /* voicemail@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED991D3CD5590014B822 /* voicemail@2x.png */; }; - 633FEF541D3CD55A0014B822 /* waiting_time.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED9A1D3CD5590014B822 /* waiting_time.png */; }; - 633FEF551D3CD55A0014B822 /* waiting_time@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED9B1D3CD5590014B822 /* waiting_time@2x.png */; }; - 633FEF581D3CD5E00014B822 /* UIAvatarPresence.m in Sources */ = {isa = PBXBuildFile; fileRef = 633FEF571D3CD5E00014B822 /* UIAvatarPresence.m */; }; - 6341807C1BBC103100F71761 /* ChatConversationCreateTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6341807B1BBC103100F71761 /* ChatConversationCreateTableView.m */; }; - 63423C0A1C4501D000D9A050 /* Contact.m in Sources */ = {isa = PBXBuildFile; fileRef = 63423C091C4501D000D9A050 /* Contact.m */; }; - 634610061B61330300548952 /* UILabel+Boldify.m in Sources */ = {isa = PBXBuildFile; fileRef = 634610051B61330300548952 /* UILabel+Boldify.m */; }; - 635173F91BA082A40095EB0A /* UIChatBubblePhotoCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 635173F81BA082A40095EB0A /* UIChatBubblePhotoCell.m */; }; - 635775251B6673EC00C8B704 /* HistoryDetailsTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 635775241B6673EC00C8B704 /* HistoryDetailsTableView.m */; }; - 636316D11A1DEBCB0009B839 /* AboutView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 636316D31A1DEBCB0009B839 /* AboutView.xib */; }; - 636316D41A1DEC650009B839 /* SettingsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 636316D61A1DEC650009B839 /* SettingsView.xib */; }; - 636BC9971B5F921B00C754CE /* UIIconButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 636BC9961B5F921B00C754CE /* UIIconButton.m */; }; - 63701DDF1BA32039006A9AE3 /* UIConfirmationDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = 63701DDE1BA32039006A9AE3 /* UIConfirmationDialog.m */; }; - 637157A11B283FE200C91677 /* FileTransferDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 637157A01B283FE200C91677 /* FileTransferDelegate.m */; }; - 6377AC801BDE4069007F7625 /* UIBackToCallButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 6377AC7F1BDE4069007F7625 /* UIBackToCallButton.m */; }; - 6381DA7D1C1AD5EA00DF3BBD /* UIBouncingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6381DA7C1C1AD5EA00DF3BBD /* UIBouncingView.m */; }; - 638F1A621C2021B2004B8E02 /* DialerView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 638F1A601C2021B2004B8E02 /* DialerView~ipad.xib */; }; - 638F1A911C21993D004B8E02 /* UICompositeView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 638F1A8F1C21993D004B8E02 /* UICompositeView~ipad.xib */; }; - 639CEAFD1A1DF4D9004DE38F /* StatusBarView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639CEAFF1A1DF4D9004DE38F /* StatusBarView.xib */; }; - 639CEB001A1DF4E4004DE38F /* UIHistoryCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639CEB021A1DF4E4004DE38F /* UIHistoryCell.xib */; }; - 639CEB031A1DF4EB004DE38F /* UICompositeView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639CEB051A1DF4EB004DE38F /* UICompositeView.xib */; }; - 639CEB091A1DF4FA004DE38F /* UIChatCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639CEB0B1A1DF4FA004DE38F /* UIChatCell.xib */; }; - 639E9C801C0DB13D00019A75 /* UICheckBoxTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 639E9C7F1C0DB13D00019A75 /* UICheckBoxTableView.m */; }; - 639E9C931C0DB7BE00019A75 /* FirstLoginView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639E9C951C0DB7BE00019A75 /* FirstLoginView.xib */; }; - 639E9CA01C0DB7E500019A75 /* UIChatBubblePhotoCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639E9CA21C0DB7E500019A75 /* UIChatBubblePhotoCell.xib */; }; - 639E9CA31C0DB7EA00019A75 /* UIChatBubbleTextCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639E9CA51C0DB7EA00019A75 /* UIChatBubbleTextCell.xib */; }; - 639E9CA61C0DB7F200019A75 /* UIChatCreateCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639E9CA81C0DB7F200019A75 /* UIChatCreateCell.xib */; }; - 639E9CA91C0DB7FB00019A75 /* UIConfirmationDialog.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639E9CAB1C0DB7FB00019A75 /* UIConfirmationDialog.xib */; }; - 639E9CAC1C0DB80300019A75 /* UIContactDetailsCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639E9CAE1C0DB80300019A75 /* UIContactDetailsCell.xib */; }; - 639E9CB01C0DB83000019A75 /* SideMenuView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639E9CB21C0DB83000019A75 /* SideMenuView.xib */; }; - 639E9CB51C0DB88200019A75 /* PhoneMainView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639E9CB31C0DB88200019A75 /* PhoneMainView.xib */; }; - 63AADBE81B6A0FF200AA16FD /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBC41B6A0FF200AA16FD /* Localizable.strings */; }; - 63AADBEA1B6A0FF200AA16FD /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBCA1B6A0FF200AA16FD /* Images.xcassets */; }; - 63AADBF51B6A0FF200AA16FD /* linphonerc in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBD71B6A0FF200AA16FD /* linphonerc */; }; - 63AADBF61B6A0FF200AA16FD /* linphonerc-factory in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBD81B6A0FF200AA16FD /* linphonerc-factory */; }; - 63AADBF81B6A0FF200AA16FD /* linphonerc~ipad in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBDA1B6A0FF200AA16FD /* linphonerc~ipad */; }; - 63AADBFF1B6A0FF200AA16FD /* assistant_external_sip.rc in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBE31B6A0FF200AA16FD /* assistant_external_sip.rc */; }; - 63AADC001B6A0FF200AA16FD /* assistant_linphone_create.rc in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBE41B6A0FF200AA16FD /* assistant_linphone_create.rc */; }; - 63AADC011B6A0FF200AA16FD /* assistant_linphone_existing.rc in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBE51B6A0FF200AA16FD /* assistant_linphone_existing.rc */; }; - 63AADC021B6A0FF200AA16FD /* assistant_remote.rc in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBE61B6A0FF200AA16FD /* assistant_remote.rc */; }; - 63B81A0C1B57DA33009604A6 /* LICENSE.txt in Resources */ = {isa = PBXBuildFile; fileRef = 63B81A031B57DA33009604A6 /* LICENSE.txt */; }; - 63B81A0D1B57DA33009604A6 /* TPKeyboardAvoidingCollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B81A051B57DA33009604A6 /* TPKeyboardAvoidingCollectionView.m */; }; - 63B81A0E1B57DA33009604A6 /* TPKeyboardAvoidingScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B81A071B57DA33009604A6 /* TPKeyboardAvoidingScrollView.m */; }; - 63B81A0F1B57DA33009604A6 /* TPKeyboardAvoidingTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B81A091B57DA33009604A6 /* TPKeyboardAvoidingTableView.m */; }; - 63B81A101B57DA33009604A6 /* UIScrollView+TPKeyboardAvoidingAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B81A0B1B57DA33009604A6 /* UIScrollView+TPKeyboardAvoidingAdditions.m */; }; - 63B8D68C1BCBE65600C12B09 /* ChatConversationCreateView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 63B8D68E1BCBE65600C12B09 /* ChatConversationCreateView.xib */; }; - 63B8D6A21BCBF43100C12B09 /* UIChatCreateCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B8D6A01BCBF43100C12B09 /* UIChatCreateCell.m */; }; - 63BE7A781D75BDF6000990EF /* ShopTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 63BE7A771D75BDF6000990EF /* ShopTableView.m */; }; - 63C441C31BBC23ED0053DC5E /* UIAssistantTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 63C441C21BBC23ED0053DC5E /* UIAssistantTextField.m */; }; - 63CD4B4F1A5AAC8C00B84282 /* DTAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 63CD4B4E1A5AAC8C00B84282 /* DTAlertView.m */; }; - 63CDC45E1C3BDE370085F529 /* msg.caf in Resources */ = {isa = PBXBuildFile; fileRef = 63CDC4531C3BDE370085F529 /* msg.caf */; }; - 63CDC45F1C3BDE370085F529 /* ringback.wav in Resources */ = {isa = PBXBuildFile; fileRef = 63CDC4541C3BDE370085F529 /* ringback.wav */; }; - 63CDC4661C3BDE370085F529 /* shortring.caf in Resources */ = {isa = PBXBuildFile; fileRef = 63CDC45C1C3BDE370085F529 /* shortring.caf */; }; - 63CE58401C85EBF400304800 /* VideoToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63CE583F1C85EBF400304800 /* VideoToolbox.framework */; }; - 63D11C531C3D501200E8FCEE /* Log.m in Sources */ = {isa = PBXBuildFile; fileRef = 63D11C521C3D501200E8FCEE /* Log.m */; }; - 63DFE04B1C40161700DA5E87 /* notes_of_the_optimistic.caf in Resources */ = {isa = PBXBuildFile; fileRef = 63DFE0451C40161700DA5E87 /* notes_of_the_optimistic.caf */; }; - 63E27A321C4FECD000D332AE /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 63E27A311C4FECD000D332AE /* LaunchScreen.xib */; }; - 63E27A521C50EDB000D332AE /* hold.mkv in Resources */ = {isa = PBXBuildFile; fileRef = 63E27A511C50EB2700D332AE /* hold.mkv */; }; - 63E59A3F1ADE70D900646FB3 /* InAppProductsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 63E59A3E1ADE70D900646FB3 /* InAppProductsManager.m */; }; - 63E802DB1C625AEF000D5509 /* (null) in Resources */ = {isa = PBXBuildFile; }; - 63EC8D391D7438660066547B /* AssistantLinkView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 63EC8D3B1D7438660066547B /* AssistantLinkView.xib */; }; - 63F1DF441BCE618E00EDED90 /* UIAddressTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 63F1DF431BCE618E00EDED90 /* UIAddressTextField.m */; }; - 63FB30351A680E73008CA393 /* UIRoundedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 63FB30341A680E73008CA393 /* UIRoundedImageView.m */; }; - 662553B427EDFB35007F67D8 /* MagicSearch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 662553B327EDFB35007F67D8 /* MagicSearch.swift */; }; - 662B73332A73C331002135F3 /* CopyableLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 662B73322A73C331002135F3 /* CopyableLabel.swift */; }; - 662F56FE28C00DF300E851BF /* UITestsUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 662F13B52887E8A10084C28C /* UITestsUtils.swift */; }; - 662F56FF28C0A9FE00E851BF /* IncomingOutgoingCallViewUITestsMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6643AD54287F25A500701703 /* IncomingOutgoingCallViewUITestsMethods.swift */; }; - 662F570028C0AA0800E851BF /* UITestsCoreManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6643AD51287EF56200701703 /* UITestsCoreManager.swift */; }; - 662F570228C2506600E851BF /* OutgoingCallUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663B06592886B54F00E41889 /* OutgoingCallUITests.swift */; }; - 66305A5B28B9105D00838792 /* UITestsScreenshots.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66689D3F28A2443A0054E633 /* UITestsScreenshots.swift */; }; - 6637AF90288593AF00965733 /* IncomingCallUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6637AF8F288593AF00965733 /* IncomingCallUITests.swift */; }; - 6643501C28D1CD3300AEA777 /* UIColorExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71BE285A24B10066163B /* UIColorExtensions.swift */; }; - 66631CE728D37A2400115E36 /* ExtraMenuUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663B06652886F0DB00E41889 /* ExtraMenuUITests.swift */; }; - 66631CE828D37AA300115E36 /* ExtraMenuActiveCallActionsUITestsMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663B06672886F16300E41889 /* ExtraMenuActiveCallActionsUITestsMethods.swift */; }; - 667A423C293A4BAD00C4306C /* post_quantum_secure@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 667A423B293A4BAD00C4306C /* post_quantum_secure@3x.png */; }; - 6693A1D328D0FCE400489A39 /* ActiveCallUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663B065F2886E38100E41889 /* ActiveCallUITests.swift */; }; - 6693A1D428D0FCE900489A39 /* ActiveCallViewUITestsMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663B065B2886DA8500E41889 /* ActiveCallViewUITestsMethods.swift */; }; - 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 */; }; - 66E399F72857869300E73456 /* menu_notifications_off.png in Resources */ = {isa = PBXBuildFile; fileRef = 66E399F52857869200E73456 /* menu_notifications_off.png */; }; - 66E399F82857869300E73456 /* menu_notifications_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 66E399F62857869200E73456 /* menu_notifications_on.png */; }; - 70E542F313E147E3002BA2C0 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F213E147E3002BA2C0 /* OpenGLES.framework */; }; - 70E542F513E147EB002BA2C0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F413E147EB002BA2C0 /* QuartzCore.framework */; }; - 8C2595DF1DEDCC8E007A6424 /* CallKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C2595DE1DEDCC8E007A6424 /* CallKit.framework */; }; - 8C2A81951F87B8000012A66B /* chat_group_avatar@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C2A81931F87B7FF0012A66B /* chat_group_avatar@2x.png */; }; - 8C2A81961F87B8000012A66B /* chat_group_avatar.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C2A81941F87B8000012A66B /* chat_group_avatar.png */; }; - 8C300D9A1E40E0CC00728EF3 /* lime_ko.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C300D981E40E0CC00728EF3 /* lime_ko.png */; }; - 8C300D9B1E40E0CC00728EF3 /* lime_ko@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C300D991E40E0CC00728EF3 /* lime_ko@2x.png */; }; - 8C73477C1D9BA3A00022EE8C /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C73477B1D9BA3A00022EE8C /* UserNotifications.framework */; }; - 8C92ABE81FA773190006FB5D /* UIChatNotifiedEventCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8C92ABE71FA773190006FB5D /* UIChatNotifiedEventCell.xib */; }; - 8C92ABF31FA773E50006FB5D /* UIChatNotifiedEventCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C92ABF21FA773E50006FB5D /* UIChatNotifiedEventCell.m */; }; - 8C9C5E0D1F83B2EF006987FA /* ChatConversationCreateCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C9C5E0C1F83B2EF006987FA /* ChatConversationCreateCollectionViewController.m */; }; - 8C9C5E111F83BD97006987FA /* UIChatCreateCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C9C5E0F1F83BD97006987FA /* UIChatCreateCollectionViewCell.m */; }; - 8CA2004C1D8158440095F859 /* PushKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8CA2004B1D8158440095F859 /* PushKit.framework */; }; - 8CA70AD11F9E0AE100A3D2EB /* ChatConversationInfoView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CA70AD01F9E0AE100A3D2EB /* ChatConversationInfoView.m */; }; - 8CA70AD41F9E285C00A3D2EB /* chat_group_add@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CA70AD21F9E285B00A3D2EB /* chat_group_add@2x.png */; }; - 8CA70AD51F9E285C00A3D2EB /* chat_group_add.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CA70AD31F9E285B00A3D2EB /* chat_group_add.png */; }; - 8CA70AE41F9E39E400A3D2EB /* UIChatConversationInfoTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CA70AE21F9E39E400A3D2EB /* UIChatConversationInfoTableViewCell.m */; }; - 8CB2B8F91F86229E0015CEE2 /* chat_secure.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CB2B8F61F86229B0015CEE2 /* chat_secure.png */; }; - 8CB2B8FA1F86229E0015CEE2 /* next_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CB2B8F71F86229C0015CEE2 /* next_disabled.png */; }; - 8CB2B8FB1F86229E0015CEE2 /* next_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CB2B8F81F86229D0015CEE2 /* next_disabled@2x.png */; }; - 8CBD7BA020B6B7FD00E5DCC0 /* ChatConversationInfoView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8CBD7BA220B6B7FD00E5DCC0 /* ChatConversationInfoView.xib */; }; - 8CBD7BA320B6B80D00E5DCC0 /* ChatConversationImdnView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8CBD7BA520B6B80D00E5DCC0 /* ChatConversationImdnView.xib */; }; - 8CBD7BA620B6B82400E5DCC0 /* UIChatConversationInfoTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8CBD7BA820B6B82400E5DCC0 /* UIChatConversationInfoTableViewCell.xib */; }; - 8CBD7BA920B6B82A00E5DCC0 /* UIChatConversationImdnTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8CBD7BAB20B6B82A00E5DCC0 /* UIChatConversationImdnTableViewCell.xib */; }; - 8CD99A1C20908C27008A7CDA /* callkit_logo@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD99A1B20908C27008A7CDA /* callkit_logo@2x.png */; }; - 8CD99A372090A824008A7CDA /* splashscreen@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD99A352090A823008A7CDA /* splashscreen@2x.png */; }; - 8CD99A382090A824008A7CDA /* splashscreen.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD99A362090A824008A7CDA /* splashscreen.png */; }; - 8CD99A3C2090B9FA008A7CDA /* ChatConversationImdnView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD99A3B2090B9FA008A7CDA /* ChatConversationImdnView.m */; }; - 8CD99A422090CE6F008A7CDA /* UIChatConversationImdnTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD99A412090CE6F008A7CDA /* UIChatConversationImdnTableViewCell.m */; }; - 8CDC61951F84D89B0087CF7F /* check_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CDC618C1F84D89B0087CF7F /* check_selected.png */; }; - 8CDC61971F84D9270087CF7F /* check_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CDC61961F84D9270087CF7F /* check_selected@2x.png */; }; - 8CE24F4B1F8234A30077AC0A /* next_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CE24F491F8234A20077AC0A /* next_default.png */; }; - 8CE24F4C1F8234A30077AC0A /* next_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CE24F4A1F8234A30077AC0A /* next_default@2x.png */; }; - 8CE24F571F8268850077AC0A /* conference_delete.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CE24F551F8268840077AC0A /* conference_delete.png */; }; - 8CE24F581F8268850077AC0A /* conference_delete@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CE24F561F8268840077AC0A /* conference_delete@2x.png */; }; - 8CF25D951F9F336100BEA0C1 /* check_unselected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CF25D8B1F9F336000BEA0C1 /* check_unselected@2x.png */; }; - 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 */; }; - 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 */; }; - C622E3EF26A81290004F5434 /* vr_stop.png in Resources */ = {isa = PBXBuildFile; fileRef = C622E3E926A8128F004F5434 /* vr_stop.png */; }; - C622E3F026A81290004F5434 /* vr_wave.png in Resources */ = {isa = PBXBuildFile; fileRef = C622E3EA26A8128F004F5434 /* vr_wave.png */; }; - C622E3F126A81290004F5434 /* vr_on.png in Resources */ = {isa = PBXBuildFile; fileRef = C622E3EB26A8128F004F5434 /* vr_on.png */; }; - C622E3F226A81290004F5434 /* vr_off.png in Resources */ = {isa = PBXBuildFile; fileRef = C622E3EC26A8128F004F5434 /* vr_off.png */; }; - C622E3F326A81290004F5434 /* vr_pause.png in Resources */ = {isa = PBXBuildFile; fileRef = C622E3ED26A8128F004F5434 /* vr_pause.png */; }; - C622E3F426A81290004F5434 /* vr_play.png in Resources */ = {isa = PBXBuildFile; fileRef = C622E3EE26A81290004F5434 /* vr_play.png */; }; - C63D2F1529029536008F0F66 /* FileUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63D2F1429029536008F0F66 /* FileUtil.swift */; }; - C63F720D285A24B10066163B /* ConfigManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7197285A24B10066163B /* ConfigManager.swift */; }; - C63F720E285A24B10066163B /* CallManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7198285A24B10066163B /* CallManager.swift */; }; - C63F720F285A24B10066163B /* ConferenceWaitingRoomViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F719B285A24B10066163B /* ConferenceWaitingRoomViewModel.swift */; }; - C63F7210285A24B10066163B /* ConferenceSchedulingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F719C285A24B10066163B /* ConferenceSchedulingViewModel.swift */; }; - C63F7211285A24B10066163B /* ScheduledConferencesViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F719D285A24B10066163B /* ScheduledConferencesViewModel.swift */; }; - C63F7212285A24B10066163B /* ScheduledConferenceData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F719F285A24B10066163B /* ScheduledConferenceData.swift */; }; - C63F7213285A24B10066163B /* TimeZoneData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71A0285A24B10066163B /* TimeZoneData.swift */; }; - C63F7214285A24B10066163B /* Duration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71A1285A24B10066163B /* Duration.swift */; }; - C63F7215285A24B10066163B /* ConferenceWaitingRoomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71A3285A24B10066163B /* ConferenceWaitingRoomView.swift */; }; - C63F7216285A24B10066163B /* ScheduledConferencesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71A4285A24B10066163B /* ScheduledConferencesView.swift */; }; - C63F7217285A24B10066163B /* ICSBubbleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71A5285A24B10066163B /* ICSBubbleView.swift */; }; - C63F7218285A24B10066163B /* ScheduledConferencesCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71A6285A24B10066163B /* ScheduledConferencesCell.swift */; }; - C63F7219285A24B10066163B /* ConferenceHistoryDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71A7285A24B10066163B /* ConferenceHistoryDetailsView.swift */; }; - C63F721A285A24B10066163B /* ConferenceSchedulingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71A8285A24B10066163B /* ConferenceSchedulingView.swift */; }; - C63F721B285A24B10066163B /* ConferenceSchedulingSummaryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71A9285A24B10066163B /* ConferenceSchedulingSummaryView.swift */; }; - C63F721C285A24B10066163B /* MediatorLiveData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71AC285A24B10066163B /* MediatorLiveData.swift */; }; - C63F721D285A24B10066163B /* MutableLiveData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71AD285A24B10066163B /* MutableLiveData.swift */; }; - C63F721E285A24B10066163B /* Pair.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71AE285A24B10066163B /* Pair.swift */; }; - C63F721F285A24B10066163B /* BackNextNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71AF285A24B10066163B /* BackNextNavigationView.swift */; }; - C63F7220285A24B10066163B /* TimestampUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71B0285A24B10066163B /* TimestampUtils.swift */; }; - C63F7221285A24B10066163B /* AppManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71B1285A24B10066163B /* AppManager.swift */; }; - C63F7222285A24B10066163B /* UIApplication+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71B4285A24B10066163B /* UIApplication+Extension.swift */; }; - C63F7224285A24B10066163B /* UIVIewControllerExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71B6285A24B10066163B /* UIVIewControllerExtensions.swift */; }; - C63F7225285A24B10066163B /* UIImageExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71B7285A24B10066163B /* UIImageExtensions.swift */; }; - C63F7226285A24B10066163B /* UIVIewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71B8285A24B10066163B /* UIVIewExtensions.swift */; }; - C63F7227285A24B10066163B /* UILabelExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71B9285A24B10066163B /* UILabelExtensions.swift */; }; - C63F7228285A24B10066163B /* OptionalExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71BA285A24B10066163B /* OptionalExtensions.swift */; }; - C63F7229285A24B10066163B /* UIButtonExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71BB285A24B10066163B /* UIButtonExtensions.swift */; }; - C63F722A285A24B10066163B /* UIImageViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71BC285A24B10066163B /* UIImageViewExtensions.swift */; }; - C63F722B285A24B10066163B /* UIDeviceExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71BD285A24B10066163B /* UIDeviceExtensions.swift */; }; - C63F722C285A24B10066163B /* UIColorExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71BE285A24B10066163B /* UIColorExtensions.swift */; }; - C63F722D285A24B10066163B /* CoreExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71C0285A24B10066163B /* CoreExtensions.swift */; }; - C63F722E285A24B10066163B /* IceState.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71C1285A24B10066163B /* IceState.swift */; }; - C63F722F285A24B10066163B /* AddressExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71C2285A24B10066163B /* AddressExtensions.swift */; }; - C63F7230285A24B10066163B /* ParticipantExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71C3285A24B10066163B /* ParticipantExtensions.swift */; }; - C63F7231285A24B10066163B /* PayloadType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71C4285A24B10066163B /* PayloadType.swift */; }; - C63F7232285A24B10066163B /* CallExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71C5285A24B10066163B /* CallExtensions.swift */; }; - C63F7233285A24B10066163B /* ConferenceExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71C6285A24B10066163B /* ConferenceExtensions.swift */; }; - C63F7234285A24B10066163B /* ConferenceViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71C9285A24B10066163B /* ConferenceViewModel.swift */; }; - C63F7235285A24B10066163B /* CallsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71CA285A24B10066163B /* CallsViewModel.swift */; }; - C63F7236285A24B10066163B /* ControlsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71CB285A24B10066163B /* ControlsViewModel.swift */; }; - C63F7237285A24B10066163B /* CallStatisticsData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71CC285A24B10066163B /* CallStatisticsData.swift */; }; - C63F7238285A24B10066163B /* ConferenceParticipantData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71CD285A24B10066163B /* ConferenceParticipantData.swift */; }; - C63F7239285A24B10066163B /* ConferenceParticipantDeviceData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71CE285A24B10066163B /* ConferenceParticipantDeviceData.swift */; }; - C63F723A285A24B10066163B /* CallData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71CF285A24B10066163B /* CallData.swift */; }; - C63F723B285A24B10066163B /* AudioRouteUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71D0285A24B10066163B /* AudioRouteUtils.swift */; }; - C63F723C285A24B10066163B /* LightDarkColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71D2285A24B10066163B /* LightDarkColor.swift */; }; - C63F723D285A24B10066163B /* TextStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71D3285A24B10066163B /* TextStyle.swift */; }; - C63F723E285A24B10066163B /* VoipTexts.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71D4285A24B10066163B /* VoipTexts.swift */; }; - C63F723F285A24B10066163B /* ButtonTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71D5285A24B10066163B /* ButtonTheme.swift */; }; - C63F7240285A24B10066163B /* VoipTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71D6285A24B10066163B /* VoipTheme.swift */; }; - C63F7241285A24B10066163B /* ParticipantsListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71DA285A24B10066163B /* ParticipantsListView.swift */; }; - C63F7242285A24B10066163B /* VoipParticipantCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71DB285A24B10066163B /* VoipParticipantCell.swift */; }; - C63F7243285A24B10066163B /* AudioRoutesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71DC285A24B10066163B /* AudioRoutesView.swift */; }; - C63F7244285A24B10066163B /* VoipActiveSpeakerParticipantCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71DE285A24B10066163B /* VoipActiveSpeakerParticipantCell.swift */; }; - C63F7245285A24B10066163B /* VoipConferenceAudioOnlyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71DF285A24B10066163B /* VoipConferenceAudioOnlyView.swift */; }; - C63F7246285A24B10066163B /* VoipGridParticipantCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71E0285A24B10066163B /* VoipGridParticipantCell.swift */; }; - C63F7247285A24B10066163B /* VoipAudioOnlyParticipantCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71E1285A24B10066163B /* VoipAudioOnlyParticipantCell.swift */; }; - C63F7248285A24B10066163B /* MicMuted.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71E2285A24B10066163B /* MicMuted.swift */; }; - C63F7249285A24B10066163B /* VoipConferenceGridView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71E3285A24B10066163B /* VoipConferenceGridView.swift */; }; - C63F724A285A24B10066163B /* VoipConferenceActiveSpeakerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71E4285A24B10066163B /* VoipConferenceActiveSpeakerView.swift */; }; - C63F724B285A24B10066163B /* VoipConferenceDisplayModeSelectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71E5285A24B10066163B /* VoipConferenceDisplayModeSelectionView.swift */; }; - C63F724C285A24B10066163B /* ActiveCallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71E7285A24B10066163B /* ActiveCallView.swift */; }; - C63F724D285A24B10066163B /* AbstractIncomingOutgoingCallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71E8285A24B10066163B /* AbstractIncomingOutgoingCallView.swift */; }; - C63F724E285A24B10066163B /* PausedCallOrConferenceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71E9285A24B10066163B /* PausedCallOrConferenceView.swift */; }; - C63F724F285A24B10066163B /* LocalVideoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71EA285A24B10066163B /* LocalVideoView.swift */; }; - C63F7250285A24B10066163B /* CallStatsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71EB285A24B10066163B /* CallStatsView.swift */; }; - C63F7251285A24B10066163B /* NumpadView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71EC285A24B10066163B /* NumpadView.swift */; }; - C63F7252285A24B10066163B /* VoipExtraButtonsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71ED285A24B10066163B /* VoipExtraButtonsView.swift */; }; - C63F7253285A24B10066163B /* VoipCallContextMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71EF285A24B10066163B /* VoipCallContextMenu.swift */; }; - C63F7254285A24B10066163B /* CallsListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71F0285A24B10066163B /* CallsListView.swift */; }; - C63F7255285A24B10066163B /* VoipCallCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71F1285A24B10066163B /* VoipCallCell.swift */; }; - C63F7256285A24B10066163B /* DismissableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71F2285A24B10066163B /* DismissableView.swift */; }; - C63F7257285A24B10066163B /* ConferenceLayoutPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71F3285A24B10066163B /* ConferenceLayoutPickerView.swift */; }; - C63F7258285A24B10066163B /* ControlsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71F4285A24B10066163B /* ControlsView.swift */; }; - C63F7259285A24B10066163B /* RemotelyRecording.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71F5285A24B10066163B /* RemotelyRecording.swift */; }; - C63F725A285A24B10066163B /* OutgoingCallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71F7285A24B10066163B /* OutgoingCallView.swift */; }; - C63F725C285A24B10066163B /* IncomingCallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71F9285A24B10066163B /* IncomingCallView.swift */; }; - C63F725D285A24B10066163B /* SharedLayoutConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71FA285A24B10066163B /* SharedLayoutConstants.swift */; }; - C63F725E285A24B10066163B /* VoipDialog.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71FB285A24B10066163B /* VoipDialog.swift */; }; - C63F725F285A24B10066163B /* StyledValuePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71FD285A24B10066163B /* StyledValuePicker.swift */; }; - C63F7260285A24B10066163B /* StyledSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71FE285A24B10066163B /* StyledSwitch.swift */; }; - C63F7261285A24B10066163B /* CallControlButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71FF285A24B10066163B /* CallControlButton.swift */; }; - C63F7262285A24B10066163B /* RotatingSpinner.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7200285A24B10066163B /* RotatingSpinner.swift */; }; - C63F7263285A24B10066163B /* FormButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7201285A24B10066163B /* FormButton.swift */; }; - C63F7264285A24B10066163B /* BouncingCounter.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7202285A24B10066163B /* BouncingCounter.swift */; }; - C63F7265285A24B10066163B /* VoipExtraButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7203285A24B10066163B /* VoipExtraButton.swift */; }; - C63F7266285A24B10066163B /* UICallTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7204285A24B10066163B /* UICallTimer.swift */; }; - C63F7267285A24B10066163B /* StyledCheckBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7205285A24B10066163B /* StyledCheckBox.swift */; }; - C63F7268285A24B10066163B /* Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7206285A24B10066163B /* Avatar.swift */; }; - C63F7269285A24B10066163B /* StyledLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7207285A24B10066163B /* StyledLabel.swift */; }; - C63F726A285A24B10066163B /* StyledDatePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7208285A24B10066163B /* StyledDatePicker.swift */; }; - C63F726B285A24B10066163B /* ButtonWithStateBackgrounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7209285A24B10066163B /* ButtonWithStateBackgrounds.swift */; }; - C63F726C285A24B10066163B /* StyledTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F720A285A24B10066163B /* StyledTextView.swift */; }; - C63F726D285A24B10066163B /* ProviderDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F720B285A24B10066163B /* ProviderDelegate.swift */; }; - C63F726E285A24B10066163B /* VFSUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F720C285A24B10066163B /* VFSUtil.swift */; }; - C63F726F285A24E90066163B /* VFSUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F720C285A24B10066163B /* VFSUtil.swift */; }; - C63F7270285A24E90066163B /* VFSUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F720C285A24B10066163B /* VFSUtil.swift */; }; - C63F72B5285A2F1D0066163B /* voip_dropdown.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7271285A2F140066163B /* voip_dropdown.png */; }; - C63F72B6285A2F1D0066163B /* voip_spinner.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7272285A2F140066163B /* voip_spinner.png */; }; - C63F72B7285A2F1D0066163B /* voip_numpad_7.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7273285A2F140066163B /* voip_numpad_7.png */; }; - C63F72B8285A2F1D0066163B /* voip_radio_off.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7274285A2F150066163B /* voip_radio_off.png */; }; - C63F72B9285A2F1D0066163B /* voip_export.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7275285A2F150066163B /* voip_export.png */; }; - C63F72BA285A2F1D0066163B /* voip_call_numpad.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7276285A2F150066163B /* voip_call_numpad.png */; }; - C63F72BB285A2F1D0066163B /* voip_chat_rooms_list.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7277285A2F150066163B /* voip_chat_rooms_list.png */; }; - C63F72BC285A2F1D0066163B /* voip_numpad_4.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7278285A2F150066163B /* voip_numpad_4.png */; }; - C63F72BD285A2F1D0066163B /* voip_call_header_incoming.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7279285A2F150066163B /* voip_call_header_incoming.png */; }; - C63F72BE285A2F1D0066163B /* voip_calls_list.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F727A285A2F150066163B /* voip_calls_list.png */; }; - C63F72BF285A2F1D0066163B /* voip_call_header_paused.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F727B285A2F160066163B /* voip_call_header_paused.png */; }; - C63F72C0285A2F1D0066163B /* voip_numpad_0.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F727C285A2F160066163B /* voip_numpad_0.png */; }; - C63F72C1285A2F1D0066163B /* voip_numpad_3.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F727D285A2F160066163B /* voip_numpad_3.png */; }; - C63F72C2285A2F1D0066163B /* voip_numpad_9.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F727E285A2F160066163B /* voip_numpad_9.png */; }; - C63F72C3285A2F1D0066163B /* voip_speaker_on.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F727F285A2F160066163B /* voip_speaker_on.png */; }; - C63F72C4285A2F1D0066163B /* voip_audio_routes.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7280285A2F160066163B /* voip_audio_routes.png */; }; - C63F72C5285A2F1E0066163B /* voip_call_record.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7281285A2F160066163B /* voip_call_record.png */; }; - C63F72C6285A2F1E0066163B /* voip_call_forward.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7282285A2F170066163B /* voip_call_forward.png */; }; - C63F72C7285A2F1E0066163B /* voip_change_camera.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7283285A2F170066163B /* voip_change_camera.png */; }; - C63F72C8285A2F1E0066163B /* voip_checkbox_checked.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7284285A2F170066163B /* voip_checkbox_checked.png */; }; - C63F72C9285A2F1E0066163B /* voip_info.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7285285A2F170066163B /* voip_info.png */; }; - C63F72CA285A2F1E0066163B /* voip_speaker_off.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7286285A2F170066163B /* voip_speaker_off.png */; }; - C63F72CB285A2F1E0066163B /* voip_call_more.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7287285A2F170066163B /* voip_call_more.png */; }; - C63F72CC285A2F1E0066163B /* voip_call_stats.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7288285A2F170066163B /* voip_call_stats.png */; }; - C63F72CD285A2F1E0066163B /* voip_numpad_8.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7289285A2F180066163B /* voip_numpad_8.png */; }; - C63F72CE285A2F1E0066163B /* voip_call_add.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F728A285A2F180066163B /* voip_call_add.png */; }; - C63F72CF285A2F1E0066163B /* voip_copy.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F728B285A2F180066163B /* voip_copy.png */; }; - C63F72D0285A2F1E0066163B /* voip_conference_paused_big.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F728C285A2F180066163B /* voip_conference_paused_big.png */; }; - C63F72D1285A2F1E0066163B /* voip_numpad_star.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F728D285A2F180066163B /* voip_numpad_star.png */; }; - C63F72D2285A2F1E0066163B /* voip_numpad_hash.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F728E285A2F180066163B /* voip_numpad_hash.png */; }; - C63F72D3285A2F1E0066163B /* voip_multiple_contacts_avatar.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F728F285A2F180066163B /* voip_multiple_contacts_avatar.png */; }; - C63F72D4285A2F1E0066163B /* voip_remote_recording.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7290285A2F180066163B /* voip_remote_recording.png */; }; - C63F72D5285A2F1E0066163B /* voip_hangup.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7291285A2F190066163B /* voip_hangup.png */; }; - C63F72D6285A2F1E0066163B /* voip_pause.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7292285A2F190066163B /* voip_pause.png */; }; - C63F72D7285A2F1E0066163B /* voip_numpad_1.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7293285A2F190066163B /* voip_numpad_1.png */; }; - C63F72D8285A2F1E0066163B /* voip_mandatory.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7294285A2F190066163B /* voip_mandatory.png */; }; - C63F72D9285A2F1E0066163B /* voip_earpiece.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7295285A2F190066163B /* voip_earpiece.png */; }; - C63F72DA285A2F1E0066163B /* voip_numpad_2.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7296285A2F190066163B /* voip_numpad_2.png */; }; - C63F72DB285A2F1E0066163B /* voip_conference_audio_only.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7297285A2F190066163B /* voip_conference_audio_only.png */; }; - C63F72DC285A2F1E0066163B /* voip_menu_more.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7298285A2F1A0066163B /* voip_menu_more.png */; }; - C63F72DD285A2F1E0066163B /* voip_conference_new.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7299285A2F1A0066163B /* voip_conference_new.png */; }; - C63F72DE285A2F1E0066163B /* voip_call_header_active.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F729A285A2F1A0066163B /* voip_call_header_active.png */; }; - C63F72DF285A2F1E0066163B /* voip_bluetooth.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F729B285A2F1A0066163B /* voip_bluetooth.png */; }; - C63F72E0285A2F1E0066163B /* voip_micro_off.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F729C285A2F1A0066163B /* voip_micro_off.png */; }; - C63F72E1285A2F1E0066163B /* voip_camera_on.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F729D285A2F1A0066163B /* voip_camera_on.png */; }; - C63F72E2285A2F1E0066163B /* voip_conference_play_big.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F729E285A2F1A0066163B /* voip_conference_play_big.png */; }; - C63F72E3285A2F1E0066163B /* voip_call.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F729F285A2F1B0066163B /* voip_call.png */; }; - C63F72E4285A2F1E0066163B /* voip_call_list_menu.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72A0285A2F1B0066163B /* voip_call_list_menu.png */; }; - C63F72E5285A2F1E0066163B /* voip_conference_active_speaker.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72A1285A2F1B0066163B /* voip_conference_active_speaker.png */; }; - C63F72E6285A2F1E0066163B /* voip_numpad_6.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72A2285A2F1B0066163B /* voip_numpad_6.png */; }; - C63F72E7285A2F1E0066163B /* voip_call_participants.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72A3285A2F1B0066163B /* voip_call_participants.png */; }; - C63F72E8285A2F1E0066163B /* conference_schedule_calendar_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72A4285A2F1B0066163B /* conference_schedule_calendar_default.png */; }; - C63F72E9285A2F1E0066163B /* voip_call_chat.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72A5285A2F1B0066163B /* voip_call_chat.png */; }; - C63F72EA285A2F1E0066163B /* voip_checkbox_unchecked.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72A6285A2F1B0066163B /* voip_checkbox_unchecked.png */; }; - C63F72EB285A2F1E0066163B /* voip_edit.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72A7285A2F1C0066163B /* voip_edit.png */; }; - C63F72EC285A2F1E0066163B /* conference_schedule_time_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72A8285A2F1C0066163B /* conference_schedule_time_default.png */; }; - C63F72ED285A2F1E0066163B /* voip_merge_calls.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72A9285A2F1C0066163B /* voip_merge_calls.png */; }; - C63F72EE285A2F1E0066163B /* voip_camera_off.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72AA285A2F1C0066163B /* voip_camera_off.png */; }; - C63F72EF285A2F1E0066163B /* voip_micro_on.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72AB285A2F1C0066163B /* voip_micro_on.png */; }; - C63F72F0285A2F1E0066163B /* voip_radio_on.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72AC285A2F1C0066163B /* voip_radio_on.png */; }; - C63F72F1285A2F1E0066163B /* conference_schedule_participants_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72AD285A2F1C0066163B /* conference_schedule_participants_default.png */; }; - C63F72F2285A2F1E0066163B /* voip_conference_mosaic.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72AE285A2F1D0066163B /* voip_conference_mosaic.png */; }; - C63F72F3285A2F1E0066163B /* voip_numpad_5.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72AF285A2F1D0066163B /* voip_numpad_5.png */; }; - C63F72F4285A2F1E0066163B /* voip_conference_new_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72B0285A2F1D0066163B /* voip_conference_new_selected.png */; }; - C63F72F5285A2F1E0066163B /* voip_single_contact_avatar.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72B1285A2F1D0066163B /* voip_single_contact_avatar.png */; }; - C63F72F6285A2F1E0066163B /* voip_delete.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72B2285A2F1D0066163B /* voip_delete.png */; }; - C63F72F7285A2F1E0066163B /* voip_cancel.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72B3285A2F1D0066163B /* voip_cancel.png */; }; - C63F72F8285A2F1E0066163B /* voip_call_header_outgoing.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72B4285A2F1D0066163B /* voip_call_header_outgoing.png */; }; - C63F72FD285A31DA0066163B /* Roboto-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C63F72FA285A31DA0066163B /* Roboto-Regular.ttf */; }; - C63F72FE285A31DA0066163B /* Roboto-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C63F72FB285A31DA0066163B /* Roboto-Italic.ttf */; }; - C63F72FF285A31DA0066163B /* Roboto-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C63F72FC285A31DA0066163B /* Roboto-Bold.ttf */; }; - C64A854E2667B67200252AD2 /* EphemeralSettingsView.m in Sources */ = {isa = PBXBuildFile; fileRef = C64A854D2667B67200252AD2 /* EphemeralSettingsView.m */; }; - C64A85502667B67A00252AD2 /* EphemeralSettingsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C64A854F2667B67A00252AD2 /* EphemeralSettingsView.xib */; }; - C64A85522667B74100252AD2 /* ephemeral_messages_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C64A85512667B74100252AD2 /* ephemeral_messages_default.png */; }; - C6548820292D32FA00BF646B /* SingleCallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C654881E292D32FA00BF646B /* SingleCallView.swift */; }; - C6548821292D32FA00BF646B /* ConferenceCallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C654881F292D32FA00BF646B /* ConferenceCallView.swift */; }; - C6548823292D369500BF646B /* AbstractCallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6548822292D369500BF646B /* AbstractCallView.swift */; }; - C66B03BB26E8EB1A009B5EDC /* UIChatReplyBubbleView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C66B03BD26E8EB1A009B5EDC /* UIChatReplyBubbleView.xib */; }; - C66B040A26EFDA55009B5EDC /* reply_cancel.png in Resources */ = {isa = PBXBuildFile; fileRef = C66B040926EFDA54009B5EDC /* reply_cancel.png */; }; - C66B040E26F095D1009B5EDC /* cancel_forward.png in Resources */ = {isa = PBXBuildFile; fileRef = C66B040D26F095CE009B5EDC /* cancel_forward.png */; }; - C684F1FA2913D65500736775 /* SnapkitBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = C684F1F92913D65500736775 /* SnapkitBridge.swift */; }; - C6A1BB3526E8815400540D50 /* menu_info.png in Resources */ = {isa = PBXBuildFile; fileRef = C6A1BB3126E8815300540D50 /* menu_info.png */; }; - C6A1BB3626E8815400540D50 /* menu_forward_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6A1BB3226E8815400540D50 /* menu_forward_default.png */; }; - C6A1BB3726E8815400540D50 /* menu_copy_text_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6A1BB3326E8815400540D50 /* menu_copy_text_default.png */; }; - C6A1BB3826E8815400540D50 /* menu_reply_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6A1BB3426E8815400540D50 /* menu_reply_default.png */; }; - C6A1BB3A26E881E100540D50 /* menu_delete.png in Resources */ = {isa = PBXBuildFile; fileRef = C6A1BB3926E881E100540D50 /* menu_delete.png */; }; - C6A1BB3E26E882D000540D50 /* UIChatReplyBubbleView.m in Sources */ = {isa = PBXBuildFile; fileRef = C6A1BB3C26E882D000540D50 /* UIChatReplyBubbleView.m */; }; - C6A1BB4126E889AD00540D50 /* forward_message_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6A1BB4026E889AD00540D50 /* forward_message_default.png */; }; - C6A1BB4326E88F7C00540D50 /* menu_resend_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6A1BB4226E88F7C00540D50 /* menu_resend_default.png */; }; - C6A1BB4526E890BD00540D50 /* file_voice_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6A1BB4426E890BD00540D50 /* file_voice_default.png */; }; - C6B4444226AAD0980076C517 /* file_video_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6B4443D26AAD0970076C517 /* file_video_default.png */; }; - C6B4444326AAD0980076C517 /* file_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6B4443E26AAD0970076C517 /* file_default.png */; }; - C6B4444426AAD0980076C517 /* file_picture_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6B4443F26AAD0970076C517 /* file_picture_default.png */; }; - C6B4444526AAD0980076C517 /* file_audio_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6B4444026AAD0970076C517 /* file_audio_default.png */; }; - C6B4444626AAD0980076C517 /* file_pdf_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6B4444126AAD0970076C517 /* file_pdf_default.png */; }; - C6B4444826AADA530076C517 /* SwiftUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6B4444726AADA530076C517 /* SwiftUtil.swift */; }; - C6E3E7EC291D642B00DDFC46 /* side_menu_voip_meeting_schedule.png in Resources */ = {isa = PBXBuildFile; fileRef = C6E3E7EB291D642B00DDFC46 /* side_menu_voip_meeting_schedule.png */; }; - C6E3E7EE291D648D00DDFC46 /* side_menu_voip_meeting_schedule@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C6E3E7ED291D648D00DDFC46 /* side_menu_voip_meeting_schedule@2x.png */; }; - C6F55645287CC69F0056E213 /* voip_meeting_schedule.png in Resources */ = {isa = PBXBuildFile; fileRef = C6F55644287CC69F0056E213 /* voip_meeting_schedule.png */; }; - C6F55647287CCFB70056E213 /* menu_voip_meeting_schedule.png in Resources */ = {isa = PBXBuildFile; fileRef = C6F55646287CCFB60056E213 /* menu_voip_meeting_schedule.png */; }; - C90FAA7915AF54E6002091CB /* HistoryDetailsView.m in Sources */ = {isa = PBXBuildFile; fileRef = C90FAA7715AF54E6002091CB /* HistoryDetailsView.m */; }; - CF15F21E20E4F9A3008B1DE6 /* UIImageViewDeletable.m in Sources */ = {isa = PBXBuildFile; fileRef = CF15F21C20E4F9A3008B1DE6 /* UIImageViewDeletable.m */; }; - CF15F21F20E4F9A3008B1DE6 /* UIImageViewDeletable.xib in Resources */ = {isa = PBXBuildFile; fileRef = CF15F21D20E4F9A3008B1DE6 /* UIImageViewDeletable.xib */; }; - CF1DE92D210A0F5D00A0A97E /* UILinphoneAudioPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = CF1DE924210A0F5A00A0A97E /* UILinphoneAudioPlayer.m */; }; - CF1DE92E210A0F5D00A0A97E /* UILinphoneAudioPlayer.xib in Resources */ = {isa = PBXBuildFile; fileRef = CF1DE92B210A0F5B00A0A97E /* UILinphoneAudioPlayer.xib */; }; - CF7602D7210867E800749F76 /* RecordingsListView.m in Sources */ = {isa = PBXBuildFile; fileRef = CF7602D5210867E800749F76 /* RecordingsListView.m */; }; - CF7602E221086EB200749F76 /* RecordingsListTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = CF7602E021086EB200749F76 /* RecordingsListTableView.m */; }; - CF7602E72108759A00749F76 /* UIRecordingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CF7602E52108759A00749F76 /* UIRecordingCell.m */; }; - CF7602E82108759A00749F76 /* UIRecordingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CF7602E62108759A00749F76 /* UIRecordingCell.xib */; }; - CF7602F5210898CC00749F76 /* rec_off_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CF7602EB210898C100749F76 /* rec_off_default@2x.png */; }; - CF7602F6210898CC00749F76 /* rec_on_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CF7602F2210898C400749F76 /* rec_on_default@2x.png */; }; - CF7602F7210898CC00749F76 /* rec_off_default.png in Resources */ = {isa = PBXBuildFile; fileRef = CF7602F3210898C600749F76 /* rec_off_default.png */; }; - CF7602F8210898CC00749F76 /* rec_on_default.png in Resources */ = {isa = PBXBuildFile; fileRef = CF7602F4210898C800749F76 /* rec_on_default.png */; }; - CFBD7A2A20E504AE007C5286 /* delete_img.png in Resources */ = {isa = PBXBuildFile; fileRef = CFBD7A2320E504AD007C5286 /* delete_img.png */; }; - D306459E1611EC2A00BB571E /* UILoadingImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = D306459D1611EC2900BB571E /* UILoadingImageView.m */; }; - D3128FE115AABC7E00A2147A /* ContactDetailsView.m in Sources */ = {isa = PBXBuildFile; fileRef = D3128FDF15AABC7E00A2147A /* ContactDetailsView.m */; }; - D31B4B21159876C0002E6C72 /* UICompositeView.m in Sources */ = {isa = PBXBuildFile; fileRef = D31B4B1F159876C0002E6C72 /* UICompositeView.m */; }; - D31C9C98158A1CDF00756B45 /* UIHistoryCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D31C9C97158A1CDE00756B45 /* UIHistoryCell.m */; }; - D326483815887D5200930C67 /* OrderedDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = D326483715887D5200930C67 /* OrderedDictionary.m */; }; - D32648441588F6FC00930C67 /* UIToggleButton.m in Sources */ = {isa = PBXBuildFile; fileRef = D32648431588F6FB00930C67 /* UIToggleButton.m */; }; - D32B6E2915A5BC440033019F /* ChatConversationTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = D32B6E2815A5BC430033019F /* ChatConversationTableView.m */; }; - D32B9DFC15A2F131000B6DEC /* FastAddressBook.m in Sources */ = {isa = PBXBuildFile; fileRef = D32B9DFB15A2F131000B6DEC /* FastAddressBook.m */; }; - D34F6F9E1594D3FB0095705B /* InAppSettings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = D34F6F9D1594D3FB0095705B /* InAppSettings.bundle */; }; - D350F20E15A43BB100149E54 /* AssistantView.m in Sources */ = {isa = PBXBuildFile; fileRef = D350F20C15A43BB100149E54 /* AssistantView.m */; }; - D35497FE15875372000081D8 /* ContactsListView.m in Sources */ = {isa = PBXBuildFile; fileRef = D35497FC15875372000081D8 /* ContactsListView.m */; }; - D3549816158761D0000081D8 /* ContactsListTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = D3549815158761D0000081D8 /* ContactsListTableView.m */; }; - D35498211587716B000081D8 /* StatusBarView.m in Sources */ = {isa = PBXBuildFile; fileRef = D354981F1587716B000081D8 /* StatusBarView.m */; }; - D35860D615B549B500513429 /* Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = D35860D515B549B500513429 /* Utils.m */; }; - D35E7597159460580066B1C1 /* ChatsListView.m in Sources */ = {isa = PBXBuildFile; fileRef = D35E7595159460560066B1C1 /* ChatsListView.m */; }; - D35E759F159460B70066B1C1 /* SettingsView.m in Sources */ = {isa = PBXBuildFile; fileRef = D35E759D159460B50066B1C1 /* SettingsView.m */; }; - D378AB2A15DCDB4A0098505D /* ImagePickerView.m in Sources */ = {isa = PBXBuildFile; fileRef = D378AB2915DCDB490098505D /* ImagePickerView.m */; }; - D37C639B15AADEF6009D0BAC /* ContactDetailsTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = D37C639A15AADEF5009D0BAC /* ContactDetailsTableView.m */; }; - D37DC6C11594AE1800B2A5EB /* LinphoneCoreSettingsStore.m in Sources */ = {isa = PBXBuildFile; fileRef = D37DC6C01594AE1800B2A5EB /* LinphoneCoreSettingsStore.m */; }; - D37DC7181594AF3400B2A5EB /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D37DC7171594AF3400B2A5EB /* MessageUI.framework */; }; - D37E3ECD1619C27A0087659A /* CAAnimation+Blocks.m in Sources */ = {isa = PBXBuildFile; fileRef = D37E3ECC1619C27A0087659A /* CAAnimation+Blocks.m */; }; - D37EE10D16035793003608A6 /* ImageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D37EE11016035793003608A6 /* ImageView.xib */; }; - D37EE162160377D7003608A6 /* DTActionSheet.m in Sources */ = {isa = PBXBuildFile; fileRef = D37EE161160377D7003608A6 /* DTActionSheet.m */; }; - D3807FBF15C28940005BE9BC /* DCRoundSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FB815C28940005BE9BC /* DCRoundSwitch.m */; }; - D3807FC115C28940005BE9BC /* DCRoundSwitchKnobLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FBA15C28940005BE9BC /* DCRoundSwitchKnobLayer.m */; }; - D3807FC315C28940005BE9BC /* DCRoundSwitchOutlineLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FBC15C28940005BE9BC /* DCRoundSwitchOutlineLayer.m */; }; - D3807FC515C28940005BE9BC /* DCRoundSwitchToggleLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FBE15C28940005BE9BC /* DCRoundSwitchToggleLayer.m */; }; - D3807FE815C2894A005BE9BC /* IASKAppSettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FCA15C2894A005BE9BC /* IASKAppSettingsViewController.m */; settings = {COMPILER_FLAGS = "-Wno-deprecated-declarations -Wno-objc-designated-initializers"; }; }; - D3807FEC15C2894A005BE9BC /* IASKSpecifierValuesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FCE15C2894A005BE9BC /* IASKSpecifierValuesViewController.m */; }; - D3807FEE15C2894A005BE9BC /* IASKSettingsReader.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FD215C2894A005BE9BC /* IASKSettingsReader.m */; }; - D3807FF015C2894A005BE9BC /* IASKSettingsStore.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FD415C2894A005BE9BC /* IASKSettingsStore.m */; }; - D3807FF215C2894A005BE9BC /* IASKSettingsStoreFile.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FD615C2894A005BE9BC /* IASKSettingsStoreFile.m */; }; - D3807FF415C2894A005BE9BC /* IASKSettingsStoreUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FD815C2894A005BE9BC /* IASKSettingsStoreUserDefaults.m */; }; - D3807FF615C2894A005BE9BC /* IASKSpecifier.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FDA15C2894A005BE9BC /* IASKSpecifier.m */; settings = {COMPILER_FLAGS = "-Wno-deprecated-declarations"; }; }; - D3807FF815C2894A005BE9BC /* IASKPSSliderSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FDD15C2894A005BE9BC /* IASKPSSliderSpecifierViewCell.m */; }; - D3807FFA15C2894A005BE9BC /* IASKPSTextFieldSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FDF15C2894A005BE9BC /* IASKPSTextFieldSpecifierViewCell.m */; settings = {COMPILER_FLAGS = "-Wno-deprecated-declarations"; }; }; - D3807FFE15C2894A005BE9BC /* IASKSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FE315C2894A005BE9BC /* IASKSlider.m */; }; - D380800015C2894A005BE9BC /* IASKSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FE515C2894A005BE9BC /* IASKSwitch.m */; }; - D380800215C2894A005BE9BC /* IASKTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FE715C2894A005BE9BC /* IASKTextField.m */; }; - D380801315C299D0005BE9BC /* ColorSpaceUtilites.m in Sources */ = {isa = PBXBuildFile; fileRef = D380801215C299D0005BE9BC /* ColorSpaceUtilites.m */; }; - D38187AD15FE340100C3EDCA /* ChatConversationView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D38187B015FE340100C3EDCA /* ChatConversationView.xib */; }; - D38187B115FE340500C3EDCA /* ChatsListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D38187B415FE340500C3EDCA /* ChatsListView.xib */; }; - D38187B915FE342200C3EDCA /* ContactDetailsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D38187BC15FE342200C3EDCA /* ContactDetailsView.xib */; }; - D38187BD15FE342800C3EDCA /* ContactsListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D38187C015FE342800C3EDCA /* ContactsListView.xib */; }; - D38187C115FE345B00C3EDCA /* DialerView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D38187C415FE345B00C3EDCA /* DialerView.xib */; }; - D38187CD15FE346700C3EDCA /* HistoryDetailsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D38187D015FE346700C3EDCA /* HistoryDetailsView.xib */; }; - D38187D115FE346B00C3EDCA /* HistoryListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D38187D415FE346B00C3EDCA /* HistoryListView.xib */; }; - D38187DD15FE348A00C3EDCA /* AssistantView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D38187E015FE348A00C3EDCA /* AssistantView.xib */; }; - D38187F815FE355D00C3EDCA /* TabBarView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D38187FB15FE355D00C3EDCA /* TabBarView.xib */; }; - D3A55FBC15877E5E003FD403 /* UIContactCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D3A55FBB15877E5E003FD403 /* UIContactCell.m */; }; - D3A8BB7015A6C7D500F96BE5 /* UIChatBubbleTextCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D3A8BB6F15A6C7D500F96BE5 /* UIChatBubbleTextCell.m */; }; - D3C6526715AC1A8F0092A874 /* UIContactDetailsCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D3C6526615AC1A8F0092A874 /* UIContactDetailsCell.m */; }; - D3D5126C160B3A8E00946DF8 /* AssistantViewScreens.xib in Resources */ = {isa = PBXBuildFile; fileRef = D3D5126A160B3A8E00946DF8 /* AssistantViewScreens.xib */; }; - D3EA53FD159850E80037DC6B /* LinphoneManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D3EA53FC159850E80037DC6B /* LinphoneManager.m */; }; - D3EA540D1598528B0037DC6B /* ChatsListTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = D3EA540C1598528B0037DC6B /* ChatsListTableView.m */; }; - D3EA5411159853750037DC6B /* UIChatCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D3EA5410159853750037DC6B /* UIChatCell.m */; }; - D3ED3E871586291E006C0DE4 /* TabBarView.m in Sources */ = {isa = PBXBuildFile; fileRef = D3ED3E851586291B006C0DE4 /* TabBarView.m */; }; - D3ED3EA71587334E006C0DE4 /* HistoryListTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = D3ED3EA51587334C006C0DE4 /* HistoryListTableView.m */; }; - D3ED3EB81587392C006C0DE4 /* HistoryListView.m in Sources */ = {isa = PBXBuildFile; fileRef = D3ED3EB615873929006C0DE4 /* HistoryListView.m */; }; - D3F795D615A582810077328B /* ChatConversationView.m in Sources */ = {isa = PBXBuildFile; fileRef = D3F795D415A582800077328B /* ChatConversationView.m */; }; - D3F7998115BD32370018C273 /* TPMultiLayoutViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D3F7998015BD32370018C273 /* TPMultiLayoutViewController.m */; }; - D3F83F8E15822ABE00336684 /* PhoneMainView.m in Sources */ = {isa = PBXBuildFile; fileRef = D3F83F8D15822ABD00336684 /* PhoneMainView.m */; }; - D7013DB82940AA12004EEAAE /* MessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7013DB72940AA12004EEAAE /* MessageView.swift */; }; - D7097B35296D684900AEF6C5 /* FileType.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7097B34296D684900AEF6C5 /* FileType.swift */; }; - D71418E329C9B4E0002EEF75 /* DownloadMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D71418E229C9B4E0002EEF75 /* DownloadMessageCell.swift */; }; - D71418E529C9E2CD002EEF75 /* CircularProgressBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D71418E429C9E2CD002EEF75 /* CircularProgressBarView.swift */; }; - D72F27AA2AA8B42D00CFB13D /* SheetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D72F27A92AA8B42D00CFB13D /* SheetViewController.swift */; }; - D7421D9E29228A5200290CAB /* ChatConversationViewSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7421D9D29228A5200290CAB /* ChatConversationViewSwift.swift */; }; - D74A44912923BAF90017D063 /* BackActionsNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D74A44902923BAF90017D063 /* BackActionsNavigationView.swift */; }; - D768763529CDA88200570747 /* UploadMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D768763429CDA88200570747 /* UploadMessageCell.swift */; }; - D77057F1292E4A340031A970 /* ChatConversationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D77057F0292E4A340031A970 /* ChatConversationViewModel.swift */; }; - D779D39829A3C933007B8087 /* ChatConversationTableViewSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = D779D39729A3C933007B8087 /* ChatConversationTableViewSwift.swift */; }; - D779D39A29A4C285007B8087 /* MultilineMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D779D39929A4C285007B8087 /* MultilineMessageCell.swift */; }; - D779D39C29A76DE6007B8087 /* ChatConversationTableViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D779D39B29A76DE6007B8087 /* ChatConversationTableViewModel.swift */; }; - D779D39E29AC9E93007B8087 /* AudioPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D779D39D29AC9E92007B8087 /* AudioPlayer.swift */; }; - D779D3A229B5E365007B8087 /* UIImageExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D779D3A129B5E365007B8087 /* UIImageExtension.swift */; }; - D780FF7D2A459CE3001535E6 /* MediaViewer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D780FF7C2A459CE3001535E6 /* MediaViewer.swift */; }; - D783D9BA2A669A9E00293E87 /* ContentMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D783D9B92A669A9E00293E87 /* ContentMessageView.swift */; }; - D7A4C0082A3B135800EFBD1B /* new_chat_attachment_default.png in Resources */ = {isa = PBXBuildFile; fileRef = D7A4C0052A3B135800EFBD1B /* new_chat_attachment_default.png */; }; - D7A4C0092A3B135800EFBD1B /* new_vr_off.png in Resources */ = {isa = PBXBuildFile; fileRef = D7A4C0062A3B135800EFBD1B /* new_vr_off.png */; }; - D7A4C00A2A3B135800EFBD1B /* new_chat_send_default.png in Resources */ = {isa = PBXBuildFile; fileRef = D7A4C0072A3B135800EFBD1B /* new_chat_send_default.png */; }; - D7A7545029507038005C9D4A /* CustomAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7A7544F29507038005C9D4A /* CustomAlertController.swift */; }; - D7C6DE832948CF3100756E03 /* DropDownCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7C6DE812948CF3100756E03 /* DropDownCell.swift */; }; - D7C6DE842948CF3100756E03 /* DropDownCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = D7C6DE822948CF3100756E03 /* DropDownCell.xib */; }; - D7CBC0F72A8E1669009182D8 /* Mode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7CBC0F62A8E1669009182D8 /* Mode.swift */; }; - D7CBC0FB2A8E3D1E009182D8 /* SpeakersListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7CBC0FA2A8E3D1E009182D8 /* SpeakersListView.swift */; }; - D7CBC0FD2A8E3D3F009182D8 /* VoipSpeakerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7CBC0FC2A8E3D3F009182D8 /* VoipSpeakerCell.swift */; }; - D7CBC0FF2A8E3E11009182D8 /* ConferenceSpeakerData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7CBC0FE2A8E3E11009182D8 /* ConferenceSpeakerData.swift */; }; - D7CF13732A2E225200D92165 /* emoji.png in Resources */ = {isa = PBXBuildFile; fileRef = D7CF13722A2E225200D92165 /* emoji.png */; }; - D7DA18712A02598700FABA0D /* TextViewer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7DA18702A02598700FABA0D /* TextViewer.swift */; }; - D7F067482AAA1BFB0044CC87 /* ReactionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7F067472AAA1BFB0044CC87 /* ReactionCell.swift */; }; - EA0007A62356008F003CC6BF /* msgNotificationService.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = EA5F25D9232BD3E200475F2E /* msgNotificationService.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - EA3650DB2330D2E30001148A /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA5F25DB232BD3E200475F2E /* NotificationService.swift */; }; - EA88A405242A6216007FEC61 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBC41B6A0FF200AA16FD /* Localizable.strings */; }; - EA88A407242A6235007FEC61 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBC41B6A0FF200AA16FD /* Localizable.strings */; }; - EA88F3AB241BD05200E66528 /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C73477B1D9BA3A00022EE8C /* UserNotifications.framework */; }; - EA88F3AC241BD05200E66528 /* UserNotificationsUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E58962520DCE5700030868C /* UserNotificationsUI.framework */; }; - EA88F3AF241BD1F700E66528 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = EA8CB82D239F96CA00C330CC /* MainInterface.storyboard */; }; - EA8CB82C239F96CA00C330CC /* NotificationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA8CB82B239F96CA00C330CC /* NotificationViewController.swift */; }; - EA8CB833239F96CA00C330CC /* msgNotificationContent.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = EA8CB827239F96CA00C330CC /* msgNotificationContent.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - EAE6C88423FABF690076A018 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAE6C88323FABF690076A018 /* Utils.swift */; }; - EAE6C88523FABF690076A018 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAE6C88323FABF690076A018 /* Utils.swift */; }; - F03CA84318C72F1A0008889D /* UITextViewNoDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = F03CA84218C72F1A0008889D /* UITextViewNoDefine.m */; }; - F05BAA621A5D594E00411815 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F05BAA611A5D594E00411815 /* libz.dylib */; }; - F0642EF119DAC891009DB336 /* MainStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F0642EF019DAC891009DB336 /* MainStoryboard.storyboard */; }; - F088488A19FF8C41007FFCF3 /* UIContactCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F088488D19FF8C41007FFCF3 /* UIContactCell.xib */; }; - F0938159188E629800A55DFA /* iTunesArtwork in Resources */ = {isa = PBXBuildFile; fileRef = F0938158188E629800A55DFA /* iTunesArtwork */; }; - F0B026F31AA710AF00FF49F7 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F0B026F21AA710AF00FF49F7 /* libiconv.dylib */; }; - F0B89C2218DC89E30050B60E /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F0B89C2118DC89E30050B60E /* MediaPlayer.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 61AE365420C00B370089D9D3 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 61AE364A20C00B370089D9D3; - remoteInfo = linphoneExtension; - }; - 6637AF93288593AF00965733 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1D6058900D05DD3D006BFB54; - remoteInfo = linphone; - }; - EA88F393241BC1F400E66528 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = EA5F25D8232BD3E200475F2E; - remoteInfo = msgNotificationService; - }; - EA88F394241BC1F400E66528 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = EA8CB826239F96CA00C330CC; - remoteInfo = msgNotificationContent; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 5EF0C35020C806A5005081B0 /* Embed App Extensions */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 13; - files = ( - 61AE365620C00B370089D9D3 /* linphoneExtension.appex in Embed App Extensions */, - EA8CB833239F96CA00C330CC /* msgNotificationContent.appex in Embed App Extensions */, - EA0007A62356008F003CC6BF /* msgNotificationService.appex in Embed App Extensions */, - ); - name = "Embed App Extensions"; - runOnlyForDeploymentPostprocessing = 0; - }; - 8CDC89061EAF89A8006B5652 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 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; }; - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 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 = ""; }; - 22276E8613C73D8A00210156 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; - 22276E8813C73DC000210156 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; - 22405EED1600B4E400B92522 /* AssetsLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AssetsLibrary.framework; path = System/Library/Frameworks/AssetsLibrary.framework; sourceTree = SDKROOT; }; - 22405EFD1601C19000B92522 /* ImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageView.h; sourceTree = ""; }; - 22405EFE1601C19100B92522 /* ImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ImageView.m; sourceTree = ""; }; - 224567C1107B968500F10948 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - 2248E90C12F7E4CF00220D9C /* UIDigitButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIDigitButton.h; sourceTree = ""; }; - 2248E90D12F7E4CF00220D9C /* UIDigitButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIDigitButton.m; sourceTree = ""; }; - 2264B6D111200342002C2C53 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - 226EF06B15FA256B005865C7 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; - 22744019106F31BD006EC466 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; - 2274402E106F335E006EC466 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - 22744043106F33FC006EC466 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; - 22744056106F9BC9006EC466 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; }; - 228697C311AC29B800E9E0CA /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; - 22AA8AFF13D83F6300B30535 /* UICamSwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UICamSwitch.h; sourceTree = ""; }; - 22AA8B0013D83F6300B30535 /* UICamSwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UICamSwitch.m; sourceTree = ""; }; - 22B5EFA210CE50BD00777D97 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; - 22B5F03410CE6B2F00777D97 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; - 22D1B68012A3E0BE001AE361 /* libresolv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libresolv.dylib; path = usr/lib/libresolv.dylib; sourceTree = SDKROOT; }; - 22E0A81C111C44E100B04932 /* AboutView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AboutView.m; sourceTree = ""; }; - 22E0A81D111C44E100B04932 /* AboutView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AboutView.h; sourceTree = ""; }; - 22F2508B107141E100AC9B3F /* DialerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DialerView.h; sourceTree = ""; }; - 22F2508C107141E100AC9B3F /* DialerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = DialerView.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - 244523AC1E8266CC0037A187 /* chat_delivered.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_delivered.png; sourceTree = ""; }; - 244523AD1E8266CC0037A187 /* chat_error.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_error.png; sourceTree = ""; }; - 244523AE1E8266CC0037A187 /* chat_read.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_read.png; sourceTree = ""; }; - 244523BC1E8D3A6C0037A187 /* chat_unsecure.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_unsecure.png; sourceTree = ""; }; - 249660941FD6A359001D55AA /* Photos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Photos.framework; path = System/Library/Frameworks/Photos.framework; sourceTree = SDKROOT; }; - 24A3459D1D95797700881A5C /* UIShopTableCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UIShopTableCell.xib; sourceTree = ""; }; - 24A345A51D95798A00881A5C /* UIShopTableCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIShopTableCell.m; sourceTree = ""; }; - 24A345A71D95799900881A5C /* UIShopTableCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIShopTableCell.h; sourceTree = ""; }; - 24BFAA8C209B062B004F47A7 /* dialer_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = dialer_background.png; sourceTree = ""; }; - 24BFAA93209B062C004F47A7 /* linphone_user.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = linphone_user.png; sourceTree = ""; }; - 24BFAA94209B062C004F47A7 /* contacts_sip_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "contacts_sip_default@2x.png"; sourceTree = ""; }; - 24BFAA95209B062D004F47A7 /* linphone_user@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "linphone_user@2x.png"; sourceTree = ""; }; - 24BFAA96209B062D004F47A7 /* linphone_user~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "linphone_user~ipad@2x.png"; sourceTree = ""; }; - 24BFAA97209B062E004F47A7 /* contacts_sip_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = contacts_sip_selected.png; sourceTree = ""; }; - 24BFAA98209B062E004F47A7 /* linphone_logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = linphone_logo.png; sourceTree = ""; }; - 24BFAA99209B062E004F47A7 /* contacts_sip_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = contacts_sip_default.png; sourceTree = ""; }; - 24BFAA9A209B062F004F47A7 /* linphone_user~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "linphone_user~ipad.png"; sourceTree = ""; }; - 24BFAA9B209B062F004F47A7 /* callkit_logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = callkit_logo.png; sourceTree = ""; }; - 24BFAA9C209B062F004F47A7 /* contacts_sip_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "contacts_sip_selected@2x.png"; sourceTree = ""; }; - 24BFAA9D209B0630004F47A7 /* linphone_logo@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "linphone_logo@2x.png"; sourceTree = ""; }; - 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 = ""; }; - 32CA4F630368D1EE00C91783 /* linphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linphone_Prefix.pch; sourceTree = ""; }; - 340751961506459A00B89C47 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; }; - 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; }; - 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 = ""; }; - 570742661D5A63DB004B9C84 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; - 5E58962520DCE5700030868C /* UserNotificationsUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotificationsUI.framework; path = System/Library/Frameworks/UserNotificationsUI.framework; sourceTree = SDKROOT; }; - 5EF0C33820C806A5005081B0 /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; }; - 6112A01B243B31A600DBD5F5 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - 6112A01D243B5FD500DBD5F5 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - 6130C85B22BBB493009CC79C /* LaunchScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LaunchScreen.h; sourceTree = ""; }; - 6135761A240E81AC005304D4 /* UIInterfaceStyleButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIInterfaceStyleButton.h; sourceTree = ""; }; - 6135761B240E81BA005304D4 /* UIInterfaceStyleButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIInterfaceStyleButton.m; sourceTree = ""; }; - 6135761D240E81C7005304D4 /* UIInterfaceStyleToggleButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIInterfaceStyleToggleButton.h; sourceTree = ""; }; - 6135761E240E81D0005304D4 /* UIInterfaceStyleToggleButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIInterfaceStyleToggleButton.m; sourceTree = ""; }; - 614C087623D1A35E00217F80 /* linphone-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "linphone-Bridging-Header.h"; sourceTree = ""; }; - 614D09CD21E74D5400C43EDF /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - 61586B7A217A16EE0038AC45 /* menu_about.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_about.png; sourceTree = ""; }; - 61586B82217A16FD0038AC45 /* menu_about@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu_about@2x.png"; sourceTree = ""; }; - 61586B84217A17070038AC45 /* menu_assistant.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_assistant.png; sourceTree = ""; }; - 61586B86217A17150038AC45 /* menu_assistant@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu_assistant@2x.png"; sourceTree = ""; }; - 61586B88217A17220038AC45 /* menu_link_account.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_link_account.png; sourceTree = ""; }; - 61586B8A217A17320038AC45 /* menu_link_account@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu_link_account@2x.png"; sourceTree = ""; }; - 61586B8C217A173F0038AC45 /* menu_options.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_options.png; sourceTree = ""; }; - 61586B8E217A174F0038AC45 /* menu_options@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu_options@2x.png"; sourceTree = ""; }; - 61586B90217A175C0038AC45 /* menu_recordings.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_recordings.png; sourceTree = ""; }; - 61586B92217A176F0038AC45 /* menu_recordings@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu_recordings@2x.png"; sourceTree = ""; }; - 615A2808217F1FD40060F920 /* chat_add_group.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_add_group.png; sourceTree = ""; }; - 615A2810217F1FDE0060F920 /* chat_add_group@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_add_group@2x.png"; sourceTree = ""; }; - 615A2812217F24D40060F920 /* security_1_indicator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = security_1_indicator.png; sourceTree = ""; }; - 615A2814217F24E00060F920 /* security_1_indicator@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "security_1_indicator@2x.png"; sourceTree = ""; }; - 615A2816217F280C0060F920 /* chat_list_indicator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_list_indicator.png; sourceTree = ""; }; - 615A2818217F28160060F920 /* chat_list_indicator@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_list_indicator@2x.png"; sourceTree = ""; }; - 615A281A217F6F9B0060F920 /* security_2_indicator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = security_2_indicator.png; sourceTree = ""; }; - 615A281C217F6FA80060F920 /* security_2_indicator@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "security_2_indicator@2x.png"; sourceTree = ""; }; - 615A281E217F6FB30060F920 /* security_alert_indicator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = security_alert_indicator.png; sourceTree = ""; }; - 615A2820217F6FBF0060F920 /* security_alert_indicator@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "security_alert_indicator@2x.png"; sourceTree = ""; }; - 615A282321805B250060F920 /* security_toogle_icon_green.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = security_toogle_icon_green.png; sourceTree = ""; }; - 615A282521805B320060F920 /* security_toogle_icon_green@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "security_toogle_icon_green@2x.png"; sourceTree = ""; }; - 615A282721805B400060F920 /* security_toogle_icon_grey.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = security_toogle_icon_grey.png; sourceTree = ""; }; - 615A282921805B4C0060F920 /* security_toogle_icon_grey@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "security_toogle_icon_grey@2x.png"; sourceTree = ""; }; - 615A282F218071E80060F920 /* security_toogle_background_green.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = security_toogle_background_green.png; sourceTree = ""; }; - 615A2831218071F30060F920 /* security_toogle_background_green@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "security_toogle_background_green@2x.png"; sourceTree = ""; }; - 615A2833218071FF0060F920 /* security_toogle_background_grey.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = security_toogle_background_grey.png; sourceTree = ""; }; - 615A28352180720D0060F920 /* security_toogle_background_grey@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "security_toogle_background_grey@2x.png"; sourceTree = ""; }; - 615A28392180788E0060F920 /* security_toogle_button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = security_toogle_button.png; sourceTree = ""; }; - 615A283B2180789C0060F920 /* security_toogle_button@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "security_toogle_button@2x.png"; sourceTree = ""; }; - 615A283D2180A2550060F920 /* invite_linphone.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = invite_linphone.png; sourceTree = ""; }; - 615A283F2180A2620060F920 /* invite_linphone@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "invite_linphone@2x.png"; sourceTree = ""; }; - 615A28412180C0820060F920 /* recording.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = recording.png; sourceTree = ""; }; - 615A28432180C08F0060F920 /* recording@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "recording@2x.png"; sourceTree = ""; }; - 617B4A61260A2B7800A87337 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/RecordingsListView.xib; sourceTree = ""; }; - 617B4A64260A2B8500A87337 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/RecordingsListView.strings; sourceTree = ""; }; - 617B4A75260A3F5500A87337 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/RecordingsListView.strings; sourceTree = ""; }; - 617C2428263022430042FB4A /* UIChatContentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIChatContentView.h; sourceTree = ""; }; - 617C2429263022690042FB4A /* UIChatContentView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UIChatContentView.m; sourceTree = ""; }; - 6180D6FD21EE41A800AD9CB6 /* QuickLook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickLook.framework; path = System/Library/Frameworks/QuickLook.framework; sourceTree = SDKROOT; }; - 6187B1B524B3271500D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/AboutView.strings; sourceTree = ""; }; - 6187B1B624B3271500D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/AssistantLinkView.strings; sourceTree = ""; }; - 6187B1B724B3271600D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/AssistantView.strings; sourceTree = ""; }; - 6187B1B824B3271600D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/AssistantViewScreens.strings; sourceTree = ""; }; - 6187B1BD24B3271800D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/ChatConversationCreateView.strings; sourceTree = ""; }; - 6187B1BE24B3271900D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/ChatConversationImdnView.strings; sourceTree = ""; }; - 6187B1BF24B3271900D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/ChatConversationInfoView.strings; sourceTree = ""; }; - 6187B1C024B3271A00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/ChatConversationView.strings; sourceTree = ""; }; - 6187B1C124B3271A00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/ChatsListView.strings; sourceTree = ""; }; - 6187B1C224B3271A00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/ContactDetailsView.strings; sourceTree = ""; }; - 6187B1C324B3271B00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/ContactsListView.strings; sourceTree = ""; }; - 6187B1C424B3271B00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/CountryListView.strings; sourceTree = ""; }; - 6187B1C524B3271B00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/DialerView.strings; sourceTree = ""; }; - 6187B1C624B3271C00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = "hu.lproj/DialerView~ipad.strings"; sourceTree = ""; }; - 6187B1C724B3271C00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/FirstLoginView.strings; sourceTree = ""; }; - 6187B1C824B3271D00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/HistoryDetailsView.strings; sourceTree = ""; }; - 6187B1C924B3271D00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/HistoryListView.strings; sourceTree = ""; }; - 6187B1CA24B3271E00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/ImageView.strings; sourceTree = ""; }; - 6187B1CD24B3271F00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UIChatBubblePhotoCell.strings; sourceTree = ""; }; - 6187B1CE24B3271F00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UIChatBubbleTextCell.strings; sourceTree = ""; }; - 6187B1CF24B3271F00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UIChatCell.strings; sourceTree = ""; }; - 6187B1D024B3272000D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UIChatConversationImdnTableViewCell.strings; sourceTree = ""; }; - 6187B1D124B3272000D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UIChatConversationInfoTableViewCell.strings; sourceTree = ""; }; - 6187B1D224B3272100D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UIChatCreateCell.strings; sourceTree = ""; }; - 6187B1D424B3272100D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UICompositeView.strings; sourceTree = ""; }; - 6187B1D524B3272200D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = "hu.lproj/UICompositeView~ipad.strings"; sourceTree = ""; }; - 6187B1D624B3272200D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UIConfirmationDialog.strings; sourceTree = ""; }; - 6187B1D724B3272300D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UIContactCell.strings; sourceTree = ""; }; - 6187B1D824B3272300D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UIContactDetailsCell.strings; sourceTree = ""; }; - 6187B1D924B3272400D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UIHistoryCell.strings; sourceTree = ""; }; - 6187B1DA24B3272400D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/PhoneMainView.strings; sourceTree = ""; }; - 6187B1DB24B3272400D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/SettingsView.strings; sourceTree = ""; }; - 6187B1DC24B3272500D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/ShopView.strings; sourceTree = ""; }; - 6187B1DD24B3272500D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/SideMenuView.strings; sourceTree = ""; }; - 6187B1DE24B3272600D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = "hu.lproj/SideMenuView~ipad.strings"; sourceTree = ""; }; - 6187B1DF24B3272600D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/StatusBarView.strings; sourceTree = ""; }; - 6187B1E024B3272700D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/TabBarView.strings; sourceTree = ""; }; - 61AE364B20C00B370089D9D3 /* linphoneExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = linphoneExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; - 61AE364D20C00B370089D9D3 /* ShareViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ShareViewController.h; sourceTree = ""; }; - 61AE364E20C00B370089D9D3 /* ShareViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ShareViewController.m; sourceTree = ""; }; - 61AE365120C00B370089D9D3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; - 61AE365320C00B370089D9D3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 61AE366320C00C810089D9D3 /* linphoneExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = linphoneExtension.entitlements; sourceTree = ""; }; - 61AEBEB5219198EF00F35E7F /* DevicesListView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DevicesListView.h; sourceTree = ""; }; - 61AEBEBC2191990A00F35E7F /* DevicesListView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DevicesListView.m; sourceTree = ""; }; - 61AEBEBE2191991F00F35E7F /* DevicesListView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DevicesListView.xib; sourceTree = ""; }; - 61AEBEC52191E47500F35E7F /* chevron_list_close.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chevron_list_close.png; sourceTree = ""; }; - 61AEBEC72191E48400F35E7F /* chevron_list_close@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chevron_list_close@2x.png"; sourceTree = ""; }; - 61AEBEC92191E49200F35E7F /* chevron_list_open.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chevron_list_open.png; sourceTree = ""; }; - 61AEBECB2191E4A300F35E7F /* chevron_list_open@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chevron_list_open@2x.png"; sourceTree = ""; }; - 61CCC3D721933B380060EDEA /* UIDeviceCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIDeviceCell.h; sourceTree = ""; }; - 61CCC3DE21933B580060EDEA /* UIDeviceCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UIDeviceCell.m; sourceTree = ""; }; - 61CCC3E021933B660060EDEA /* UIDeviceCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UIDeviceCell.xib; sourceTree = ""; }; - 61DD7E1E2372E88F001BDD01 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; - 61E8E46323C5E8EC00434E71 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/AboutView.strings; sourceTree = ""; }; - 61E8E46523C5E8F000434E71 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/AboutView.strings; sourceTree = ""; }; - 61E8E46723C5E9B400434E71 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/AssistantLinkView.strings; sourceTree = ""; }; - 61E8E46B23C5EA2E00434E71 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ShopView.strings; sourceTree = ""; }; - 61F1996E20C6B1D5006B069A /* AVKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVKit.framework; path = System/Library/Frameworks/AVKit.framework; sourceTree = SDKROOT; }; - 6306440B1BECB08500134C72 /* FirstLoginView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FirstLoginView.h; sourceTree = ""; }; - 6306440C1BECB08500134C72 /* FirstLoginView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FirstLoginView.m; sourceTree = ""; }; - 6308F9C31BF0DD6600D1234B /* XMLRPCHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XMLRPCHelper.h; path = Utils/XMLRPCHelper.h; sourceTree = ""; }; - 6308F9C41BF0DD6600D1234B /* XMLRPCHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XMLRPCHelper.m; path = Utils/XMLRPCHelper.m; sourceTree = ""; }; - 630CF5551AF7CE1500539F7A /* UITextField+DoneButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UITextField+DoneButton.h"; sourceTree = ""; }; - 630CF5561AF7CE1500539F7A /* UITextField+DoneButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITextField+DoneButton.m"; sourceTree = ""; }; - 631098471D4660580041F2B3 /* CountryListView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountryListView.h; sourceTree = ""; }; - 631098481D4660580041F2B3 /* CountryListView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountryListView.m; sourceTree = ""; }; - 631098511D4660630041F2B3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/CountryListView.xib; sourceTree = ""; }; - 63130FB11C1ED06900371918 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = "Base.lproj/SideMenuView~ipad.xib"; sourceTree = ""; }; - 6313482E1B6F7B6600C6BDCB /* UIRoundBorderedButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIRoundBorderedButton.h; sourceTree = ""; }; - 6313482F1B6F7B6600C6BDCB /* UIRoundBorderedButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIRoundBorderedButton.m; sourceTree = ""; }; - 6336715E1BCBAAD200BFCBDE /* ChatConversationCreateView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChatConversationCreateView.h; sourceTree = ""; }; - 6336715F1BCBAAD200BFCBDE /* ChatConversationCreateView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ChatConversationCreateView.m; sourceTree = ""; }; - 633756371B67BAF400E21BAD /* SideMenuTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SideMenuTableView.h; sourceTree = ""; }; - 633756381B67BAF400E21BAD /* SideMenuTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SideMenuTableView.m; sourceTree = ""; }; - 633756421B67D2B100E21BAD /* SideMenuView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SideMenuView.h; sourceTree = ""; }; - 633756431B67D2B100E21BAD /* SideMenuView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SideMenuView.m; sourceTree = ""; }; - 633888411BFB2C49001D5E7B /* HPGrowingTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HPGrowingTextView.h; sourceTree = ""; }; - 633888421BFB2C49001D5E7B /* HPGrowingTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HPGrowingTextView.m; sourceTree = ""; }; - 633888431BFB2C49001D5E7B /* HPTextViewInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HPTextViewInternal.h; sourceTree = ""; }; - 633888441BFB2C49001D5E7B /* HPTextViewInternal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HPTextViewInternal.m; sourceTree = ""; }; - 633E388219FFB0F400936D1C /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; - 633E417F1D74258F00320475 /* AssistantLinkView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AssistantLinkView.h; sourceTree = ""; }; - 633E41801D74258F00320475 /* AssistantLinkView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AssistantLinkView.m; sourceTree = ""; }; - 633FEBE21D3CD5570014B822 /* add_field_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = add_field_default.png; sourceTree = ""; }; - 633FEBE31D3CD5570014B822 /* add_field_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "add_field_default@2x.png"; sourceTree = ""; }; - 633FEBE41D3CD5570014B822 /* add_field_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = add_field_over.png; sourceTree = ""; }; - 633FEBE51D3CD5570014B822 /* add_field_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "add_field_over@2x.png"; sourceTree = ""; }; - 633FEBE61D3CD5570014B822 /* avatar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = avatar.png; sourceTree = ""; }; - 633FEBE71D3CD5570014B822 /* avatar@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "avatar@2x.png"; sourceTree = ""; }; - 633FEBE81D3CD5570014B822 /* avatar~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "avatar~ipad.png"; sourceTree = ""; }; - 633FEBE91D3CD5570014B822 /* avatar~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "avatar~ipad@2x.png"; sourceTree = ""; }; - 633FEBEA1D3CD5570014B822 /* back_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = back_default.png; sourceTree = ""; }; - 633FEBEB1D3CD5570014B822 /* back_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "back_default@2x.png"; sourceTree = ""; }; - 633FEBEC1D3CD5570014B822 /* back_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = back_disabled.png; sourceTree = ""; }; - 633FEBED1D3CD5570014B822 /* back_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "back_disabled@2x.png"; sourceTree = ""; }; - 633FEBEE1D3CD5570014B822 /* backspace_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = backspace_default.png; sourceTree = ""; }; - 633FEBEF1D3CD5570014B822 /* backspace_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "backspace_default@2x.png"; sourceTree = ""; }; - 633FEBF01D3CD5570014B822 /* backspace_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = backspace_disabled.png; sourceTree = ""; }; - 633FEBF11D3CD5570014B822 /* backspace_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "backspace_disabled@2x.png"; sourceTree = ""; }; - 633FEBF21D3CD5570014B822 /* backspace_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = backspace_over.png; sourceTree = ""; }; - 633FEBF31D3CD5570014B822 /* backspace_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "backspace_over@2x.png"; sourceTree = ""; }; - 633FEBF41D3CD5570014B822 /* call_add_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_add_default.png; sourceTree = ""; }; - 633FEBF51D3CD5570014B822 /* call_add_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_add_default@2x.png"; sourceTree = ""; }; - 633FEBF61D3CD5570014B822 /* call_add_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_add_disabled.png; sourceTree = ""; }; - 633FEBF71D3CD5570014B822 /* call_add_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_add_disabled@2x.png"; sourceTree = ""; }; - 633FEBF81D3CD5570014B822 /* call_alt_back_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_alt_back_default.png; sourceTree = ""; }; - 633FEBF91D3CD5570014B822 /* call_alt_back_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_alt_back_default@2x.png"; sourceTree = ""; }; - 633FEBFA1D3CD5570014B822 /* call_alt_back_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_alt_back_disabled.png; sourceTree = ""; }; - 633FEBFB1D3CD5570014B822 /* call_alt_back_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_alt_back_disabled@2x.png"; sourceTree = ""; }; - 633FEBFC1D3CD5570014B822 /* call_alt_start_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_alt_start_default.png; sourceTree = ""; }; - 633FEBFD1D3CD5570014B822 /* call_alt_start_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_alt_start_default@2x.png"; sourceTree = ""; }; - 633FEBFE1D3CD5570014B822 /* call_alt_start_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_alt_start_disabled.png; sourceTree = ""; }; - 633FEBFF1D3CD5570014B822 /* call_alt_start_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_alt_start_disabled@2x.png"; sourceTree = ""; }; - 633FEC001D3CD5570014B822 /* call_audio_start_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_audio_start_default.png; sourceTree = ""; }; - 633FEC011D3CD5570014B822 /* call_audio_start_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_audio_start_default@2x.png"; sourceTree = ""; }; - 633FEC021D3CD5570014B822 /* call_audio_start_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_audio_start_disabled.png; sourceTree = ""; }; - 633FEC031D3CD5570014B822 /* call_audio_start_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_audio_start_disabled@2x.png"; sourceTree = ""; }; - 633FEC041D3CD5570014B822 /* call_back_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_back_default.png; sourceTree = ""; }; - 633FEC051D3CD5570014B822 /* call_back_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_back_default@2x.png"; sourceTree = ""; }; - 633FEC061D3CD5570014B822 /* call_back_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_back_disabled.png; sourceTree = ""; }; - 633FEC071D3CD5570014B822 /* call_back_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_back_disabled@2x.png"; sourceTree = ""; }; - 633FEC081D3CD5570014B822 /* call_hangup_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_hangup_default.png; sourceTree = ""; }; - 633FEC091D3CD5570014B822 /* call_hangup_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_hangup_default@2x.png"; sourceTree = ""; }; - 633FEC0A1D3CD5570014B822 /* call_hangup_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_hangup_disabled.png; sourceTree = ""; }; - 633FEC0B1D3CD5570014B822 /* call_hangup_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_hangup_disabled@2x.png"; sourceTree = ""; }; - 633FEC0C1D3CD5570014B822 /* call_incoming.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_incoming.png; sourceTree = ""; }; - 633FEC0D1D3CD5570014B822 /* call_incoming@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_incoming@2x.png"; sourceTree = ""; }; - 633FEC0E1D3CD5570014B822 /* call_missed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_missed.png; sourceTree = ""; }; - 633FEC0F1D3CD5570014B822 /* call_missed@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_missed@2x.png"; sourceTree = ""; }; - 633FEC101D3CD5570014B822 /* call_outgoing.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_outgoing.png; sourceTree = ""; }; - 633FEC111D3CD5570014B822 /* call_outgoing@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_outgoing@2x.png"; sourceTree = ""; }; - 633FEC121D3CD5570014B822 /* call_quality_indicator_0.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_quality_indicator_0.png; sourceTree = ""; }; - 633FEC131D3CD5570014B822 /* call_quality_indicator_0@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_quality_indicator_0@2x.png"; sourceTree = ""; }; - 633FEC141D3CD5570014B822 /* call_quality_indicator_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_quality_indicator_1.png; sourceTree = ""; }; - 633FEC151D3CD5570014B822 /* call_quality_indicator_1@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_quality_indicator_1@2x.png"; sourceTree = ""; }; - 633FEC161D3CD5570014B822 /* call_quality_indicator_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_quality_indicator_2.png; sourceTree = ""; }; - 633FEC171D3CD5570014B822 /* call_quality_indicator_2@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_quality_indicator_2@2x.png"; sourceTree = ""; }; - 633FEC181D3CD5570014B822 /* call_quality_indicator_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_quality_indicator_3.png; sourceTree = ""; }; - 633FEC191D3CD5570014B822 /* call_quality_indicator_3@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_quality_indicator_3@2x.png"; sourceTree = ""; }; - 633FEC1A1D3CD5570014B822 /* call_quality_indicator_4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_quality_indicator_4.png; sourceTree = ""; }; - 633FEC1B1D3CD5570014B822 /* call_quality_indicator_4@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_quality_indicator_4@2x.png"; sourceTree = ""; }; - 633FEC1C1D3CD5570014B822 /* call_start_body_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_start_body_default.png; sourceTree = ""; }; - 633FEC1D1D3CD5570014B822 /* call_start_body_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_start_body_default@2x.png"; sourceTree = ""; }; - 633FEC1E1D3CD5570014B822 /* call_start_body_default~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_start_body_default~ipad.png"; sourceTree = ""; }; - 633FEC1F1D3CD5570014B822 /* call_start_body_default~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_start_body_default~ipad@2x.png"; sourceTree = ""; }; - 633FEC201D3CD5570014B822 /* call_start_body_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_start_body_disabled.png; sourceTree = ""; }; - 633FEC211D3CD5570014B822 /* call_start_body_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_start_body_disabled@2x.png"; sourceTree = ""; }; - 633FEC221D3CD5570014B822 /* call_start_body_disabled~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_start_body_disabled~ipad.png"; sourceTree = ""; }; - 633FEC231D3CD5570014B822 /* call_start_body_disabled~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_start_body_disabled~ipad@2x.png"; sourceTree = ""; }; - 633FEC241D3CD5570014B822 /* call_start_body_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_start_body_over.png; sourceTree = ""; }; - 633FEC251D3CD5570014B822 /* call_start_body_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_start_body_over@2x.png"; sourceTree = ""; }; - 633FEC261D3CD5570014B822 /* call_start_body_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_start_body_over~ipad.png"; sourceTree = ""; }; - 633FEC271D3CD5570014B822 /* call_start_body_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_start_body_over~ipad@2x.png"; sourceTree = ""; }; - 633FEC281D3CD5570014B822 /* call_status_incoming.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_status_incoming.png; sourceTree = ""; }; - 633FEC291D3CD5570014B822 /* call_status_incoming@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_status_incoming@2x.png"; sourceTree = ""; }; - 633FEC2A1D3CD5570014B822 /* call_status_incoming~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_status_incoming~ipad.png"; sourceTree = ""; }; - 633FEC2B1D3CD5570014B822 /* call_status_incoming~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_status_incoming~ipad@2x.png"; sourceTree = ""; }; - 633FEC2C1D3CD5570014B822 /* call_status_missed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_status_missed.png; sourceTree = ""; }; - 633FEC2D1D3CD5570014B822 /* call_status_missed@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_status_missed@2x.png"; sourceTree = ""; }; - 633FEC2E1D3CD5570014B822 /* call_status_missed~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_status_missed~ipad.png"; sourceTree = ""; }; - 633FEC2F1D3CD5570014B822 /* call_status_missed~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_status_missed~ipad@2x.png"; sourceTree = ""; }; - 633FEC301D3CD5570014B822 /* call_status_outgoing.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_status_outgoing.png; sourceTree = ""; }; - 633FEC311D3CD5570014B822 /* call_status_outgoing@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_status_outgoing@2x.png"; sourceTree = ""; }; - 633FEC321D3CD5570014B822 /* call_status_outgoing~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_status_outgoing~ipad.png"; sourceTree = ""; }; - 633FEC331D3CD5570014B822 /* call_status_outgoing~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_status_outgoing~ipad@2x.png"; sourceTree = ""; }; - 633FEC341D3CD5570014B822 /* call_transfer_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_transfer_default.png; sourceTree = ""; }; - 633FEC351D3CD5570014B822 /* call_transfer_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_transfer_default@2x.png"; sourceTree = ""; }; - 633FEC361D3CD5570014B822 /* call_transfer_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_transfer_disabled.png; sourceTree = ""; }; - 633FEC371D3CD5570014B822 /* call_transfer_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_transfer_disabled@2x.png"; sourceTree = ""; }; - 633FEC381D3CD5570014B822 /* call_video_start_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_video_start_default.png; sourceTree = ""; }; - 633FEC391D3CD5570014B822 /* call_video_start_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_video_start_default@2x.png"; sourceTree = ""; }; - 633FEC3A1D3CD5570014B822 /* call_video_start_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_video_start_disabled.png; sourceTree = ""; }; - 633FEC3B1D3CD5570014B822 /* call_video_start_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_video_start_disabled@2x.png"; sourceTree = ""; }; - 633FEC3C1D3CD5570014B822 /* camera_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = camera_default.png; sourceTree = ""; }; - 633FEC3D1D3CD5570014B822 /* camera_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "camera_default@2x.png"; sourceTree = ""; }; - 633FEC3E1D3CD5570014B822 /* camera_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = camera_disabled.png; sourceTree = ""; }; - 633FEC3F1D3CD5570014B822 /* camera_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "camera_disabled@2x.png"; sourceTree = ""; }; - 633FEC401D3CD5570014B822 /* camera_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = camera_selected.png; sourceTree = ""; }; - 633FEC411D3CD5570014B822 /* camera_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "camera_selected@2x.png"; sourceTree = ""; }; - 633FEC421D3CD5570014B822 /* camera_switch_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = camera_switch_default.png; sourceTree = ""; }; - 633FEC431D3CD5570014B822 /* camera_switch_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "camera_switch_default@2x.png"; sourceTree = ""; }; - 633FEC441D3CD5570014B822 /* camera_switch_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = camera_switch_disabled.png; sourceTree = ""; }; - 633FEC451D3CD5570014B822 /* camera_switch_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "camera_switch_disabled@2x.png"; sourceTree = ""; }; - 633FEC461D3CD5570014B822 /* camera_switch_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = camera_switch_over.png; sourceTree = ""; }; - 633FEC471D3CD5570014B822 /* camera_switch_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "camera_switch_over@2x.png"; sourceTree = ""; }; - 633FEC481D3CD5570014B822 /* cancel_edit_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cancel_edit_default.png; sourceTree = ""; }; - 633FEC491D3CD5570014B822 /* cancel_edit_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "cancel_edit_default@2x.png"; sourceTree = ""; }; - 633FEC4A1D3CD5570014B822 /* cancel_edit_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cancel_edit_disabled.png; sourceTree = ""; }; - 633FEC4B1D3CD5570014B822 /* cancel_edit_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "cancel_edit_disabled@2x.png"; sourceTree = ""; }; - 633FEC4C1D3CD5570014B822 /* chat_add_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_add_default.png; sourceTree = ""; }; - 633FEC4D1D3CD5570014B822 /* chat_add_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_add_default@2x.png"; sourceTree = ""; }; - 633FEC4E1D3CD5570014B822 /* chat_add_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_add_disabled.png; sourceTree = ""; }; - 633FEC4F1D3CD5570014B822 /* chat_add_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_add_disabled@2x.png"; sourceTree = ""; }; - 633FEC501D3CD5570014B822 /* chat_attachment_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_attachment_default.png; sourceTree = ""; }; - 633FEC511D3CD5570014B822 /* chat_attachment_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_attachment_default@2x.png"; sourceTree = ""; }; - 633FEC521D3CD5570014B822 /* chat_attachment_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_attachment_disabled.png; sourceTree = ""; }; - 633FEC531D3CD5570014B822 /* chat_attachment_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_attachment_disabled@2x.png"; sourceTree = ""; }; - 633FEC541D3CD5570014B822 /* chat_attachment_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_attachment_over.png; sourceTree = ""; }; - 633FEC551D3CD5570014B822 /* chat_attachment_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_attachment_over@2x.png"; sourceTree = ""; }; - 633FEC561D3CD5570014B822 /* chat_list_indicator~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_list_indicator~ipad.png"; sourceTree = ""; }; - 633FEC571D3CD5570014B822 /* chat_list_indicator~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_list_indicator~ipad@2x.png"; sourceTree = ""; }; - 633FEC581D3CD5570014B822 /* chat_message_not_delivered.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_message_not_delivered.png; sourceTree = ""; }; - 633FEC591D3CD5570014B822 /* chat_message_not_delivered@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_message_not_delivered@2x.png"; sourceTree = ""; }; - 633FEC5A1D3CD5570014B822 /* chat_send_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_send_default.png; sourceTree = ""; }; - 633FEC5B1D3CD5570014B822 /* chat_send_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_send_default@2x.png"; sourceTree = ""; }; - 633FEC5C1D3CD5570014B822 /* chat_send_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_send_disabled.png; sourceTree = ""; }; - 633FEC5D1D3CD5570014B822 /* chat_send_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_send_disabled@2x.png"; sourceTree = ""; }; - 633FEC5E1D3CD5570014B822 /* chat_send_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_send_over.png; sourceTree = ""; }; - 633FEC5F1D3CD5570014B822 /* chat_send_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_send_over@2x.png"; sourceTree = ""; }; - 633FEC601D3CD5570014B822 /* chat_start_body_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_start_body_default.png; sourceTree = ""; }; - 633FEC611D3CD5570014B822 /* chat_start_body_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_start_body_default@2x.png"; sourceTree = ""; }; - 633FEC621D3CD5570014B822 /* chat_start_body_default~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_start_body_default~ipad.png"; sourceTree = ""; }; - 633FEC631D3CD5570014B822 /* chat_start_body_default~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_start_body_default~ipad@2x.png"; sourceTree = ""; }; - 633FEC641D3CD5570014B822 /* chat_start_body_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_start_body_disabled.png; sourceTree = ""; }; - 633FEC651D3CD5570014B822 /* chat_start_body_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_start_body_disabled@2x.png"; sourceTree = ""; }; - 633FEC661D3CD5570014B822 /* chat_start_body_disabled~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_start_body_disabled~ipad.png"; sourceTree = ""; }; - 633FEC671D3CD5570014B822 /* chat_start_body_disabled~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_start_body_disabled~ipad@2x.png"; sourceTree = ""; }; - 633FEC681D3CD5570014B822 /* chat_start_body_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_start_body_over.png; sourceTree = ""; }; - 633FEC691D3CD5570014B822 /* chat_start_body_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_start_body_over@2x.png"; sourceTree = ""; }; - 633FEC6A1D3CD5570014B822 /* chat_start_body_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_start_body_over~ipad.png"; sourceTree = ""; }; - 633FEC6B1D3CD5570014B822 /* chat_start_body_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_start_body_over~ipad@2x.png"; sourceTree = ""; }; - 633FEC6C1D3CD5570014B822 /* checkbox_checked.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = checkbox_checked.png; sourceTree = ""; }; - 633FEC6D1D3CD5570014B822 /* checkbox_checked@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "checkbox_checked@2x.png"; sourceTree = ""; }; - 633FEC6E1D3CD5570014B822 /* checkbox_unchecked.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = checkbox_unchecked.png; sourceTree = ""; }; - 633FEC6F1D3CD5570014B822 /* checkbox_unchecked@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "checkbox_unchecked@2x.png"; sourceTree = ""; }; - 633FEC701D3CD5570014B822 /* color_A.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = color_A.png; sourceTree = ""; }; - 633FEC711D3CD5570014B822 /* color_C.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = color_C.png; sourceTree = ""; }; - 633FEC721D3CD5570014B822 /* color_D.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = color_D.png; sourceTree = ""; }; - 633FEC731D3CD5570014B822 /* color_E.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = color_E.png; sourceTree = ""; }; - 633FEC741D3CD5570014B822 /* color_F.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = color_F.png; sourceTree = ""; }; - 633FEC751D3CD5570014B822 /* color_G.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = color_G.png; sourceTree = ""; }; - 633FEC761D3CD5570014B822 /* color_H.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = color_H.png; sourceTree = ""; }; - 633FEC771D3CD5570014B822 /* color_I.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = color_I.png; sourceTree = ""; }; - 633FEC781D3CD5570014B822 /* color_L.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = color_L.png; sourceTree = ""; }; - 633FEC791D3CD5570014B822 /* color_M.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = color_M.png; sourceTree = ""; }; - 633FEC7A1D3CD5570014B822 /* conference_exit_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = conference_exit_default.png; sourceTree = ""; }; - 633FEC7B1D3CD5570014B822 /* conference_exit_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "conference_exit_default@2x.png"; sourceTree = ""; }; - 633FEC7C1D3CD5570014B822 /* conference_exit_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = conference_exit_over.png; sourceTree = ""; }; - 633FEC7D1D3CD5570014B822 /* conference_exit_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "conference_exit_over@2x.png"; sourceTree = ""; }; - 633FEC7E1D3CD5570014B822 /* contact_add_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = contact_add_default.png; sourceTree = ""; }; - 633FEC7F1D3CD5570014B822 /* contact_add_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "contact_add_default@2x.png"; sourceTree = ""; }; - 633FEC801D3CD5570014B822 /* contact_add_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = contact_add_disabled.png; sourceTree = ""; }; - 633FEC811D3CD5570014B822 /* contact_add_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "contact_add_disabled@2x.png"; sourceTree = ""; }; - 633FEC821D3CD5570014B822 /* contacts_all_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = contacts_all_default.png; sourceTree = ""; }; - 633FEC831D3CD5570014B822 /* contacts_all_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "contacts_all_default@2x.png"; sourceTree = ""; }; - 633FEC841D3CD5570014B822 /* contacts_all_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = contacts_all_disabled.png; sourceTree = ""; }; - 633FEC851D3CD5570014B822 /* contacts_all_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "contacts_all_disabled@2x.png"; sourceTree = ""; }; - 633FEC861D3CD5570014B822 /* contacts_all_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = contacts_all_selected.png; sourceTree = ""; }; - 633FEC871D3CD5570014B822 /* contacts_all_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "contacts_all_selected@2x.png"; sourceTree = ""; }; - 633FEC8E1D3CD5570014B822 /* delete_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = delete_default.png; sourceTree = ""; }; - 633FEC8F1D3CD5570014B822 /* delete_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "delete_default@2x.png"; sourceTree = ""; }; - 633FEC901D3CD5570014B822 /* delete_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = delete_disabled.png; sourceTree = ""; }; - 633FEC911D3CD5570014B822 /* delete_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "delete_disabled@2x.png"; sourceTree = ""; }; - 633FEC921D3CD5570014B822 /* delete_field_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = delete_field_default.png; sourceTree = ""; }; - 633FEC931D3CD5570014B822 /* delete_field_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "delete_field_default@2x.png"; sourceTree = ""; }; - 633FEC941D3CD5570014B822 /* delete_field_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = delete_field_over.png; sourceTree = ""; }; - 633FEC951D3CD5570014B822 /* delete_field_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "delete_field_over@2x.png"; sourceTree = ""; }; - 633FEC961D3CD5570014B822 /* deselect_all.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = deselect_all.png; sourceTree = ""; }; - 633FEC971D3CD5570014B822 /* deselect_all@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "deselect_all@2x.png"; sourceTree = ""; }; - 633FEC981D3CD5570014B822 /* dialer_alt_back.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = dialer_alt_back.png; sourceTree = ""; }; - 633FEC991D3CD5570014B822 /* dialer_alt_back@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "dialer_alt_back@2x.png"; sourceTree = ""; }; - 633FEC9A1D3CD5570014B822 /* dialer_back_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = dialer_back_default.png; sourceTree = ""; }; - 633FEC9B1D3CD5570014B822 /* dialer_back_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "dialer_back_default@2x.png"; sourceTree = ""; }; - 633FEC9C1D3CD5570014B822 /* dialer_back_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = dialer_back_disabled.png; sourceTree = ""; }; - 633FEC9D1D3CD5570014B822 /* dialer_back_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "dialer_back_disabled@2x.png"; sourceTree = ""; }; - 633FECA01D3CD5570014B822 /* edit_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = edit_default.png; sourceTree = ""; }; - 633FECA11D3CD5570014B822 /* edit_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "edit_default@2x.png"; sourceTree = ""; }; - 633FECA21D3CD5570014B822 /* edit_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = edit_disabled.png; sourceTree = ""; }; - 633FECA31D3CD5570014B822 /* edit_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "edit_disabled@2x.png"; sourceTree = ""; }; - 633FECA41D3CD5570014B822 /* edit_list_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = edit_list_default.png; sourceTree = ""; }; - 633FECA51D3CD5570014B822 /* edit_list_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "edit_list_default@2x.png"; sourceTree = ""; }; - 633FECA61D3CD5570014B822 /* edit_list_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = edit_list_disabled.png; sourceTree = ""; }; - 633FECA71D3CD5570014B822 /* edit_list_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "edit_list_disabled@2x.png"; sourceTree = ""; }; - 633FECA81D3CD5570014B822 /* footer_chat_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = footer_chat_default.png; sourceTree = ""; }; - 633FECA91D3CD5570014B822 /* footer_chat_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "footer_chat_default@2x.png"; sourceTree = ""; }; - 633FECAA1D3CD5570014B822 /* footer_chat_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = footer_chat_disabled.png; sourceTree = ""; }; - 633FECAB1D3CD5570014B822 /* footer_chat_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "footer_chat_disabled@2x.png"; sourceTree = ""; }; - 633FECAC1D3CD5570014B822 /* footer_contacts_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = footer_contacts_default.png; sourceTree = ""; }; - 633FECAD1D3CD5570014B822 /* footer_contacts_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "footer_contacts_default@2x.png"; sourceTree = ""; }; - 633FECAE1D3CD5570014B822 /* footer_contacts_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = footer_contacts_disabled.png; sourceTree = ""; }; - 633FECAF1D3CD5570014B822 /* footer_contacts_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "footer_contacts_disabled@2x.png"; sourceTree = ""; }; - 633FECB01D3CD5570014B822 /* footer_dialer_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = footer_dialer_default.png; sourceTree = ""; }; - 633FECB11D3CD5570014B822 /* footer_dialer_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "footer_dialer_default@2x.png"; sourceTree = ""; }; - 633FECB21D3CD5570014B822 /* footer_dialer_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = footer_dialer_disabled.png; sourceTree = ""; }; - 633FECB31D3CD5570014B822 /* footer_dialer_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "footer_dialer_disabled@2x.png"; sourceTree = ""; }; - 633FECB41D3CD5570014B822 /* footer_history_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = footer_history_default.png; sourceTree = ""; }; - 633FECB51D3CD5570014B822 /* footer_history_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "footer_history_default@2x.png"; sourceTree = ""; }; - 633FECB61D3CD5570014B822 /* footer_history_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = footer_history_disabled.png; sourceTree = ""; }; - 633FECB71D3CD5570014B822 /* footer_history_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "footer_history_disabled@2x.png"; sourceTree = ""; }; - 633FECB81D3CD5570014B822 /* history_all_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = history_all_default.png; sourceTree = ""; }; - 633FECB91D3CD5570014B822 /* history_all_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "history_all_default@2x.png"; sourceTree = ""; }; - 633FECBA1D3CD5570014B822 /* history_all_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = history_all_disabled.png; sourceTree = ""; }; - 633FECBB1D3CD5570014B822 /* history_all_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "history_all_disabled@2x.png"; sourceTree = ""; }; - 633FECBC1D3CD5570014B822 /* history_all_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = history_all_selected.png; sourceTree = ""; }; - 633FECBD1D3CD5570014B822 /* history_all_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "history_all_selected@2x.png"; sourceTree = ""; }; - 633FECBE1D3CD5570014B822 /* history_chat_indicator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = history_chat_indicator.png; sourceTree = ""; }; - 633FECBF1D3CD5570014B822 /* history_chat_indicator@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "history_chat_indicator@2x.png"; sourceTree = ""; }; - 633FECC01D3CD5570014B822 /* history_missed_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = history_missed_default.png; sourceTree = ""; }; - 633FECC11D3CD5570014B822 /* history_missed_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "history_missed_default@2x.png"; sourceTree = ""; }; - 633FECC21D3CD5570014B822 /* history_missed_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = history_missed_disabled.png; sourceTree = ""; }; - 633FECC31D3CD5570014B822 /* history_missed_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "history_missed_disabled@2x.png"; sourceTree = ""; }; - 633FECC41D3CD5570014B822 /* history_missed_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = history_missed_selected.png; sourceTree = ""; }; - 633FECC51D3CD5570014B822 /* history_missed_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "history_missed_selected@2x.png"; sourceTree = ""; }; - 633FECC61D3CD5570014B822 /* led_connected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = led_connected.png; sourceTree = ""; }; - 633FECC71D3CD5570014B822 /* led_connected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "led_connected@2x.png"; sourceTree = ""; }; - 633FECC81D3CD5570014B822 /* led_disconnected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = led_disconnected.png; sourceTree = ""; }; - 633FECC91D3CD5570014B822 /* led_disconnected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "led_disconnected@2x.png"; sourceTree = ""; }; - 633FECCA1D3CD5570014B822 /* led_error.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = led_error.png; sourceTree = ""; }; - 633FECCB1D3CD5570014B822 /* led_error@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "led_error@2x.png"; sourceTree = ""; }; - 633FECCC1D3CD5570014B822 /* led_inprogress.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = led_inprogress.png; sourceTree = ""; }; - 633FECCD1D3CD5570014B822 /* led_inprogress@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "led_inprogress@2x.png"; sourceTree = ""; }; - 633FECD41D3CD5580014B822 /* list_details_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = list_details_default.png; sourceTree = ""; }; - 633FECD51D3CD5580014B822 /* list_details_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "list_details_default@2x.png"; sourceTree = ""; }; - 633FECD61D3CD5580014B822 /* list_details_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = list_details_over.png; sourceTree = ""; }; - 633FECD71D3CD5580014B822 /* list_details_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "list_details_over@2x.png"; sourceTree = ""; }; - 633FECD81D3CD5580014B822 /* menu.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu.png; sourceTree = ""; }; - 633FECD91D3CD5580014B822 /* menu@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu@2x.png"; sourceTree = ""; }; - 633FECDA1D3CD5580014B822 /* micro_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = micro_default.png; sourceTree = ""; }; - 633FECDB1D3CD5580014B822 /* micro_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "micro_default@2x.png"; sourceTree = ""; }; - 633FECDC1D3CD5580014B822 /* micro_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = micro_disabled.png; sourceTree = ""; }; - 633FECDD1D3CD5580014B822 /* micro_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "micro_disabled@2x.png"; sourceTree = ""; }; - 633FECDE1D3CD5580014B822 /* micro_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = micro_selected.png; sourceTree = ""; }; - 633FECDF1D3CD5580014B822 /* micro_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "micro_selected@2x.png"; sourceTree = ""; }; - 633FECE01D3CD5580014B822 /* nowebcamCIF.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = nowebcamCIF.jpg; sourceTree = ""; }; - 633FECE11D3CD5580014B822 /* numpad_0_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_0_default.png; sourceTree = ""; }; - 633FECE21D3CD5580014B822 /* numpad_0_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_0_default@2x.png"; sourceTree = ""; }; - 633FECE31D3CD5580014B822 /* numpad_0_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_0_over.png; sourceTree = ""; }; - 633FECE41D3CD5580014B822 /* numpad_0_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_0_over@2x.png"; sourceTree = ""; }; - 633FECE51D3CD5580014B822 /* numpad_0_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_0_over~ipad.png"; sourceTree = ""; }; - 633FECE61D3CD5580014B822 /* numpad_0_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_0_over~ipad@2x.png"; sourceTree = ""; }; - 633FECE71D3CD5580014B822 /* numpad_0~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_0~ipad.png"; sourceTree = ""; }; - 633FECE81D3CD5580014B822 /* numpad_0~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_0~ipad@2x.png"; sourceTree = ""; }; - 633FECE91D3CD5580014B822 /* numpad_1_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_1_default.png; sourceTree = ""; }; - 633FECEA1D3CD5580014B822 /* numpad_1_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_1_default@2x.png"; sourceTree = ""; }; - 633FECEB1D3CD5580014B822 /* numpad_1_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_1_over.png; sourceTree = ""; }; - 633FECEC1D3CD5580014B822 /* numpad_1_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_1_over@2x.png"; sourceTree = ""; }; - 633FECED1D3CD5580014B822 /* numpad_1_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_1_over~ipad.png"; sourceTree = ""; }; - 633FECEE1D3CD5580014B822 /* numpad_1_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_1_over~ipad@2x.png"; sourceTree = ""; }; - 633FECEF1D3CD5580014B822 /* numpad_1~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_1~ipad.png"; sourceTree = ""; }; - 633FECF01D3CD5580014B822 /* numpad_1~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_1~ipad@2x.png"; sourceTree = ""; }; - 633FECF11D3CD5580014B822 /* numpad_2_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_2_default.png; sourceTree = ""; }; - 633FECF21D3CD5580014B822 /* numpad_2_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_2_default@2x.png"; sourceTree = ""; }; - 633FECF31D3CD5580014B822 /* numpad_2_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_2_over.png; sourceTree = ""; }; - 633FECF41D3CD5580014B822 /* numpad_2_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_2_over@2x.png"; sourceTree = ""; }; - 633FECF51D3CD5580014B822 /* numpad_2_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_2_over~ipad.png"; sourceTree = ""; }; - 633FECF61D3CD5580014B822 /* numpad_2_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_2_over~ipad@2x.png"; sourceTree = ""; }; - 633FECF71D3CD5580014B822 /* numpad_2~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_2~ipad.png"; sourceTree = ""; }; - 633FECF81D3CD5580014B822 /* numpad_2~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_2~ipad@2x.png"; sourceTree = ""; }; - 633FECF91D3CD5580014B822 /* numpad_3_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_3_default.png; sourceTree = ""; }; - 633FECFA1D3CD5580014B822 /* numpad_3_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_3_default@2x.png"; sourceTree = ""; }; - 633FECFB1D3CD5580014B822 /* numpad_3_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_3_over.png; sourceTree = ""; }; - 633FECFC1D3CD5580014B822 /* numpad_3_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_3_over@2x.png"; sourceTree = ""; }; - 633FECFD1D3CD5580014B822 /* numpad_3_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_3_over~ipad.png"; sourceTree = ""; }; - 633FECFE1D3CD5580014B822 /* numpad_3_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_3_over~ipad@2x.png"; sourceTree = ""; }; - 633FECFF1D3CD5580014B822 /* numpad_3~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_3~ipad.png"; sourceTree = ""; }; - 633FED001D3CD5580014B822 /* numpad_3~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_3~ipad@2x.png"; sourceTree = ""; }; - 633FED011D3CD5580014B822 /* numpad_4_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_4_default.png; sourceTree = ""; }; - 633FED021D3CD5580014B822 /* numpad_4_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_4_default@2x.png"; sourceTree = ""; }; - 633FED031D3CD5580014B822 /* numpad_4_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_4_over.png; sourceTree = ""; }; - 633FED041D3CD5580014B822 /* numpad_4_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_4_over@2x.png"; sourceTree = ""; }; - 633FED051D3CD5580014B822 /* numpad_4_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_4_over~ipad.png"; sourceTree = ""; }; - 633FED061D3CD5580014B822 /* numpad_4_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_4_over~ipad@2x.png"; sourceTree = ""; }; - 633FED071D3CD5580014B822 /* numpad_4~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_4~ipad.png"; sourceTree = ""; }; - 633FED081D3CD5580014B822 /* numpad_4~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_4~ipad@2x.png"; sourceTree = ""; }; - 633FED091D3CD5580014B822 /* numpad_5_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_5_default.png; sourceTree = ""; }; - 633FED0A1D3CD5580014B822 /* numpad_5_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_5_default@2x.png"; sourceTree = ""; }; - 633FED0B1D3CD5580014B822 /* numpad_5_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_5_over.png; sourceTree = ""; }; - 633FED0C1D3CD5580014B822 /* numpad_5_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_5_over@2x.png"; sourceTree = ""; }; - 633FED0D1D3CD5580014B822 /* numpad_5_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_5_over~ipad.png"; sourceTree = ""; }; - 633FED0E1D3CD5580014B822 /* numpad_5_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_5_over~ipad@2x.png"; sourceTree = ""; }; - 633FED0F1D3CD5580014B822 /* numpad_5~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_5~ipad.png"; sourceTree = ""; }; - 633FED101D3CD5580014B822 /* numpad_5~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_5~ipad@2x.png"; sourceTree = ""; }; - 633FED111D3CD5580014B822 /* numpad_6_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_6_default.png; sourceTree = ""; }; - 633FED121D3CD5580014B822 /* numpad_6_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_6_default@2x.png"; sourceTree = ""; }; - 633FED131D3CD5580014B822 /* numpad_6_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_6_over.png; sourceTree = ""; }; - 633FED141D3CD5580014B822 /* numpad_6_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_6_over@2x.png"; sourceTree = ""; }; - 633FED151D3CD5580014B822 /* numpad_6_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_6_over~ipad.png"; sourceTree = ""; }; - 633FED161D3CD5580014B822 /* numpad_6_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_6_over~ipad@2x.png"; sourceTree = ""; }; - 633FED171D3CD5580014B822 /* numpad_6~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_6~ipad.png"; sourceTree = ""; }; - 633FED181D3CD5580014B822 /* numpad_6~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_6~ipad@2x.png"; sourceTree = ""; }; - 633FED191D3CD5580014B822 /* numpad_7_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_7_default.png; sourceTree = ""; }; - 633FED1A1D3CD5580014B822 /* numpad_7_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_7_default@2x.png"; sourceTree = ""; }; - 633FED1B1D3CD5580014B822 /* numpad_7_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_7_over.png; sourceTree = ""; }; - 633FED1C1D3CD5580014B822 /* numpad_7_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_7_over@2x.png"; sourceTree = ""; }; - 633FED1D1D3CD5580014B822 /* numpad_7_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_7_over~ipad.png"; sourceTree = ""; }; - 633FED1E1D3CD5580014B822 /* numpad_7_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_7_over~ipad@2x.png"; sourceTree = ""; }; - 633FED1F1D3CD5580014B822 /* numpad_7~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_7~ipad.png"; sourceTree = ""; }; - 633FED201D3CD5580014B822 /* numpad_7~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_7~ipad@2x.png"; sourceTree = ""; }; - 633FED211D3CD5580014B822 /* numpad_8_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_8_default.png; sourceTree = ""; }; - 633FED221D3CD5580014B822 /* numpad_8_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_8_default@2x.png"; sourceTree = ""; }; - 633FED231D3CD5580014B822 /* numpad_8_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_8_over.png; sourceTree = ""; }; - 633FED241D3CD5580014B822 /* numpad_8_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_8_over@2x.png"; sourceTree = ""; }; - 633FED251D3CD5580014B822 /* numpad_8_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_8_over~ipad.png"; sourceTree = ""; }; - 633FED261D3CD5580014B822 /* numpad_8_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_8_over~ipad@2x.png"; sourceTree = ""; }; - 633FED271D3CD5580014B822 /* numpad_8~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_8~ipad.png"; sourceTree = ""; }; - 633FED281D3CD5580014B822 /* numpad_8~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_8~ipad@2x.png"; sourceTree = ""; }; - 633FED291D3CD5580014B822 /* numpad_9_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_9_default.png; sourceTree = ""; }; - 633FED2A1D3CD5580014B822 /* numpad_9_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_9_default@2x.png"; sourceTree = ""; }; - 633FED2B1D3CD5580014B822 /* numpad_9_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_9_over.png; sourceTree = ""; }; - 633FED2C1D3CD5580014B822 /* numpad_9_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_9_over@2x.png"; sourceTree = ""; }; - 633FED2D1D3CD5580014B822 /* numpad_9_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_9_over~ipad.png"; sourceTree = ""; }; - 633FED2E1D3CD5580014B822 /* numpad_9_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_9_over~ipad@2x.png"; sourceTree = ""; }; - 633FED2F1D3CD5580014B822 /* numpad_9~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_9~ipad.png"; sourceTree = ""; }; - 633FED301D3CD5580014B822 /* numpad_9~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_9~ipad@2x.png"; sourceTree = ""; }; - 633FED311D3CD5580014B822 /* numpad_hash_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_hash_default.png; sourceTree = ""; }; - 633FED321D3CD5580014B822 /* numpad_hash_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_hash_default@2x.png"; sourceTree = ""; }; - 633FED331D3CD5580014B822 /* numpad_hash_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_hash_over.png; sourceTree = ""; }; - 633FED341D3CD5580014B822 /* numpad_hash_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_hash_over@2x.png"; sourceTree = ""; }; - 633FED351D3CD5580014B822 /* numpad_hash_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_hash_over~ipad.png"; sourceTree = ""; }; - 633FED361D3CD5580014B822 /* numpad_hash_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_hash_over~ipad@2x.png"; sourceTree = ""; }; - 633FED371D3CD5580014B822 /* numpad_hash~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_hash~ipad.png"; sourceTree = ""; }; - 633FED381D3CD5580014B822 /* numpad_hash~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_hash~ipad@2x.png"; sourceTree = ""; }; - 633FED391D3CD5580014B822 /* numpad_over_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_over_background.png; sourceTree = ""; }; - 633FED3A1D3CD5580014B822 /* numpad_star_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_star_default.png; sourceTree = ""; }; - 633FED3B1D3CD5580014B822 /* numpad_star_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_star_default@2x.png"; sourceTree = ""; }; - 633FED3C1D3CD5580014B822 /* numpad_star_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_star_over.png; sourceTree = ""; }; - 633FED3D1D3CD5580014B822 /* numpad_star_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_star_over@2x.png"; sourceTree = ""; }; - 633FED3E1D3CD5580014B822 /* numpad_star_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_star_over~ipad.png"; sourceTree = ""; }; - 633FED3F1D3CD5580014B822 /* numpad_star_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_star_over~ipad@2x.png"; sourceTree = ""; }; - 633FED401D3CD5580014B822 /* numpad_star~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_star~ipad.png"; sourceTree = ""; }; - 633FED411D3CD5580014B822 /* numpad_star~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_star~ipad@2x.png"; sourceTree = ""; }; - 633FED421D3CD5580014B822 /* options_add_call_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = options_add_call_default.png; sourceTree = ""; }; - 633FED431D3CD5580014B822 /* options_add_call_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "options_add_call_default@2x.png"; sourceTree = ""; }; - 633FED441D3CD5580014B822 /* options_add_call_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = options_add_call_disabled.png; sourceTree = ""; }; - 633FED451D3CD5580014B822 /* options_add_call_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "options_add_call_disabled@2x.png"; sourceTree = ""; }; - 633FED461D3CD5580014B822 /* options_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = options_default.png; sourceTree = ""; }; - 633FED471D3CD5580014B822 /* options_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "options_default@2x.png"; sourceTree = ""; }; - 633FED481D3CD5580014B822 /* options_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = options_disabled.png; sourceTree = ""; }; - 633FED491D3CD5580014B822 /* options_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "options_disabled@2x.png"; sourceTree = ""; }; - 633FED4A1D3CD5580014B822 /* options_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = options_selected.png; sourceTree = ""; }; - 633FED4B1D3CD5580014B822 /* options_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "options_selected@2x.png"; sourceTree = ""; }; - 633FED4C1D3CD5580014B822 /* options_start_conference_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = options_start_conference_default.png; sourceTree = ""; }; - 633FED4D1D3CD5580014B822 /* options_start_conference_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "options_start_conference_default@2x.png"; sourceTree = ""; }; - 633FED4E1D3CD5580014B822 /* options_start_conference_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = options_start_conference_disabled.png; sourceTree = ""; }; - 633FED4F1D3CD5580014B822 /* options_start_conference_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "options_start_conference_disabled@2x.png"; sourceTree = ""; }; - 633FED501D3CD5580014B822 /* options_transfer_call_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = options_transfer_call_default.png; sourceTree = ""; }; - 633FED511D3CD5580014B822 /* options_transfer_call_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "options_transfer_call_default@2x.png"; sourceTree = ""; }; - 633FED521D3CD5580014B822 /* options_transfer_call_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = options_transfer_call_disabled.png; sourceTree = ""; }; - 633FED531D3CD5580014B822 /* options_transfer_call_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "options_transfer_call_disabled@2x.png"; sourceTree = ""; }; - 633FED541D3CD5580014B822 /* pause_big_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pause_big_default.png; sourceTree = ""; }; - 633FED551D3CD5580014B822 /* pause_big_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pause_big_default@2x.png"; sourceTree = ""; }; - 633FED561D3CD5580014B822 /* pause_big_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pause_big_disabled.png; sourceTree = ""; }; - 633FED571D3CD5580014B822 /* pause_big_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pause_big_disabled@2x.png"; sourceTree = ""; }; - 633FED581D3CD5580014B822 /* pause_big_over_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pause_big_over_selected.png; sourceTree = ""; }; - 633FED591D3CD5580014B822 /* pause_big_over_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pause_big_over_selected@2x.png"; sourceTree = ""; }; - 633FED5A1D3CD5580014B822 /* pause_small_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pause_small_default.png; sourceTree = ""; }; - 633FED5B1D3CD5590014B822 /* pause_small_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pause_small_default@2x.png"; sourceTree = ""; }; - 633FED5C1D3CD5590014B822 /* pause_small_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pause_small_disabled.png; sourceTree = ""; }; - 633FED5D1D3CD5590014B822 /* pause_small_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pause_small_disabled@2x.png"; sourceTree = ""; }; - 633FED5E1D3CD5590014B822 /* pause_small_over_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pause_small_over_selected.png; sourceTree = ""; }; - 633FED5F1D3CD5590014B822 /* pause_small_over_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pause_small_over_selected@2x.png"; sourceTree = ""; }; - 633FED601D3CD5590014B822 /* presence_away.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = presence_away.png; sourceTree = ""; }; - 633FED611D3CD5590014B822 /* presence_away@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "presence_away@2x.png"; sourceTree = ""; }; - 633FED621D3CD5590014B822 /* presence_offline.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = presence_offline.png; sourceTree = ""; }; - 633FED631D3CD5590014B822 /* presence_offline@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "presence_offline@2x.png"; sourceTree = ""; }; - 633FED641D3CD5590014B822 /* presence_online.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = presence_online.png; sourceTree = ""; }; - 633FED651D3CD5590014B822 /* presence_online@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "presence_online@2x.png"; sourceTree = ""; }; - 633FED661D3CD5590014B822 /* presence_unregistered.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = presence_unregistered.png; sourceTree = ""; }; - 633FED671D3CD5590014B822 /* presence_unregistered@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "presence_unregistered@2x.png"; sourceTree = ""; }; - 633FED681D3CD5590014B822 /* route_bluetooth_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route_bluetooth_default.png; sourceTree = ""; }; - 633FED691D3CD5590014B822 /* route_bluetooth_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "route_bluetooth_default@2x.png"; sourceTree = ""; }; - 633FED6A1D3CD5590014B822 /* route_bluetooth_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route_bluetooth_disabled.png; sourceTree = ""; }; - 633FED6B1D3CD5590014B822 /* route_bluetooth_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "route_bluetooth_disabled@2x.png"; sourceTree = ""; }; - 633FED6C1D3CD5590014B822 /* route_bluetooth_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route_bluetooth_selected.png; sourceTree = ""; }; - 633FED6D1D3CD5590014B822 /* route_bluetooth_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "route_bluetooth_selected@2x.png"; sourceTree = ""; }; - 633FED6E1D3CD5590014B822 /* route_earpiece_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route_earpiece_default.png; sourceTree = ""; }; - 633FED6F1D3CD5590014B822 /* route_earpiece_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "route_earpiece_default@2x.png"; sourceTree = ""; }; - 633FED701D3CD5590014B822 /* route_earpiece_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route_earpiece_disabled.png; sourceTree = ""; }; - 633FED711D3CD5590014B822 /* route_earpiece_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "route_earpiece_disabled@2x.png"; sourceTree = ""; }; - 633FED721D3CD5590014B822 /* route_earpiece_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route_earpiece_selected.png; sourceTree = ""; }; - 633FED731D3CD5590014B822 /* route_earpiece_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "route_earpiece_selected@2x.png"; sourceTree = ""; }; - 633FED741D3CD5590014B822 /* route_speaker_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route_speaker_default.png; sourceTree = ""; }; - 633FED751D3CD5590014B822 /* route_speaker_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "route_speaker_default@2x.png"; sourceTree = ""; }; - 633FED761D3CD5590014B822 /* route_speaker_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route_speaker_disabled.png; sourceTree = ""; }; - 633FED771D3CD5590014B822 /* route_speaker_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "route_speaker_disabled@2x.png"; sourceTree = ""; }; - 633FED781D3CD5590014B822 /* route_speaker_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route_speaker_selected.png; sourceTree = ""; }; - 633FED791D3CD5590014B822 /* route_speaker_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "route_speaker_selected@2x.png"; sourceTree = ""; }; - 633FED7A1D3CD5590014B822 /* routes_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = routes_default.png; sourceTree = ""; }; - 633FED7B1D3CD5590014B822 /* routes_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "routes_default@2x.png"; sourceTree = ""; }; - 633FED7C1D3CD5590014B822 /* routes_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = routes_disabled.png; sourceTree = ""; }; - 633FED7D1D3CD5590014B822 /* routes_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "routes_disabled@2x.png"; sourceTree = ""; }; - 633FED7E1D3CD5590014B822 /* routes_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = routes_selected.png; sourceTree = ""; }; - 633FED7F1D3CD5590014B822 /* routes_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "routes_selected@2x.png"; sourceTree = ""; }; - 633FED801D3CD5590014B822 /* security_ko.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = security_ko.png; sourceTree = ""; }; - 633FED811D3CD5590014B822 /* security_ko@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "security_ko@2x.png"; sourceTree = ""; }; - 633FED821D3CD5590014B822 /* security_ok.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = security_ok.png; sourceTree = ""; }; - 633FED831D3CD5590014B822 /* security_ok@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "security_ok@2x.png"; sourceTree = ""; }; - 633FED841D3CD5590014B822 /* security_pending.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = security_pending.png; sourceTree = ""; }; - 633FED851D3CD5590014B822 /* security_pending@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "security_pending@2x.png"; sourceTree = ""; }; - 633FED861D3CD5590014B822 /* select_all_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = select_all_default.png; sourceTree = ""; }; - 633FED871D3CD5590014B822 /* select_all_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "select_all_default@2x.png"; sourceTree = ""; }; - 633FED881D3CD5590014B822 /* select_all_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = select_all_disabled.png; sourceTree = ""; }; - 633FED891D3CD5590014B822 /* select_all_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "select_all_disabled@2x.png"; sourceTree = ""; }; - 633FED8A1D3CD5590014B822 /* speaker_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = speaker_default.png; sourceTree = ""; }; - 633FED8B1D3CD5590014B822 /* speaker_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "speaker_default@2x.png"; sourceTree = ""; }; - 633FED8C1D3CD5590014B822 /* speaker_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = speaker_disabled.png; sourceTree = ""; }; - 633FED8D1D3CD5590014B822 /* speaker_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "speaker_disabled@2x.png"; sourceTree = ""; }; - 633FED8E1D3CD5590014B822 /* speaker_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = speaker_selected.png; sourceTree = ""; }; - 633FED8F1D3CD5590014B822 /* speaker_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "speaker_selected@2x.png"; sourceTree = ""; }; - 633FED941D3CD5590014B822 /* valid_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = valid_default.png; sourceTree = ""; }; - 633FED951D3CD5590014B822 /* valid_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "valid_default@2x.png"; sourceTree = ""; }; - 633FED961D3CD5590014B822 /* valid_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = valid_disabled.png; sourceTree = ""; }; - 633FED971D3CD5590014B822 /* valid_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "valid_disabled@2x.png"; sourceTree = ""; }; - 633FED981D3CD5590014B822 /* voicemail.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voicemail.png; sourceTree = ""; }; - 633FED991D3CD5590014B822 /* voicemail@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "voicemail@2x.png"; sourceTree = ""; }; - 633FED9A1D3CD5590014B822 /* waiting_time.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = waiting_time.png; sourceTree = ""; }; - 633FED9B1D3CD5590014B822 /* waiting_time@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "waiting_time@2x.png"; sourceTree = ""; }; - 633FEF561D3CD5E00014B822 /* UIAvatarPresence.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIAvatarPresence.h; sourceTree = ""; }; - 633FEF571D3CD5E00014B822 /* UIAvatarPresence.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIAvatarPresence.m; sourceTree = ""; }; - 6341807A1BBC103100F71761 /* ChatConversationCreateTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChatConversationCreateTableView.h; sourceTree = ""; }; - 6341807B1BBC103100F71761 /* ChatConversationCreateTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ChatConversationCreateTableView.m; sourceTree = ""; }; - 63423C081C4501D000D9A050 /* Contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Contact.h; sourceTree = ""; }; - 63423C091C4501D000D9A050 /* Contact.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Contact.m; sourceTree = ""; }; - 634610041B61330300548952 /* UILabel+Boldify.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UILabel+Boldify.h"; sourceTree = ""; }; - 634610051B61330300548952 /* UILabel+Boldify.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UILabel+Boldify.m"; sourceTree = ""; }; - 635173F71BA082A40095EB0A /* UIChatBubblePhotoCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIChatBubblePhotoCell.h; sourceTree = ""; }; - 635173F81BA082A40095EB0A /* UIChatBubblePhotoCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIChatBubblePhotoCell.m; sourceTree = ""; }; - 635775231B6673EC00C8B704 /* HistoryDetailsTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HistoryDetailsTableView.h; sourceTree = ""; }; - 635775241B6673EC00C8B704 /* HistoryDetailsTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HistoryDetailsTableView.m; sourceTree = ""; }; - 636316D21A1DEBCB0009B839 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/AboutView.xib; sourceTree = ""; }; - 636316D51A1DEC650009B839 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/SettingsView.xib; sourceTree = ""; }; - 636316DB1A1DEDD80009B839 /* ru */ = {isa = PBXFileReference; fileEncoding = 2483028224; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/HistoryDetailsView.strings; sourceTree = ""; }; - 636BC9951B5F921B00C754CE /* UIIconButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIIconButton.h; sourceTree = ""; }; - 636BC9961B5F921B00C754CE /* UIIconButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIIconButton.m; sourceTree = ""; }; - 63701DDD1BA32039006A9AE3 /* UIConfirmationDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIConfirmationDialog.h; sourceTree = ""; }; - 63701DDE1BA32039006A9AE3 /* UIConfirmationDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIConfirmationDialog.m; sourceTree = ""; }; - 6371579F1B283FE200C91677 /* FileTransferDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FileTransferDelegate.h; path = Utils/FileTransferDelegate.h; sourceTree = ""; }; - 637157A01B283FE200C91677 /* FileTransferDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FileTransferDelegate.m; path = Utils/FileTransferDelegate.m; sourceTree = ""; }; - 6377AC7E1BDE4068007F7625 /* UIBackToCallButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIBackToCallButton.h; sourceTree = ""; }; - 6377AC7F1BDE4069007F7625 /* UIBackToCallButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIBackToCallButton.m; sourceTree = ""; }; - 6381DA7B1C1AD5EA00DF3BBD /* UIBouncingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIBouncingView.h; sourceTree = ""; }; - 6381DA7C1C1AD5EA00DF3BBD /* UIBouncingView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIBouncingView.m; sourceTree = ""; }; - 638F1A611C2021B2004B8E02 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = "Base.lproj/DialerView~ipad.xib"; sourceTree = ""; }; - 638F1A901C21993D004B8E02 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = "Base.lproj/UICompositeView~ipad.xib"; sourceTree = ""; }; - 639CEAFE1A1DF4D9004DE38F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/StatusBarView.xib; sourceTree = ""; }; - 639CEB011A1DF4E4004DE38F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIHistoryCell.xib; sourceTree = ""; }; - 639CEB041A1DF4EB004DE38F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UICompositeView.xib; sourceTree = ""; }; - 639CEB0A1A1DF4FA004DE38F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIChatCell.xib; sourceTree = ""; }; - 639E9C7E1C0DB13D00019A75 /* UICheckBoxTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UICheckBoxTableView.h; sourceTree = ""; }; - 639E9C7F1C0DB13D00019A75 /* UICheckBoxTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UICheckBoxTableView.m; sourceTree = ""; }; - 639E9C941C0DB7BE00019A75 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/FirstLoginView.xib; sourceTree = ""; }; - 639E9CA11C0DB7E500019A75 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIChatBubblePhotoCell.xib; sourceTree = ""; }; - 639E9CA41C0DB7EA00019A75 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIChatBubbleTextCell.xib; sourceTree = ""; }; - 639E9CA71C0DB7F200019A75 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIChatCreateCell.xib; sourceTree = ""; }; - 639E9CAA1C0DB7FB00019A75 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIConfirmationDialog.xib; sourceTree = ""; }; - 639E9CAD1C0DB80300019A75 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIContactDetailsCell.xib; sourceTree = ""; }; - 639E9CB11C0DB83000019A75 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/SideMenuView.xib; sourceTree = ""; }; - 639E9CB41C0DB88200019A75 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/PhoneMainView.xib; sourceTree = ""; }; - 63AADBC51B6A0FF200AA16FD /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Localizable.strings; sourceTree = ""; }; - 63AADBC61B6A0FF200AA16FD /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; - 63AADBC71B6A0FF200AA16FD /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; - 63AADBCA1B6A0FF200AA16FD /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - 63AADBCB1B6A0FF200AA16FD /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; - 63AADBD71B6A0FF200AA16FD /* linphonerc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = linphonerc; sourceTree = ""; }; - 63AADBD81B6A0FF200AA16FD /* linphonerc-factory */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "linphonerc-factory"; sourceTree = ""; }; - 63AADBDA1B6A0FF200AA16FD /* linphonerc~ipad */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "linphonerc~ipad"; sourceTree = ""; }; - 63AADBDD1B6A0FF200AA16FD /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; }; - 63AADBE11B6A0FF200AA16FD /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; - 63AADBE31B6A0FF200AA16FD /* assistant_external_sip.rc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = assistant_external_sip.rc; sourceTree = ""; }; - 63AADBE41B6A0FF200AA16FD /* assistant_linphone_create.rc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = assistant_linphone_create.rc; sourceTree = ""; }; - 63AADBE51B6A0FF200AA16FD /* assistant_linphone_existing.rc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = assistant_linphone_existing.rc; sourceTree = ""; }; - 63AADBE61B6A0FF200AA16FD /* assistant_remote.rc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = assistant_remote.rc; sourceTree = ""; }; - 63B81A031B57DA33009604A6 /* LICENSE.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE.txt; sourceTree = ""; }; - 63B81A041B57DA33009604A6 /* TPKeyboardAvoidingCollectionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TPKeyboardAvoidingCollectionView.h; sourceTree = ""; }; - 63B81A051B57DA33009604A6 /* TPKeyboardAvoidingCollectionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TPKeyboardAvoidingCollectionView.m; sourceTree = ""; }; - 63B81A061B57DA33009604A6 /* TPKeyboardAvoidingScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TPKeyboardAvoidingScrollView.h; sourceTree = ""; }; - 63B81A071B57DA33009604A6 /* TPKeyboardAvoidingScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TPKeyboardAvoidingScrollView.m; sourceTree = ""; }; - 63B81A081B57DA33009604A6 /* TPKeyboardAvoidingTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TPKeyboardAvoidingTableView.h; sourceTree = ""; }; - 63B81A091B57DA33009604A6 /* TPKeyboardAvoidingTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TPKeyboardAvoidingTableView.m; sourceTree = ""; }; - 63B81A0A1B57DA33009604A6 /* UIScrollView+TPKeyboardAvoidingAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIScrollView+TPKeyboardAvoidingAdditions.h"; sourceTree = ""; }; - 63B81A0B1B57DA33009604A6 /* UIScrollView+TPKeyboardAvoidingAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIScrollView+TPKeyboardAvoidingAdditions.m"; sourceTree = ""; }; - 63B8D68D1BCBE65600C12B09 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ChatConversationCreateView.xib; sourceTree = ""; }; - 63B8D69F1BCBF43100C12B09 /* UIChatCreateCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIChatCreateCell.h; sourceTree = ""; }; - 63B8D6A01BCBF43100C12B09 /* UIChatCreateCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIChatCreateCell.m; sourceTree = ""; }; - 63BE7A761D75BDF6000990EF /* ShopTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShopTableView.h; sourceTree = ""; }; - 63BE7A771D75BDF6000990EF /* ShopTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ShopTableView.m; sourceTree = ""; }; - 63C441C11BBC23ED0053DC5E /* UIAssistantTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIAssistantTextField.h; sourceTree = ""; }; - 63C441C21BBC23ED0053DC5E /* UIAssistantTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIAssistantTextField.m; sourceTree = ""; }; - 63CD4B4D1A5AAC8C00B84282 /* DTAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DTAlertView.h; sourceTree = ""; }; - 63CD4B4E1A5AAC8C00B84282 /* DTAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DTAlertView.m; sourceTree = ""; }; - 63CDC4531C3BDE370085F529 /* msg.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = msg.caf; sourceTree = ""; }; - 63CDC4541C3BDE370085F529 /* ringback.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = ringback.wav; sourceTree = ""; }; - 63CDC45C1C3BDE370085F529 /* shortring.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = shortring.caf; sourceTree = ""; }; - 63CE583F1C85EBF400304800 /* VideoToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VideoToolbox.framework; path = System/Library/Frameworks/VideoToolbox.framework; sourceTree = SDKROOT; }; - 63D11C521C3D501200E8FCEE /* Log.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Log.m; path = Utils/Log.m; sourceTree = ""; }; - 63D11C541C3D503A00E8FCEE /* Log.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Log.h; sourceTree = ""; }; - 63DFE0451C40161700DA5E87 /* notes_of_the_optimistic.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = notes_of_the_optimistic.caf; sourceTree = ""; }; - 63E27A311C4FECD000D332AE /* LaunchScreen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LaunchScreen.xib; sourceTree = ""; }; - 63E27A511C50EB2700D332AE /* hold.mkv */ = {isa = PBXFileReference; lastKnownFileType = file; path = hold.mkv; sourceTree = ""; }; - 63E59A3D1ADE6ECB00646FB3 /* InAppProductsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InAppProductsManager.h; sourceTree = ""; }; - 63E59A3E1ADE70D900646FB3 /* InAppProductsManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InAppProductsManager.m; sourceTree = ""; }; - 63EC8D3A1D7438660066547B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/AssistantLinkView.xib; sourceTree = ""; }; - 63EEE4091BBA9B110087D3AF /* libxml2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libxml2.tbd; path = usr/lib/libxml2.tbd; sourceTree = SDKROOT; }; - 63EEE40B1BBA9B1B0087D3AF /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; - 63EEE40D1BBA9B250087D3AF /* libiconv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libiconv.tbd; path = usr/lib/libiconv.tbd; sourceTree = SDKROOT; }; - 63F1DF421BCE618E00EDED90 /* UIAddressTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIAddressTextField.h; sourceTree = ""; }; - 63F1DF431BCE618E00EDED90 /* UIAddressTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIAddressTextField.m; 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 = ""; }; - 662553B327EDFB35007F67D8 /* MagicSearch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagicSearch.swift; sourceTree = ""; }; - 662B73322A73C331002135F3 /* CopyableLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CopyableLabel.swift; sourceTree = ""; }; - 662F13B52887E8A10084C28C /* UITestsUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITestsUtils.swift; sourceTree = ""; }; - 6637AF8D288593AF00965733 /* CallUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CallUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 6637AF8F288593AF00965733 /* IncomingCallUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IncomingCallUITests.swift; sourceTree = ""; }; - 663B06592886B54F00E41889 /* OutgoingCallUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OutgoingCallUITests.swift; sourceTree = ""; }; - 663B065B2886DA8500E41889 /* ActiveCallViewUITestsMethods.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActiveCallViewUITestsMethods.swift; sourceTree = ""; }; - 663B065F2886E38100E41889 /* ActiveCallUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActiveCallUITests.swift; sourceTree = ""; }; - 663B06652886F0DB00E41889 /* ExtraMenuUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtraMenuUITests.swift; sourceTree = ""; }; - 663B06672886F16300E41889 /* ExtraMenuActiveCallActionsUITestsMethods.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtraMenuActiveCallActionsUITestsMethods.swift; sourceTree = ""; }; - 6643AD51287EF56200701703 /* UITestsCoreManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITestsCoreManager.swift; sourceTree = ""; }; - 6643AD54287F25A500701703 /* IncomingOutgoingCallViewUITestsMethods.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IncomingOutgoingCallViewUITestsMethods.swift; sourceTree = ""; }; - 66495D0B28901429002780DE /* Default.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = Default.xctestplan; sourceTree = ""; }; - 66495D0C289014E2002780DE /* PauseMode_extended.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = PauseMode_extended.xctestplan; sourceTree = ""; }; - 664F8220289A66ED00D8C470 /* Debug.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = Debug.xctestplan; sourceTree = ""; }; - 66689D3F28A2443A0054E633 /* UITestsScreenshots.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITestsScreenshots.swift; sourceTree = ""; }; - 666D795C283E67E300B07215 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; - 667A423B293A4BAD00C4306C /* post_quantum_secure@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "post_quantum_secure@3x.png"; sourceTree = ""; }; - 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 = ""; }; - 66E399F52857869200E73456 /* menu_notifications_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_notifications_off.png; sourceTree = ""; }; - 66E399F62857869200E73456 /* menu_notifications_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_notifications_on.png; sourceTree = ""; }; - 66EADAF62A939485002DDCEE /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; }; - 66EADAF72A939485002DDCEE /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; - 66EADAF82A939486002DDCEE /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; }; - 66EADAF92A939486002DDCEE /* pt_BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt_BR; path = pt_BR.lproj/Localizable.strings; sourceTree = ""; }; - 66EADAFA2A939486002DDCEE /* zh_TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh_TW; path = zh_TW.lproj/Localizable.strings; sourceTree = ""; }; - 66EADAFB2A939486002DDCEE /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; - 66EADAFC2A939486002DDCEE /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Localizable.strings; sourceTree = ""; }; - 66EADAFD2A939486002DDCEE /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = ""; }; - 66EADAFE2A939487002DDCEE /* ka */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ka; path = ka.lproj/Localizable.strings; sourceTree = ""; }; - 66EADAFF2A939487002DDCEE /* es_AR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es_AR; path = es_AR.lproj/Localizable.strings; sourceTree = ""; }; - 66EADB002A939487002DDCEE /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = ""; }; - 66EADB012A939487002DDCEE /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; - 66EADB022A939487002DDCEE /* zh_CN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh_CN; path = zh_CN.lproj/Localizable.strings; 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; }; - 8C1A1F7C1FA331D40064BE00 /* libsoci_sqlite3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsoci_sqlite3.a; path = "liblinphone-sdk/apple-darwin/lib/libsoci_sqlite3.a"; sourceTree = ""; }; - 8C23BCB71D82AAC3005F19BB /* linphone.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = linphone.entitlements; sourceTree = ""; }; - 8C2595DE1DEDCC8E007A6424 /* CallKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CallKit.framework; path = System/Library/Frameworks/CallKit.framework; sourceTree = SDKROOT; }; - 8C2A81931F87B7FF0012A66B /* chat_group_avatar@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_group_avatar@2x.png"; sourceTree = ""; }; - 8C2A81941F87B8000012A66B /* chat_group_avatar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_group_avatar.png; sourceTree = ""; }; - 8C300D981E40E0CC00728EF3 /* lime_ko.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = lime_ko.png; sourceTree = ""; }; - 8C300D991E40E0CC00728EF3 /* lime_ko@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "lime_ko@2x.png"; sourceTree = ""; }; - 8C3EAA191EB8D9C300B732B6 /* linphonetester.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = linphonetester.framework; path = "liblinphone-sdk/apple-darwin/Frameworks/linphonetester.framework"; sourceTree = ""; }; - 8C5BCEC61EB3859200A9AAEF /* bctoolbox-tester.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = "bctoolbox-tester.framework"; path = "liblinphone-sdk/apple-darwin/Frameworks/bctoolbox-tester.framework"; sourceTree = ""; }; - 8C5D1B991D9BC48100DC6539 /* UIShopTableCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIShopTableCell.h; sourceTree = ""; }; - 8C5D1B9B1D9BC48100DC6539 /* UIShopTableCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UIShopTableCell.xib; sourceTree = ""; }; - 8C73477B1D9BA3A00022EE8C /* UserNotifications.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotifications.framework; path = System/Library/Frameworks/UserNotifications.framework; sourceTree = SDKROOT; }; - 8C92ABE71FA773190006FB5D /* UIChatNotifiedEventCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UIChatNotifiedEventCell.xib; sourceTree = ""; }; - 8C92ABF11FA773C20006FB5D /* UIChatNotifiedEventCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIChatNotifiedEventCell.h; sourceTree = ""; }; - 8C92ABF21FA773E50006FB5D /* UIChatNotifiedEventCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UIChatNotifiedEventCell.m; sourceTree = ""; }; - 8C9C5E0B1F83B2EF006987FA /* ChatConversationCreateCollectionViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ChatConversationCreateCollectionViewController.h; sourceTree = ""; }; - 8C9C5E0C1F83B2EF006987FA /* ChatConversationCreateCollectionViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ChatConversationCreateCollectionViewController.m; sourceTree = ""; }; - 8C9C5E0E1F83BD97006987FA /* UIChatCreateCollectionViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIChatCreateCollectionViewCell.h; sourceTree = ""; }; - 8C9C5E0F1F83BD97006987FA /* UIChatCreateCollectionViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UIChatCreateCollectionViewCell.m; sourceTree = ""; }; - 8CA2004B1D8158440095F859 /* PushKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PushKit.framework; path = System/Library/Frameworks/PushKit.framework; sourceTree = SDKROOT; }; - 8CA70ACF1F9E0ABA00A3D2EB /* ChatConversationInfoView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ChatConversationInfoView.h; sourceTree = ""; }; - 8CA70AD01F9E0AE100A3D2EB /* ChatConversationInfoView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ChatConversationInfoView.m; sourceTree = ""; }; - 8CA70AD21F9E285B00A3D2EB /* chat_group_add@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_group_add@2x.png"; sourceTree = ""; }; - 8CA70AD31F9E285B00A3D2EB /* chat_group_add.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_group_add.png; sourceTree = ""; }; - 8CA70AE11F9E39E400A3D2EB /* UIChatConversationInfoTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIChatConversationInfoTableViewCell.h; sourceTree = ""; }; - 8CA70AE21F9E39E400A3D2EB /* UIChatConversationInfoTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UIChatConversationInfoTableViewCell.m; sourceTree = ""; }; - 8CB2B8F61F86229B0015CEE2 /* chat_secure.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_secure.png; sourceTree = ""; }; - 8CB2B8F71F86229C0015CEE2 /* next_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = next_disabled.png; sourceTree = ""; }; - 8CB2B8F81F86229D0015CEE2 /* next_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "next_disabled@2x.png"; sourceTree = ""; }; - 8CBD7BA120B6B7FD00E5DCC0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ChatConversationInfoView.xib; sourceTree = ""; }; - 8CBD7BA420B6B80D00E5DCC0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ChatConversationImdnView.xib; sourceTree = ""; }; - 8CBD7BA720B6B82400E5DCC0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIChatConversationInfoTableViewCell.xib; sourceTree = ""; }; - 8CBD7BAA20B6B82A00E5DCC0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIChatConversationImdnTableViewCell.xib; sourceTree = ""; }; - 8CBD7BB120B6B86900E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/AssistantView.strings; sourceTree = ""; }; - 8CBD7BB220B6B86A00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/AssistantViewScreens.strings; sourceTree = ""; }; - 8CBD7BB720B6B86E00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ChatConversationInfoView.strings; sourceTree = ""; }; - 8CBD7BB820B6B86F00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ChatConversationImdnView.strings; sourceTree = ""; }; - 8CBD7BB920B6B87000E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ChatConversationCreateView.strings; sourceTree = ""; }; - 8CBD7BBA20B6B87000E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ChatConversationView.strings; sourceTree = ""; }; - 8CBD7BBB20B6B87100E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ChatsListView.strings; sourceTree = ""; }; - 8CBD7BBC20B6B87200E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ContactDetailsView.strings; sourceTree = ""; }; - 8CBD7BBD20B6B87300E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ContactsListView.strings; sourceTree = ""; }; - 8CBD7BBE20B6B87400E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/CountryListView.strings; sourceTree = ""; }; - 8CBD7BBF20B6B87400E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/DialerView.strings; sourceTree = ""; }; - 8CBD7BC020B6B87500E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = "fr.lproj/DialerView~ipad.strings"; sourceTree = ""; }; - 8CBD7BC120B6B87600E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/FirstLoginView.strings; sourceTree = ""; }; - 8CBD7BC220B6B87600E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/HistoryDetailsView.strings; sourceTree = ""; }; - 8CBD7BC320B6B87700E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/HistoryListView.strings; sourceTree = ""; }; - 8CBD7BC420B6B87800E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ImageView.strings; sourceTree = ""; }; - 8CBD7BC720B6B87A00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatBubblePhotoCell.strings; sourceTree = ""; }; - 8CBD7BC820B6B87B00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatBubbleTextCell.strings; sourceTree = ""; }; - 8CBD7BC920B6B87B00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatCell.strings; sourceTree = ""; }; - 8CBD7BCA20B6B87D00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatConversationInfoTableViewCell.strings; sourceTree = ""; }; - 8CBD7BCB20B6B87E00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatConversationImdnTableViewCell.strings; sourceTree = ""; }; - 8CBD7BCD20B6B88000E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatCreateCell.strings; sourceTree = ""; }; - 8CBD7BCE20B6B88100E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UICompositeView.strings; sourceTree = ""; }; - 8CBD7BCF20B6B88200E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = "fr.lproj/UICompositeView~ipad.strings"; sourceTree = ""; }; - 8CBD7BD020B6B88400E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIConfirmationDialog.strings; sourceTree = ""; }; - 8CBD7BD120B6B88500E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIContactCell.strings; sourceTree = ""; }; - 8CBD7BD220B6B88700E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIContactDetailsCell.strings; sourceTree = ""; }; - 8CBD7BD320B6B88900E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIHistoryCell.strings; sourceTree = ""; }; - 8CBD7BD420B6B88A00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/PhoneMainView.strings; sourceTree = ""; }; - 8CBD7BD520B6B88C00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/SettingsView.strings; sourceTree = ""; }; - 8CBD7BD720B6B88E00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/SideMenuView.strings; sourceTree = ""; }; - 8CBD7BD820B6B88F00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = "fr.lproj/SideMenuView~ipad.strings"; sourceTree = ""; }; - 8CBD7BD920B6B89000E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/StatusBarView.strings; sourceTree = ""; }; - 8CBD7BDA20B6B89000E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/TabBarView.strings; sourceTree = ""; }; - 8CD0B3BE1FA22CBA008FEB16 /* libsoci_core.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsoci_core.a; path = "liblinphone-sdk/apple-darwin/lib/libsoci_core.a"; sourceTree = ""; }; - 8CD99A1B20908C27008A7CDA /* callkit_logo@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "callkit_logo@2x.png"; sourceTree = ""; }; - 8CD99A352090A823008A7CDA /* splashscreen@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "splashscreen@2x.png"; sourceTree = ""; }; - 8CD99A362090A824008A7CDA /* splashscreen.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = splashscreen.png; sourceTree = ""; }; - 8CD99A3B2090B9FA008A7CDA /* ChatConversationImdnView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ChatConversationImdnView.m; sourceTree = ""; }; - 8CD99A3D2090BA24008A7CDA /* ChatConversationImdnView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ChatConversationImdnView.h; sourceTree = ""; }; - 8CD99A402090CE25008A7CDA /* UIChatConversationImdnTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIChatConversationImdnTableViewCell.h; sourceTree = ""; }; - 8CD99A412090CE6F008A7CDA /* UIChatConversationImdnTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UIChatConversationImdnTableViewCell.m; sourceTree = ""; }; - 8CDC618C1F84D89B0087CF7F /* check_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = check_selected.png; sourceTree = ""; }; - 8CDC61961F84D9270087CF7F /* check_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "check_selected@2x.png"; sourceTree = ""; }; - 8CE24F491F8234A20077AC0A /* next_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = next_default.png; sourceTree = ""; }; - 8CE24F4A1F8234A30077AC0A /* next_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "next_default@2x.png"; sourceTree = ""; }; - 8CE24F551F8268840077AC0A /* conference_delete.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = conference_delete.png; sourceTree = ""; }; - 8CE24F561F8268840077AC0A /* conference_delete@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "conference_delete@2x.png"; sourceTree = ""; }; - 8CF25D8B1F9F336000BEA0C1 /* check_unselected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "check_unselected@2x.png"; sourceTree = ""; }; - 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 = ""; }; - 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 = ""; }; - C622E3E926A8128F004F5434 /* vr_stop.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = vr_stop.png; sourceTree = ""; }; - C622E3EA26A8128F004F5434 /* vr_wave.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = vr_wave.png; sourceTree = ""; }; - C622E3EB26A8128F004F5434 /* vr_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = vr_on.png; sourceTree = ""; }; - C622E3EC26A8128F004F5434 /* vr_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = vr_off.png; sourceTree = ""; }; - C622E3ED26A8128F004F5434 /* vr_pause.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = vr_pause.png; sourceTree = ""; }; - C622E3EE26A81290004F5434 /* vr_play.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = vr_play.png; sourceTree = ""; }; - C63D2F1429029536008F0F66 /* FileUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileUtil.swift; sourceTree = ""; }; - C63F7197285A24B10066163B /* ConfigManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfigManager.swift; sourceTree = ""; }; - C63F7198285A24B10066163B /* CallManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallManager.swift; sourceTree = ""; }; - C63F719B285A24B10066163B /* ConferenceWaitingRoomViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceWaitingRoomViewModel.swift; sourceTree = ""; }; - C63F719C285A24B10066163B /* ConferenceSchedulingViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceSchedulingViewModel.swift; sourceTree = ""; }; - C63F719D285A24B10066163B /* ScheduledConferencesViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScheduledConferencesViewModel.swift; sourceTree = ""; }; - C63F719F285A24B10066163B /* ScheduledConferenceData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScheduledConferenceData.swift; sourceTree = ""; }; - C63F71A0285A24B10066163B /* TimeZoneData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TimeZoneData.swift; sourceTree = ""; }; - C63F71A1285A24B10066163B /* Duration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Duration.swift; sourceTree = ""; }; - C63F71A3285A24B10066163B /* ConferenceWaitingRoomView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceWaitingRoomView.swift; sourceTree = ""; }; - C63F71A4285A24B10066163B /* ScheduledConferencesView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScheduledConferencesView.swift; sourceTree = ""; }; - C63F71A5285A24B10066163B /* ICSBubbleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ICSBubbleView.swift; sourceTree = ""; }; - C63F71A6285A24B10066163B /* ScheduledConferencesCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScheduledConferencesCell.swift; sourceTree = ""; }; - C63F71A7285A24B10066163B /* ConferenceHistoryDetailsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceHistoryDetailsView.swift; sourceTree = ""; }; - C63F71A8285A24B10066163B /* ConferenceSchedulingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceSchedulingView.swift; sourceTree = ""; }; - C63F71A9285A24B10066163B /* ConferenceSchedulingSummaryView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceSchedulingSummaryView.swift; sourceTree = ""; }; - C63F71AC285A24B10066163B /* MediatorLiveData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediatorLiveData.swift; sourceTree = ""; }; - C63F71AD285A24B10066163B /* MutableLiveData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MutableLiveData.swift; sourceTree = ""; }; - C63F71AE285A24B10066163B /* Pair.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Pair.swift; sourceTree = ""; }; - C63F71AF285A24B10066163B /* BackNextNavigationView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BackNextNavigationView.swift; sourceTree = ""; }; - C63F71B0285A24B10066163B /* TimestampUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TimestampUtils.swift; sourceTree = ""; }; - C63F71B1285A24B10066163B /* AppManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppManager.swift; sourceTree = ""; }; - C63F71B4285A24B10066163B /* UIApplication+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIApplication+Extension.swift"; sourceTree = ""; }; - C63F71B6285A24B10066163B /* UIVIewControllerExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIVIewControllerExtensions.swift; sourceTree = ""; }; - C63F71B7285A24B10066163B /* UIImageExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageExtensions.swift; sourceTree = ""; }; - C63F71B8285A24B10066163B /* UIVIewExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIVIewExtensions.swift; sourceTree = ""; }; - C63F71B9285A24B10066163B /* UILabelExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UILabelExtensions.swift; sourceTree = ""; }; - C63F71BA285A24B10066163B /* OptionalExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OptionalExtensions.swift; sourceTree = ""; }; - C63F71BB285A24B10066163B /* UIButtonExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIButtonExtensions.swift; sourceTree = ""; }; - C63F71BC285A24B10066163B /* UIImageViewExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageViewExtensions.swift; sourceTree = ""; }; - C63F71BD285A24B10066163B /* UIDeviceExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIDeviceExtensions.swift; sourceTree = ""; }; - C63F71BE285A24B10066163B /* UIColorExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIColorExtensions.swift; sourceTree = ""; }; - C63F71C0285A24B10066163B /* CoreExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreExtensions.swift; sourceTree = ""; }; - C63F71C1285A24B10066163B /* IceState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IceState.swift; sourceTree = ""; }; - C63F71C2285A24B10066163B /* AddressExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddressExtensions.swift; sourceTree = ""; }; - C63F71C3285A24B10066163B /* ParticipantExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParticipantExtensions.swift; sourceTree = ""; }; - C63F71C4285A24B10066163B /* PayloadType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PayloadType.swift; sourceTree = ""; }; - C63F71C5285A24B10066163B /* CallExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallExtensions.swift; sourceTree = ""; }; - C63F71C6285A24B10066163B /* ConferenceExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceExtensions.swift; sourceTree = ""; }; - C63F71C9285A24B10066163B /* ConferenceViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceViewModel.swift; sourceTree = ""; }; - C63F71CA285A24B10066163B /* CallsViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallsViewModel.swift; sourceTree = ""; }; - C63F71CB285A24B10066163B /* ControlsViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ControlsViewModel.swift; sourceTree = ""; }; - C63F71CC285A24B10066163B /* CallStatisticsData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallStatisticsData.swift; sourceTree = ""; }; - C63F71CD285A24B10066163B /* ConferenceParticipantData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceParticipantData.swift; sourceTree = ""; }; - C63F71CE285A24B10066163B /* ConferenceParticipantDeviceData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceParticipantDeviceData.swift; sourceTree = ""; }; - C63F71CF285A24B10066163B /* CallData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallData.swift; sourceTree = ""; }; - C63F71D0285A24B10066163B /* AudioRouteUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AudioRouteUtils.swift; sourceTree = ""; }; - C63F71D2285A24B10066163B /* LightDarkColor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LightDarkColor.swift; sourceTree = ""; }; - C63F71D3285A24B10066163B /* TextStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextStyle.swift; sourceTree = ""; }; - C63F71D4285A24B10066163B /* VoipTexts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipTexts.swift; sourceTree = ""; }; - C63F71D5285A24B10066163B /* ButtonTheme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ButtonTheme.swift; sourceTree = ""; }; - C63F71D6285A24B10066163B /* VoipTheme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipTheme.swift; sourceTree = ""; }; - C63F71DA285A24B10066163B /* ParticipantsListView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParticipantsListView.swift; sourceTree = ""; }; - C63F71DB285A24B10066163B /* VoipParticipantCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipParticipantCell.swift; sourceTree = ""; }; - C63F71DC285A24B10066163B /* AudioRoutesView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AudioRoutesView.swift; sourceTree = ""; }; - C63F71DE285A24B10066163B /* VoipActiveSpeakerParticipantCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipActiveSpeakerParticipantCell.swift; sourceTree = ""; }; - C63F71DF285A24B10066163B /* VoipConferenceAudioOnlyView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipConferenceAudioOnlyView.swift; sourceTree = ""; }; - C63F71E0285A24B10066163B /* VoipGridParticipantCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipGridParticipantCell.swift; sourceTree = ""; }; - C63F71E1285A24B10066163B /* VoipAudioOnlyParticipantCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipAudioOnlyParticipantCell.swift; sourceTree = ""; }; - C63F71E2285A24B10066163B /* MicMuted.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MicMuted.swift; sourceTree = ""; }; - C63F71E3285A24B10066163B /* VoipConferenceGridView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipConferenceGridView.swift; sourceTree = ""; }; - C63F71E4285A24B10066163B /* VoipConferenceActiveSpeakerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipConferenceActiveSpeakerView.swift; sourceTree = ""; }; - C63F71E5285A24B10066163B /* VoipConferenceDisplayModeSelectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipConferenceDisplayModeSelectionView.swift; sourceTree = ""; }; - C63F71E7285A24B10066163B /* ActiveCallView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActiveCallView.swift; sourceTree = ""; }; - C63F71E8285A24B10066163B /* AbstractIncomingOutgoingCallView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AbstractIncomingOutgoingCallView.swift; sourceTree = ""; }; - C63F71E9285A24B10066163B /* PausedCallOrConferenceView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PausedCallOrConferenceView.swift; sourceTree = ""; }; - C63F71EA285A24B10066163B /* LocalVideoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocalVideoView.swift; sourceTree = ""; }; - C63F71EB285A24B10066163B /* CallStatsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallStatsView.swift; sourceTree = ""; }; - C63F71EC285A24B10066163B /* NumpadView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NumpadView.swift; sourceTree = ""; }; - C63F71ED285A24B10066163B /* VoipExtraButtonsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipExtraButtonsView.swift; sourceTree = ""; }; - C63F71EF285A24B10066163B /* VoipCallContextMenu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipCallContextMenu.swift; sourceTree = ""; }; - C63F71F0285A24B10066163B /* CallsListView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallsListView.swift; sourceTree = ""; }; - C63F71F1285A24B10066163B /* VoipCallCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipCallCell.swift; sourceTree = ""; }; - C63F71F2285A24B10066163B /* DismissableView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DismissableView.swift; sourceTree = ""; }; - C63F71F3285A24B10066163B /* ConferenceLayoutPickerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceLayoutPickerView.swift; sourceTree = ""; }; - C63F71F4285A24B10066163B /* ControlsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ControlsView.swift; sourceTree = ""; }; - C63F71F5285A24B10066163B /* RemotelyRecording.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemotelyRecording.swift; sourceTree = ""; }; - C63F71F7285A24B10066163B /* OutgoingCallView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OutgoingCallView.swift; sourceTree = ""; }; - C63F71F9285A24B10066163B /* IncomingCallView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IncomingCallView.swift; sourceTree = ""; }; - C63F71FA285A24B10066163B /* SharedLayoutConstants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SharedLayoutConstants.swift; sourceTree = ""; }; - C63F71FB285A24B10066163B /* VoipDialog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipDialog.swift; sourceTree = ""; }; - C63F71FD285A24B10066163B /* StyledValuePicker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StyledValuePicker.swift; sourceTree = ""; }; - C63F71FE285A24B10066163B /* StyledSwitch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StyledSwitch.swift; sourceTree = ""; }; - C63F71FF285A24B10066163B /* CallControlButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallControlButton.swift; sourceTree = ""; }; - C63F7200285A24B10066163B /* RotatingSpinner.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RotatingSpinner.swift; sourceTree = ""; }; - C63F7201285A24B10066163B /* FormButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FormButton.swift; sourceTree = ""; }; - C63F7202285A24B10066163B /* BouncingCounter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BouncingCounter.swift; sourceTree = ""; }; - C63F7203285A24B10066163B /* VoipExtraButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipExtraButton.swift; sourceTree = ""; }; - C63F7204285A24B10066163B /* UICallTimer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UICallTimer.swift; sourceTree = ""; }; - C63F7205285A24B10066163B /* StyledCheckBox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StyledCheckBox.swift; sourceTree = ""; }; - C63F7206285A24B10066163B /* Avatar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Avatar.swift; sourceTree = ""; }; - C63F7207285A24B10066163B /* StyledLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StyledLabel.swift; sourceTree = ""; }; - C63F7208285A24B10066163B /* StyledDatePicker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StyledDatePicker.swift; sourceTree = ""; }; - C63F7209285A24B10066163B /* ButtonWithStateBackgrounds.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ButtonWithStateBackgrounds.swift; sourceTree = ""; }; - C63F720A285A24B10066163B /* StyledTextView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StyledTextView.swift; sourceTree = ""; }; - C63F720B285A24B10066163B /* ProviderDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProviderDelegate.swift; sourceTree = ""; }; - C63F720C285A24B10066163B /* VFSUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VFSUtil.swift; sourceTree = ""; }; - C63F7271285A2F140066163B /* voip_dropdown.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_dropdown.png; sourceTree = ""; }; - C63F7272285A2F140066163B /* voip_spinner.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_spinner.png; sourceTree = ""; }; - C63F7273285A2F140066163B /* voip_numpad_7.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_7.png; sourceTree = ""; }; - C63F7274285A2F150066163B /* voip_radio_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_radio_off.png; sourceTree = ""; }; - C63F7275285A2F150066163B /* voip_export.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_export.png; sourceTree = ""; }; - C63F7276285A2F150066163B /* voip_call_numpad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_numpad.png; sourceTree = ""; }; - C63F7277285A2F150066163B /* voip_chat_rooms_list.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_chat_rooms_list.png; sourceTree = ""; }; - C63F7278285A2F150066163B /* voip_numpad_4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_4.png; sourceTree = ""; }; - C63F7279285A2F150066163B /* voip_call_header_incoming.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_header_incoming.png; sourceTree = ""; }; - C63F727A285A2F150066163B /* voip_calls_list.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_calls_list.png; sourceTree = ""; }; - C63F727B285A2F160066163B /* voip_call_header_paused.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_header_paused.png; sourceTree = ""; }; - C63F727C285A2F160066163B /* voip_numpad_0.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_0.png; sourceTree = ""; }; - C63F727D285A2F160066163B /* voip_numpad_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_3.png; sourceTree = ""; }; - C63F727E285A2F160066163B /* voip_numpad_9.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_9.png; sourceTree = ""; }; - C63F727F285A2F160066163B /* voip_speaker_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_speaker_on.png; sourceTree = ""; }; - C63F7280285A2F160066163B /* voip_audio_routes.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_audio_routes.png; sourceTree = ""; }; - C63F7281285A2F160066163B /* voip_call_record.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_record.png; sourceTree = ""; }; - C63F7282285A2F170066163B /* voip_call_forward.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_forward.png; sourceTree = ""; }; - C63F7283285A2F170066163B /* voip_change_camera.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_change_camera.png; sourceTree = ""; }; - C63F7284285A2F170066163B /* voip_checkbox_checked.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_checkbox_checked.png; sourceTree = ""; }; - C63F7285285A2F170066163B /* voip_info.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_info.png; sourceTree = ""; }; - C63F7286285A2F170066163B /* voip_speaker_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_speaker_off.png; sourceTree = ""; }; - C63F7287285A2F170066163B /* voip_call_more.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_more.png; sourceTree = ""; }; - C63F7288285A2F170066163B /* voip_call_stats.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_stats.png; sourceTree = ""; }; - C63F7289285A2F180066163B /* voip_numpad_8.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_8.png; sourceTree = ""; }; - C63F728A285A2F180066163B /* voip_call_add.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_add.png; sourceTree = ""; }; - C63F728B285A2F180066163B /* voip_copy.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_copy.png; sourceTree = ""; }; - C63F728C285A2F180066163B /* voip_conference_paused_big.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_conference_paused_big.png; sourceTree = ""; }; - C63F728D285A2F180066163B /* voip_numpad_star.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_star.png; sourceTree = ""; }; - C63F728E285A2F180066163B /* voip_numpad_hash.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_hash.png; sourceTree = ""; }; - C63F728F285A2F180066163B /* voip_multiple_contacts_avatar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_multiple_contacts_avatar.png; sourceTree = ""; }; - C63F7290285A2F180066163B /* voip_remote_recording.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_remote_recording.png; sourceTree = ""; }; - C63F7291285A2F190066163B /* voip_hangup.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_hangup.png; sourceTree = ""; }; - C63F7292285A2F190066163B /* voip_pause.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_pause.png; sourceTree = ""; }; - C63F7293285A2F190066163B /* voip_numpad_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_1.png; sourceTree = ""; }; - C63F7294285A2F190066163B /* voip_mandatory.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_mandatory.png; sourceTree = ""; }; - C63F7295285A2F190066163B /* voip_earpiece.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_earpiece.png; sourceTree = ""; }; - C63F7296285A2F190066163B /* voip_numpad_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_2.png; sourceTree = ""; }; - C63F7297285A2F190066163B /* voip_conference_audio_only.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_conference_audio_only.png; sourceTree = ""; }; - C63F7298285A2F1A0066163B /* voip_menu_more.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_menu_more.png; sourceTree = ""; }; - C63F7299285A2F1A0066163B /* voip_conference_new.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_conference_new.png; sourceTree = ""; }; - C63F729A285A2F1A0066163B /* voip_call_header_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_header_active.png; sourceTree = ""; }; - C63F729B285A2F1A0066163B /* voip_bluetooth.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_bluetooth.png; sourceTree = ""; }; - C63F729C285A2F1A0066163B /* voip_micro_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_micro_off.png; sourceTree = ""; }; - C63F729D285A2F1A0066163B /* voip_camera_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_camera_on.png; sourceTree = ""; }; - C63F729E285A2F1A0066163B /* voip_conference_play_big.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_conference_play_big.png; sourceTree = ""; }; - C63F729F285A2F1B0066163B /* voip_call.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call.png; sourceTree = ""; }; - C63F72A0285A2F1B0066163B /* voip_call_list_menu.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_list_menu.png; sourceTree = ""; }; - C63F72A1285A2F1B0066163B /* voip_conference_active_speaker.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_conference_active_speaker.png; sourceTree = ""; }; - C63F72A2285A2F1B0066163B /* voip_numpad_6.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_6.png; sourceTree = ""; }; - C63F72A3285A2F1B0066163B /* voip_call_participants.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_participants.png; sourceTree = ""; }; - C63F72A4285A2F1B0066163B /* conference_schedule_calendar_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = conference_schedule_calendar_default.png; sourceTree = ""; }; - C63F72A5285A2F1B0066163B /* voip_call_chat.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_chat.png; sourceTree = ""; }; - C63F72A6285A2F1B0066163B /* voip_checkbox_unchecked.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_checkbox_unchecked.png; sourceTree = ""; }; - C63F72A7285A2F1C0066163B /* voip_edit.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_edit.png; sourceTree = ""; }; - C63F72A8285A2F1C0066163B /* conference_schedule_time_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = conference_schedule_time_default.png; sourceTree = ""; }; - C63F72A9285A2F1C0066163B /* voip_merge_calls.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_merge_calls.png; sourceTree = ""; }; - C63F72AA285A2F1C0066163B /* voip_camera_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_camera_off.png; sourceTree = ""; }; - C63F72AB285A2F1C0066163B /* voip_micro_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_micro_on.png; sourceTree = ""; }; - C63F72AC285A2F1C0066163B /* voip_radio_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_radio_on.png; sourceTree = ""; }; - C63F72AD285A2F1C0066163B /* conference_schedule_participants_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = conference_schedule_participants_default.png; sourceTree = ""; }; - C63F72AE285A2F1D0066163B /* voip_conference_mosaic.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_conference_mosaic.png; sourceTree = ""; }; - C63F72AF285A2F1D0066163B /* voip_numpad_5.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_5.png; sourceTree = ""; }; - C63F72B0285A2F1D0066163B /* voip_conference_new_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_conference_new_selected.png; sourceTree = ""; }; - C63F72B1285A2F1D0066163B /* voip_single_contact_avatar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_single_contact_avatar.png; sourceTree = ""; }; - C63F72B2285A2F1D0066163B /* voip_delete.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_delete.png; sourceTree = ""; }; - C63F72B3285A2F1D0066163B /* voip_cancel.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_cancel.png; sourceTree = ""; }; - C63F72B4285A2F1D0066163B /* voip_call_header_outgoing.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_header_outgoing.png; sourceTree = ""; }; - C63F72FA285A31DA0066163B /* Roboto-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Roboto-Regular.ttf"; sourceTree = ""; }; - C63F72FB285A31DA0066163B /* Roboto-Italic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Roboto-Italic.ttf"; sourceTree = ""; }; - C63F72FC285A31DA0066163B /* Roboto-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Roboto-Bold.ttf"; sourceTree = ""; }; - C64A854C2667B66900252AD2 /* EphemeralSettingsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EphemeralSettingsView.h; sourceTree = ""; }; - C64A854D2667B67200252AD2 /* EphemeralSettingsView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EphemeralSettingsView.m; sourceTree = ""; }; - C64A854F2667B67A00252AD2 /* EphemeralSettingsView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = EphemeralSettingsView.xib; sourceTree = ""; }; - C64A85512667B74100252AD2 /* ephemeral_messages_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ephemeral_messages_default.png; sourceTree = ""; }; - C654881E292D32FA00BF646B /* SingleCallView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleCallView.swift; sourceTree = ""; }; - C654881F292D32FA00BF646B /* ConferenceCallView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceCallView.swift; sourceTree = ""; }; - C6548822292D369500BF646B /* AbstractCallView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AbstractCallView.swift; sourceTree = ""; }; - C66B03BC26E8EB1A009B5EDC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIChatReplyBubbleView.xib; sourceTree = ""; }; - C66B03C126E8EB82009B5EDC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/UIChatReplyBubbleView.strings; sourceTree = ""; }; - C66B03C326E8EB87009B5EDC /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatReplyBubbleView.strings; sourceTree = ""; }; - C66B040926EFDA54009B5EDC /* reply_cancel.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = reply_cancel.png; sourceTree = ""; }; - C66B040D26F095CE009B5EDC /* cancel_forward.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cancel_forward.png; sourceTree = ""; }; - C684F1F92913D65500736775 /* SnapkitBridge.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SnapkitBridge.swift; sourceTree = ""; }; - C6909F6B2AA0DC2A0011D273 /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = System/Library/Frameworks/NetworkExtension.framework; sourceTree = SDKROOT; }; - C6A1BB3126E8815300540D50 /* menu_info.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_info.png; sourceTree = ""; }; - C6A1BB3226E8815400540D50 /* menu_forward_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_forward_default.png; sourceTree = ""; }; - C6A1BB3326E8815400540D50 /* menu_copy_text_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_copy_text_default.png; sourceTree = ""; }; - C6A1BB3426E8815400540D50 /* menu_reply_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_reply_default.png; sourceTree = ""; }; - C6A1BB3926E881E100540D50 /* menu_delete.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_delete.png; sourceTree = ""; }; - C6A1BB3B26E882D000540D50 /* UIChatReplyBubbleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIChatReplyBubbleView.h; sourceTree = ""; }; - C6A1BB3C26E882D000540D50 /* UIChatReplyBubbleView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIChatReplyBubbleView.m; sourceTree = ""; }; - C6A1BB4026E889AD00540D50 /* forward_message_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = forward_message_default.png; sourceTree = ""; }; - C6A1BB4226E88F7C00540D50 /* menu_resend_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_resend_default.png; sourceTree = ""; }; - C6A1BB4426E890BD00540D50 /* file_voice_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = file_voice_default.png; sourceTree = ""; }; - C6B4443D26AAD0970076C517 /* file_video_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = file_video_default.png; sourceTree = ""; }; - C6B4443E26AAD0970076C517 /* file_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = file_default.png; sourceTree = ""; }; - C6B4443F26AAD0970076C517 /* file_picture_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = file_picture_default.png; sourceTree = ""; }; - C6B4444026AAD0970076C517 /* file_audio_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = file_audio_default.png; sourceTree = ""; }; - C6B4444126AAD0970076C517 /* file_pdf_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = file_pdf_default.png; sourceTree = ""; }; - C6B4444726AADA530076C517 /* SwiftUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUtil.swift; sourceTree = ""; }; - C6E3E7EB291D642B00DDFC46 /* side_menu_voip_meeting_schedule.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = side_menu_voip_meeting_schedule.png; sourceTree = ""; }; - C6E3E7ED291D648D00DDFC46 /* side_menu_voip_meeting_schedule@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "side_menu_voip_meeting_schedule@2x.png"; sourceTree = ""; }; - C6F55644287CC69F0056E213 /* voip_meeting_schedule.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_meeting_schedule.png; sourceTree = ""; }; - C6F55646287CCFB60056E213 /* menu_voip_meeting_schedule.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_voip_meeting_schedule.png; sourceTree = ""; }; - 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 = ""; }; - 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 = ""; }; - CF1DE924210A0F5A00A0A97E /* UILinphoneAudioPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UILinphoneAudioPlayer.m; sourceTree = ""; }; - CF1DE92B210A0F5B00A0A97E /* UILinphoneAudioPlayer.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UILinphoneAudioPlayer.xib; sourceTree = ""; }; - CF1DE92C210A0F5C00A0A97E /* UILinphoneAudioPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UILinphoneAudioPlayer.h; sourceTree = ""; }; - CF7602D4210867E800749F76 /* RecordingsListView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RecordingsListView.h; sourceTree = ""; }; - CF7602D5210867E800749F76 /* RecordingsListView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RecordingsListView.m; sourceTree = ""; }; - CF7602DF21086EB100749F76 /* RecordingsListTableView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RecordingsListTableView.h; sourceTree = ""; }; - CF7602E021086EB200749F76 /* RecordingsListTableView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RecordingsListTableView.m; sourceTree = ""; }; - CF7602E42108759A00749F76 /* UIRecordingCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIRecordingCell.h; sourceTree = ""; }; - CF7602E52108759A00749F76 /* UIRecordingCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UIRecordingCell.m; sourceTree = ""; }; - CF7602E62108759A00749F76 /* UIRecordingCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UIRecordingCell.xib; sourceTree = ""; }; - CF7602EB210898C100749F76 /* rec_off_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "rec_off_default@2x.png"; sourceTree = ""; }; - CF7602F2210898C400749F76 /* rec_on_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "rec_on_default@2x.png"; sourceTree = ""; }; - 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 = ""; }; - 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 = ""; }; - D3128FDF15AABC7E00A2147A /* ContactDetailsView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ContactDetailsView.m; sourceTree = ""; }; - D31B4B1E159876C0002E6C72 /* UICompositeView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UICompositeView.h; sourceTree = ""; }; - D31B4B1F159876C0002E6C72 /* UICompositeView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UICompositeView.m; sourceTree = ""; }; - D31C9C96158A1CDE00756B45 /* UIHistoryCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIHistoryCell.h; sourceTree = ""; }; - D31C9C97158A1CDE00756B45 /* UIHistoryCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIHistoryCell.m; sourceTree = ""; }; - D326483615887D5200930C67 /* OrderedDictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OrderedDictionary.h; path = Utils/OrderedDictionary.h; sourceTree = ""; }; - D326483715887D5200930C67 /* OrderedDictionary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OrderedDictionary.m; path = Utils/OrderedDictionary.m; sourceTree = ""; }; - D32648421588F6FA00930C67 /* UIToggleButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIToggleButton.h; sourceTree = ""; }; - D32648431588F6FB00930C67 /* UIToggleButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIToggleButton.m; sourceTree = ""; }; - D32B6E2715A5BC430033019F /* ChatConversationTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChatConversationTableView.h; sourceTree = ""; }; - D32B6E2815A5BC430033019F /* ChatConversationTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ChatConversationTableView.m; sourceTree = ""; }; - D32B6E2E15A5C0AC0033019F /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; }; - D32B9DFA15A2F131000B6DEC /* FastAddressBook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FastAddressBook.h; path = Utils/FastAddressBook.h; sourceTree = ""; }; - D32B9DFB15A2F131000B6DEC /* FastAddressBook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FastAddressBook.m; path = Utils/FastAddressBook.m; sourceTree = ""; }; - D34F6F9D1594D3FB0095705B /* InAppSettings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = InAppSettings.bundle; sourceTree = ""; }; - D350F20B15A43BB100149E54 /* AssistantView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AssistantView.h; sourceTree = ""; }; - D350F20C15A43BB100149E54 /* AssistantView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AssistantView.m; sourceTree = ""; }; - D35497FB15875372000081D8 /* ContactsListView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContactsListView.h; sourceTree = ""; }; - D35497FC15875372000081D8 /* ContactsListView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = ContactsListView.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - D3549814158761CF000081D8 /* ContactsListTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContactsListTableView.h; sourceTree = ""; }; - D3549815158761D0000081D8 /* ContactsListTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = ContactsListTableView.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - D354981E1587716B000081D8 /* StatusBarView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StatusBarView.h; path = LinphoneUI/StatusBarView.h; sourceTree = ""; }; - D354981F1587716B000081D8 /* StatusBarView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = StatusBarView.m; path = LinphoneUI/StatusBarView.m; sourceTree = ""; }; - D35860D515B549B500513429 /* Utils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Utils.m; path = Utils/Utils.m; sourceTree = ""; }; - D35E7594159460560066B1C1 /* ChatsListView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChatsListView.h; sourceTree = ""; }; - D35E7595159460560066B1C1 /* ChatsListView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ChatsListView.m; sourceTree = ""; }; - D35E759C159460B50066B1C1 /* SettingsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsView.h; sourceTree = ""; }; - D35E759D159460B50066B1C1 /* SettingsView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingsView.m; sourceTree = ""; }; - D378AB2815DCDB480098505D /* ImagePickerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImagePickerView.h; sourceTree = ""; }; - D378AB2915DCDB490098505D /* ImagePickerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ImagePickerView.m; sourceTree = ""; }; - D37C639915AADEF4009D0BAC /* ContactDetailsTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContactDetailsTableView.h; sourceTree = ""; }; - D37C639A15AADEF5009D0BAC /* ContactDetailsTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ContactDetailsTableView.m; sourceTree = ""; }; - D37DC6BF1594AE1800B2A5EB /* LinphoneCoreSettingsStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LinphoneCoreSettingsStore.h; sourceTree = ""; }; - D37DC6C01594AE1800B2A5EB /* LinphoneCoreSettingsStore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LinphoneCoreSettingsStore.m; sourceTree = ""; }; - D37DC7171594AF3400B2A5EB /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; }; - D37E3ECB1619C27A0087659A /* CAAnimation+Blocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CAAnimation+Blocks.h"; sourceTree = ""; }; - D37E3ECC1619C27A0087659A /* CAAnimation+Blocks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CAAnimation+Blocks.m"; sourceTree = ""; }; - D37EE160160377D7003608A6 /* DTActionSheet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DTActionSheet.h; sourceTree = ""; }; - D37EE161160377D7003608A6 /* DTActionSheet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DTActionSheet.m; sourceTree = ""; }; - D3807FB715C28940005BE9BC /* DCRoundSwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DCRoundSwitch.h; sourceTree = ""; }; - D3807FB815C28940005BE9BC /* DCRoundSwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DCRoundSwitch.m; sourceTree = ""; }; - D3807FB915C28940005BE9BC /* DCRoundSwitchKnobLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DCRoundSwitchKnobLayer.h; sourceTree = ""; }; - D3807FBA15C28940005BE9BC /* DCRoundSwitchKnobLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DCRoundSwitchKnobLayer.m; sourceTree = ""; }; - D3807FBB15C28940005BE9BC /* DCRoundSwitchOutlineLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DCRoundSwitchOutlineLayer.h; sourceTree = ""; }; - D3807FBC15C28940005BE9BC /* DCRoundSwitchOutlineLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DCRoundSwitchOutlineLayer.m; sourceTree = ""; }; - D3807FBD15C28940005BE9BC /* DCRoundSwitchToggleLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DCRoundSwitchToggleLayer.h; sourceTree = ""; }; - D3807FBE15C28940005BE9BC /* DCRoundSwitchToggleLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DCRoundSwitchToggleLayer.m; sourceTree = ""; }; - D3807FC915C2894A005BE9BC /* IASKAppSettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKAppSettingsViewController.h; sourceTree = ""; }; - D3807FCA15C2894A005BE9BC /* IASKAppSettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKAppSettingsViewController.m; sourceTree = ""; }; - D3807FCD15C2894A005BE9BC /* IASKSpecifierValuesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSpecifierValuesViewController.h; sourceTree = ""; }; - D3807FCE15C2894A005BE9BC /* IASKSpecifierValuesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSpecifierValuesViewController.m; sourceTree = ""; }; - D3807FCF15C2894A005BE9BC /* IASKViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKViewController.h; sourceTree = ""; }; - D3807FD115C2894A005BE9BC /* IASKSettingsReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsReader.h; sourceTree = ""; }; - D3807FD215C2894A005BE9BC /* IASKSettingsReader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsReader.m; sourceTree = ""; }; - D3807FD315C2894A005BE9BC /* IASKSettingsStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsStore.h; sourceTree = ""; }; - D3807FD415C2894A005BE9BC /* IASKSettingsStore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsStore.m; sourceTree = ""; }; - D3807FD515C2894A005BE9BC /* IASKSettingsStoreFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsStoreFile.h; sourceTree = ""; }; - D3807FD615C2894A005BE9BC /* IASKSettingsStoreFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsStoreFile.m; sourceTree = ""; }; - D3807FD715C2894A005BE9BC /* IASKSettingsStoreUserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsStoreUserDefaults.h; sourceTree = ""; }; - D3807FD815C2894A005BE9BC /* IASKSettingsStoreUserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsStoreUserDefaults.m; sourceTree = ""; }; - D3807FD915C2894A005BE9BC /* IASKSpecifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSpecifier.h; sourceTree = ""; }; - D3807FDA15C2894A005BE9BC /* IASKSpecifier.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSpecifier.m; sourceTree = ""; }; - D3807FDC15C2894A005BE9BC /* IASKPSSliderSpecifierViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKPSSliderSpecifierViewCell.h; sourceTree = ""; }; - D3807FDD15C2894A005BE9BC /* IASKPSSliderSpecifierViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKPSSliderSpecifierViewCell.m; sourceTree = ""; }; - D3807FDE15C2894A005BE9BC /* IASKPSTextFieldSpecifierViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKPSTextFieldSpecifierViewCell.h; sourceTree = ""; }; - D3807FDF15C2894A005BE9BC /* IASKPSTextFieldSpecifierViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKPSTextFieldSpecifierViewCell.m; sourceTree = ""; }; - D3807FE215C2894A005BE9BC /* IASKSlider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSlider.h; sourceTree = ""; }; - D3807FE315C2894A005BE9BC /* IASKSlider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSlider.m; sourceTree = ""; }; - D3807FE415C2894A005BE9BC /* IASKSwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSwitch.h; sourceTree = ""; }; - D3807FE515C2894A005BE9BC /* IASKSwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSwitch.m; sourceTree = ""; }; - D3807FE615C2894A005BE9BC /* IASKTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKTextField.h; sourceTree = ""; }; - D3807FE715C2894A005BE9BC /* IASKTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKTextField.m; sourceTree = ""; }; - D380801115C29984005BE9BC /* ColorSpaceUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ColorSpaceUtilities.h; path = Utils/ColorSpaceUtilities.h; sourceTree = ""; }; - D380801215C299D0005BE9BC /* ColorSpaceUtilites.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ColorSpaceUtilites.m; path = Utils/ColorSpaceUtilites.m; sourceTree = ""; }; - D3A55FBA15877E5E003FD403 /* UIContactCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIContactCell.h; sourceTree = ""; }; - D3A55FBB15877E5E003FD403 /* UIContactCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIContactCell.m; sourceTree = ""; }; - D3A8BB6E15A6C7D500F96BE5 /* UIChatBubbleTextCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIChatBubbleTextCell.h; sourceTree = ""; }; - D3A8BB6F15A6C7D500F96BE5 /* UIChatBubbleTextCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIChatBubbleTextCell.m; sourceTree = ""; }; - D3C6526515AC1A8F0092A874 /* UIContactDetailsCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIContactDetailsCell.h; sourceTree = ""; }; - D3C6526615AC1A8F0092A874 /* UIContactDetailsCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIContactDetailsCell.m; sourceTree = ""; }; - D3EA53FB159850E80037DC6B /* LinphoneManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LinphoneManager.h; sourceTree = ""; }; - D3EA53FC159850E80037DC6B /* LinphoneManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LinphoneManager.m; sourceTree = ""; }; - D3EA540B1598528B0037DC6B /* ChatsListTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChatsListTableView.h; sourceTree = ""; }; - D3EA540C1598528B0037DC6B /* ChatsListTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ChatsListTableView.m; sourceTree = ""; }; - D3EA540F159853750037DC6B /* UIChatCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIChatCell.h; sourceTree = ""; }; - D3EA5410159853750037DC6B /* UIChatCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIChatCell.m; sourceTree = ""; }; - D3ED3E841586291B006C0DE4 /* TabBarView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TabBarView.h; path = LinphoneUI/TabBarView.h; sourceTree = ""; }; - D3ED3E851586291B006C0DE4 /* TabBarView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TabBarView.m; path = LinphoneUI/TabBarView.m; sourceTree = ""; }; - D3ED3EA41587334B006C0DE4 /* HistoryListTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HistoryListTableView.h; sourceTree = ""; }; - D3ED3EA51587334C006C0DE4 /* HistoryListTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = HistoryListTableView.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - D3ED3EB515873928006C0DE4 /* HistoryListView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HistoryListView.h; sourceTree = ""; }; - D3ED3EB615873929006C0DE4 /* HistoryListView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = HistoryListView.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - D3F795D315A582800077328B /* ChatConversationView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChatConversationView.h; sourceTree = ""; }; - D3F795D415A582800077328B /* ChatConversationView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ChatConversationView.m; sourceTree = ""; }; - D3F7997F15BD32370018C273 /* TPMultiLayoutViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TPMultiLayoutViewController.h; path = Utils/TPMultiLayoutViewController/TPMultiLayoutViewController.h; sourceTree = ""; }; - D3F7998015BD32370018C273 /* TPMultiLayoutViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TPMultiLayoutViewController.m; path = Utils/TPMultiLayoutViewController/TPMultiLayoutViewController.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 = ""; }; - D7013DB72940AA12004EEAAE /* MessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageView.swift; sourceTree = ""; }; - D7097B34296D684900AEF6C5 /* FileType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileType.swift; sourceTree = ""; }; - D71418E229C9B4E0002EEF75 /* DownloadMessageCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadMessageCell.swift; sourceTree = ""; }; - D71418E429C9E2CD002EEF75 /* CircularProgressBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CircularProgressBarView.swift; sourceTree = ""; }; - D72F27A92AA8B42D00CFB13D /* SheetViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SheetViewController.swift; sourceTree = ""; }; - D7421D9D29228A5200290CAB /* ChatConversationViewSwift.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatConversationViewSwift.swift; sourceTree = ""; }; - D74A44902923BAF90017D063 /* BackActionsNavigationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackActionsNavigationView.swift; sourceTree = ""; }; - D768763429CDA88200570747 /* UploadMessageCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UploadMessageCell.swift; sourceTree = ""; }; - D77057F0292E4A340031A970 /* ChatConversationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatConversationViewModel.swift; sourceTree = ""; }; - D779D39729A3C933007B8087 /* ChatConversationTableViewSwift.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatConversationTableViewSwift.swift; sourceTree = ""; }; - D779D39929A4C285007B8087 /* MultilineMessageCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultilineMessageCell.swift; sourceTree = ""; }; - D779D39B29A76DE6007B8087 /* ChatConversationTableViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatConversationTableViewModel.swift; sourceTree = ""; }; - D779D39D29AC9E92007B8087 /* AudioPlayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioPlayer.swift; sourceTree = ""; }; - D779D3A129B5E365007B8087 /* UIImageExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIImageExtension.swift; sourceTree = ""; }; - D780FF7C2A459CE3001535E6 /* MediaViewer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaViewer.swift; sourceTree = ""; }; - D783D9B92A669A9E00293E87 /* ContentMessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentMessageView.swift; sourceTree = ""; }; - D7A4C0052A3B135800EFBD1B /* new_chat_attachment_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = new_chat_attachment_default.png; sourceTree = ""; }; - D7A4C0062A3B135800EFBD1B /* new_vr_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = new_vr_off.png; sourceTree = ""; }; - D7A4C0072A3B135800EFBD1B /* new_chat_send_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = new_chat_send_default.png; sourceTree = ""; }; - D7A7544F29507038005C9D4A /* CustomAlertController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomAlertController.swift; sourceTree = ""; }; - D7C6DE812948CF3100756E03 /* DropDownCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DropDownCell.swift; sourceTree = ""; }; - D7C6DE822948CF3100756E03 /* DropDownCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DropDownCell.xib; sourceTree = ""; }; - D7CBC0F62A8E1669009182D8 /* Mode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Mode.swift; sourceTree = ""; }; - D7CBC0FA2A8E3D1E009182D8 /* SpeakersListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpeakersListView.swift; sourceTree = ""; }; - D7CBC0FC2A8E3D3F009182D8 /* VoipSpeakerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoipSpeakerCell.swift; sourceTree = ""; }; - D7CBC0FE2A8E3E11009182D8 /* ConferenceSpeakerData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConferenceSpeakerData.swift; sourceTree = ""; }; - D7CF13722A2E225200D92165 /* emoji.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = emoji.png; sourceTree = ""; }; - D7DA18702A02598700FABA0D /* TextViewer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextViewer.swift; sourceTree = ""; }; - D7F067472AAA1BFB0044CC87 /* ReactionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionCell.swift; 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 = ""; }; - EA8CB827239F96CA00C330CC /* msgNotificationContent.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = msgNotificationContent.appex; sourceTree = BUILT_PRODUCTS_DIR; }; - EA8CB82B239F96CA00C330CC /* NotificationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationViewController.swift; sourceTree = ""; }; - EA8CB82E239F96CA00C330CC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; - EA8CB830239F96CA00C330CC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 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; }; - 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; }; - F03CA84118C72F1A0008889D /* UITextViewNoDefine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UITextViewNoDefine.h; sourceTree = ""; }; - F03CA84218C72F1A0008889D /* UITextViewNoDefine.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UITextViewNoDefine.m; sourceTree = ""; }; - F05BAA611A5D594E00411815 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; - F0642EF019DAC891009DB336 /* MainStoryboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = MainStoryboard.storyboard; sourceTree = ""; }; - F0642EF719DAF32E009DB336 /* DTWeakSupport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DTWeakSupport.h; sourceTree = ""; }; - F088488C19FF8C41007FFCF3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIContactCell.xib; sourceTree = ""; }; - F0938158188E629800A55DFA /* iTunesArtwork */ = {isa = PBXFileReference; lastKnownFileType = file; path = iTunesArtwork; sourceTree = ""; }; - F09548181883F15300E8A69B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ChatConversationView.xib; sourceTree = ""; }; - F09548191883F15300E8A69B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ChatsListView.xib; sourceTree = ""; }; - F095481B1883F15300E8A69B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ContactDetailsView.xib; sourceTree = ""; }; - F095481C1883F15300E8A69B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ContactsListView.xib; sourceTree = ""; }; - F095481D1883F15300E8A69B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/DialerView.xib; sourceTree = ""; }; - F09548201883F15400E8A69B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/HistoryDetailsView.xib; sourceTree = ""; }; - F09548211883F15400E8A69B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/HistoryListView.xib; sourceTree = ""; }; - F09548221883F15400E8A69B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ImageView.xib; sourceTree = ""; }; - F095482C1883F15400E8A69B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/TabBarView.xib; sourceTree = ""; }; - F095482E1883F15500E8A69B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/AssistantView.xib; sourceTree = ""; }; - F09548301883F15500E8A69B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/AssistantViewScreens.xib; sourceTree = ""; }; - F09548321883F20A00E8A69B /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/ChatConversationView.strings; sourceTree = ""; }; - F09548341883F25F00E8A69B /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/ChatsListView.strings; sourceTree = ""; }; - F09548381883F29C00E8A69B /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/ContactDetailsView.strings; sourceTree = ""; }; - F095483A1883F2CA00E8A69B /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/ContactsListView.strings; sourceTree = ""; }; - F095483C1883F2E300E8A69B /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/DialerView.strings; sourceTree = ""; }; - F09548421883F51B00E8A69B /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/HistoryListView.strings; sourceTree = ""; }; - F09548441883F52900E8A69B /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/ImageView.strings; sourceTree = ""; }; - F09548561883F61600E8A69B /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/TabBarView.strings; sourceTree = ""; }; - F095485A1883F67B00E8A69B /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/AssistantView.strings; sourceTree = ""; }; - F095485E1883F6EA00E8A69B /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/AssistantViewScreens.strings; sourceTree = ""; }; - F0AF06F11A24BA760086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/ChatConversationView.strings; sourceTree = ""; }; - F0AF06F21A24BA760086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/ChatsListView.strings; sourceTree = ""; }; - F0AF06F41A24BA760086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/ContactDetailsView.strings; sourceTree = ""; }; - F0AF06F51A24BA760086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/ContactsListView.strings; sourceTree = ""; }; - F0AF06F61A24BA760086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/DialerView.strings; sourceTree = ""; }; - F0AF06F91A24BA760086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/HistoryDetailsView.strings; sourceTree = ""; }; - F0AF06FA1A24BA770086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/HistoryListView.strings; sourceTree = ""; }; - F0AF06FB1A24BA770086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/ImageView.strings; sourceTree = ""; }; - F0AF07021A24BA770086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/UIChatCell.strings; sourceTree = ""; }; - F0AF07041A24BA770086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/UICompositeView.strings; sourceTree = ""; }; - F0AF07061A24BA770086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/UIContactCell.strings; sourceTree = ""; }; - F0AF07091A24BA770086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/UIHistoryCell.strings; sourceTree = ""; }; - F0AF070A1A24BA770086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/TabBarView.strings; sourceTree = ""; }; - F0AF070C1A24BA770086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/StatusBarView.strings; sourceTree = ""; }; - F0AF070E1A24BA770086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/SettingsView.strings; sourceTree = ""; }; - F0AF070F1A24BA770086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/AssistantView.strings; sourceTree = ""; }; - F0AF07111A24BA770086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/AssistantViewScreens.strings; sourceTree = ""; }; - F0B026F21AA710AF00FF49F7 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; }; - F0B89C2118DC89E30050B60E /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; - 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; }; - 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 = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 143EFEE2501CB14E6BB244EF /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - EA88F3AC241BD05200E66528 /* UserNotificationsUI.framework in Frameworks */, - EA88F3AB241BD05200E66528 /* UserNotifications.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 61DD7E1F2372E88F001BDD01 /* CoreLocation.framework in Frameworks */, - 6180D6FE21EE41A800AD9CB6 /* QuickLook.framework in Frameworks */, - D37DC7181594AF3400B2A5EB /* MessageUI.framework in Frameworks */, - 61F1997520C6B1D5006B069A /* AVKit.framework in Frameworks */, - 249660951FD6A35F001D55AA /* Photos.framework in Frameworks */, - 24E1C7C01F9A235600D3F981 /* Contacts.framework in Frameworks */, - 8C2595DF1DEDCC8E007A6424 /* CallKit.framework in Frameworks */, - 8C73477C1D9BA3A00022EE8C /* UserNotifications.framework in Frameworks */, - 8CA2004C1D8158440095F859 /* PushKit.framework in Frameworks */, - 340751971506459A00B89C47 /* CoreTelephony.framework in Frameworks */, - 63177FBF1C86E68C00ADE58D /* CoreVideo.framework in Frameworks */, - 63CE58401C85EBF400304800 /* VideoToolbox.framework in Frameworks */, - 6334DDFA1BBAC97C00631900 /* libsqlite3.dylib in Frameworks */, - 152F22361B15E889008C0621 /* libxml2.dylib in Frameworks */, - 570742671D5A63DB004B9C84 /* StoreKit.framework in Frameworks */, - 22405EEE1600B4E400B92522 /* AssetsLibrary.framework in Frameworks */, - 2274402F106F335E006EC466 /* AudioToolbox.framework in Frameworks */, - 224567C2107B968500F10948 /* AVFoundation.framework in Frameworks */, - 228697C411AC29B800E9E0CA /* CFNetwork.framework in Frameworks */, - 2274401A106F31BD006EC466 /* CoreAudio.framework in Frameworks */, - 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */, - 22276E8913C73DC000210156 /* CoreMedia.framework in Frameworks */, - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, - F0B89C2218DC89E30050B60E /* MediaPlayer.framework in Frameworks */, - 226EF06C15FA256B005865C7 /* MobileCoreServices.framework in Frameworks */, - 70E542F313E147E3002BA2C0 /* OpenGLES.framework in Frameworks */, - 70E542F513E147EB002BA2C0 /* QuartzCore.framework in Frameworks */, - 2264B6D211200342002C2C53 /* SystemConfiguration.framework in Frameworks */, - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, - F0B026F31AA710AF00FF49F7 /* libiconv.dylib in Frameworks */, - F05BAA621A5D594E00411815 /* libz.dylib in Frameworks */, - 344ABDF114850AE9007420B6 /* libc++.1.dylib in Frameworks */, - 22D1B68112A3E0BE001AE361 /* libresolv.dylib in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 203E6292C3E84CD13778F720 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 61AE364820C00B370089D9D3 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6637AF8A288593AF00965733 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 080E96DDFE201D6D7F000001 /* Classes */ = { - isa = PBXGroup; - children = ( - 614C087623D1A35E00217F80 /* linphone-Bridging-Header.h */, - C63F7196285A24B10066163B /* Swift */, - 22E0A81D111C44E100B04932 /* AboutView.h */, - 22E0A81C111C44E100B04932 /* AboutView.m */, - 636316D31A1DEBCB0009B839 /* AboutView.xib */, - 633E417F1D74258F00320475 /* AssistantLinkView.h */, - 633E41801D74258F00320475 /* AssistantLinkView.m */, - 63EC8D3B1D7438660066547B /* AssistantLinkView.xib */, - D350F20B15A43BB100149E54 /* AssistantView.h */, - D350F20C15A43BB100149E54 /* AssistantView.m */, - D38187E015FE348A00C3EDCA /* AssistantView.xib */, - D3D5126A160B3A8E00946DF8 /* AssistantViewScreens.xib */, - 8C9C5E0B1F83B2EF006987FA /* ChatConversationCreateCollectionViewController.h */, - 8C9C5E0C1F83B2EF006987FA /* ChatConversationCreateCollectionViewController.m */, - 6341807A1BBC103100F71761 /* ChatConversationCreateTableView.h */, - 6341807B1BBC103100F71761 /* ChatConversationCreateTableView.m */, - 6336715E1BCBAAD200BFCBDE /* ChatConversationCreateView.h */, - 6336715F1BCBAAD200BFCBDE /* ChatConversationCreateView.m */, - 63B8D68E1BCBE65600C12B09 /* ChatConversationCreateView.xib */, - 8CD99A3D2090BA24008A7CDA /* ChatConversationImdnView.h */, - 8CD99A3B2090B9FA008A7CDA /* ChatConversationImdnView.m */, - 8CBD7BA520B6B80D00E5DCC0 /* ChatConversationImdnView.xib */, - 8CA70ACF1F9E0ABA00A3D2EB /* ChatConversationInfoView.h */, - 8CA70AD01F9E0AE100A3D2EB /* ChatConversationInfoView.m */, - 8CBD7BA220B6B7FD00E5DCC0 /* ChatConversationInfoView.xib */, - D32B6E2715A5BC430033019F /* ChatConversationTableView.h */, - D32B6E2815A5BC430033019F /* ChatConversationTableView.m */, - D3F795D315A582800077328B /* ChatConversationView.h */, - D3F795D415A582800077328B /* ChatConversationView.m */, - D38187B015FE340100C3EDCA /* ChatConversationView.xib */, - D3EA540B1598528B0037DC6B /* ChatsListTableView.h */, - D3EA540C1598528B0037DC6B /* ChatsListTableView.m */, - D35E7594159460560066B1C1 /* ChatsListView.h */, - D35E7595159460560066B1C1 /* ChatsListView.m */, - D38187B415FE340500C3EDCA /* ChatsListView.xib */, - D37C639915AADEF4009D0BAC /* ContactDetailsTableView.h */, - D37C639A15AADEF5009D0BAC /* ContactDetailsTableView.m */, - D3128FDE15AABC7E00A2147A /* ContactDetailsView.h */, - D3128FDF15AABC7E00A2147A /* ContactDetailsView.m */, - D38187BC15FE342200C3EDCA /* ContactDetailsView.xib */, - D3549814158761CF000081D8 /* ContactsListTableView.h */, - D3549815158761D0000081D8 /* ContactsListTableView.m */, - D35497FB15875372000081D8 /* ContactsListView.h */, - D35497FC15875372000081D8 /* ContactsListView.m */, - 662553B327EDFB35007F67D8 /* MagicSearch.swift */, - D38187C015FE342800C3EDCA /* ContactsListView.xib */, - 631098471D4660580041F2B3 /* CountryListView.h */, - 631098481D4660580041F2B3 /* CountryListView.m */, - 631098501D4660630041F2B3 /* CountryListView.xib */, - C64A854C2667B66900252AD2 /* EphemeralSettingsView.h */, - C64A854D2667B67200252AD2 /* EphemeralSettingsView.m */, - C64A854F2667B67A00252AD2 /* EphemeralSettingsView.xib */, - 61AEBEB5219198EF00F35E7F /* DevicesListView.h */, - 61AEBEBC2191990A00F35E7F /* DevicesListView.m */, - 61AEBEBE2191991F00F35E7F /* DevicesListView.xib */, - 22F2508B107141E100AC9B3F /* DialerView.h */, - 22F2508C107141E100AC9B3F /* DialerView.m */, - D38187C415FE345B00C3EDCA /* DialerView.xib */, - 638F1A601C2021B2004B8E02 /* DialerView~ipad.xib */, - 6306440B1BECB08500134C72 /* FirstLoginView.h */, - 6306440C1BECB08500134C72 /* FirstLoginView.m */, - 639E9C951C0DB7BE00019A75 /* FirstLoginView.xib */, - 635775231B6673EC00C8B704 /* HistoryDetailsTableView.h */, - 635775241B6673EC00C8B704 /* HistoryDetailsTableView.m */, - C90FAA7615AF54E6002091CB /* HistoryDetailsView.h */, - C90FAA7715AF54E6002091CB /* HistoryDetailsView.m */, - D38187D015FE346700C3EDCA /* HistoryDetailsView.xib */, - D3ED3EA41587334B006C0DE4 /* HistoryListTableView.h */, - D3ED3EA51587334C006C0DE4 /* HistoryListTableView.m */, - D3ED3EB515873928006C0DE4 /* HistoryListView.h */, - D3ED3EB615873929006C0DE4 /* HistoryListView.m */, - D38187D415FE346B00C3EDCA /* HistoryListView.xib */, - D378AB2815DCDB480098505D /* ImagePickerView.h */, - D378AB2915DCDB490098505D /* ImagePickerView.m */, - 22405EFD1601C19000B92522 /* ImageView.h */, - 22405EFE1601C19100B92522 /* ImageView.m */, - D37EE11016035793003608A6 /* ImageView.xib */, - 63E59A3D1ADE6ECB00646FB3 /* InAppProductsManager.h */, - 63E59A3E1ADE70D900646FB3 /* InAppProductsManager.m */, - 6130C85B22BBB493009CC79C /* LaunchScreen.h */, - 63E27A311C4FECD000D332AE /* LaunchScreen.xib */, - 1D3623240D0F684500981E51 /* LinphoneAppDelegate.h */, - 1D3623250D0F684500981E51 /* LinphoneAppDelegate.m */, - D37DC6BF1594AE1800B2A5EB /* LinphoneCoreSettingsStore.h */, - D37DC6C01594AE1800B2A5EB /* LinphoneCoreSettingsStore.m */, - D3EA53FB159850E80037DC6B /* LinphoneManager.h */, - D3EA53FC159850E80037DC6B /* LinphoneManager.m */, - 2214EB7012F84668002A5394 /* LinphoneUI */, - F0642EF019DAC891009DB336 /* MainStoryboard.storyboard */, - D3F83F8C158229C500336684 /* PhoneMainView.h */, - D3F83F8D15822ABD00336684 /* PhoneMainView.m */, - 639E9CB31C0DB88200019A75 /* PhoneMainView.xib */, - CF7602DF21086EB100749F76 /* RecordingsListTableView.h */, - CF7602E021086EB200749F76 /* RecordingsListTableView.m */, - CF7602D4210867E800749F76 /* RecordingsListView.h */, - CF7602D5210867E800749F76 /* RecordingsListView.m */, - 617B4A62260A2B7800A87337 /* RecordingsListView.xib */, - D35E759C159460B50066B1C1 /* SettingsView.h */, - D35E759D159460B50066B1C1 /* SettingsView.m */, - 636316D61A1DEC650009B839 /* SettingsView.xib */, - 63BE7A761D75BDF6000990EF /* ShopTableView.h */, - 63BE7A771D75BDF6000990EF /* ShopTableView.m */, - 570742601D5A09B8004B9C84 /* ShopView.h */, - 5707425F1D5A09B8004B9C84 /* ShopView.m */, - 570742561D5A0691004B9C84 /* ShopView.xib */, - 633756371B67BAF400E21BAD /* SideMenuTableView.h */, - 633756381B67BAF400E21BAD /* SideMenuTableView.m */, - 633756421B67D2B100E21BAD /* SideMenuView.h */, - 633756431B67D2B100E21BAD /* SideMenuView.m */, - 639E9CB21C0DB83000019A75 /* SideMenuView.xib */, - 63130FB01C1ED06900371918 /* SideMenuView~ipad.xib */, - D354981E1587716B000081D8 /* StatusBarView.h */, - D354981F1587716B000081D8 /* StatusBarView.m */, - 639CEAFF1A1DF4D9004DE38F /* StatusBarView.xib */, - D3ED3E841586291B006C0DE4 /* TabBarView.h */, - D3ED3E851586291B006C0DE4 /* TabBarView.m */, - D38187FB15FE355D00C3EDCA /* TabBarView.xib */, - D326483415887D4400930C67 /* Utils */, - 669B140B27A29D140012220A /* FloatingScrollDownButton.swift */, - ); - path = Classes; - sourceTree = ""; - }; - 19C28FACFE9D520D11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - 1D6058910D05DD3D006BFB54 /* linphone.app */, - 61AE364B20C00B370089D9D3 /* linphoneExtension.appex */, - EA5F25D9232BD3E200475F2E /* msgNotificationService.appex */, - EA8CB827239F96CA00C330CC /* msgNotificationContent.appex */, - 6637AF8D288593AF00965733 /* CallUITests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 2214EB7012F84668002A5394 /* LinphoneUI */ = { - isa = PBXGroup; - children = ( - C6A1BB3B26E882D000540D50 /* UIChatReplyBubbleView.h */, - C6A1BB3C26E882D000540D50 /* UIChatReplyBubbleView.m */, - C66B03BD26E8EB1A009B5EDC /* UIChatReplyBubbleView.xib */, - 63F1DF421BCE618E00EDED90 /* UIAddressTextField.h */, - 63F1DF431BCE618E00EDED90 /* UIAddressTextField.m */, - 63C441C11BBC23ED0053DC5E /* UIAssistantTextField.h */, - 63C441C21BBC23ED0053DC5E /* UIAssistantTextField.m */, - 633FEF561D3CD5E00014B822 /* UIAvatarPresence.h */, - 633FEF571D3CD5E00014B822 /* UIAvatarPresence.m */, - 6377AC7E1BDE4068007F7625 /* UIBackToCallButton.h */, - 6377AC7F1BDE4069007F7625 /* UIBackToCallButton.m */, - 6381DA7B1C1AD5EA00DF3BBD /* UIBouncingView.h */, - 6381DA7C1C1AD5EA00DF3BBD /* UIBouncingView.m */, - 2214EB7812F846B1002A5394 /* UICallButton.h */, - 2214EB7912F846B1002A5394 /* UICallButton.m */, - 22AA8AFF13D83F6300B30535 /* UICamSwitch.h */, - 22AA8B0013D83F6300B30535 /* UICamSwitch.m */, - 635173F71BA082A40095EB0A /* UIChatBubblePhotoCell.h */, - 635173F81BA082A40095EB0A /* UIChatBubblePhotoCell.m */, - 639E9CA21C0DB7E500019A75 /* UIChatBubblePhotoCell.xib */, - D3A8BB6E15A6C7D500F96BE5 /* UIChatBubbleTextCell.h */, - D3A8BB6F15A6C7D500F96BE5 /* UIChatBubbleTextCell.m */, - 639E9CA51C0DB7EA00019A75 /* UIChatBubbleTextCell.xib */, - 617C2428263022430042FB4A /* UIChatContentView.h */, - 617C2429263022690042FB4A /* UIChatContentView.m */, - D3EA540F159853750037DC6B /* UIChatCell.h */, - D3EA5410159853750037DC6B /* UIChatCell.m */, - 639CEB0B1A1DF4FA004DE38F /* UIChatCell.xib */, - 8CD99A402090CE25008A7CDA /* UIChatConversationImdnTableViewCell.h */, - 8CD99A412090CE6F008A7CDA /* UIChatConversationImdnTableViewCell.m */, - 8CBD7BAB20B6B82A00E5DCC0 /* UIChatConversationImdnTableViewCell.xib */, - 8CA70AE11F9E39E400A3D2EB /* UIChatConversationInfoTableViewCell.h */, - 8CA70AE21F9E39E400A3D2EB /* UIChatConversationInfoTableViewCell.m */, - 8CBD7BA820B6B82400E5DCC0 /* UIChatConversationInfoTableViewCell.xib */, - 63B8D69F1BCBF43100C12B09 /* UIChatCreateCell.h */, - 63B8D6A01BCBF43100C12B09 /* UIChatCreateCell.m */, - 639E9CA81C0DB7F200019A75 /* UIChatCreateCell.xib */, - 8C9C5E0E1F83BD97006987FA /* UIChatCreateCollectionViewCell.h */, - 8C9C5E0F1F83BD97006987FA /* UIChatCreateCollectionViewCell.m */, - 8C92ABF11FA773C20006FB5D /* UIChatNotifiedEventCell.h */, - 8C92ABF21FA773E50006FB5D /* UIChatNotifiedEventCell.m */, - 8C92ABE71FA773190006FB5D /* UIChatNotifiedEventCell.xib */, - 639E9C7E1C0DB13D00019A75 /* UICheckBoxTableView.h */, - 639E9C7F1C0DB13D00019A75 /* UICheckBoxTableView.m */, - D31B4B1E159876C0002E6C72 /* UICompositeView.h */, - D31B4B1F159876C0002E6C72 /* UICompositeView.m */, - 639CEB051A1DF4EB004DE38F /* UICompositeView.xib */, - 638F1A8F1C21993D004B8E02 /* UICompositeView~ipad.xib */, - 63701DDD1BA32039006A9AE3 /* UIConfirmationDialog.h */, - 63701DDE1BA32039006A9AE3 /* UIConfirmationDialog.m */, - 639E9CAB1C0DB7FB00019A75 /* UIConfirmationDialog.xib */, - D3A55FBA15877E5E003FD403 /* UIContactCell.h */, - D3A55FBB15877E5E003FD403 /* UIContactCell.m */, - F088488D19FF8C41007FFCF3 /* UIContactCell.xib */, - D3C6526515AC1A8F0092A874 /* UIContactDetailsCell.h */, - D3C6526615AC1A8F0092A874 /* UIContactDetailsCell.m */, - 639E9CAE1C0DB80300019A75 /* UIContactDetailsCell.xib */, - 2248E90C12F7E4CF00220D9C /* UIDigitButton.h */, - 2248E90D12F7E4CF00220D9C /* UIDigitButton.m */, - 61CCC3D721933B380060EDEA /* UIDeviceCell.h */, - 61CCC3DE21933B580060EDEA /* UIDeviceCell.m */, - 61CCC3E021933B660060EDEA /* UIDeviceCell.xib */, - D31C9C96158A1CDE00756B45 /* UIHistoryCell.h */, - D31C9C97158A1CDE00756B45 /* UIHistoryCell.m */, - 639CEB021A1DF4E4004DE38F /* UIHistoryCell.xib */, - 636BC9951B5F921B00C754CE /* UIIconButton.h */, - 636BC9961B5F921B00C754CE /* UIIconButton.m */, - CF15F21B20E4F9A3008B1DE6 /* UIImageViewDeletable.h */, - CF15F21C20E4F9A3008B1DE6 /* UIImageViewDeletable.m */, - CF15F21D20E4F9A3008B1DE6 /* UIImageViewDeletable.xib */, - 6135761A240E81AC005304D4 /* UIInterfaceStyleButton.h */, - 6135761B240E81BA005304D4 /* UIInterfaceStyleButton.m */, - 6135761D240E81C7005304D4 /* UIInterfaceStyleToggleButton.h */, - 6135761E240E81D0005304D4 /* UIInterfaceStyleToggleButton.m */, - 634610041B61330300548952 /* UILabel+Boldify.h */, - 634610051B61330300548952 /* UILabel+Boldify.m */, - CF1DE92C210A0F5C00A0A97E /* UILinphoneAudioPlayer.h */, - CF1DE924210A0F5A00A0A97E /* UILinphoneAudioPlayer.m */, - CF1DE92B210A0F5B00A0A97E /* UILinphoneAudioPlayer.xib */, - D306459C1611EC2900BB571E /* UILoadingImageView.h */, - D306459D1611EC2900BB571E /* UILoadingImageView.m */, - CF7602E42108759A00749F76 /* UIRecordingCell.h */, - CF7602E52108759A00749F76 /* UIRecordingCell.m */, - CF7602E62108759A00749F76 /* UIRecordingCell.xib */, - 6313482E1B6F7B6600C6BDCB /* UIRoundBorderedButton.h */, - 6313482F1B6F7B6600C6BDCB /* UIRoundBorderedButton.m */, - 63FB30331A680E73008CA393 /* UIRoundedImageView.h */, - 63FB30341A680E73008CA393 /* UIRoundedImageView.m */, - 8C5D1B991D9BC48100DC6539 /* UIShopTableCell.h */, - 8C5D1B9B1D9BC48100DC6539 /* UIShopTableCell.xib */, - 24A345A71D95799900881A5C /* UIShopTableCell.h */, - 630CF5551AF7CE1500539F7A /* UITextField+DoneButton.h */, - 630CF5561AF7CE1500539F7A /* UITextField+DoneButton.m */, - F03CA84118C72F1A0008889D /* UITextViewNoDefine.h */, - F03CA84218C72F1A0008889D /* UITextViewNoDefine.m */, - D32648421588F6FA00930C67 /* UIToggleButton.h */, - D32648431588F6FB00930C67 /* UIToggleButton.m */, - 24A345A51D95798A00881A5C /* UIShopTableCell.m */, - 24A3459D1D95797700881A5C /* UIShopTableCell.xib */, - ); - path = LinphoneUI; - sourceTree = ""; - }; - 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { - isa = PBXGroup; - children = ( - 8C23BCB71D82AAC3005F19BB /* linphone.entitlements */, - 614D09CD21E74D5400C43EDF /* GoogleService-Info.plist */, - 080E96DDFE201D6D7F000001 /* Classes */, - 61AE364C20C00B370089D9D3 /* linphoneExtension */, - EA5F25DA232BD3E200475F2E /* msgNotificationService */, - 662F5971288AEFAA00C9CAF7 /* UITests */, - EA8CB82A239F96CA00C330CC /* msgNotificationContent */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - F0938158188E629800A55DFA /* iTunesArtwork */, - 29B97315FDCFA39411CA2CEA /* Other Sources */, - 19C28FACFE9D520D11CA2CBB /* Products */, - 633E388219FFB0F400936D1C /* README.md */, - 63AADBC31B6A0FF200AA16FD /* Resources */, - D398D3031594B0FB00FD553C /* Settings */, - 75AA7090378DBBA5417E4370 /* Pods */, - ); - name = CustomTemplate; - sourceTree = ""; - }; - 29B97315FDCFA39411CA2CEA /* Other Sources */ = { - isa = PBXGroup; - children = ( - 32CA4F630368D1EE00C91783 /* linphone_Prefix.pch */, - 29B97316FDCFA39411CA2CEA /* main.m */, - ); - name = "Other Sources"; - sourceTree = ""; - }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { - isa = PBXGroup; - children = ( - 61DD7E1E2372E88F001BDD01 /* CoreLocation.framework */, - 6180D6FD21EE41A800AD9CB6 /* QuickLook.framework */, - 22B5F03410CE6B2F00777D97 /* AddressBook.framework */, - 22B5EFA210CE50BD00777D97 /* AddressBookUI.framework */, - 22405EED1600B4E400B92522 /* AssetsLibrary.framework */, - 2274402E106F335E006EC466 /* AudioToolbox.framework */, - F0BB8C311936246600974404 /* AudioUnit.framework */, - 224567C1107B968500F10948 /* AVFoundation.framework */, - 61F1996E20C6B1D5006B069A /* AVKit.framework */, - 8C5BCEC61EB3859200A9AAEF /* bctoolbox-tester.framework */, - 8C2595DE1DEDCC8E007A6424 /* CallKit.framework */, - 228697C311AC29B800E9E0CA /* CFNetwork.framework */, - 24E1C7B91F9A235500D3F981 /* Contacts.framework */, - 22744019106F31BD006EC466 /* CoreAudio.framework */, - 22744056106F9BC9006EC466 /* CoreFoundation.framework */, - 288765FC0DF74451002DB57D /* CoreGraphics.framework */, - 22276E8813C73DC000210156 /* CoreMedia.framework */, - 340751961506459A00B89C47 /* CoreTelephony.framework */, - 22276E8613C73D8A00210156 /* CoreVideo.framework */, - 1D30AB110D05D00D00671497 /* Foundation.framework */, - F0BB8C4A193631B300974404 /* ImageIO.framework */, - F0FF66AA1ACAEEB0008A4486 /* IOKit.framework */, - 344ABDEF14850AE9007420B6 /* libc++.1.dylib */, - F03A9B9718C0DB6F00C4D7FE /* libc++.dylib */, - F0B026F21AA710AF00FF49F7 /* libiconv.dylib */, - 63EEE40D1BBA9B250087D3AF /* libiconv.tbd */, - F0BB8C34193624C800974404 /* libresolv.9.dylib */, - 22D1B68012A3E0BE001AE361 /* libresolv.dylib */, - 8CD0B3BE1FA22CBA008FEB16 /* libsoci_core.a */, - 8C1A1F7C1FA331D40064BE00 /* libsoci_sqlite3.a */, - D32B6E2E15A5C0AC0033019F /* libsqlite3.dylib */, - 63EEE40B1BBA9B1B0087D3AF /* libsqlite3.tbd */, - 344ABDF014850AE9007420B6 /* libstdc++.6.dylib */, - F03A9B9418C0DAE100C4D7FE /* libstdc++.dylib */, - 152F22351B15E889008C0621 /* libxml2.dylib */, - 63EEE4091BBA9B110087D3AF /* libxml2.tbd */, - F05BAA611A5D594E00411815 /* libz.dylib */, - 8C3EAA191EB8D9C300B732B6 /* linphonetester.framework */, - F0B89C2118DC89E30050B60E /* MediaPlayer.framework */, - D37DC7171594AF3400B2A5EB /* MessageUI.framework */, - 226EF06B15FA256B005865C7 /* MobileCoreServices.framework */, - 5EF0C33820C806A5005081B0 /* NotificationCenter.framework */, - 70E542F213E147E3002BA2C0 /* OpenGLES.framework */, - 249660941FD6A359001D55AA /* Photos.framework */, - 8CA2004B1D8158440095F859 /* PushKit.framework */, - 70E542F413E147EB002BA2C0 /* QuartzCore.framework */, - 22744043106F33FC006EC466 /* Security.framework */, - F0181B6B18BF7B1200A9A357 /* SenTestingKit.framework */, - 570742661D5A63DB004B9C84 /* StoreKit.framework */, - 2264B6D111200342002C2C53 /* SystemConfiguration.framework */, - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, - 8C73477B1D9BA3A00022EE8C /* UserNotifications.framework */, - 5E58962520DCE5700030868C /* UserNotificationsUI.framework */, - 63CE583F1C85EBF400304800 /* VideoToolbox.framework */, - C6909F6B2AA0DC2A0011D273 /* NetworkExtension.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 61AE364C20C00B370089D9D3 /* linphoneExtension */ = { - isa = PBXGroup; - children = ( - 61AE366320C00C810089D9D3 /* linphoneExtension.entitlements */, - 61AE364D20C00B370089D9D3 /* ShareViewController.h */, - 61AE364E20C00B370089D9D3 /* ShareViewController.m */, - 61AE365020C00B370089D9D3 /* MainInterface.storyboard */, - 61AE365320C00B370089D9D3 /* Info.plist */, - ); - path = linphoneExtension; - sourceTree = ""; - }; - 633888401BFB2C49001D5E7B /* HPGrowingTextView */ = { - isa = PBXGroup; - children = ( - 633888411BFB2C49001D5E7B /* HPGrowingTextView.h */, - 633888421BFB2C49001D5E7B /* HPGrowingTextView.m */, - 633888431BFB2C49001D5E7B /* HPTextViewInternal.h */, - 633888441BFB2C49001D5E7B /* HPTextViewInternal.m */, - ); - name = HPGrowingTextView; - path = Utils/HPGrowingTextView; - sourceTree = ""; - }; - 633FEBE11D3CD5570014B822 /* images */ = { - isa = PBXGroup; - children = ( - D7A4C0052A3B135800EFBD1B /* new_chat_attachment_default.png */, - D7A4C0072A3B135800EFBD1B /* new_chat_send_default.png */, - D7A4C0062A3B135800EFBD1B /* new_vr_off.png */, - D7CF13722A2E225200D92165 /* emoji.png */, - C6E3E7ED291D648D00DDFC46 /* side_menu_voip_meeting_schedule@2x.png */, - C6E3E7EB291D642B00DDFC46 /* side_menu_voip_meeting_schedule.png */, - C6F55646287CCFB60056E213 /* menu_voip_meeting_schedule.png */, - C6F55644287CC69F0056E213 /* voip_meeting_schedule.png */, - C63F72A4285A2F1B0066163B /* conference_schedule_calendar_default.png */, - C63F72AD285A2F1C0066163B /* conference_schedule_participants_default.png */, - C63F72A8285A2F1C0066163B /* conference_schedule_time_default.png */, - C63F7280285A2F160066163B /* voip_audio_routes.png */, - C63F729B285A2F1A0066163B /* voip_bluetooth.png */, - C63F728A285A2F180066163B /* voip_call_add.png */, - C63F72A5285A2F1B0066163B /* voip_call_chat.png */, - C63F7282285A2F170066163B /* voip_call_forward.png */, - C63F729A285A2F1A0066163B /* voip_call_header_active.png */, - C63F7279285A2F150066163B /* voip_call_header_incoming.png */, - C63F72B4285A2F1D0066163B /* voip_call_header_outgoing.png */, - C63F727B285A2F160066163B /* voip_call_header_paused.png */, - C63F72A0285A2F1B0066163B /* voip_call_list_menu.png */, - C63F7287285A2F170066163B /* voip_call_more.png */, - C63F7276285A2F150066163B /* voip_call_numpad.png */, - C63F72A3285A2F1B0066163B /* voip_call_participants.png */, - C63F7281285A2F160066163B /* voip_call_record.png */, - C63F7288285A2F170066163B /* voip_call_stats.png */, - C63F729F285A2F1B0066163B /* voip_call.png */, - C63F727A285A2F150066163B /* voip_calls_list.png */, - C63F72AA285A2F1C0066163B /* voip_camera_off.png */, - C63F729D285A2F1A0066163B /* voip_camera_on.png */, - C63F72B3285A2F1D0066163B /* voip_cancel.png */, - C63F7283285A2F170066163B /* voip_change_camera.png */, - C63F7277285A2F150066163B /* voip_chat_rooms_list.png */, - C63F7284285A2F170066163B /* voip_checkbox_checked.png */, - C63F72A6285A2F1B0066163B /* voip_checkbox_unchecked.png */, - C63F72A1285A2F1B0066163B /* voip_conference_active_speaker.png */, - C63F7297285A2F190066163B /* voip_conference_audio_only.png */, - C63F72AE285A2F1D0066163B /* voip_conference_mosaic.png */, - C63F72B0285A2F1D0066163B /* voip_conference_new_selected.png */, - C63F7299285A2F1A0066163B /* voip_conference_new.png */, - C63F728C285A2F180066163B /* voip_conference_paused_big.png */, - C63F729E285A2F1A0066163B /* voip_conference_play_big.png */, - C63F728B285A2F180066163B /* voip_copy.png */, - C63F72B2285A2F1D0066163B /* voip_delete.png */, - C63F7271285A2F140066163B /* voip_dropdown.png */, - C63F7295285A2F190066163B /* voip_earpiece.png */, - C63F72A7285A2F1C0066163B /* voip_edit.png */, - C63F7275285A2F150066163B /* voip_export.png */, - C63F7291285A2F190066163B /* voip_hangup.png */, - C63F7285285A2F170066163B /* voip_info.png */, - C63F7294285A2F190066163B /* voip_mandatory.png */, - C63F7298285A2F1A0066163B /* voip_menu_more.png */, - C63F72A9285A2F1C0066163B /* voip_merge_calls.png */, - C63F729C285A2F1A0066163B /* voip_micro_off.png */, - C63F72AB285A2F1C0066163B /* voip_micro_on.png */, - C63F728F285A2F180066163B /* voip_multiple_contacts_avatar.png */, - C63F727C285A2F160066163B /* voip_numpad_0.png */, - C63F7293285A2F190066163B /* voip_numpad_1.png */, - C63F7296285A2F190066163B /* voip_numpad_2.png */, - C63F727D285A2F160066163B /* voip_numpad_3.png */, - C63F7278285A2F150066163B /* voip_numpad_4.png */, - C63F72AF285A2F1D0066163B /* voip_numpad_5.png */, - C63F72A2285A2F1B0066163B /* voip_numpad_6.png */, - C63F7273285A2F140066163B /* voip_numpad_7.png */, - C63F7289285A2F180066163B /* voip_numpad_8.png */, - C63F727E285A2F160066163B /* voip_numpad_9.png */, - C63F728E285A2F180066163B /* voip_numpad_hash.png */, - C63F728D285A2F180066163B /* voip_numpad_star.png */, - C63F7292285A2F190066163B /* voip_pause.png */, - C63F7274285A2F150066163B /* voip_radio_off.png */, - C63F72AC285A2F1C0066163B /* voip_radio_on.png */, - C63F7290285A2F180066163B /* voip_remote_recording.png */, - C63F72B1285A2F1D0066163B /* voip_single_contact_avatar.png */, - C63F7286285A2F170066163B /* voip_speaker_off.png */, - C63F727F285A2F160066163B /* voip_speaker_on.png */, - C63F7272285A2F140066163B /* voip_spinner.png */, - C66B040D26F095CE009B5EDC /* cancel_forward.png */, - C66B040926EFDA54009B5EDC /* reply_cancel.png */, - C6A1BB4426E890BD00540D50 /* file_voice_default.png */, - C6A1BB4226E88F7C00540D50 /* menu_resend_default.png */, - C6A1BB4026E889AD00540D50 /* forward_message_default.png */, - C6A1BB3926E881E100540D50 /* menu_delete.png */, - C6A1BB3326E8815400540D50 /* menu_copy_text_default.png */, - C6A1BB3226E8815400540D50 /* menu_forward_default.png */, - C6A1BB3126E8815300540D50 /* menu_info.png */, - C6A1BB3426E8815400540D50 /* menu_reply_default.png */, - C6B4444026AAD0970076C517 /* file_audio_default.png */, - C6B4443E26AAD0970076C517 /* file_default.png */, - C6B4444126AAD0970076C517 /* file_pdf_default.png */, - C6B4443F26AAD0970076C517 /* file_picture_default.png */, - C6B4443D26AAD0970076C517 /* file_video_default.png */, - C622E3EC26A8128F004F5434 /* vr_off.png */, - C622E3EB26A8128F004F5434 /* vr_on.png */, - C622E3ED26A8128F004F5434 /* vr_pause.png */, - C622E3EE26A81290004F5434 /* vr_play.png */, - C622E3E926A8128F004F5434 /* vr_stop.png */, - C622E3EA26A8128F004F5434 /* vr_wave.png */, - C61B1BF62667EC6B001A4E4A /* ephemeral_messages_color_A.png */, - C61B1BF32667D202001A4E4A /* more_menu_default.png */, - C61B1BF12667D075001A4E4A /* menu_security_default.png */, - C64A85512667B74100252AD2 /* ephemeral_messages_default.png */, - 633FEBE21D3CD5570014B822 /* add_field_default.png */, - 633FEBE31D3CD5570014B822 /* add_field_default@2x.png */, - 633FEBE41D3CD5570014B822 /* add_field_over.png */, - 633FEBE51D3CD5570014B822 /* add_field_over@2x.png */, - 633FEBE61D3CD5570014B822 /* avatar.png */, - 633FEBE71D3CD5570014B822 /* avatar@2x.png */, - 633FEBE81D3CD5570014B822 /* avatar~ipad.png */, - 633FEBE91D3CD5570014B822 /* avatar~ipad@2x.png */, - 633FEBEA1D3CD5570014B822 /* back_default.png */, - 633FEBEB1D3CD5570014B822 /* back_default@2x.png */, - 633FEBEC1D3CD5570014B822 /* back_disabled.png */, - 633FEBED1D3CD5570014B822 /* back_disabled@2x.png */, - 633FEBEE1D3CD5570014B822 /* backspace_default.png */, - 633FEBEF1D3CD5570014B822 /* backspace_default@2x.png */, - 633FEBF01D3CD5570014B822 /* backspace_disabled.png */, - 633FEBF11D3CD5570014B822 /* backspace_disabled@2x.png */, - 633FEBF21D3CD5570014B822 /* backspace_over.png */, - 633FEBF31D3CD5570014B822 /* backspace_over@2x.png */, - 633FEBF41D3CD5570014B822 /* call_add_default.png */, - 633FEBF51D3CD5570014B822 /* call_add_default@2x.png */, - 633FEBF61D3CD5570014B822 /* call_add_disabled.png */, - 633FEBF71D3CD5570014B822 /* call_add_disabled@2x.png */, - 633FEBF81D3CD5570014B822 /* call_alt_back_default.png */, - 633FEBF91D3CD5570014B822 /* call_alt_back_default@2x.png */, - 633FEBFA1D3CD5570014B822 /* call_alt_back_disabled.png */, - 633FEBFB1D3CD5570014B822 /* call_alt_back_disabled@2x.png */, - 633FEBFC1D3CD5570014B822 /* call_alt_start_default.png */, - 633FEBFD1D3CD5570014B822 /* call_alt_start_default@2x.png */, - 633FEBFE1D3CD5570014B822 /* call_alt_start_disabled.png */, - 633FEBFF1D3CD5570014B822 /* call_alt_start_disabled@2x.png */, - 633FEC001D3CD5570014B822 /* call_audio_start_default.png */, - 633FEC011D3CD5570014B822 /* call_audio_start_default@2x.png */, - 633FEC021D3CD5570014B822 /* call_audio_start_disabled.png */, - 633FEC031D3CD5570014B822 /* call_audio_start_disabled@2x.png */, - 633FEC041D3CD5570014B822 /* call_back_default.png */, - 633FEC051D3CD5570014B822 /* call_back_default@2x.png */, - 633FEC061D3CD5570014B822 /* call_back_disabled.png */, - 633FEC071D3CD5570014B822 /* call_back_disabled@2x.png */, - 633FEC081D3CD5570014B822 /* call_hangup_default.png */, - 633FEC091D3CD5570014B822 /* call_hangup_default@2x.png */, - 633FEC0A1D3CD5570014B822 /* call_hangup_disabled.png */, - 633FEC0B1D3CD5570014B822 /* call_hangup_disabled@2x.png */, - 633FEC0C1D3CD5570014B822 /* call_incoming.png */, - 633FEC0D1D3CD5570014B822 /* call_incoming@2x.png */, - 633FEC0E1D3CD5570014B822 /* call_missed.png */, - 633FEC0F1D3CD5570014B822 /* call_missed@2x.png */, - 633FEC101D3CD5570014B822 /* call_outgoing.png */, - 633FEC111D3CD5570014B822 /* call_outgoing@2x.png */, - 633FEC121D3CD5570014B822 /* call_quality_indicator_0.png */, - 633FEC131D3CD5570014B822 /* call_quality_indicator_0@2x.png */, - 633FEC141D3CD5570014B822 /* call_quality_indicator_1.png */, - 633FEC151D3CD5570014B822 /* call_quality_indicator_1@2x.png */, - 633FEC161D3CD5570014B822 /* call_quality_indicator_2.png */, - 633FEC171D3CD5570014B822 /* call_quality_indicator_2@2x.png */, - 633FEC181D3CD5570014B822 /* call_quality_indicator_3.png */, - 633FEC191D3CD5570014B822 /* call_quality_indicator_3@2x.png */, - 633FEC1A1D3CD5570014B822 /* call_quality_indicator_4.png */, - 633FEC1B1D3CD5570014B822 /* call_quality_indicator_4@2x.png */, - 633FEC1C1D3CD5570014B822 /* call_start_body_default.png */, - 633FEC1D1D3CD5570014B822 /* call_start_body_default@2x.png */, - 633FEC1E1D3CD5570014B822 /* call_start_body_default~ipad.png */, - 633FEC1F1D3CD5570014B822 /* call_start_body_default~ipad@2x.png */, - 633FEC201D3CD5570014B822 /* call_start_body_disabled.png */, - 633FEC211D3CD5570014B822 /* call_start_body_disabled@2x.png */, - 633FEC221D3CD5570014B822 /* call_start_body_disabled~ipad.png */, - 633FEC231D3CD5570014B822 /* call_start_body_disabled~ipad@2x.png */, - 633FEC241D3CD5570014B822 /* call_start_body_over.png */, - 633FEC251D3CD5570014B822 /* call_start_body_over@2x.png */, - 633FEC261D3CD5570014B822 /* call_start_body_over~ipad.png */, - 633FEC271D3CD5570014B822 /* call_start_body_over~ipad@2x.png */, - 633FEC281D3CD5570014B822 /* call_status_incoming.png */, - 633FEC291D3CD5570014B822 /* call_status_incoming@2x.png */, - 633FEC2A1D3CD5570014B822 /* call_status_incoming~ipad.png */, - 633FEC2B1D3CD5570014B822 /* call_status_incoming~ipad@2x.png */, - 633FEC2C1D3CD5570014B822 /* call_status_missed.png */, - 633FEC2D1D3CD5570014B822 /* call_status_missed@2x.png */, - 633FEC2E1D3CD5570014B822 /* call_status_missed~ipad.png */, - 633FEC2F1D3CD5570014B822 /* call_status_missed~ipad@2x.png */, - 633FEC301D3CD5570014B822 /* call_status_outgoing.png */, - 633FEC311D3CD5570014B822 /* call_status_outgoing@2x.png */, - 633FEC321D3CD5570014B822 /* call_status_outgoing~ipad.png */, - 633FEC331D3CD5570014B822 /* call_status_outgoing~ipad@2x.png */, - 633FEC341D3CD5570014B822 /* call_transfer_default.png */, - 633FEC351D3CD5570014B822 /* call_transfer_default@2x.png */, - 633FEC361D3CD5570014B822 /* call_transfer_disabled.png */, - 633FEC371D3CD5570014B822 /* call_transfer_disabled@2x.png */, - 633FEC381D3CD5570014B822 /* call_video_start_default.png */, - 633FEC391D3CD5570014B822 /* call_video_start_default@2x.png */, - 633FEC3A1D3CD5570014B822 /* call_video_start_disabled.png */, - 633FEC3B1D3CD5570014B822 /* call_video_start_disabled@2x.png */, - 24BFAA9B209B062F004F47A7 /* callkit_logo.png */, - 8CD99A1B20908C27008A7CDA /* callkit_logo@2x.png */, - 633FEC3C1D3CD5570014B822 /* camera_default.png */, - 633FEC3D1D3CD5570014B822 /* camera_default@2x.png */, - 633FEC3E1D3CD5570014B822 /* camera_disabled.png */, - 633FEC3F1D3CD5570014B822 /* camera_disabled@2x.png */, - 633FEC401D3CD5570014B822 /* camera_selected.png */, - 633FEC411D3CD5570014B822 /* camera_selected@2x.png */, - 633FEC421D3CD5570014B822 /* camera_switch_default.png */, - 633FEC431D3CD5570014B822 /* camera_switch_default@2x.png */, - 633FEC441D3CD5570014B822 /* camera_switch_disabled.png */, - 633FEC451D3CD5570014B822 /* camera_switch_disabled@2x.png */, - 633FEC461D3CD5570014B822 /* camera_switch_over.png */, - 633FEC471D3CD5570014B822 /* camera_switch_over@2x.png */, - 633FEC481D3CD5570014B822 /* cancel_edit_default.png */, - 633FEC491D3CD5570014B822 /* cancel_edit_default@2x.png */, - 633FEC4A1D3CD5570014B822 /* cancel_edit_disabled.png */, - 633FEC4B1D3CD5570014B822 /* cancel_edit_disabled@2x.png */, - 633FEC4C1D3CD5570014B822 /* chat_add_default.png */, - 633FEC4D1D3CD5570014B822 /* chat_add_default@2x.png */, - 633FEC4E1D3CD5570014B822 /* chat_add_disabled.png */, - 633FEC4F1D3CD5570014B822 /* chat_add_disabled@2x.png */, - 615A2808217F1FD40060F920 /* chat_add_group.png */, - 615A2810217F1FDE0060F920 /* chat_add_group@2x.png */, - 633FEC501D3CD5570014B822 /* chat_attachment_default.png */, - 633FEC511D3CD5570014B822 /* chat_attachment_default@2x.png */, - 633FEC521D3CD5570014B822 /* chat_attachment_disabled.png */, - 633FEC531D3CD5570014B822 /* chat_attachment_disabled@2x.png */, - 633FEC541D3CD5570014B822 /* chat_attachment_over.png */, - 633FEC551D3CD5570014B822 /* chat_attachment_over@2x.png */, - 244523AC1E8266CC0037A187 /* chat_delivered.png */, - 244523AD1E8266CC0037A187 /* chat_error.png */, - 8CA70AD31F9E285B00A3D2EB /* chat_group_add.png */, - 8CA70AD21F9E285B00A3D2EB /* chat_group_add@2x.png */, - 8C2A81941F87B8000012A66B /* chat_group_avatar.png */, - 8C2A81931F87B7FF0012A66B /* chat_group_avatar@2x.png */, - 8CF25D9B1F9F76BC00BEA0C1 /* chat_group_informations.png */, - 8CF25D9C1F9F76BD00BEA0C1 /* chat_group_informations@2x.png */, - 615A2816217F280C0060F920 /* chat_list_indicator.png */, - 615A2818217F28160060F920 /* chat_list_indicator@2x.png */, - 633FEC561D3CD5570014B822 /* chat_list_indicator~ipad.png */, - 633FEC571D3CD5570014B822 /* chat_list_indicator~ipad@2x.png */, - 633FEC581D3CD5570014B822 /* chat_message_not_delivered.png */, - 633FEC591D3CD5570014B822 /* chat_message_not_delivered@2x.png */, - 244523AE1E8266CC0037A187 /* chat_read.png */, - 8CB2B8F61F86229B0015CEE2 /* chat_secure.png */, - 633FEC5A1D3CD5570014B822 /* chat_send_default.png */, - 633FEC5B1D3CD5570014B822 /* chat_send_default@2x.png */, - 633FEC5C1D3CD5570014B822 /* chat_send_disabled.png */, - 633FEC5D1D3CD5570014B822 /* chat_send_disabled@2x.png */, - 633FEC5E1D3CD5570014B822 /* chat_send_over.png */, - 633FEC5F1D3CD5570014B822 /* chat_send_over@2x.png */, - 633FEC601D3CD5570014B822 /* chat_start_body_default.png */, - 633FEC611D3CD5570014B822 /* chat_start_body_default@2x.png */, - 633FEC621D3CD5570014B822 /* chat_start_body_default~ipad.png */, - 633FEC631D3CD5570014B822 /* chat_start_body_default~ipad@2x.png */, - 633FEC641D3CD5570014B822 /* chat_start_body_disabled.png */, - 633FEC651D3CD5570014B822 /* chat_start_body_disabled@2x.png */, - 633FEC661D3CD5570014B822 /* chat_start_body_disabled~ipad.png */, - 633FEC671D3CD5570014B822 /* chat_start_body_disabled~ipad@2x.png */, - 633FEC681D3CD5570014B822 /* chat_start_body_over.png */, - 633FEC691D3CD5570014B822 /* chat_start_body_over@2x.png */, - 633FEC6A1D3CD5570014B822 /* chat_start_body_over~ipad.png */, - 633FEC6B1D3CD5570014B822 /* chat_start_body_over~ipad@2x.png */, - 244523BC1E8D3A6C0037A187 /* chat_unsecure.png */, - 8CDC618C1F84D89B0087CF7F /* check_selected.png */, - 8CDC61961F84D9270087CF7F /* check_selected@2x.png */, - 8CF25D941F9F336100BEA0C1 /* check_unselected.png */, - 8CF25D8B1F9F336000BEA0C1 /* check_unselected@2x.png */, - 633FEC6C1D3CD5570014B822 /* checkbox_checked.png */, - 633FEC6D1D3CD5570014B822 /* checkbox_checked@2x.png */, - 633FEC6E1D3CD5570014B822 /* checkbox_unchecked.png */, - 633FEC6F1D3CD5570014B822 /* checkbox_unchecked@2x.png */, - 61AEBEC52191E47500F35E7F /* chevron_list_close.png */, - 61AEBEC72191E48400F35E7F /* chevron_list_close@2x.png */, - 61AEBEC92191E49200F35E7F /* chevron_list_open.png */, - 61AEBECB2191E4A300F35E7F /* chevron_list_open@2x.png */, - 633FEC701D3CD5570014B822 /* color_A.png */, - 633FEC711D3CD5570014B822 /* color_C.png */, - 633FEC721D3CD5570014B822 /* color_D.png */, - 633FEC731D3CD5570014B822 /* color_E.png */, - 633FEC741D3CD5570014B822 /* color_F.png */, - 633FEC751D3CD5570014B822 /* color_G.png */, - 633FEC761D3CD5570014B822 /* color_H.png */, - 633FEC771D3CD5570014B822 /* color_I.png */, - 633FEC781D3CD5570014B822 /* color_L.png */, - 633FEC791D3CD5570014B822 /* color_M.png */, - 8CE24F551F8268840077AC0A /* conference_delete.png */, - 8CE24F561F8268840077AC0A /* conference_delete@2x.png */, - 633FEC7A1D3CD5570014B822 /* conference_exit_default.png */, - 633FEC7B1D3CD5570014B822 /* conference_exit_default@2x.png */, - 633FEC7C1D3CD5570014B822 /* conference_exit_over.png */, - 633FEC7D1D3CD5570014B822 /* conference_exit_over@2x.png */, - 633FEC7E1D3CD5570014B822 /* contact_add_default.png */, - 633FEC7F1D3CD5570014B822 /* contact_add_default@2x.png */, - 633FEC801D3CD5570014B822 /* contact_add_disabled.png */, - 633FEC811D3CD5570014B822 /* contact_add_disabled@2x.png */, - 633FEC821D3CD5570014B822 /* contacts_all_default.png */, - 633FEC831D3CD5570014B822 /* contacts_all_default@2x.png */, - 633FEC841D3CD5570014B822 /* contacts_all_disabled.png */, - 633FEC851D3CD5570014B822 /* contacts_all_disabled@2x.png */, - 633FEC861D3CD5570014B822 /* contacts_all_selected.png */, - 633FEC871D3CD5570014B822 /* contacts_all_selected@2x.png */, - 24BFAA99209B062E004F47A7 /* contacts_sip_default.png */, - 24BFAA94209B062C004F47A7 /* contacts_sip_default@2x.png */, - 24BFAA97209B062E004F47A7 /* contacts_sip_selected.png */, - 24BFAA9C209B062F004F47A7 /* contacts_sip_selected@2x.png */, - 633FEC8E1D3CD5570014B822 /* delete_default.png */, - 633FEC8F1D3CD5570014B822 /* delete_default@2x.png */, - 633FEC901D3CD5570014B822 /* delete_disabled.png */, - 633FEC911D3CD5570014B822 /* delete_disabled@2x.png */, - 633FEC921D3CD5570014B822 /* delete_field_default.png */, - 633FEC931D3CD5570014B822 /* delete_field_default@2x.png */, - 633FEC941D3CD5570014B822 /* delete_field_over.png */, - 633FEC951D3CD5570014B822 /* delete_field_over@2x.png */, - CFBD7A2320E504AD007C5286 /* delete_img.png */, - 633FEC961D3CD5570014B822 /* deselect_all.png */, - 633FEC971D3CD5570014B822 /* deselect_all@2x.png */, - 633FEC981D3CD5570014B822 /* dialer_alt_back.png */, - 633FEC991D3CD5570014B822 /* dialer_alt_back@2x.png */, - 633FEC9A1D3CD5570014B822 /* dialer_back_default.png */, - 633FEC9B1D3CD5570014B822 /* dialer_back_default@2x.png */, - 633FEC9C1D3CD5570014B822 /* dialer_back_disabled.png */, - 633FEC9D1D3CD5570014B822 /* dialer_back_disabled@2x.png */, - 24BFAA8C209B062B004F47A7 /* dialer_background.png */, - 633FECA01D3CD5570014B822 /* edit_default.png */, - 633FECA11D3CD5570014B822 /* edit_default@2x.png */, - 633FECA21D3CD5570014B822 /* edit_disabled.png */, - 633FECA31D3CD5570014B822 /* edit_disabled@2x.png */, - 633FECA41D3CD5570014B822 /* edit_list_default.png */, - 633FECA51D3CD5570014B822 /* edit_list_default@2x.png */, - 633FECA61D3CD5570014B822 /* edit_list_disabled.png */, - 633FECA71D3CD5570014B822 /* edit_list_disabled@2x.png */, - 633FECA81D3CD5570014B822 /* footer_chat_default.png */, - 633FECA91D3CD5570014B822 /* footer_chat_default@2x.png */, - 633FECAA1D3CD5570014B822 /* footer_chat_disabled.png */, - 633FECAB1D3CD5570014B822 /* footer_chat_disabled@2x.png */, - 633FECAC1D3CD5570014B822 /* footer_contacts_default.png */, - 633FECAD1D3CD5570014B822 /* footer_contacts_default@2x.png */, - 633FECAE1D3CD5570014B822 /* footer_contacts_disabled.png */, - 633FECAF1D3CD5570014B822 /* footer_contacts_disabled@2x.png */, - 633FECB01D3CD5570014B822 /* footer_dialer_default.png */, - 633FECB11D3CD5570014B822 /* footer_dialer_default@2x.png */, - 633FECB21D3CD5570014B822 /* footer_dialer_disabled.png */, - 633FECB31D3CD5570014B822 /* footer_dialer_disabled@2x.png */, - 633FECB41D3CD5570014B822 /* footer_history_default.png */, - 633FECB51D3CD5570014B822 /* footer_history_default@2x.png */, - 633FECB61D3CD5570014B822 /* footer_history_disabled.png */, - 633FECB71D3CD5570014B822 /* footer_history_disabled@2x.png */, - 633FECB81D3CD5570014B822 /* history_all_default.png */, - 633FECB91D3CD5570014B822 /* history_all_default@2x.png */, - 633FECBA1D3CD5570014B822 /* history_all_disabled.png */, - 633FECBB1D3CD5570014B822 /* history_all_disabled@2x.png */, - 633FECBC1D3CD5570014B822 /* history_all_selected.png */, - 633FECBD1D3CD5570014B822 /* history_all_selected@2x.png */, - 633FECBE1D3CD5570014B822 /* history_chat_indicator.png */, - 633FECBF1D3CD5570014B822 /* history_chat_indicator@2x.png */, - 633FECC01D3CD5570014B822 /* history_missed_default.png */, - 633FECC11D3CD5570014B822 /* history_missed_default@2x.png */, - 633FECC21D3CD5570014B822 /* history_missed_disabled.png */, - 633FECC31D3CD5570014B822 /* history_missed_disabled@2x.png */, - 633FECC41D3CD5570014B822 /* history_missed_selected.png */, - 633FECC51D3CD5570014B822 /* history_missed_selected@2x.png */, - 615A283D2180A2550060F920 /* invite_linphone.png */, - 615A283F2180A2620060F920 /* invite_linphone@2x.png */, - 633FECC61D3CD5570014B822 /* led_connected.png */, - 633FECC71D3CD5570014B822 /* led_connected@2x.png */, - 633FECC81D3CD5570014B822 /* led_disconnected.png */, - 633FECC91D3CD5570014B822 /* led_disconnected@2x.png */, - 633FECCA1D3CD5570014B822 /* led_error.png */, - 633FECCB1D3CD5570014B822 /* led_error@2x.png */, - 633FECCC1D3CD5570014B822 /* led_inprogress.png */, - 633FECCD1D3CD5570014B822 /* led_inprogress@2x.png */, - 8C300D981E40E0CC00728EF3 /* lime_ko.png */, - 8C300D991E40E0CC00728EF3 /* lime_ko@2x.png */, - 24BFAA98209B062E004F47A7 /* linphone_logo.png */, - 24BFAA9D209B0630004F47A7 /* linphone_logo@2x.png */, - 24BFAA93209B062C004F47A7 /* linphone_user.png */, - 24BFAA95209B062D004F47A7 /* linphone_user@2x.png */, - 24BFAA9A209B062F004F47A7 /* linphone_user~ipad.png */, - 24BFAA96209B062D004F47A7 /* linphone_user~ipad@2x.png */, - 633FECD41D3CD5580014B822 /* list_details_default.png */, - 633FECD51D3CD5580014B822 /* list_details_default@2x.png */, - 633FECD61D3CD5580014B822 /* list_details_over.png */, - 633FECD71D3CD5580014B822 /* list_details_over@2x.png */, - 633FECD81D3CD5580014B822 /* menu.png */, - 633FECD91D3CD5580014B822 /* menu@2x.png */, - 61586B7A217A16EE0038AC45 /* menu_about.png */, - 61586B82217A16FD0038AC45 /* menu_about@2x.png */, - 61586B84217A17070038AC45 /* menu_assistant.png */, - 61586B86217A17150038AC45 /* menu_assistant@2x.png */, - 61586B88217A17220038AC45 /* menu_link_account.png */, - 61586B8A217A17320038AC45 /* menu_link_account@2x.png */, - 66E399F52857869200E73456 /* menu_notifications_off.png */, - 66E399F62857869200E73456 /* menu_notifications_on.png */, - 61586B8C217A173F0038AC45 /* menu_options.png */, - 61586B8E217A174F0038AC45 /* menu_options@2x.png */, - 61586B90217A175C0038AC45 /* menu_recordings.png */, - 61586B92217A176F0038AC45 /* menu_recordings@2x.png */, - 633FECDA1D3CD5580014B822 /* micro_default.png */, - 633FECDB1D3CD5580014B822 /* micro_default@2x.png */, - 633FECDC1D3CD5580014B822 /* micro_disabled.png */, - 633FECDD1D3CD5580014B822 /* micro_disabled@2x.png */, - 633FECDE1D3CD5580014B822 /* micro_selected.png */, - 633FECDF1D3CD5580014B822 /* micro_selected@2x.png */, - 8CE24F491F8234A20077AC0A /* next_default.png */, - 8CE24F4A1F8234A30077AC0A /* next_default@2x.png */, - 8CB2B8F71F86229C0015CEE2 /* next_disabled.png */, - 8CB2B8F81F86229D0015CEE2 /* next_disabled@2x.png */, - 633FECE01D3CD5580014B822 /* nowebcamCIF.jpg */, - 633FECE11D3CD5580014B822 /* numpad_0_default.png */, - 633FECE21D3CD5580014B822 /* numpad_0_default@2x.png */, - 633FECE31D3CD5580014B822 /* numpad_0_over.png */, - 633FECE41D3CD5580014B822 /* numpad_0_over@2x.png */, - 633FECE51D3CD5580014B822 /* numpad_0_over~ipad.png */, - 633FECE61D3CD5580014B822 /* numpad_0_over~ipad@2x.png */, - 633FECE71D3CD5580014B822 /* numpad_0~ipad.png */, - 633FECE81D3CD5580014B822 /* numpad_0~ipad@2x.png */, - 633FECE91D3CD5580014B822 /* numpad_1_default.png */, - 633FECEA1D3CD5580014B822 /* numpad_1_default@2x.png */, - 633FECEB1D3CD5580014B822 /* numpad_1_over.png */, - 633FECEC1D3CD5580014B822 /* numpad_1_over@2x.png */, - 633FECED1D3CD5580014B822 /* numpad_1_over~ipad.png */, - 633FECEE1D3CD5580014B822 /* numpad_1_over~ipad@2x.png */, - 633FECEF1D3CD5580014B822 /* numpad_1~ipad.png */, - 633FECF01D3CD5580014B822 /* numpad_1~ipad@2x.png */, - 633FECF11D3CD5580014B822 /* numpad_2_default.png */, - 633FECF21D3CD5580014B822 /* numpad_2_default@2x.png */, - 633FECF31D3CD5580014B822 /* numpad_2_over.png */, - 633FECF41D3CD5580014B822 /* numpad_2_over@2x.png */, - 633FECF51D3CD5580014B822 /* numpad_2_over~ipad.png */, - 633FECF61D3CD5580014B822 /* numpad_2_over~ipad@2x.png */, - 633FECF71D3CD5580014B822 /* numpad_2~ipad.png */, - 633FECF81D3CD5580014B822 /* numpad_2~ipad@2x.png */, - 633FECF91D3CD5580014B822 /* numpad_3_default.png */, - 633FECFA1D3CD5580014B822 /* numpad_3_default@2x.png */, - 633FECFB1D3CD5580014B822 /* numpad_3_over.png */, - 633FECFC1D3CD5580014B822 /* numpad_3_over@2x.png */, - 633FECFD1D3CD5580014B822 /* numpad_3_over~ipad.png */, - 633FECFE1D3CD5580014B822 /* numpad_3_over~ipad@2x.png */, - 633FECFF1D3CD5580014B822 /* numpad_3~ipad.png */, - 633FED001D3CD5580014B822 /* numpad_3~ipad@2x.png */, - 633FED011D3CD5580014B822 /* numpad_4_default.png */, - 633FED021D3CD5580014B822 /* numpad_4_default@2x.png */, - 633FED031D3CD5580014B822 /* numpad_4_over.png */, - 633FED041D3CD5580014B822 /* numpad_4_over@2x.png */, - 633FED051D3CD5580014B822 /* numpad_4_over~ipad.png */, - 633FED061D3CD5580014B822 /* numpad_4_over~ipad@2x.png */, - 633FED071D3CD5580014B822 /* numpad_4~ipad.png */, - 633FED081D3CD5580014B822 /* numpad_4~ipad@2x.png */, - 633FED091D3CD5580014B822 /* numpad_5_default.png */, - 633FED0A1D3CD5580014B822 /* numpad_5_default@2x.png */, - 633FED0B1D3CD5580014B822 /* numpad_5_over.png */, - 633FED0C1D3CD5580014B822 /* numpad_5_over@2x.png */, - 633FED0D1D3CD5580014B822 /* numpad_5_over~ipad.png */, - 633FED0E1D3CD5580014B822 /* numpad_5_over~ipad@2x.png */, - 633FED0F1D3CD5580014B822 /* numpad_5~ipad.png */, - 633FED101D3CD5580014B822 /* numpad_5~ipad@2x.png */, - 633FED111D3CD5580014B822 /* numpad_6_default.png */, - 633FED121D3CD5580014B822 /* numpad_6_default@2x.png */, - 633FED131D3CD5580014B822 /* numpad_6_over.png */, - 633FED141D3CD5580014B822 /* numpad_6_over@2x.png */, - 633FED151D3CD5580014B822 /* numpad_6_over~ipad.png */, - 633FED161D3CD5580014B822 /* numpad_6_over~ipad@2x.png */, - 633FED171D3CD5580014B822 /* numpad_6~ipad.png */, - 633FED181D3CD5580014B822 /* numpad_6~ipad@2x.png */, - 633FED191D3CD5580014B822 /* numpad_7_default.png */, - 633FED1A1D3CD5580014B822 /* numpad_7_default@2x.png */, - 633FED1B1D3CD5580014B822 /* numpad_7_over.png */, - 633FED1C1D3CD5580014B822 /* numpad_7_over@2x.png */, - 633FED1D1D3CD5580014B822 /* numpad_7_over~ipad.png */, - 633FED1E1D3CD5580014B822 /* numpad_7_over~ipad@2x.png */, - 633FED1F1D3CD5580014B822 /* numpad_7~ipad.png */, - 633FED201D3CD5580014B822 /* numpad_7~ipad@2x.png */, - 633FED211D3CD5580014B822 /* numpad_8_default.png */, - 633FED221D3CD5580014B822 /* numpad_8_default@2x.png */, - 633FED231D3CD5580014B822 /* numpad_8_over.png */, - 633FED241D3CD5580014B822 /* numpad_8_over@2x.png */, - 633FED251D3CD5580014B822 /* numpad_8_over~ipad.png */, - 633FED261D3CD5580014B822 /* numpad_8_over~ipad@2x.png */, - 633FED271D3CD5580014B822 /* numpad_8~ipad.png */, - 633FED281D3CD5580014B822 /* numpad_8~ipad@2x.png */, - 633FED291D3CD5580014B822 /* numpad_9_default.png */, - 633FED2A1D3CD5580014B822 /* numpad_9_default@2x.png */, - 633FED2B1D3CD5580014B822 /* numpad_9_over.png */, - 633FED2C1D3CD5580014B822 /* numpad_9_over@2x.png */, - 633FED2D1D3CD5580014B822 /* numpad_9_over~ipad.png */, - 633FED2E1D3CD5580014B822 /* numpad_9_over~ipad@2x.png */, - 633FED2F1D3CD5580014B822 /* numpad_9~ipad.png */, - 633FED301D3CD5580014B822 /* numpad_9~ipad@2x.png */, - 633FED311D3CD5580014B822 /* numpad_hash_default.png */, - 633FED321D3CD5580014B822 /* numpad_hash_default@2x.png */, - 633FED331D3CD5580014B822 /* numpad_hash_over.png */, - 633FED341D3CD5580014B822 /* numpad_hash_over@2x.png */, - 633FED351D3CD5580014B822 /* numpad_hash_over~ipad.png */, - 633FED361D3CD5580014B822 /* numpad_hash_over~ipad@2x.png */, - 633FED371D3CD5580014B822 /* numpad_hash~ipad.png */, - 633FED381D3CD5580014B822 /* numpad_hash~ipad@2x.png */, - 633FED391D3CD5580014B822 /* numpad_over_background.png */, - 633FED3A1D3CD5580014B822 /* numpad_star_default.png */, - 633FED3B1D3CD5580014B822 /* numpad_star_default@2x.png */, - 633FED3C1D3CD5580014B822 /* numpad_star_over.png */, - 633FED3D1D3CD5580014B822 /* numpad_star_over@2x.png */, - 633FED3E1D3CD5580014B822 /* numpad_star_over~ipad.png */, - 633FED3F1D3CD5580014B822 /* numpad_star_over~ipad@2x.png */, - 633FED401D3CD5580014B822 /* numpad_star~ipad.png */, - 633FED411D3CD5580014B822 /* numpad_star~ipad@2x.png */, - 633FED421D3CD5580014B822 /* options_add_call_default.png */, - 633FED431D3CD5580014B822 /* options_add_call_default@2x.png */, - 633FED441D3CD5580014B822 /* options_add_call_disabled.png */, - 633FED451D3CD5580014B822 /* options_add_call_disabled@2x.png */, - 633FED461D3CD5580014B822 /* options_default.png */, - 633FED471D3CD5580014B822 /* options_default@2x.png */, - 633FED481D3CD5580014B822 /* options_disabled.png */, - 633FED491D3CD5580014B822 /* options_disabled@2x.png */, - 633FED4A1D3CD5580014B822 /* options_selected.png */, - 633FED4B1D3CD5580014B822 /* options_selected@2x.png */, - 633FED4C1D3CD5580014B822 /* options_start_conference_default.png */, - 633FED4D1D3CD5580014B822 /* options_start_conference_default@2x.png */, - 633FED4E1D3CD5580014B822 /* options_start_conference_disabled.png */, - 633FED4F1D3CD5580014B822 /* options_start_conference_disabled@2x.png */, - 633FED501D3CD5580014B822 /* options_transfer_call_default.png */, - 633FED511D3CD5580014B822 /* options_transfer_call_default@2x.png */, - 633FED521D3CD5580014B822 /* options_transfer_call_disabled.png */, - 633FED531D3CD5580014B822 /* options_transfer_call_disabled@2x.png */, - 633FED541D3CD5580014B822 /* pause_big_default.png */, - 633FED551D3CD5580014B822 /* pause_big_default@2x.png */, - 633FED561D3CD5580014B822 /* pause_big_disabled.png */, - 633FED571D3CD5580014B822 /* pause_big_disabled@2x.png */, - 633FED581D3CD5580014B822 /* pause_big_over_selected.png */, - 633FED591D3CD5580014B822 /* pause_big_over_selected@2x.png */, - 633FED5A1D3CD5580014B822 /* pause_small_default.png */, - 633FED5B1D3CD5590014B822 /* pause_small_default@2x.png */, - 633FED5C1D3CD5590014B822 /* pause_small_disabled.png */, - 633FED5D1D3CD5590014B822 /* pause_small_disabled@2x.png */, - 633FED5E1D3CD5590014B822 /* pause_small_over_selected.png */, - 633FED5F1D3CD5590014B822 /* pause_small_over_selected@2x.png */, - 667A423B293A4BAD00C4306C /* post_quantum_secure@3x.png */, - 633FED601D3CD5590014B822 /* presence_away.png */, - 633FED611D3CD5590014B822 /* presence_away@2x.png */, - 633FED621D3CD5590014B822 /* presence_offline.png */, - 633FED631D3CD5590014B822 /* presence_offline@2x.png */, - 633FED641D3CD5590014B822 /* presence_online.png */, - 633FED651D3CD5590014B822 /* presence_online@2x.png */, - 633FED661D3CD5590014B822 /* presence_unregistered.png */, - 633FED671D3CD5590014B822 /* presence_unregistered@2x.png */, - CF7602F3210898C600749F76 /* rec_off_default.png */, - CF7602EB210898C100749F76 /* rec_off_default@2x.png */, - CF7602F4210898C800749F76 /* rec_on_default.png */, - CF7602F2210898C400749F76 /* rec_on_default@2x.png */, - 615A28412180C0820060F920 /* recording.png */, - 615A28432180C08F0060F920 /* recording@2x.png */, - 633FED681D3CD5590014B822 /* route_bluetooth_default.png */, - 633FED691D3CD5590014B822 /* route_bluetooth_default@2x.png */, - 633FED6A1D3CD5590014B822 /* route_bluetooth_disabled.png */, - 633FED6B1D3CD5590014B822 /* route_bluetooth_disabled@2x.png */, - 633FED6C1D3CD5590014B822 /* route_bluetooth_selected.png */, - 633FED6D1D3CD5590014B822 /* route_bluetooth_selected@2x.png */, - 633FED6E1D3CD5590014B822 /* route_earpiece_default.png */, - 633FED6F1D3CD5590014B822 /* route_earpiece_default@2x.png */, - 633FED701D3CD5590014B822 /* route_earpiece_disabled.png */, - 633FED711D3CD5590014B822 /* route_earpiece_disabled@2x.png */, - 633FED721D3CD5590014B822 /* route_earpiece_selected.png */, - 633FED731D3CD5590014B822 /* route_earpiece_selected@2x.png */, - 633FED741D3CD5590014B822 /* route_speaker_default.png */, - 633FED751D3CD5590014B822 /* route_speaker_default@2x.png */, - 633FED761D3CD5590014B822 /* route_speaker_disabled.png */, - 633FED771D3CD5590014B822 /* route_speaker_disabled@2x.png */, - 633FED781D3CD5590014B822 /* route_speaker_selected.png */, - 633FED791D3CD5590014B822 /* route_speaker_selected@2x.png */, - 633FED7A1D3CD5590014B822 /* routes_default.png */, - 633FED7B1D3CD5590014B822 /* routes_default@2x.png */, - 633FED7C1D3CD5590014B822 /* routes_disabled.png */, - 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 */, - 615A281C217F6FA80060F920 /* security_2_indicator@2x.png */, - 615A281E217F6FB30060F920 /* security_alert_indicator.png */, - 615A2820217F6FBF0060F920 /* security_alert_indicator@2x.png */, - 633FED801D3CD5590014B822 /* security_ko.png */, - 633FED811D3CD5590014B822 /* security_ko@2x.png */, - 633FED821D3CD5590014B822 /* security_ok.png */, - 633FED831D3CD5590014B822 /* security_ok@2x.png */, - 633FED841D3CD5590014B822 /* security_pending.png */, - 633FED851D3CD5590014B822 /* security_pending@2x.png */, - 615A282F218071E80060F920 /* security_toogle_background_green.png */, - 615A2831218071F30060F920 /* security_toogle_background_green@2x.png */, - 615A2833218071FF0060F920 /* security_toogle_background_grey.png */, - 615A28352180720D0060F920 /* security_toogle_background_grey@2x.png */, - 615A28392180788E0060F920 /* security_toogle_button.png */, - 615A283B2180789C0060F920 /* security_toogle_button@2x.png */, - 615A282321805B250060F920 /* security_toogle_icon_green.png */, - 615A282521805B320060F920 /* security_toogle_icon_green@2x.png */, - 615A282721805B400060F920 /* security_toogle_icon_grey.png */, - 615A282921805B4C0060F920 /* security_toogle_icon_grey@2x.png */, - 633FED861D3CD5590014B822 /* select_all_default.png */, - 633FED871D3CD5590014B822 /* select_all_default@2x.png */, - 633FED881D3CD5590014B822 /* select_all_disabled.png */, - 633FED891D3CD5590014B822 /* select_all_disabled@2x.png */, - 633FED8A1D3CD5590014B822 /* speaker_default.png */, - 633FED8B1D3CD5590014B822 /* speaker_default@2x.png */, - 633FED8C1D3CD5590014B822 /* speaker_disabled.png */, - 633FED8D1D3CD5590014B822 /* speaker_disabled@2x.png */, - 633FED8E1D3CD5590014B822 /* speaker_selected.png */, - 633FED8F1D3CD5590014B822 /* speaker_selected@2x.png */, - 8CD99A362090A824008A7CDA /* splashscreen.png */, - 8CD99A352090A823008A7CDA /* splashscreen@2x.png */, - 633FED941D3CD5590014B822 /* valid_default.png */, - 633FED951D3CD5590014B822 /* valid_default@2x.png */, - 633FED961D3CD5590014B822 /* valid_disabled.png */, - 633FED971D3CD5590014B822 /* valid_disabled@2x.png */, - 633FED981D3CD5590014B822 /* voicemail.png */, - 633FED991D3CD5590014B822 /* voicemail@2x.png */, - 633FED9A1D3CD5590014B822 /* waiting_time.png */, - 633FED9B1D3CD5590014B822 /* waiting_time@2x.png */, - ); - path = images; - sourceTree = ""; - }; - 63AADBC31B6A0FF200AA16FD /* Resources */ = { - isa = PBXGroup; - children = ( - C63F72F9285A31DA0066163B /* fonts */, - 63AADBE31B6A0FF200AA16FD /* assistant_external_sip.rc */, - 63AADBE41B6A0FF200AA16FD /* assistant_linphone_create.rc */, - 63AADBE51B6A0FF200AA16FD /* assistant_linphone_existing.rc */, - 63AADBE61B6A0FF200AA16FD /* assistant_remote.rc */, - 63AADBCA1B6A0FF200AA16FD /* Images.xcassets */, - 633FEBE11D3CD5570014B822 /* images */, - 63AADBD71B6A0FF200AA16FD /* linphonerc */, - 63AADBD81B6A0FF200AA16FD /* linphonerc-factory */, - 63AADBDA1B6A0FF200AA16FD /* linphonerc~ipad */, - 63AADBC41B6A0FF200AA16FD /* Localizable.strings */, - 63CDC4511C3BDE370085F529 /* sounds */, - ); - path = Resources; - sourceTree = ""; - }; - 63B81A021B57DA33009604A6 /* TPKeyboardAvoiding */ = { - isa = PBXGroup; - children = ( - 63B81A031B57DA33009604A6 /* LICENSE.txt */, - 63B81A041B57DA33009604A6 /* TPKeyboardAvoidingCollectionView.h */, - 63B81A051B57DA33009604A6 /* TPKeyboardAvoidingCollectionView.m */, - 63B81A061B57DA33009604A6 /* TPKeyboardAvoidingScrollView.h */, - 63B81A071B57DA33009604A6 /* TPKeyboardAvoidingScrollView.m */, - 63B81A081B57DA33009604A6 /* TPKeyboardAvoidingTableView.h */, - 63B81A091B57DA33009604A6 /* TPKeyboardAvoidingTableView.m */, - 63B81A0A1B57DA33009604A6 /* UIScrollView+TPKeyboardAvoidingAdditions.h */, - 63B81A0B1B57DA33009604A6 /* UIScrollView+TPKeyboardAvoidingAdditions.m */, - ); - name = TPKeyboardAvoiding; - path = Utils/TPKeyboardAvoiding; - sourceTree = ""; - }; - 63CDC4511C3BDE370085F529 /* sounds */ = { - isa = PBXGroup; - children = ( - 63DFE0401C40161700DA5E87 /* ringtones */, - 63CDC4531C3BDE370085F529 /* msg.caf */, - 63E27A511C50EB2700D332AE /* hold.mkv */, - 63CDC4541C3BDE370085F529 /* ringback.wav */, - 63CDC45C1C3BDE370085F529 /* shortring.caf */, - ); - path = sounds; - sourceTree = ""; - }; - 63DFE0401C40161700DA5E87 /* ringtones */ = { - isa = PBXGroup; - children = ( - 63DFE0451C40161700DA5E87 /* notes_of_the_optimistic.caf */, - ); - path = ringtones; - sourceTree = ""; - }; - 662F5971288AEFAA00C9CAF7 /* UITests */ = { - isa = PBXGroup; - children = ( - 6637AF8E288593AF00965733 /* CallUITests */, - 6643AD3F287EEE2500701703 /* Methods */, - 66495D09289013B7002780DE /* TestPlans */, - ); - path = UITests; - sourceTree = ""; - }; - 6637AF8E288593AF00965733 /* CallUITests */ = { - isa = PBXGroup; - children = ( - 663B06652886F0DB00E41889 /* ExtraMenuUITests.swift */, - 663B065F2886E38100E41889 /* ActiveCallUITests.swift */, - 663B06592886B54F00E41889 /* OutgoingCallUITests.swift */, - 6637AF8F288593AF00965733 /* IncomingCallUITests.swift */, - ); - path = CallUITests; - sourceTree = ""; - }; - 6643AD3F287EEE2500701703 /* Methods */ = { - isa = PBXGroup; - children = ( - 6643AD51287EF56200701703 /* UITestsCoreManager.swift */, - 6643AD54287F25A500701703 /* IncomingOutgoingCallViewUITestsMethods.swift */, - 663B065B2886DA8500E41889 /* ActiveCallViewUITestsMethods.swift */, - 663B06672886F16300E41889 /* ExtraMenuActiveCallActionsUITestsMethods.swift */, - 662F13B52887E8A10084C28C /* UITestsUtils.swift */, - 66689D3F28A2443A0054E633 /* UITestsScreenshots.swift */, - ); - path = Methods; - sourceTree = ""; - }; - 66495D09289013B7002780DE /* TestPlans */ = { - isa = PBXGroup; - children = ( - 664F8220289A66ED00D8C470 /* Debug.xctestplan */, - 66495D0B28901429002780DE /* Default.xctestplan */, - 66495D0C289014E2002780DE /* PauseMode_extended.xctestplan */, - ); - path = TestPlans; - sourceTree = ""; - }; - 75AA7090378DBBA5417E4370 /* Pods */ = { - isa = PBXGroup; - children = ( - ); - path = Pods; - sourceTree = ""; - }; - C63F7196285A24B10066163B /* Swift */ = { - isa = PBXGroup; - children = ( - C63D2F1429029536008F0F66 /* FileUtil.swift */, - C6B4444726AADA530076C517 /* SwiftUtil.swift */, - C63F7197285A24B10066163B /* ConfigManager.swift */, - C63F7198285A24B10066163B /* CallManager.swift */, - C63F720B285A24B10066163B /* ProviderDelegate.swift */, - C63F720C285A24B10066163B /* VFSUtil.swift */, - C63F71B1285A24B10066163B /* AppManager.swift */, - D7421D99292283AE00290CAB /* Chat */, - C63F7199285A24B10066163B /* Conference */, - C63F71AA285A24B10066163B /* Util */, - C63F71B2285A24B10066163B /* Extensions */, - C63F71C7285A24B10066163B /* Voip */, - ); - path = Swift; - sourceTree = ""; - }; - C63F7199285A24B10066163B /* Conference */ = { - isa = PBXGroup; - children = ( - C63F719A285A24B10066163B /* ViewModels */, - C63F719E285A24B10066163B /* Data */, - C63F71A2285A24B10066163B /* Views */, - ); - path = Conference; - sourceTree = ""; - }; - C63F719A285A24B10066163B /* ViewModels */ = { - isa = PBXGroup; - children = ( - C63F719B285A24B10066163B /* ConferenceWaitingRoomViewModel.swift */, - C63F719C285A24B10066163B /* ConferenceSchedulingViewModel.swift */, - C63F719D285A24B10066163B /* ScheduledConferencesViewModel.swift */, - ); - path = ViewModels; - sourceTree = ""; - }; - C63F719E285A24B10066163B /* Data */ = { - isa = PBXGroup; - children = ( - C63F719F285A24B10066163B /* ScheduledConferenceData.swift */, - C63F71A0285A24B10066163B /* TimeZoneData.swift */, - C63F71A1285A24B10066163B /* Duration.swift */, - D7CBC0F62A8E1669009182D8 /* Mode.swift */, - ); - path = Data; - sourceTree = ""; - }; - C63F71A2285A24B10066163B /* Views */ = { - isa = PBXGroup; - children = ( - C63F71A3285A24B10066163B /* ConferenceWaitingRoomView.swift */, - C63F71A4285A24B10066163B /* ScheduledConferencesView.swift */, - C63F71A6285A24B10066163B /* ScheduledConferencesCell.swift */, - C63F71A5285A24B10066163B /* ICSBubbleView.swift */, - C63F71A7285A24B10066163B /* ConferenceHistoryDetailsView.swift */, - C63F71A8285A24B10066163B /* ConferenceSchedulingView.swift */, - C63F71A9285A24B10066163B /* ConferenceSchedulingSummaryView.swift */, - ); - path = Views; - sourceTree = ""; - }; - C63F71AA285A24B10066163B /* Util */ = { - isa = PBXGroup; - children = ( - D7DA18722A02599A00FABA0D /* Viewers */, - C63F71AB285A24B10066163B /* ViewModel */, - C63F71AD285A24B10066163B /* MutableLiveData.swift */, - C63F71AE285A24B10066163B /* Pair.swift */, - C63F71AF285A24B10066163B /* BackNextNavigationView.swift */, - C63F71B0285A24B10066163B /* TimestampUtils.swift */, - D74A44902923BAF90017D063 /* BackActionsNavigationView.swift */, - D7A7544F29507038005C9D4A /* CustomAlertController.swift */, - D779D39D29AC9E92007B8087 /* AudioPlayer.swift */, - D779D3A129B5E365007B8087 /* UIImageExtension.swift */, - D783D9B92A669A9E00293E87 /* ContentMessageView.swift */, - ); - path = Util; - sourceTree = ""; - }; - C63F71AB285A24B10066163B /* ViewModel */ = { - isa = PBXGroup; - children = ( - C63F71AC285A24B10066163B /* MediatorLiveData.swift */, - ); - path = ViewModel; - sourceTree = ""; - }; - C63F71B2285A24B10066163B /* Extensions */ = { - isa = PBXGroup; - children = ( - C63F71B3285A24B10066163B /* IOS */, - C63F71BF285A24B10066163B /* LinphoneCore */, - ); - path = Extensions; - sourceTree = ""; - }; - C63F71B3285A24B10066163B /* IOS */ = { - isa = PBXGroup; - children = ( - 662B73322A73C331002135F3 /* CopyableLabel.swift */, - C684F1F92913D65500736775 /* SnapkitBridge.swift */, - C63F71B4285A24B10066163B /* UIApplication+Extension.swift */, - C63F71B6285A24B10066163B /* UIVIewControllerExtensions.swift */, - C63F71B7285A24B10066163B /* UIImageExtensions.swift */, - C63F71B8285A24B10066163B /* UIVIewExtensions.swift */, - C63F71B9285A24B10066163B /* UILabelExtensions.swift */, - C63F71BA285A24B10066163B /* OptionalExtensions.swift */, - C63F71BB285A24B10066163B /* UIButtonExtensions.swift */, - C63F71BC285A24B10066163B /* UIImageViewExtensions.swift */, - C63F71BD285A24B10066163B /* UIDeviceExtensions.swift */, - C63F71BE285A24B10066163B /* UIColorExtensions.swift */, - ); - path = IOS; - sourceTree = ""; - }; - C63F71BF285A24B10066163B /* LinphoneCore */ = { - isa = PBXGroup; - children = ( - C63F71C0285A24B10066163B /* CoreExtensions.swift */, - C63F71C1285A24B10066163B /* IceState.swift */, - C63F71C2285A24B10066163B /* AddressExtensions.swift */, - C63F71C3285A24B10066163B /* ParticipantExtensions.swift */, - C63F71C4285A24B10066163B /* PayloadType.swift */, - C63F71C5285A24B10066163B /* CallExtensions.swift */, - C63F71C6285A24B10066163B /* ConferenceExtensions.swift */, - ); - path = LinphoneCore; - sourceTree = ""; - }; - C63F71C7285A24B10066163B /* Voip */ = { - isa = PBXGroup; - children = ( - C63F71C8285A24B10066163B /* ViewModels */, - C63F71D0285A24B10066163B /* AudioRouteUtils.swift */, - C63F71D1285A24B10066163B /* Theme */, - C63F71D7285A24B10066163B /* Views */, - C63F71FB285A24B10066163B /* VoipDialog.swift */, - C63F71FC285A24B10066163B /* Widgets */, - ); - path = Voip; - sourceTree = ""; - }; - C63F71C8285A24B10066163B /* ViewModels */ = { - isa = PBXGroup; - children = ( - C63F71C9285A24B10066163B /* ConferenceViewModel.swift */, - C63F71CA285A24B10066163B /* CallsViewModel.swift */, - C63F71CB285A24B10066163B /* ControlsViewModel.swift */, - C63F71CC285A24B10066163B /* CallStatisticsData.swift */, - C63F71CD285A24B10066163B /* ConferenceParticipantData.swift */, - C63F71CE285A24B10066163B /* ConferenceParticipantDeviceData.swift */, - C63F71CF285A24B10066163B /* CallData.swift */, - D7CBC0FE2A8E3E11009182D8 /* ConferenceSpeakerData.swift */, - ); - path = ViewModels; - sourceTree = ""; - }; - C63F71D1285A24B10066163B /* Theme */ = { - isa = PBXGroup; - children = ( - C63F71D2285A24B10066163B /* LightDarkColor.swift */, - C63F71D3285A24B10066163B /* TextStyle.swift */, - C63F71D4285A24B10066163B /* VoipTexts.swift */, - C63F71D5285A24B10066163B /* ButtonTheme.swift */, - C63F71D6285A24B10066163B /* VoipTheme.swift */, - ); - path = Theme; - sourceTree = ""; - }; - C63F71D7285A24B10066163B /* Views */ = { - isa = PBXGroup; - children = ( - C63F71D8285A24B10066163B /* Fragments */, - C63F71F6285A24B10066163B /* CompositeViewControllers */, - C63F71FA285A24B10066163B /* SharedLayoutConstants.swift */, - ); - path = Views; - sourceTree = ""; - }; - C63F71D8285A24B10066163B /* Fragments */ = { - isa = PBXGroup; - children = ( - D7CBC0F92A8E3CF4009182D8 /* SpeakersList */, - C63F71D9285A24B10066163B /* ParticipantsList */, - C63F71DC285A24B10066163B /* AudioRoutesView.swift */, - C63F71DD285A24B10066163B /* Conference */, - C63F71E6285A24B10066163B /* ActiveCall */, - C63F71E9285A24B10066163B /* PausedCallOrConferenceView.swift */, - C63F71EA285A24B10066163B /* LocalVideoView.swift */, - C63F71EB285A24B10066163B /* CallStatsView.swift */, - C63F71EC285A24B10066163B /* NumpadView.swift */, - C63F71ED285A24B10066163B /* VoipExtraButtonsView.swift */, - C63F71EE285A24B10066163B /* CallsList */, - C63F71F2285A24B10066163B /* DismissableView.swift */, - C63F71F3285A24B10066163B /* ConferenceLayoutPickerView.swift */, - C63F71F4285A24B10066163B /* ControlsView.swift */, - C63F71F5285A24B10066163B /* RemotelyRecording.swift */, - ); - path = Fragments; - sourceTree = ""; - }; - C63F71D9285A24B10066163B /* ParticipantsList */ = { - isa = PBXGroup; - children = ( - C63F71DA285A24B10066163B /* ParticipantsListView.swift */, - C63F71DB285A24B10066163B /* VoipParticipantCell.swift */, - ); - path = ParticipantsList; - sourceTree = ""; - }; - C63F71DD285A24B10066163B /* Conference */ = { - isa = PBXGroup; - children = ( - C63F71DE285A24B10066163B /* VoipActiveSpeakerParticipantCell.swift */, - C63F71DF285A24B10066163B /* VoipConferenceAudioOnlyView.swift */, - C63F71E0285A24B10066163B /* VoipGridParticipantCell.swift */, - C63F71E1285A24B10066163B /* VoipAudioOnlyParticipantCell.swift */, - C63F71E2285A24B10066163B /* MicMuted.swift */, - C63F71E3285A24B10066163B /* VoipConferenceGridView.swift */, - C63F71E4285A24B10066163B /* VoipConferenceActiveSpeakerView.swift */, - C63F71E5285A24B10066163B /* VoipConferenceDisplayModeSelectionView.swift */, - ); - path = Conference; - sourceTree = ""; - }; - C63F71E6285A24B10066163B /* ActiveCall */ = { - isa = PBXGroup; - children = ( - C63F71E7285A24B10066163B /* ActiveCallView.swift */, - ); - path = ActiveCall; - sourceTree = ""; - }; - C63F71EE285A24B10066163B /* CallsList */ = { - isa = PBXGroup; - children = ( - C63F71EF285A24B10066163B /* VoipCallContextMenu.swift */, - C63F71F0285A24B10066163B /* CallsListView.swift */, - C63F71F1285A24B10066163B /* VoipCallCell.swift */, - ); - path = CallsList; - sourceTree = ""; - }; - C63F71F6285A24B10066163B /* CompositeViewControllers */ = { - isa = PBXGroup; - children = ( - C63F71E8285A24B10066163B /* AbstractIncomingOutgoingCallView.swift */, - C6548822292D369500BF646B /* AbstractCallView.swift */, - C654881F292D32FA00BF646B /* ConferenceCallView.swift */, - C654881E292D32FA00BF646B /* SingleCallView.swift */, - C63F71F7285A24B10066163B /* OutgoingCallView.swift */, - C63F71F9285A24B10066163B /* IncomingCallView.swift */, - ); - path = CompositeViewControllers; - sourceTree = ""; - }; - C63F71FC285A24B10066163B /* Widgets */ = { - isa = PBXGroup; - children = ( - C63F71FD285A24B10066163B /* StyledValuePicker.swift */, - C63F71FE285A24B10066163B /* StyledSwitch.swift */, - C63F71FF285A24B10066163B /* CallControlButton.swift */, - C63F7200285A24B10066163B /* RotatingSpinner.swift */, - C63F7201285A24B10066163B /* FormButton.swift */, - C63F7202285A24B10066163B /* BouncingCounter.swift */, - C63F7203285A24B10066163B /* VoipExtraButton.swift */, - C63F7204285A24B10066163B /* UICallTimer.swift */, - C63F7205285A24B10066163B /* StyledCheckBox.swift */, - C63F7206285A24B10066163B /* Avatar.swift */, - C63F7207285A24B10066163B /* StyledLabel.swift */, - C63F7208285A24B10066163B /* StyledDatePicker.swift */, - C63F7209285A24B10066163B /* ButtonWithStateBackgrounds.swift */, - C63F720A285A24B10066163B /* StyledTextView.swift */, - ); - path = Widgets; - sourceTree = ""; - }; - C63F72F9285A31DA0066163B /* fonts */ = { - isa = PBXGroup; - children = ( - C63F72FA285A31DA0066163B /* Roboto-Regular.ttf */, - C63F72FB285A31DA0066163B /* Roboto-Italic.ttf */, - C63F72FC285A31DA0066163B /* Roboto-Bold.ttf */, - ); - path = fonts; - sourceTree = ""; - }; - D326483415887D4400930C67 /* Utils */ = { - isa = PBXGroup; - children = ( - D37E3ECA1619C27A0087659A /* CAAnimationBlocks */, - D380801215C299D0005BE9BC /* ColorSpaceUtilites.m */, - D380801115C29984005BE9BC /* ColorSpaceUtilities.h */, - D3807FB615C28940005BE9BC /* DCRoundSwitch */, - D37EE15F160377D7003608A6 /* DTFoundation */, - D32B9DFA15A2F131000B6DEC /* FastAddressBook.h */, - D32B9DFB15A2F131000B6DEC /* FastAddressBook.m */, - 6371579F1B283FE200C91677 /* FileTransferDelegate.h */, - 637157A01B283FE200C91677 /* FileTransferDelegate.m */, - 633888401BFB2C49001D5E7B /* HPGrowingTextView */, - D3807FC715C2894A005BE9BC /* InAppSettingsKit */, - D326483615887D5200930C67 /* OrderedDictionary.h */, - D326483715887D5200930C67 /* OrderedDictionary.m */, - 63B81A021B57DA33009604A6 /* TPKeyboardAvoiding */, - D3F7997E15BD31EC0018C273 /* TPMultiLayoutViewController */, - 6308F9C31BF0DD6600D1234B /* XMLRPCHelper.h */, - 6308F9C41BF0DD6600D1234B /* XMLRPCHelper.m */, - C9B3A6FD15B485DB006F52EE /* Utils.h */, - D35860D515B549B500513429 /* Utils.m */, - 63D11C521C3D501200E8FCEE /* Log.m */, - 63D11C541C3D503A00E8FCEE /* Log.h */, - 63423C081C4501D000D9A050 /* Contact.h */, - 63423C091C4501D000D9A050 /* Contact.m */, - ); - name = Utils; - sourceTree = ""; - }; - D37E3ECA1619C27A0087659A /* CAAnimationBlocks */ = { - isa = PBXGroup; - children = ( - D37E3ECB1619C27A0087659A /* CAAnimation+Blocks.h */, - D37E3ECC1619C27A0087659A /* CAAnimation+Blocks.m */, - ); - name = CAAnimationBlocks; - path = Utils/CAAnimationBlocks; - sourceTree = ""; - }; - D37EE15F160377D7003608A6 /* DTFoundation */ = { - isa = PBXGroup; - children = ( - D37EE160160377D7003608A6 /* DTActionSheet.h */, - 63CD4B4D1A5AAC8C00B84282 /* DTAlertView.h */, - 63CD4B4E1A5AAC8C00B84282 /* DTAlertView.m */, - D37EE161160377D7003608A6 /* DTActionSheet.m */, - F0642EF719DAF32E009DB336 /* DTWeakSupport.h */, - ); - name = DTFoundation; - path = Utils/DTFoundation; - sourceTree = ""; - }; - D3807FB615C28940005BE9BC /* DCRoundSwitch */ = { - isa = PBXGroup; - children = ( - D3807FB715C28940005BE9BC /* DCRoundSwitch.h */, - D3807FB815C28940005BE9BC /* DCRoundSwitch.m */, - D3807FB915C28940005BE9BC /* DCRoundSwitchKnobLayer.h */, - D3807FBA15C28940005BE9BC /* DCRoundSwitchKnobLayer.m */, - D3807FBB15C28940005BE9BC /* DCRoundSwitchOutlineLayer.h */, - D3807FBC15C28940005BE9BC /* DCRoundSwitchOutlineLayer.m */, - D3807FBD15C28940005BE9BC /* DCRoundSwitchToggleLayer.h */, - D3807FBE15C28940005BE9BC /* DCRoundSwitchToggleLayer.m */, - ); - name = DCRoundSwitch; - path = Utils/DCRoundSwitch; - sourceTree = ""; - }; - D3807FC715C2894A005BE9BC /* InAppSettingsKit */ = { - isa = PBXGroup; - children = ( - D3807FC815C2894A005BE9BC /* Controllers */, - D3807FD015C2894A005BE9BC /* Models */, - D3807FDB15C2894A005BE9BC /* Views */, - ); - name = InAppSettingsKit; - path = Utils/InAppSettingsKit; - sourceTree = ""; - }; - D3807FC815C2894A005BE9BC /* Controllers */ = { - isa = PBXGroup; - children = ( - D3807FC915C2894A005BE9BC /* IASKAppSettingsViewController.h */, - D3807FCA15C2894A005BE9BC /* IASKAppSettingsViewController.m */, - D3807FCD15C2894A005BE9BC /* IASKSpecifierValuesViewController.h */, - D3807FCE15C2894A005BE9BC /* IASKSpecifierValuesViewController.m */, - D3807FCF15C2894A005BE9BC /* IASKViewController.h */, - ); - path = Controllers; - sourceTree = ""; - }; - D3807FD015C2894A005BE9BC /* Models */ = { - isa = PBXGroup; - children = ( - D3807FD115C2894A005BE9BC /* IASKSettingsReader.h */, - D3807FD215C2894A005BE9BC /* IASKSettingsReader.m */, - D3807FD315C2894A005BE9BC /* IASKSettingsStore.h */, - D3807FD415C2894A005BE9BC /* IASKSettingsStore.m */, - D3807FD515C2894A005BE9BC /* IASKSettingsStoreFile.h */, - D3807FD615C2894A005BE9BC /* IASKSettingsStoreFile.m */, - D3807FD715C2894A005BE9BC /* IASKSettingsStoreUserDefaults.h */, - D3807FD815C2894A005BE9BC /* IASKSettingsStoreUserDefaults.m */, - D3807FD915C2894A005BE9BC /* IASKSpecifier.h */, - D3807FDA15C2894A005BE9BC /* IASKSpecifier.m */, - ); - path = Models; - sourceTree = ""; - }; - D3807FDB15C2894A005BE9BC /* Views */ = { - isa = PBXGroup; - children = ( - D3807FDC15C2894A005BE9BC /* IASKPSSliderSpecifierViewCell.h */, - D3807FDD15C2894A005BE9BC /* IASKPSSliderSpecifierViewCell.m */, - D3807FDE15C2894A005BE9BC /* IASKPSTextFieldSpecifierViewCell.h */, - D3807FDF15C2894A005BE9BC /* IASKPSTextFieldSpecifierViewCell.m */, - D3807FE215C2894A005BE9BC /* IASKSlider.h */, - D3807FE315C2894A005BE9BC /* IASKSlider.m */, - D3807FE415C2894A005BE9BC /* IASKSwitch.h */, - D3807FE515C2894A005BE9BC /* IASKSwitch.m */, - D3807FE615C2894A005BE9BC /* IASKTextField.h */, - D3807FE715C2894A005BE9BC /* IASKTextField.m */, - ); - path = Views; - sourceTree = ""; - }; - D398D3031594B0FB00FD553C /* Settings */ = { - isa = PBXGroup; - children = ( - D34F6F9D1594D3FB0095705B /* InAppSettings.bundle */, - ); - path = Settings; - sourceTree = ""; - }; - D3F7997E15BD31EC0018C273 /* TPMultiLayoutViewController */ = { - isa = PBXGroup; - children = ( - D3F7997F15BD32370018C273 /* TPMultiLayoutViewController.h */, - D3F7998015BD32370018C273 /* TPMultiLayoutViewController.m */, - ); - name = TPMultiLayoutViewController; - sourceTree = ""; - }; - D72F27A82AA8B40C00CFB13D /* Fragments */ = { - isa = PBXGroup; - children = ( - D72F27A92AA8B42D00CFB13D /* SheetViewController.swift */, - D7F067472AAA1BFB0044CC87 /* ReactionCell.swift */, - ); - path = Fragments; - sourceTree = ""; - }; - D7421D99292283AE00290CAB /* Chat */ = { - isa = PBXGroup; - children = ( - D7421D9A292283D300290CAB /* ViewModels */, - D7421D9B292283E100290CAB /* Data */, - D7421D9C292283ED00290CAB /* Views */, - ); - path = Chat; - sourceTree = ""; - }; - D7421D9A292283D300290CAB /* ViewModels */ = { - isa = PBXGroup; - children = ( - D77057F0292E4A340031A970 /* ChatConversationViewModel.swift */, - D779D39B29A76DE6007B8087 /* ChatConversationTableViewModel.swift */, - ); - path = ViewModels; - sourceTree = ""; - }; - D7421D9B292283E100290CAB /* Data */ = { - isa = PBXGroup; - children = ( - D7097B34296D684900AEF6C5 /* FileType.swift */, - ); - path = Data; - sourceTree = ""; - }; - D7421D9C292283ED00290CAB /* Views */ = { - isa = PBXGroup; - children = ( - D72F27A82AA8B40C00CFB13D /* Fragments */, - D7421D9D29228A5200290CAB /* ChatConversationViewSwift.swift */, - D779D39729A3C933007B8087 /* ChatConversationTableViewSwift.swift */, - D7013DB72940AA12004EEAAE /* MessageView.swift */, - D779D39929A4C285007B8087 /* MultilineMessageCell.swift */, - D7C6DE812948CF3100756E03 /* DropDownCell.swift */, - D7C6DE822948CF3100756E03 /* DropDownCell.xib */, - D71418E229C9B4E0002EEF75 /* DownloadMessageCell.swift */, - D71418E429C9E2CD002EEF75 /* CircularProgressBarView.swift */, - D768763429CDA88200570747 /* UploadMessageCell.swift */, - ); - path = Views; - sourceTree = ""; - }; - D7CBC0F92A8E3CF4009182D8 /* SpeakersList */ = { - isa = PBXGroup; - children = ( - D7CBC0FA2A8E3D1E009182D8 /* SpeakersListView.swift */, - D7CBC0FC2A8E3D3F009182D8 /* VoipSpeakerCell.swift */, - ); - path = SpeakersList; - sourceTree = ""; - }; - D7DA18722A02599A00FABA0D /* Viewers */ = { - isa = PBXGroup; - children = ( - D7DA18702A02598700FABA0D /* TextViewer.swift */, - D780FF7C2A459CE3001535E6 /* MediaViewer.swift */, - ); - path = Viewers; - sourceTree = ""; - }; - EA5F25DA232BD3E200475F2E /* msgNotificationService */ = { - isa = PBXGroup; - children = ( - EAB783CF232F8E4D0076B1A0 /* msgNotificationService.entitlements */, - EAE6C88323FABF690076A018 /* Utils.swift */, - EA5F25DB232BD3E200475F2E /* NotificationService.swift */, - 6112A01D243B5FD500DBD5F5 /* GoogleService-Info.plist */, - EA5F25DD232BD3E200475F2E /* Info.plist */, - ); - path = msgNotificationService; - sourceTree = ""; - }; - EA8CB82A239F96CA00C330CC /* msgNotificationContent */ = { - isa = PBXGroup; - children = ( - 6112A01B243B31A600DBD5F5 /* GoogleService-Info.plist */, - EA8CB83F239FD41400C330CC /* msgNotificationContent.entitlements */, - EA8CB82B239F96CA00C330CC /* NotificationViewController.swift */, - EA8CB82D239F96CA00C330CC /* MainInterface.storyboard */, - EA8CB830239F96CA00C330CC /* Info.plist */, - ); - path = msgNotificationContent; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 1D6058900D05DD3D006BFB54 /* linphone */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "linphone" */; - buildPhases = ( - 1D60588D0D05DD3D006BFB54 /* Resources */, - 63DCC71D1A07B08E00916627 /* Run Script */, - 1D60588E0D05DD3D006BFB54 /* Sources */, - 1D60588F0D05DD3D006BFB54 /* Frameworks */, - 8CDC89061EAF89A8006B5652 /* Embed Frameworks */, - 5EF0C35020C806A5005081B0 /* Embed App Extensions */, - 614D0A1821E77F5300C43EDF /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - EA8CB83A239F9A3000C330CC /* PBXTargetDependency */, - EA8CB83C239F9A3000C330CC /* PBXTargetDependency */, - 61AE365520C00B370089D9D3 /* PBXTargetDependency */, - ); - name = linphone; - productName = linphone; - productReference = 1D6058910D05DD3D006BFB54 /* linphone.app */; - productType = "com.apple.product-type.application"; - }; - 61AE364A20C00B370089D9D3 /* linphoneExtension */ = { - isa = PBXNativeTarget; - buildConfigurationList = 61AE366120C00B370089D9D3 /* Build configuration list for PBXNativeTarget "linphoneExtension" */; - buildPhases = ( - 61AE364720C00B370089D9D3 /* Sources */, - 61AE364820C00B370089D9D3 /* Frameworks */, - 61AE364920C00B370089D9D3 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = linphoneExtension; - productName = linphoneExtension; - productReference = 61AE364B20C00B370089D9D3 /* linphoneExtension.appex */; - productType = "com.apple.product-type.app-extension"; - }; - 6637AF8C288593AF00965733 /* CallUITests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 6637AF99288593AF00965733 /* Build configuration list for PBXNativeTarget "CallUITests" */; - buildPhases = ( - 6637AF89288593AF00965733 /* Sources */, - 6637AF8A288593AF00965733 /* Frameworks */, - 6637AF8B288593AF00965733 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 6637AF94288593AF00965733 /* PBXTargetDependency */, - ); - name = CallUITests; - productName = IncommingCallUITests; - productReference = 6637AF8D288593AF00965733 /* CallUITests.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; - }; - EA5F25D8232BD3E200475F2E /* msgNotificationService */ = { - isa = PBXNativeTarget; - buildConfigurationList = EA5F25E1232BD3E300475F2E /* Build configuration list for PBXNativeTarget "msgNotificationService" */; - buildPhases = ( - EA5F25D5232BD3E200475F2E /* Sources */, - 203E6292C3E84CD13778F720 /* Frameworks */, - EA88A406242A6224007FEC61 /* Resources */, - 6112A01A243B2CCF00DBD5F5 /* Run Script */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = msgNotificationService; - productName = messagesNotification; - productReference = EA5F25D9232BD3E200475F2E /* msgNotificationService.appex */; - productType = "com.apple.product-type.app-extension"; - }; - EA8CB826239F96CA00C330CC /* msgNotificationContent */ = { - isa = PBXNativeTarget; - buildConfigurationList = EA8CB834239F96CA00C330CC /* Build configuration list for PBXNativeTarget "msgNotificationContent" */; - buildPhases = ( - EA8CB823239F96CA00C330CC /* Sources */, - 143EFEE2501CB14E6BB244EF /* Frameworks */, - EA88F3AE241BD1ED00E66528 /* Resources */, - 6112A019243B2C8400DBD5F5 /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = msgNotificationContent; - productName = msgNotificationContent; - productReference = EA8CB827239F96CA00C330CC /* msgNotificationContent.appex */; - productType = "com.apple.product-type.app-extension"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 1430; - LastUpgradeCheck = 1130; - TargetAttributes = { - 1D6058900D05DD3D006BFB54 = { - DevelopmentTeam = Z2V957B3D6; - LastSwiftMigration = 1030; - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.ApplicationGroups.iOS = { - enabled = 1; - }; - com.apple.BackgroundModes = { - enabled = 1; - }; - com.apple.InAppPurchase = { - enabled = 1; - }; - com.apple.Push = { - enabled = 1; - }; - com.apple.iCloud = { - enabled = 1; - }; - }; - }; - 61AE364A20C00B370089D9D3 = { - CreatedOnToolsVersion = 9.2; - DevelopmentTeam = Z2V957B3D6; - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.ApplicationGroups.iOS = { - enabled = 1; - }; - }; - }; - 6637AF8C288593AF00965733 = { - CreatedOnToolsVersion = 13.4.1; - DevelopmentTeam = Z2V957B3D6; - ProvisioningStyle = Automatic; - TestTargetID = 1D6058900D05DD3D006BFB54; - }; - EA5F25D8232BD3E200475F2E = { - CreatedOnToolsVersion = 11.0; - DevelopmentTeam = Z2V957B3D6; - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.ApplicationGroups.iOS = { - enabled = 1; - }; - }; - }; - EA8CB826239F96CA00C330CC = { - CreatedOnToolsVersion = 10.3; - DevelopmentTeam = Z2V957B3D6; - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.ApplicationGroups.iOS = { - enabled = 1; - }; - }; - }; - }; - }; - buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "linphone" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - en, - ru, - Base, - ar, - de, - ja, - nl, - zh_TW, - pl, - sv, - tr, - zh_CN, - fr, - hu, - es, - pt_BR, - it, - uk, - ka, - es_AR, - cs, - ); - mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; - productRefGroup = 19C28FACFE9D520D11CA2CBB /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 1D6058900D05DD3D006BFB54 /* linphone */, - 61AE364A20C00B370089D9D3 /* linphoneExtension */, - EA5F25D8232BD3E200475F2E /* msgNotificationService */, - EA8CB826239F96CA00C330CC /* msgNotificationContent */, - 6637AF8C288593AF00965733 /* CallUITests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1D60588D0D05DD3D006BFB54 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 633FEF3F1D3CD55A0014B822 /* security_pending@2x.png in Resources */, - 24BFAAA4209B0630004F47A7 /* linphone_logo.png in Resources */, - 633FEDC41D3CD5590014B822 /* call_hangup_disabled.png in Resources */, - C66B03BB26E8EB1A009B5EDC /* UIChatReplyBubbleView.xib in Resources */, - 633FEDA81D3CD5590014B822 /* backspace_default.png in Resources */, - C63F72C0285A2F1D0066163B /* voip_numpad_0.png in Resources */, - 636316D11A1DEBCB0009B839 /* AboutView.xib in Resources */, - 8CBD7BA620B6B82400E5DCC0 /* UIChatConversationInfoTableViewCell.xib in Resources */, - 244523AF1E8266CC0037A187 /* chat_delivered.png in Resources */, - CF7602F8210898CC00749F76 /* rec_on_default.png in Resources */, - 633FEF481D3CD55A0014B822 /* speaker_selected.png in Resources */, - 633FEED91D3CD55A0014B822 /* numpad_7~ipad.png in Resources */, - 633FEE2B1D3CD5590014B822 /* color_C.png in Resources */, - 633FEE871D3CD5590014B822 /* led_inprogress@2x.png in Resources */, - 633FEEC61D3CD55A0014B822 /* numpad_5_over@2x.png in Resources */, - 633FEF021D3CD55A0014B822 /* options_disabled.png in Resources */, - 633FEDC81D3CD5590014B822 /* call_missed.png in Resources */, - 8CB2B8FA1F86229E0015CEE2 /* next_disabled.png in Resources */, - 8CF25D961F9F336100BEA0C1 /* check_unselected.png in Resources */, - 8C300D9A1E40E0CC00728EF3 /* lime_ko.png in Resources */, - 633FEE311D3CD5590014B822 /* color_I.png in Resources */, - 633FEF1F1D3CD55A0014B822 /* presence_online@2x.png in Resources */, - 633FEE641D3CD5590014B822 /* footer_chat_disabled.png in Resources */, - 633FEE9C1D3CD55A0014B822 /* numpad_0_default@2x.png in Resources */, - 633FEE3C1D3CD5590014B822 /* contacts_all_default.png in Resources */, - 633FEE171D3CD5590014B822 /* chat_send_disabled@2x.png in Resources */, - C61B1BF22667D075001A4E4A /* menu_security_default.png in Resources */, - 633FEE6E1D3CD5590014B822 /* footer_history_default.png in Resources */, - 633FEEB21D3CD55A0014B822 /* numpad_2~ipad@2x.png in Resources */, - 633FEDC61D3CD5590014B822 /* call_incoming.png in Resources */, - D7A4C00A2A3B135800EFBD1B /* new_chat_send_default.png in Resources */, - 633FEF2D1D3CD55A0014B822 /* route_earpiece_selected@2x.png in Resources */, - 638F1A621C2021B2004B8E02 /* DialerView~ipad.xib in Resources */, - 615A2817217F280C0060F920 /* chat_list_indicator.png in Resources */, - 633FEEFF1D3CD55A0014B822 /* options_add_call_disabled@2x.png in Resources */, - C63F72FD285A31DA0066163B /* Roboto-Regular.ttf in Resources */, - 633FEF091D3CD55A0014B822 /* options_start_conference_disabled@2x.png in Resources */, - C622E3F326A81290004F5434 /* vr_pause.png in Resources */, - 633FEE051D3CD5590014B822 /* cancel_edit_disabled@2x.png in Resources */, - 633FEE5F1D3CD5590014B822 /* edit_list_default@2x.png in Resources */, - C63F72F6285A2F1E0066163B /* voip_delete.png in Resources */, - C63F72F0285A2F1E0066163B /* voip_radio_on.png in Resources */, - C63F72EB285A2F1E0066163B /* voip_edit.png in Resources */, - 633FEEB61D3CD55A0014B822 /* numpad_3_over@2x.png in Resources */, - 633FEF371D3CD55A0014B822 /* routes_disabled@2x.png in Resources */, - C63F72D1285A2F1E0066163B /* voip_numpad_star.png in Resources */, - 633FEE0F1D3CD5590014B822 /* chat_attachment_over@2x.png in Resources */, - C6E3E7EC291D642B00DDFC46 /* side_menu_voip_meeting_schedule.png in Resources */, - 633FEF381D3CD55A0014B822 /* routes_selected.png in Resources */, - 633FEE0B1D3CD5590014B822 /* chat_attachment_default@2x.png in Resources */, - 633FEED41D3CD55A0014B822 /* numpad_7_default@2x.png in Resources */, - 633FEEE01D3CD55A0014B822 /* numpad_8_over~ipad@2x.png in Resources */, - 633FEDDC1D3CD5590014B822 /* call_start_body_disabled~ipad.png in Resources */, - C63F72FF285A31DA0066163B /* Roboto-Bold.ttf in Resources */, - 63E802DB1C625AEF000D5509 /* (null) in Resources */, - 633FEE2E1D3CD5590014B822 /* color_F.png in Resources */, - 633FEDC51D3CD5590014B822 /* call_hangup_disabled@2x.png in Resources */, - 633FEEDF1D3CD55A0014B822 /* numpad_8_over~ipad.png in Resources */, - C63F72C3285A2F1D0066163B /* voip_speaker_on.png in Resources */, - 8CD99A372090A824008A7CDA /* splashscreen@2x.png in Resources */, - 24BFAAA9209B0630004F47A7 /* linphone_logo@2x.png in Resources */, - 633FEE071D3CD5590014B822 /* chat_add_default@2x.png in Resources */, - 633FEF551D3CD55A0014B822 /* waiting_time@2x.png in Resources */, - 633FEEAC1D3CD55A0014B822 /* numpad_2_default@2x.png in Resources */, - 633FEE541D3CD5590014B822 /* dialer_back_default.png in Resources */, - C63F72DE285A2F1E0066163B /* voip_call_header_active.png in Resources */, - 633FEF0B1D3CD55A0014B822 /* options_transfer_call_default@2x.png in Resources */, - 633FEDE81D3CD5590014B822 /* call_status_missed~ipad.png in Resources */, - 63AADBFF1B6A0FF200AA16FD /* assistant_external_sip.rc in Resources */, - 61CCC3E121933B660060EDEA /* UIDeviceCell.xib in Resources */, - C63F72F8285A2F1E0066163B /* voip_call_header_outgoing.png in Resources */, - 633FEE9E1D3CD55A0014B822 /* numpad_0_over@2x.png in Resources */, - 8CE24F581F8268850077AC0A /* conference_delete@2x.png in Resources */, - 633FEDC21D3CD5590014B822 /* call_hangup_default.png in Resources */, - 633FEEB41D3CD55A0014B822 /* numpad_3_default@2x.png in Resources */, - 633FEEE51D3CD55A0014B822 /* numpad_9_over.png in Resources */, - 633FEECA1D3CD55A0014B822 /* numpad_5~ipad@2x.png in Resources */, - 633FEE101D3CD5590014B822 /* chat_list_indicator~ipad.png in Resources */, - 633FEF331D3CD55A0014B822 /* route_speaker_selected@2x.png in Resources */, - 633FEE6C1D3CD5590014B822 /* footer_dialer_disabled.png in Resources */, - 633FEF231D3CD55A0014B822 /* route_bluetooth_default@2x.png in Resources */, - C6A1BB4526E890BD00540D50 /* file_voice_default.png in Resources */, - 633FED9C1D3CD5590014B822 /* add_field_default.png in Resources */, - 633FEE411D3CD5590014B822 /* contacts_all_selected@2x.png in Resources */, - D38187F815FE355D00C3EDCA /* TabBarView.xib in Resources */, - C63F72D2285A2F1E0066163B /* voip_numpad_hash.png in Resources */, - C63F72F4285A2F1E0066163B /* voip_conference_new_selected.png in Resources */, - 633FEE2F1D3CD5590014B822 /* color_G.png in Resources */, - 633FEECE1D3CD55A0014B822 /* numpad_6_over@2x.png in Resources */, - 8C92ABE81FA773190006FB5D /* UIChatNotifiedEventCell.xib in Resources */, - C63F72C7285A2F1E0066163B /* voip_change_camera.png in Resources */, - 633FEDAB1D3CD5590014B822 /* backspace_disabled@2x.png in Resources */, - 633FEDD91D3CD5590014B822 /* call_start_body_default~ipad@2x.png in Resources */, - 633FEE401D3CD5590014B822 /* contacts_all_selected.png in Resources */, - 633FEE0C1D3CD5590014B822 /* chat_attachment_disabled.png in Resources */, - C622E3EF26A81290004F5434 /* vr_stop.png in Resources */, - 633FEF001D3CD55A0014B822 /* options_default.png in Resources */, - CF15F21F20E4F9A3008B1DE6 /* UIImageViewDeletable.xib in Resources */, - 633FEE951D3CD55A0014B822 /* micro_default@2x.png in Resources */, - 633FEE6A1D3CD5590014B822 /* footer_dialer_default.png in Resources */, - 633FEEC91D3CD55A0014B822 /* numpad_5~ipad.png in Resources */, - 633FEDFA1D3CD5590014B822 /* camera_selected.png in Resources */, - 633FEF451D3CD55A0014B822 /* speaker_default@2x.png in Resources */, - 633FEDD41D3CD5590014B822 /* call_quality_indicator_4.png in Resources */, - 633FEF241D3CD55A0014B822 /* route_bluetooth_disabled.png in Resources */, - 633FEECD1D3CD55A0014B822 /* numpad_6_over.png in Resources */, - D38187D115FE346B00C3EDCA /* HistoryListView.xib in Resources */, - D38187BD15FE342800C3EDCA /* ContactsListView.xib in Resources */, - 633FEF0E1D3CD55A0014B822 /* pause_big_default.png in Resources */, - 633FEF191D3CD55A0014B822 /* pause_small_over_selected@2x.png in Resources */, - 633FEDA71D3CD5590014B822 /* back_disabled@2x.png in Resources */, - 633FEDBD1D3CD5590014B822 /* call_audio_start_disabled@2x.png in Resources */, - 615A2815217F24E00060F920 /* security_1_indicator@2x.png in Resources */, - 633FEE981D3CD55A0014B822 /* micro_selected.png in Resources */, - 633FEEB51D3CD55A0014B822 /* numpad_3_over.png in Resources */, - 633FEE041D3CD5590014B822 /* cancel_edit_disabled.png in Resources */, - 633FEDE61D3CD5590014B822 /* call_status_missed.png in Resources */, - 8CDC61971F84D9270087CF7F /* check_selected@2x.png in Resources */, - 633FEE7A1D3CD5590014B822 /* history_missed_default.png in Resources */, - 633FEF121D3CD55A0014B822 /* pause_big_over_selected.png in Resources */, - 633FED9D1D3CD5590014B822 /* add_field_default@2x.png in Resources */, - C622E3F426A81290004F5434 /* vr_play.png in Resources */, - 639E9CB01C0DB83000019A75 /* SideMenuView.xib in Resources */, - 633FEDBB1D3CD5590014B822 /* call_audio_start_default@2x.png in Resources */, - 633FEF1A1D3CD55A0014B822 /* presence_away.png in Resources */, - 639E9CB51C0DB88200019A75 /* PhoneMainView.xib in Resources */, - 633FEDB61D3CD5590014B822 /* call_alt_start_default.png in Resources */, - 633FEF0D1D3CD55A0014B822 /* options_transfer_call_disabled@2x.png in Resources */, - 633FEDEF1D3CD5590014B822 /* call_transfer_default@2x.png in Resources */, - 633FEF391D3CD55A0014B822 /* routes_selected@2x.png in Resources */, - 633FEE491D3CD5590014B822 /* delete_default@2x.png in Resources */, - 633FEF291D3CD55A0014B822 /* route_earpiece_default@2x.png in Resources */, - C63F72EA285A2F1E0066163B /* voip_checkbox_unchecked.png in Resources */, - 633FEE271D3CD5590014B822 /* checkbox_checked@2x.png in Resources */, - 61586B85217A17070038AC45 /* menu_assistant.png in Resources */, - 633FEDCC1D3CD5590014B822 /* call_quality_indicator_0.png in Resources */, - 633FEDEB1D3CD5590014B822 /* call_status_outgoing@2x.png in Resources */, - 633FEDEE1D3CD5590014B822 /* call_transfer_default.png in Resources */, - 63DFE04B1C40161700DA5E87 /* notes_of_the_optimistic.caf in Resources */, - 639E9C931C0DB7BE00019A75 /* FirstLoginView.xib in Resources */, - 633FEEF61D3CD55A0014B822 /* numpad_star_over.png in Resources */, - 633FEEE81D3CD55A0014B822 /* numpad_9_over~ipad@2x.png in Resources */, - 633FEEDE1D3CD55A0014B822 /* numpad_8_over@2x.png in Resources */, - 633FEEB11D3CD55A0014B822 /* numpad_2~ipad.png in Resources */, - 633FEE521D3CD5590014B822 /* dialer_alt_back.png in Resources */, - 633FEE341D3CD5590014B822 /* conference_exit_default.png in Resources */, - 615A283E2180A2560060F920 /* invite_linphone.png in Resources */, - 633FEF281D3CD55A0014B822 /* route_earpiece_default.png in Resources */, - 633FEE4F1D3CD5590014B822 /* delete_field_over@2x.png in Resources */, - C622E3F226A81290004F5434 /* vr_off.png in Resources */, - 633FEE531D3CD5590014B822 /* dialer_alt_back@2x.png in Resources */, - 633FEE3E1D3CD5590014B822 /* contacts_all_disabled.png in Resources */, - 633FEEF31D3CD55A0014B822 /* numpad_over_background.png in Resources */, - 633FEDAD1D3CD5590014B822 /* backspace_over@2x.png in Resources */, - 633FEEEF1D3CD55A0014B822 /* numpad_hash_over~ipad.png in Resources */, - 633FEEE21D3CD55A0014B822 /* numpad_8~ipad@2x.png in Resources */, - 633FEEED1D3CD55A0014B822 /* numpad_hash_over.png in Resources */, - D7CF13732A2E225200D92165 /* emoji.png in Resources */, - 633FEE1F1D3CD5590014B822 /* chat_start_body_disabled@2x.png in Resources */, - 633FEEF81D3CD55A0014B822 /* numpad_star_over~ipad.png in Resources */, - C6A1BB3826E8815400540D50 /* menu_reply_default.png in Resources */, - 633FEF301D3CD55A0014B822 /* route_speaker_disabled.png in Resources */, - 639CEAFD1A1DF4D9004DE38F /* StatusBarView.xib in Resources */, - 633FEDE91D3CD5590014B822 /* call_status_missed~ipad@2x.png in Resources */, - C63F72C9285A2F1E0066163B /* voip_info.png in Resources */, - 8CE24F4C1F8234A30077AC0A /* next_default@2x.png in Resources */, - 244523B11E8266CC0037A187 /* chat_read.png in Resources */, - 61AEBEC62191E47500F35E7F /* chevron_list_close.png in Resources */, - 617B4A60260A2B7800A87337 /* RecordingsListView.xib in Resources */, - 639E9CAC1C0DB80300019A75 /* UIContactDetailsCell.xib in Resources */, - 633FEE511D3CD5590014B822 /* deselect_all@2x.png in Resources */, - C63F72D4285A2F1E0066163B /* voip_remote_recording.png in Resources */, - 8CF25D951F9F336100BEA0C1 /* check_unselected@2x.png in Resources */, - F088488A19FF8C41007FFCF3 /* UIContactCell.xib in Resources */, - 633FEE381D3CD5590014B822 /* contact_add_default.png in Resources */, - 633FEE6F1D3CD5590014B822 /* footer_history_default@2x.png in Resources */, - 633FEF201D3CD55A0014B822 /* presence_unregistered.png in Resources */, - 61586B8D217A173F0038AC45 /* menu_options.png in Resources */, - 61AEBEC82191E48400F35E7F /* chevron_list_close@2x.png in Resources */, - C6E3E7EE291D648D00DDFC46 /* side_menu_voip_meeting_schedule@2x.png in Resources */, - 633FEF341D3CD55A0014B822 /* routes_default.png in Resources */, - C63F72ED285A2F1E0066163B /* voip_merge_calls.png in Resources */, - 633FEE061D3CD5590014B822 /* chat_add_default.png in Resources */, - 633FEDF21D3CD5590014B822 /* call_video_start_default.png in Resources */, - 633FEF491D3CD55A0014B822 /* speaker_selected@2x.png in Resources */, - 633FEF541D3CD55A0014B822 /* waiting_time.png in Resources */, - 633FEE861D3CD5590014B822 /* led_inprogress.png in Resources */, - 633FEDFC1D3CD5590014B822 /* camera_switch_default.png in Resources */, - 24BFAA9F209B0630004F47A7 /* linphone_user.png in Resources */, - 633FEE4B1D3CD5590014B822 /* delete_disabled@2x.png in Resources */, - 633FEE181D3CD5590014B822 /* chat_send_over.png in Resources */, - 633FEDED1D3CD5590014B822 /* call_status_outgoing~ipad@2x.png in Resources */, - 633FEE2D1D3CD5590014B822 /* color_E.png in Resources */, - 633FEED01D3CD55A0014B822 /* numpad_6_over~ipad@2x.png in Resources */, - C64A85502667B67A00252AD2 /* EphemeralSettingsView.xib in Resources */, - 633FEEC81D3CD55A0014B822 /* numpad_5_over~ipad@2x.png in Resources */, - 61586B91217A175D0038AC45 /* menu_recordings.png in Resources */, - C63F72DA285A2F1E0066163B /* voip_numpad_2.png in Resources */, - 633FEF1B1D3CD55A0014B822 /* presence_away@2x.png in Resources */, - C6A1BB3A26E881E100540D50 /* menu_delete.png in Resources */, - 633FEE281D3CD5590014B822 /* checkbox_unchecked.png in Resources */, - 633FEE9D1D3CD55A0014B822 /* numpad_0_over.png in Resources */, - 633FEEC21D3CD55A0014B822 /* numpad_4~ipad@2x.png in Resources */, - 633FEDFE1D3CD5590014B822 /* camera_switch_disabled.png in Resources */, - 633FEE7F1D3CD5590014B822 /* history_missed_selected@2x.png in Resources */, - 633FEDC01D3CD5590014B822 /* call_back_disabled.png in Resources */, - 633FEED31D3CD55A0014B822 /* numpad_7_default.png in Resources */, - 63130FB21C1ED06900371918 /* SideMenuView~ipad.xib in Resources */, - 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 */, - 61586B8B217A17320038AC45 /* menu_link_account@2x.png in Resources */, - 63CDC4661C3BDE370085F529 /* shortring.caf in Resources */, - C6A1BB4126E889AD00540D50 /* forward_message_default.png in Resources */, - 633FEDD51D3CD5590014B822 /* call_quality_indicator_4@2x.png in Resources */, - C63F72CA285A2F1E0066163B /* voip_speaker_off.png in Resources */, - 633FEDE71D3CD5590014B822 /* call_status_missed@2x.png in Resources */, - 615A2821217F6FBF0060F920 /* security_alert_indicator@2x.png in Resources */, - 633FEE1E1D3CD5590014B822 /* chat_start_body_disabled.png in Resources */, - 639CEB001A1DF4E4004DE38F /* UIHistoryCell.xib in Resources */, - 633FEE841D3CD5590014B822 /* led_error.png in Resources */, - 633FEDEA1D3CD5590014B822 /* call_status_outgoing.png in Resources */, - 633FEF511D3CD55A0014B822 /* valid_disabled@2x.png in Resources */, - C63F72C5285A2F1E0066163B /* voip_call_record.png in Resources */, - 633FEEBB1D3CD55A0014B822 /* numpad_4_default.png in Resources */, - 633FEF2B1D3CD55A0014B822 /* route_earpiece_disabled@2x.png in Resources */, - 639E9CA31C0DB7EA00019A75 /* UIChatBubbleTextCell.xib in Resources */, - 633FEDD21D3CD5590014B822 /* call_quality_indicator_3.png in Resources */, - 633FEDAF1D3CD5590014B822 /* call_add_default@2x.png in Resources */, - 633FEE931D3CD55A0014B822 /* menu@2x.png in Resources */, - 633FEF3D1D3CD55A0014B822 /* security_ok@2x.png in Resources */, - 633FEF161D3CD55A0014B822 /* pause_small_disabled.png in Resources */, - 633FEF521D3CD55A0014B822 /* voicemail.png in Resources */, - 633FEE711D3CD5590014B822 /* footer_history_disabled@2x.png in Resources */, - C63F72E5285A2F1E0066163B /* voip_conference_active_speaker.png in Resources */, - 633FEF141D3CD55A0014B822 /* pause_small_default.png in Resources */, - D38187B115FE340500C3EDCA /* ChatsListView.xib in Resources */, - 633FEDA41D3CD5590014B822 /* back_default.png in Resources */, - C63F72BE285A2F1D0066163B /* voip_calls_list.png in Resources */, - C63F72DF285A2F1E0066163B /* voip_bluetooth.png in Resources */, - 633FEE2C1D3CD5590014B822 /* color_D.png in Resources */, - 615A280F217F1FD50060F920 /* chat_add_group.png in Resources */, - 633FEEC41D3CD55A0014B822 /* numpad_5_default@2x.png in Resources */, - 633FEDAC1D3CD5590014B822 /* backspace_over.png in Resources */, - D7A4C0082A3B135800EFBD1B /* new_chat_attachment_default.png in Resources */, - 633FEE1B1D3CD5590014B822 /* chat_start_body_default@2x.png in Resources */, - 633FEE021D3CD5590014B822 /* cancel_edit_default.png in Resources */, - C63F72D7285A2F1E0066163B /* voip_numpad_1.png in Resources */, - 633FEEE31D3CD55A0014B822 /* numpad_9_default.png in Resources */, - 633FEE651D3CD5590014B822 /* footer_chat_disabled@2x.png in Resources */, - 633FEEDD1D3CD55A0014B822 /* numpad_8_over.png in Resources */, - 633FEE8E1D3CD55A0014B822 /* list_details_default.png in Resources */, - 633FEED71D3CD55A0014B822 /* numpad_7_over~ipad.png in Resources */, - C63F72D3285A2F1E0066163B /* voip_multiple_contacts_avatar.png in Resources */, - 633FEF2A1D3CD55A0014B822 /* route_earpiece_disabled.png in Resources */, - 633FEDDB1D3CD5590014B822 /* call_start_body_disabled@2x.png in Resources */, - CFBD7A2A20E504AE007C5286 /* delete_img.png in Resources */, - C63F72C8285A2F1E0066163B /* voip_checkbox_checked.png in Resources */, - 633FEDFD1D3CD5590014B822 /* camera_switch_default@2x.png in Resources */, - 633FEEC51D3CD55A0014B822 /* numpad_5_over.png in Resources */, - 633FEE721D3CD5590014B822 /* history_all_default.png in Resources */, - C6B4444326AAD0980076C517 /* file_default.png in Resources */, - 615A283C2180789C0060F920 /* security_toogle_button@2x.png in Resources */, - 633FEF0A1D3CD55A0014B822 /* options_transfer_call_default.png in Resources */, - 633FEDA51D3CD5590014B822 /* back_default@2x.png in Resources */, - 633FEF311D3CD55A0014B822 /* route_speaker_disabled@2x.png in Resources */, - 61586B81217A16EE0038AC45 /* menu_about.png in Resources */, - C63F72D0285A2F1E0066163B /* voip_conference_paused_big.png in Resources */, - 633FEEE41D3CD55A0014B822 /* numpad_9_default@2x.png in Resources */, - C63F72CD285A2F1E0066163B /* voip_numpad_8.png in Resources */, - 8C2A81961F87B8000012A66B /* chat_group_avatar.png in Resources */, - 633FEDA31D3CD5590014B822 /* avatar~ipad@2x.png in Resources */, - 633FEF461D3CD55A0014B822 /* speaker_disabled.png in Resources */, - 638F1A911C21993D004B8E02 /* UICompositeView~ipad.xib in Resources */, - 633FEE211D3CD5590014B822 /* chat_start_body_disabled~ipad@2x.png in Resources */, - 63AADC011B6A0FF200AA16FD /* assistant_linphone_existing.rc in Resources */, - 633FEE5A1D3CD5590014B822 /* edit_default.png in Resources */, - 244523B01E8266CC0037A187 /* chat_error.png in Resources */, - 8CBD7BA320B6B80D00E5DCC0 /* ChatConversationImdnView.xib in Resources */, - 633FEDD11D3CD5590014B822 /* call_quality_indicator_2@2x.png in Resources */, - 633FEDBC1D3CD5590014B822 /* call_audio_start_disabled.png in Resources */, - 24BFAA9E209B0630004F47A7 /* dialer_background.png in Resources */, - 633FEE481D3CD5590014B822 /* delete_default.png in Resources */, - 633FEEB01D3CD55A0014B822 /* numpad_2_over~ipad@2x.png in Resources */, - 633FEE2A1D3CD5590014B822 /* color_A.png in Resources */, - 633FEEA41D3CD55A0014B822 /* numpad_1_default@2x.png in Resources */, - 63E27A321C4FECD000D332AE /* LaunchScreen.xib in Resources */, - 633FEED11D3CD55A0014B822 /* numpad_6~ipad.png in Resources */, - CF7602E82108759A00749F76 /* UIRecordingCell.xib in Resources */, - C6B4444626AAD0980076C517 /* file_pdf_default.png in Resources */, - 633FEED21D3CD55A0014B822 /* numpad_6~ipad@2x.png in Resources */, - C63F72E0285A2F1E0066163B /* voip_micro_off.png in Resources */, - 633FEDCD1D3CD5590014B822 /* call_quality_indicator_0@2x.png in Resources */, - 636316D41A1DEC650009B839 /* SettingsView.xib in Resources */, - 24BFAAA6209B0630004F47A7 /* linphone_user~ipad.png in Resources */, - 633FEEBF1D3CD55A0014B822 /* numpad_4_over~ipad.png in Resources */, - 633FEEAD1D3CD55A0014B822 /* numpad_2_over.png in Resources */, - 633FEE801D3CD5590014B822 /* led_connected.png in Resources */, - 633FEEF41D3CD55A0014B822 /* numpad_star_default.png in Resources */, - 61586B93217A17700038AC45 /* menu_recordings@2x.png in Resources */, - 615A2834218071FF0060F920 /* security_toogle_background_grey.png in Resources */, - 633FEDDE1D3CD5590014B822 /* call_start_body_over.png in Resources */, - 24BFAAA0209B0630004F47A7 /* contacts_sip_default@2x.png in Resources */, - 8CF25D9D1F9F76BD00BEA0C1 /* chat_group_informations.png in Resources */, - 633FEDFB1D3CD5590014B822 /* camera_selected@2x.png in Resources */, - 633FEF051D3CD55A0014B822 /* options_selected@2x.png in Resources */, - 633FEDD61D3CD5590014B822 /* call_start_body_default.png in Resources */, - 633FEEEC1D3CD55A0014B822 /* numpad_hash_default@2x.png in Resources */, - C63F72D8285A2F1E0066163B /* voip_mandatory.png in Resources */, - 633FEE831D3CD5590014B822 /* led_disconnected@2x.png in Resources */, - 244523BE1E8D3A6C0037A187 /* chat_unsecure.png in Resources */, - C63F72DC285A2F1E0066163B /* voip_menu_more.png in Resources */, - C63F72D5285A2F1E0066163B /* voip_hangup.png in Resources */, - 633FEE031D3CD5590014B822 /* cancel_edit_default@2x.png in Resources */, - 633FEDE01D3CD5590014B822 /* call_start_body_over~ipad.png in Resources */, - 8CBD7BA920B6B82A00E5DCC0 /* UIChatConversationImdnTableViewCell.xib in Resources */, - 615A28442180C0900060F920 /* recording@2x.png in Resources */, - 615A2813217F24D40060F920 /* security_1_indicator.png in Resources */, - 24BFAAA7209B0630004F47A7 /* callkit_logo.png in Resources */, - 615A2811217F1FDE0060F920 /* chat_add_group@2x.png in Resources */, - D34F6F9E1594D3FB0095705B /* InAppSettings.bundle in Resources */, - 633FEE4D1D3CD5590014B822 /* delete_field_default@2x.png in Resources */, - C63F72D9285A2F1E0066163B /* voip_earpiece.png in Resources */, - 615A28362180720D0060F920 /* security_toogle_background_grey@2x.png in Resources */, - 639CEB091A1DF4FA004DE38F /* UIChatCell.xib in Resources */, - C6F55645287CC69F0056E213 /* voip_meeting_schedule.png in Resources */, - 633FEE961D3CD55A0014B822 /* micro_disabled.png in Resources */, - 63AADBF61B6A0FF200AA16FD /* linphonerc-factory in Resources */, - C63F72C6285A2F1E0066163B /* voip_call_forward.png in Resources */, - 633FEE671D3CD5590014B822 /* footer_contacts_default@2x.png in Resources */, - 615A2830218071E80060F920 /* security_toogle_background_green.png in Resources */, - 63B8D68C1BCBE65600C12B09 /* ChatConversationCreateView.xib in Resources */, - 63CDC45F1C3BDE370085F529 /* ringback.wav in Resources */, - 8CD99A1C20908C27008A7CDA /* callkit_logo@2x.png in Resources */, - 633FEE251D3CD5590014B822 /* chat_start_body_over~ipad@2x.png in Resources */, - 633FEDF91D3CD5590014B822 /* camera_disabled@2x.png in Resources */, - 633FEE161D3CD5590014B822 /* chat_send_disabled.png in Resources */, - 615A282421805B260060F920 /* security_toogle_icon_green.png in Resources */, - 633FEE1A1D3CD5590014B822 /* chat_start_body_default.png in Resources */, - 633FEF041D3CD55A0014B822 /* options_selected.png in Resources */, - 633FEEE61D3CD55A0014B822 /* numpad_9_over@2x.png in Resources */, - 63E27A521C50EDB000D332AE /* hold.mkv in Resources */, - 633FEEDC1D3CD55A0014B822 /* numpad_8_default@2x.png in Resources */, - 633FEDAE1D3CD5590014B822 /* call_add_default.png in Resources */, - 633FEE1D1D3CD5590014B822 /* chat_start_body_default~ipad@2x.png in Resources */, - 633FEEEB1D3CD55A0014B822 /* numpad_hash_default.png in Resources */, - 633FEF221D3CD55A0014B822 /* route_bluetooth_default.png in Resources */, - 633FEE701D3CD5590014B822 /* footer_history_disabled.png in Resources */, - 633FEDC91D3CD5590014B822 /* call_missed@2x.png in Resources */, - C63F72E8285A2F1E0066163B /* conference_schedule_calendar_default.png in Resources */, - 633FEEAE1D3CD55A0014B822 /* numpad_2_over@2x.png in Resources */, - 633FEDB51D3CD5590014B822 /* call_alt_back_disabled@2x.png in Resources */, - 631098521D4660630041F2B3 /* CountryListView.xib in Resources */, - 633FEF271D3CD55A0014B822 /* route_bluetooth_selected@2x.png in Resources */, - 633FEE111D3CD5590014B822 /* chat_list_indicator~ipad@2x.png in Resources */, - 633FEEFC1D3CD55A0014B822 /* options_add_call_default.png in Resources */, - 615A2819217F28160060F920 /* chat_list_indicator@2x.png in Resources */, - 61AEBECC2191E4A300F35E7F /* chevron_list_open@2x.png in Resources */, - 24BFAAA5209B0630004F47A7 /* contacts_sip_default.png in Resources */, - 633FEF441D3CD55A0014B822 /* speaker_default.png in Resources */, - 639CEB031A1DF4EB004DE38F /* UICompositeView.xib in Resources */, - C6A1BB4326E88F7C00540D50 /* menu_resend_default.png in Resources */, - 633FEF3A1D3CD55A0014B822 /* security_ko.png in Resources */, - 615A283A2180788E0060F920 /* security_toogle_button.png in Resources */, - 633FEDA01D3CD5590014B822 /* avatar.png in Resources */, - 633FEEBC1D3CD55A0014B822 /* numpad_4_default@2x.png in Resources */, - 633FEEA91D3CD55A0014B822 /* numpad_1~ipad.png in Resources */, - 615A28402180A2620060F920 /* invite_linphone@2x.png in Resources */, - C61B1BF42667D202001A4E4A /* more_menu_default.png in Resources */, - 633FEDF71D3CD5590014B822 /* camera_default@2x.png in Resources */, - D7A4C0092A3B135800EFBD1B /* new_vr_off.png in Resources */, - C64A85522667B74100252AD2 /* ephemeral_messages_default.png in Resources */, - 633FEDB31D3CD5590014B822 /* call_alt_back_default@2x.png in Resources */, - C63F72F2285A2F1E0066163B /* voip_conference_mosaic.png in Resources */, - 633FEDCF1D3CD5590014B822 /* call_quality_indicator_1@2x.png in Resources */, - 633FEF131D3CD55A0014B822 /* pause_big_over_selected@2x.png in Resources */, - 8CDC61951F84D89B0087CF7F /* check_selected.png in Resources */, - 633FEEF01D3CD55A0014B822 /* numpad_hash_over~ipad@2x.png in Resources */, - 63AADBF81B6A0FF200AA16FD /* linphonerc~ipad in Resources */, - 633FEE8F1D3CD55A0014B822 /* list_details_default@2x.png in Resources */, - 633FEE5E1D3CD5590014B822 /* edit_list_default.png in Resources */, - C63F72F7285A2F1E0066163B /* voip_cancel.png in Resources */, - 615A282621805B320060F920 /* security_toogle_icon_green@2x.png in Resources */, - 633FEDB11D3CD5590014B822 /* call_add_disabled@2x.png in Resources */, - CF7602F7210898CC00749F76 /* rec_off_default.png in Resources */, - 633FEDB21D3CD5590014B822 /* call_alt_back_default.png in Resources */, - 633FEE3D1D3CD5590014B822 /* contacts_all_default@2x.png in Resources */, - 633FEF251D3CD55A0014B822 /* route_bluetooth_disabled@2x.png in Resources */, - 633FEDD81D3CD5590014B822 /* call_start_body_default~ipad.png in Resources */, - 61586B83217A16FD0038AC45 /* menu_about@2x.png in Resources */, - C63F72E6285A2F1E0066163B /* voip_numpad_6.png in Resources */, - 633FEED81D3CD55A0014B822 /* numpad_7_over~ipad@2x.png in Resources */, - 633FEDD71D3CD5590014B822 /* call_start_body_default@2x.png in Resources */, - C63F72D6285A2F1E0066163B /* voip_pause.png in Resources */, - 633FEE571D3CD5590014B822 /* dialer_back_disabled@2x.png in Resources */, - 63CDC45E1C3BDE370085F529 /* msg.caf in Resources */, - 633FEE6D1D3CD5590014B822 /* footer_dialer_disabled@2x.png in Resources */, - 633FEF171D3CD55A0014B822 /* pause_small_disabled@2x.png in Resources */, - C6A1BB3626E8815400540D50 /* menu_forward_default.png in Resources */, - D38187DD15FE348A00C3EDCA /* AssistantView.xib in Resources */, - 633FEDA61D3CD5590014B822 /* back_disabled.png in Resources */, - 633FEED61D3CD55A0014B822 /* numpad_7_over@2x.png in Resources */, - 633FEDA11D3CD5590014B822 /* avatar@2x.png in Resources */, - 633FED9E1D3CD5590014B822 /* add_field_over.png in Resources */, - 633FEE0A1D3CD5590014B822 /* chat_attachment_default.png in Resources */, - 633FEE201D3CD5590014B822 /* chat_start_body_disabled~ipad.png in Resources */, - 633FEE5B1D3CD5590014B822 /* edit_default@2x.png in Resources */, - 633FEDE11D3CD5590014B822 /* call_start_body_over~ipad@2x.png in Resources */, - 633FEF4F1D3CD55A0014B822 /* valid_default@2x.png in Resources */, - 8CD99A382090A824008A7CDA /* splashscreen.png in Resources */, - C63F72B7285A2F1D0066163B /* voip_numpad_7.png in Resources */, - 633FEE241D3CD5590014B822 /* chat_start_body_over~ipad.png in Resources */, - 8C2A81951F87B8000012A66B /* chat_group_avatar@2x.png in Resources */, - C63F72C4285A2F1D0066163B /* voip_audio_routes.png in Resources */, - C63F72E1285A2F1E0066163B /* voip_camera_on.png in Resources */, - 633FEE091D3CD5590014B822 /* chat_add_disabled@2x.png in Resources */, - 633FEE191D3CD5590014B822 /* chat_send_over@2x.png in Resources */, - 633FEF181D3CD55A0014B822 /* pause_small_over_selected.png in Resources */, - 633FEE001D3CD5590014B822 /* camera_switch_over.png in Resources */, - C622E3F126A81290004F5434 /* vr_on.png in Resources */, - 633FEF401D3CD55A0014B822 /* select_all_default.png in Resources */, - C6B4444426AAD0980076C517 /* file_picture_default.png in Resources */, - 633FEDF01D3CD5590014B822 /* call_transfer_disabled.png in Resources */, - 633FEE351D3CD5590014B822 /* conference_exit_default@2x.png in Resources */, - 633FEECF1D3CD55A0014B822 /* numpad_6_over~ipad.png in Resources */, - 61586B87217A17160038AC45 /* menu_assistant@2x.png in Resources */, - 633FEE9A1D3CD55A0014B822 /* nowebcamCIF.jpg in Resources */, - 61586B89217A17220038AC45 /* menu_link_account.png in Resources */, - 633FEF351D3CD55A0014B822 /* routes_default@2x.png in Resources */, - 633FEEDB1D3CD55A0014B822 /* numpad_8_default.png in Resources */, - 633FEE5C1D3CD5590014B822 /* edit_disabled.png in Resources */, - C63F72BD285A2F1D0066163B /* voip_call_header_incoming.png in Resources */, - 8CF25D9E1F9F76BD00BEA0C1 /* chat_group_informations@2x.png in Resources */, - 633FEDCA1D3CD5590014B822 /* call_outgoing.png in Resources */, - 633FEDF81D3CD5590014B822 /* camera_disabled.png in Resources */, - 8CB2B8FB1F86229E0015CEE2 /* next_disabled@2x.png in Resources */, - 633FEEE91D3CD55A0014B822 /* numpad_9~ipad.png in Resources */, - 633FEE331D3CD5590014B822 /* color_M.png in Resources */, - 633FEE811D3CD5590014B822 /* led_connected@2x.png in Resources */, - 8CA70AD51F9E285C00A3D2EB /* chat_group_add.png in Resources */, - 633FEE9B1D3CD55A0014B822 /* numpad_0_default.png in Resources */, - 633FEF411D3CD55A0014B822 /* select_all_default@2x.png in Resources */, - 633FEEFD1D3CD55A0014B822 /* options_add_call_default@2x.png in Resources */, - 633FEEA81D3CD55A0014B822 /* numpad_1_over~ipad@2x.png in Resources */, - C63F72B9285A2F1D0066163B /* voip_export.png in Resources */, - D38187AD15FE340100C3EDCA /* ChatConversationView.xib in Resources */, - 633FEE7C1D3CD5590014B822 /* history_missed_disabled.png in Resources */, - CF1DE92E210A0F5D00A0A97E /* UILinphoneAudioPlayer.xib in Resources */, - 633FEDF11D3CD5590014B822 /* call_transfer_disabled@2x.png in Resources */, - 615A282821805B400060F920 /* security_toogle_icon_grey.png in Resources */, - 667A423C293A4BAD00C4306C /* post_quantum_secure@3x.png in Resources */, - 633FEDFF1D3CD5590014B822 /* camera_switch_disabled@2x.png in Resources */, - 633FEDDF1D3CD5590014B822 /* call_start_body_over@2x.png in Resources */, - 633FEEFA1D3CD55A0014B822 /* numpad_star~ipad.png in Resources */, - D38187B915FE342200C3EDCA /* ContactDetailsView.xib in Resources */, - 633FEE921D3CD55A0014B822 /* menu.png in Resources */, - C622E3F026A81290004F5434 /* vr_wave.png in Resources */, - C63F72E3285A2F1E0066163B /* voip_call.png in Resources */, - 633FEDE41D3CD5590014B822 /* call_status_incoming~ipad.png in Resources */, - 633FEE4C1D3CD5590014B822 /* delete_field_default.png in Resources */, - 633FEE391D3CD5590014B822 /* contact_add_default@2x.png in Resources */, - 633FEE741D3CD5590014B822 /* history_all_disabled.png in Resources */, - 633FEE081D3CD5590014B822 /* chat_add_disabled.png in Resources */, - 615A28422180C0870060F920 /* recording.png in Resources */, - C63F72EC285A2F1E0066163B /* conference_schedule_time_default.png in Resources */, - 633FEF1D1D3CD55A0014B822 /* presence_offline@2x.png in Resources */, - 24A3459E1D95797700881A5C /* UIShopTableCell.xib in Resources */, - 633FEE231D3CD5590014B822 /* chat_start_body_over@2x.png in Resources */, - 633FEEBE1D3CD55A0014B822 /* numpad_4_over@2x.png in Resources */, - 633FEF471D3CD55A0014B822 /* speaker_disabled@2x.png in Resources */, - 633FEEFE1D3CD55A0014B822 /* options_add_call_disabled.png in Resources */, - 633FEE291D3CD5590014B822 /* checkbox_unchecked@2x.png in Resources */, - 63AADC001B6A0FF200AA16FD /* assistant_linphone_create.rc in Resources */, - 633FEF1C1D3CD55A0014B822 /* presence_offline.png in Resources */, - 633FEE901D3CD55A0014B822 /* list_details_over.png in Resources */, - 633FEDE31D3CD5590014B822 /* call_status_incoming@2x.png in Resources */, - 633FEE821D3CD5590014B822 /* led_disconnected.png in Resources */, - C63F72BC285A2F1D0066163B /* voip_numpad_4.png in Resources */, - 633FEDB01D3CD5590014B822 /* call_add_disabled.png in Resources */, - 63EC8D391D7438660066547B /* AssistantLinkView.xib in Resources */, - 633FEE971D3CD55A0014B822 /* micro_disabled@2x.png in Resources */, - D38187CD15FE346700C3EDCA /* HistoryDetailsView.xib in Resources */, - 633FEEA21D3CD55A0014B822 /* numpad_0~ipad@2x.png in Resources */, - 633FEE991D3CD55A0014B822 /* micro_selected@2x.png in Resources */, - 633FEE621D3CD5590014B822 /* footer_chat_default.png in Resources */, - 24BFAAA3209B0630004F47A7 /* contacts_sip_selected.png in Resources */, - 633FEE0D1D3CD5590014B822 /* chat_attachment_disabled@2x.png in Resources */, - 639E9CA61C0DB7F200019A75 /* UIChatCreateCell.xib in Resources */, - 633FEEA31D3CD55A0014B822 /* numpad_1_default.png in Resources */, - 633FEEA51D3CD55A0014B822 /* numpad_1_over.png in Resources */, - 633FEF2E1D3CD55A0014B822 /* route_speaker_default.png in Resources */, - 633FEDA91D3CD5590014B822 /* backspace_default@2x.png in Resources */, - 633FEDF61D3CD5590014B822 /* camera_default.png in Resources */, - C63F72E2285A2F1E0066163B /* voip_conference_play_big.png in Resources */, - F0642EF119DAC891009DB336 /* MainStoryboard.storyboard in Resources */, - 633FEECC1D3CD55A0014B822 /* numpad_6_default@2x.png in Resources */, - 633FEEB91D3CD55A0014B822 /* numpad_3~ipad.png in Resources */, - C63F72F5285A2F1E0066163B /* voip_single_contact_avatar.png in Resources */, - C63F72EF285A2F1E0066163B /* voip_micro_on.png in Resources */, - 633FEE731D3CD5590014B822 /* history_all_default@2x.png in Resources */, - 633FEDE21D3CD5590014B822 /* call_status_incoming.png in Resources */, - 633FEDDA1D3CD5590014B822 /* call_start_body_disabled.png in Resources */, - 633FEDB91D3CD5590014B822 /* call_alt_start_disabled@2x.png in Resources */, - 633FEE691D3CD5590014B822 /* footer_contacts_disabled@2x.png in Resources */, - 8CBD7BA020B6B7FD00E5DCC0 /* ChatConversationInfoView.xib in Resources */, - 633FEF071D3CD55A0014B822 /* options_start_conference_default@2x.png in Resources */, - 633FEE151D3CD5590014B822 /* chat_send_default@2x.png in Resources */, - 633FEDC31D3CD5590014B822 /* call_hangup_default@2x.png in Resources */, - 633FEF061D3CD55A0014B822 /* options_start_conference_default.png in Resources */, - 63AADC021B6A0FF200AA16FD /* assistant_remote.rc in Resources */, - 633FEF1E1D3CD55A0014B822 /* presence_online.png in Resources */, - 8CE24F571F8268850077AC0A /* conference_delete.png in Resources */, - 633FEDF41D3CD5590014B822 /* call_video_start_disabled.png in Resources */, - 633FEDD31D3CD5590014B822 /* call_quality_indicator_3@2x.png in Resources */, - 633FEE3A1D3CD5590014B822 /* contact_add_disabled.png in Resources */, - 633FEEA11D3CD55A0014B822 /* numpad_0~ipad.png in Resources */, - 8CE24F4B1F8234A30077AC0A /* next_default.png in Resources */, - 633FEE751D3CD5590014B822 /* history_all_disabled@2x.png in Resources */, - 633FEEF71D3CD55A0014B822 /* numpad_star_over@2x.png in Resources */, - 633FEEAB1D3CD55A0014B822 /* numpad_2_default.png in Resources */, - 633FEE851D3CD5590014B822 /* led_error@2x.png in Resources */, - C6B4444226AAD0980076C517 /* file_video_default.png in Resources */, - 633FEDBE1D3CD5590014B822 /* call_back_default.png in Resources */, - 633FEF0F1D3CD55A0014B822 /* pause_big_default@2x.png in Resources */, - C66B040E26F095D1009B5EDC /* cancel_forward.png in Resources */, - CF7602F6210898CC00749F76 /* rec_on_default@2x.png in Resources */, - 633FEF081D3CD55A0014B822 /* options_start_conference_disabled.png in Resources */, - 633FEE301D3CD5590014B822 /* color_H.png in Resources */, - 633FEE7D1D3CD5590014B822 /* history_missed_disabled@2x.png in Resources */, - 633FEE941D3CD55A0014B822 /* micro_default.png in Resources */, - 633FEE611D3CD5590014B822 /* edit_list_disabled@2x.png in Resources */, - C63F72EE285A2F1E0066163B /* voip_camera_off.png in Resources */, - 633FEE761D3CD5590014B822 /* history_all_selected.png in Resources */, - C63F72E7285A2F1E0066163B /* voip_call_participants.png in Resources */, - 8C300D9B1E40E0CC00728EF3 /* lime_ko@2x.png in Resources */, - 633FEF321D3CD55A0014B822 /* route_speaker_selected.png in Resources */, - 61AEBEBF2191991F00F35E7F /* DevicesListView.xib in Resources */, - C63F72BA285A2F1D0066163B /* voip_call_numpad.png in Resources */, - 633FEDF51D3CD5590014B822 /* call_video_start_disabled@2x.png in Resources */, - 63B81A0C1B57DA33009604A6 /* LICENSE.txt in Resources */, - 633FEEDA1D3CD55A0014B822 /* numpad_7~ipad@2x.png in Resources */, - 633FEE5D1D3CD5590014B822 /* edit_disabled@2x.png in Resources */, - 615A2832218071F30060F920 /* security_toogle_background_green@2x.png in Resources */, - 633FEEC11D3CD55A0014B822 /* numpad_4~ipad.png in Resources */, - 633FEE6B1D3CD5590014B822 /* footer_dialer_default@2x.png in Resources */, - 633FEE0E1D3CD5590014B822 /* chat_attachment_over.png in Resources */, - 633FEE7B1D3CD5590014B822 /* history_missed_default@2x.png in Resources */, - 633FEEC71D3CD55A0014B822 /* numpad_5_over~ipad.png in Resources */, - C6F55647287CCFB70056E213 /* menu_voip_meeting_schedule.png in Resources */, - C63F72BF285A2F1D0066163B /* voip_call_header_paused.png in Resources */, - 633FEEAA1D3CD55A0014B822 /* numpad_1~ipad@2x.png in Resources */, - 633FEDEC1D3CD5590014B822 /* call_status_outgoing~ipad.png in Resources */, - 633FEDE51D3CD5590014B822 /* call_status_incoming~ipad@2x.png in Resources */, - 633FEEE11D3CD55A0014B822 /* numpad_8~ipad.png in Resources */, - 633FEF101D3CD55A0014B822 /* pause_big_disabled.png in Resources */, - 633FEE221D3CD5590014B822 /* chat_start_body_over.png in Resources */, - 633FEE601D3CD5590014B822 /* edit_list_disabled.png in Resources */, - D38187C115FE345B00C3EDCA /* DialerView.xib in Resources */, - C6A1BB3726E8815400540D50 /* menu_copy_text_default.png in Resources */, - D37EE10D16035793003608A6 /* ImageView.xib in Resources */, - C63F72B8285A2F1D0066163B /* voip_radio_off.png in Resources */, - 633FEE9F1D3CD55A0014B822 /* numpad_0_over~ipad.png in Resources */, - 633FEED51D3CD55A0014B822 /* numpad_7_over.png in Resources */, - 633FEE561D3CD5590014B822 /* dialer_back_disabled.png in Resources */, - 633FEDBF1D3CD5590014B822 /* call_back_default@2x.png in Resources */, - 24BFAAA8209B0630004F47A7 /* contacts_sip_selected@2x.png in Resources */, - 633FEE141D3CD5590014B822 /* chat_send_default.png in Resources */, - 633FEF421D3CD55A0014B822 /* select_all_disabled.png in Resources */, - 63AADBE81B6A0FF200AA16FD /* Localizable.strings in Resources */, - C63F72CF285A2F1E0066163B /* voip_copy.png in Resources */, - 633FEEF21D3CD55A0014B822 /* numpad_hash~ipad@2x.png in Resources */, - 633FEE3F1D3CD5590014B822 /* contacts_all_disabled@2x.png in Resources */, - 633FEF3B1D3CD55A0014B822 /* security_ko@2x.png in Resources */, - C63F72F1285A2F1E0066163B /* conference_schedule_participants_default.png in Resources */, - 633FEE4A1D3CD5590014B822 /* delete_disabled.png in Resources */, - 614D09CE21E74D5400C43EDF /* GoogleService-Info.plist in Resources */, - C6B4444526AAD0980076C517 /* file_audio_default.png in Resources */, - C6A1BB3526E8815400540D50 /* menu_info.png in Resources */, - C61B1BF72667EC6B001A4E4A /* ephemeral_messages_color_A.png in Resources */, - 633FEF151D3CD55A0014B822 /* pause_small_default@2x.png in Resources */, - 633FEEF91D3CD55A0014B822 /* numpad_star_over~ipad@2x.png in Resources */, - 633FEDCB1D3CD5590014B822 /* call_outgoing@2x.png in Resources */, - 633FEF501D3CD55A0014B822 /* valid_disabled.png in Resources */, - 633FEEB31D3CD55A0014B822 /* numpad_3_default.png in Resources */, - 61AEBECA2191E49300F35E7F /* chevron_list_open.png in Resources */, - 633FEE1C1D3CD5590014B822 /* chat_start_body_default~ipad.png in Resources */, - 633FEE011D3CD5590014B822 /* camera_switch_over@2x.png in Resources */, - 633FEEA01D3CD55A0014B822 /* numpad_0_over~ipad@2x.png in Resources */, - 66E399F72857869300E73456 /* menu_notifications_off.png in Resources */, - 633FEF3E1D3CD55A0014B822 /* security_pending.png in Resources */, - 633FEE7E1D3CD5590014B822 /* history_missed_selected.png in Resources */, - 633FEE261D3CD5590014B822 /* checkbox_checked.png in Resources */, - C63F72B6285A2F1D0066163B /* voip_spinner.png in Resources */, - 633FEF531D3CD55A0014B822 /* voicemail@2x.png in Resources */, - 633FEF2C1D3CD55A0014B822 /* route_earpiece_selected.png in Resources */, - 633FEE681D3CD5590014B822 /* footer_contacts_disabled.png in Resources */, - C63F72B5285A2F1D0066163B /* voip_dropdown.png in Resources */, - C63F72CC285A2F1E0066163B /* voip_call_stats.png in Resources */, - 633FEDB71D3CD5590014B822 /* call_alt_start_default@2x.png in Resources */, - D3D5126C160B3A8E00946DF8 /* AssistantViewScreens.xib in Resources */, - 63AADBEA1B6A0FF200AA16FD /* Images.xcassets in Resources */, - 633FEECB1D3CD55A0014B822 /* numpad_6_default.png in Resources */, - C63F72DD285A2F1E0066163B /* voip_conference_new.png in Resources */, - 633FEDC71D3CD5590014B822 /* call_incoming@2x.png in Resources */, - 633FEDB81D3CD5590014B822 /* call_alt_start_disabled.png in Resources */, - 615A281D217F6FA80060F920 /* security_2_indicator@2x.png in Resources */, - C63F72E9285A2F1E0066163B /* voip_call_chat.png in Resources */, - 633FEF3C1D3CD55A0014B822 /* security_ok.png in Resources */, - 633FEEAF1D3CD55A0014B822 /* numpad_2_over~ipad.png in Resources */, - 633FEEB81D3CD55A0014B822 /* numpad_3_over~ipad@2x.png in Resources */, - 633FEEFB1D3CD55A0014B822 /* numpad_star~ipad@2x.png in Resources */, - 633FED9F1D3CD5590014B822 /* add_field_over@2x.png in Resources */, - 633FEEB71D3CD55A0014B822 /* numpad_3_over~ipad.png in Resources */, - C63F72F3285A2F1E0066163B /* voip_numpad_5.png in Resources */, - 633FEEF51D3CD55A0014B822 /* numpad_star_default@2x.png in Resources */, - 639E9CA91C0DB7FB00019A75 /* UIConfirmationDialog.xib in Resources */, - C63F72CB285A2F1E0066163B /* voip_call_more.png in Resources */, - 633FEF111D3CD55A0014B822 /* pause_big_disabled@2x.png in Resources */, - C63F72FE285A31DA0066163B /* Roboto-Italic.ttf in Resources */, - C63F72C1285A2F1D0066163B /* voip_numpad_3.png in Resources */, - 633FEE321D3CD5590014B822 /* color_L.png in Resources */, - 615A281F217F6FB40060F920 /* security_alert_indicator.png in Resources */, - CF7602F5210898CC00749F76 /* rec_off_default@2x.png in Resources */, - 633FEDB41D3CD5590014B822 /* call_alt_back_disabled.png in Resources */, - 633FEE631D3CD5590014B822 /* footer_chat_default@2x.png in Resources */, - 615A281B217F6F9C0060F920 /* security_2_indicator.png in Resources */, - 633FEE661D3CD5590014B822 /* footer_contacts_default.png in Resources */, - 633FEDC11D3CD5590014B822 /* call_back_disabled@2x.png in Resources */, - 633FEEEE1D3CD55A0014B822 /* numpad_hash_over@2x.png in Resources */, - 633FEDD01D3CD5590014B822 /* call_quality_indicator_2.png in Resources */, - C63F72BB285A2F1D0066163B /* voip_chat_rooms_list.png in Resources */, - 633FEE551D3CD5590014B822 /* dialer_back_default@2x.png in Resources */, - 633FEF361D3CD55A0014B822 /* routes_disabled.png in Resources */, - 633FEF261D3CD55A0014B822 /* route_bluetooth_selected.png in Resources */, - 633FEDF31D3CD5590014B822 /* call_video_start_default@2x.png in Resources */, - 24BFAAA2209B0630004F47A7 /* linphone_user~ipad@2x.png in Resources */, - 633FEDBA1D3CD5590014B822 /* call_audio_start_default.png in Resources */, - D7C6DE842948CF3100756E03 /* DropDownCell.xib in Resources */, - 61586B8F217A174F0038AC45 /* menu_options@2x.png in Resources */, - 633FEE131D3CD5590014B822 /* chat_message_not_delivered@2x.png in Resources */, - 615A282A21805B4C0060F920 /* security_toogle_icon_grey@2x.png in Resources */, - C63F72CE285A2F1E0066163B /* voip_call_add.png in Resources */, - 63AADBF51B6A0FF200AA16FD /* linphonerc in Resources */, - 633FEF0C1D3CD55A0014B822 /* options_transfer_call_disabled.png in Resources */, - 633FEE911D3CD55A0014B822 /* list_details_over@2x.png in Resources */, - 633FEE121D3CD5590014B822 /* chat_message_not_delivered.png in Resources */, - 633FEDCE1D3CD5590014B822 /* call_quality_indicator_1.png in Resources */, - 66E399F82857869300E73456 /* menu_notifications_on.png in Resources */, - 8CB2B8F91F86229E0015CEE2 /* chat_secure.png in Resources */, - C63F72DB285A2F1E0066163B /* voip_conference_audio_only.png in Resources */, - 633FEF4E1D3CD55A0014B822 /* valid_default.png in Resources */, - 570742581D5A0691004B9C84 /* ShopView.xib in Resources */, - 633FEE361D3CD5590014B822 /* conference_exit_over.png in Resources */, - 633FEDAA1D3CD5590014B822 /* backspace_disabled.png in Resources */, - F0938159188E629800A55DFA /* iTunesArtwork in Resources */, - 633FEE791D3CD5590014B822 /* history_chat_indicator@2x.png in Resources */, - 633FEEBA1D3CD55A0014B822 /* numpad_3~ipad@2x.png in Resources */, - 633FEEA61D3CD55A0014B822 /* numpad_1_over@2x.png in Resources */, - 633FEE371D3CD5590014B822 /* conference_exit_over@2x.png in Resources */, - 639E9CA01C0DB7E500019A75 /* UIChatBubblePhotoCell.xib in Resources */, - 633FEE4E1D3CD5590014B822 /* delete_field_over.png in Resources */, - 633FEE501D3CD5590014B822 /* deselect_all.png in Resources */, - 633FEF2F1D3CD55A0014B822 /* route_speaker_default@2x.png in Resources */, - 633FEDDD1D3CD5590014B822 /* call_start_body_disabled~ipad@2x.png in Resources */, - 633FEEBD1D3CD55A0014B822 /* numpad_4_over.png in Resources */, - 8CA70AD41F9E285C00A3D2EB /* chat_group_add@2x.png in Resources */, - C66B040A26EFDA55009B5EDC /* reply_cancel.png in Resources */, - 633FEEF11D3CD55A0014B822 /* numpad_hash~ipad.png in Resources */, - 633FEE781D3CD5590014B822 /* history_chat_indicator.png in Resources */, - 633FEF431D3CD55A0014B822 /* select_all_disabled@2x.png in Resources */, - 633FEE771D3CD5590014B822 /* history_all_selected@2x.png in Resources */, - 633FEF031D3CD55A0014B822 /* options_disabled@2x.png in Resources */, - 633FEDA21D3CD5590014B822 /* avatar~ipad.png in Resources */, - 24BFAAA1209B0630004F47A7 /* linphone_user@2x.png in Resources */, - 633FEF211D3CD55A0014B822 /* presence_unregistered@2x.png in Resources */, - C63F72C2285A2F1D0066163B /* voip_numpad_9.png in Resources */, - C63F72E4285A2F1E0066163B /* voip_call_list_menu.png in Resources */, - 633FEEA71D3CD55A0014B822 /* numpad_1_over~ipad.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 61AE364920C00B370089D9D3 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 61AE365220C00B370089D9D3 /* MainInterface.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6637AF8B288593AF00965733 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EA88A406242A6224007FEC61 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - EA88A407242A6235007FEC61 /* Localizable.strings in Resources */, - 6112A01E243B5FD500DBD5F5 /* GoogleService-Info.plist in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EA88F3AE241BD1ED00E66528 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - EA88F3AF241BD1F700E66528 /* MainInterface.storyboard in Resources */, - EA88A405242A6216007FEC61 /* Localizable.strings in Resources */, - 6112A01C243B31A700DBD5F5 /* GoogleService-Info.plist in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 6112A019243B2C8400DBD5F5 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "$(SRCROOT)/msgNotificationContent/linphone-Info.plist", - "$(SRCROOT)/linphone.xcarchive/dSYMs/msgNotificationContent.appex.dSYM/Contents/Resources/DWARF/msgNotificationContent", - ); - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "val=`expr \"$GCC_PREPROCESSOR_DEFINITIONS\" : \".*USE_CRASHLYTICS=\\([0-9]*\\)\"`\nif [ $val = 1 ]; then\n ${PODS_ROOT}/FirebaseCrashlytics/run\nfi\n"; - }; - 6112A01A243B2CCF00DBD5F5 /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "$(SRCROOT)/msgNotificationService/linphone-Info.plist", - "$(SRCROOT)/linphone.xcarchive/dSYMs/msgNotificationService.appex.dSYM/Contents/Resources/DWARF/msgNotificationService", - ); - name = "Run Script"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "val=`expr \"$GCC_PREPROCESSOR_DEFINITIONS\" : \".*USE_CRASHLYTICS=\\([0-9]*\\)\"`\nif [ $val = 1 ]; then\n ${PODS_ROOT}/FirebaseCrashlytics/run\nfi\n"; - }; - 614D0A1821E77F5300C43EDF /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "$(SRCROOT)/linphone.xcarchive/dSYMs/linphone.app.dSYM/Contents/Resources/DWARF/linphone", - "$(SRCROOT)/linphone-Info.plist", - ); - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "val=`expr \"$GCC_PREPROCESSOR_DEFINITIONS\" : \".*USE_CRASHLYTICS=\\([0-9]*\\)\"`\nif [ $val = 1 ]; then\n ${PODS_ROOT}/FirebaseCrashlytics/run\nfi\n\n\n"; - }; - 63DCC71D1A07B08E00916627 /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "$SRCROOT/Tools/git_version.sh\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1D60588E0D05DD3D006BFB54 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 63B81A0F1B57DA33009604A6 /* TPKeyboardAvoidingTableView.m in Sources */, - CF1DE92D210A0F5D00A0A97E /* UILinphoneAudioPlayer.m in Sources */, - D779D39C29A76DE6007B8087 /* ChatConversationTableViewModel.swift in Sources */, - 1D60589B0D05DD56006BFB54 /* main.m in Sources */, - C63F725C285A24B10066163B /* IncomingCallView.swift in Sources */, - C63F726B285A24B10066163B /* ButtonWithStateBackgrounds.swift in Sources */, - D783D9BA2A669A9E00293E87 /* ContentMessageView.swift in Sources */, - C63F7218285A24B10066163B /* ScheduledConferencesCell.swift in Sources */, - C63F722E285A24B10066163B /* IceState.swift in Sources */, - 6135761C240E81BB005304D4 /* UIInterfaceStyleButton.m in Sources */, - C63F721C285A24B10066163B /* MediatorLiveData.swift in Sources */, - 8CD99A3C2090B9FA008A7CDA /* ChatConversationImdnView.m in Sources */, - 1D3623260D0F684500981E51 /* LinphoneAppDelegate.m in Sources */, - C63F7264285A24B10066163B /* BouncingCounter.swift in Sources */, - D7013DB82940AA12004EEAAE /* MessageView.swift in Sources */, - C6B4444826AADA530076C517 /* SwiftUtil.swift in Sources */, - C63F7257285A24B10066163B /* ConferenceLayoutPickerView.swift in Sources */, - CF15F21E20E4F9A3008B1DE6 /* UIImageViewDeletable.m in Sources */, - D7F067482AAA1BFB0044CC87 /* ReactionCell.swift in Sources */, - 22F2508E107141E100AC9B3F /* DialerView.m in Sources */, - C63F724F285A24B10066163B /* LocalVideoView.swift in Sources */, - 633756451B67D2B200E21BAD /* SideMenuView.m in Sources */, - 8CD99A422090CE6F008A7CDA /* UIChatConversationImdnTableViewCell.m in Sources */, - 22E0A822111C44E100B04932 /* AboutView.m in Sources */, - 633671611BCBAAD200BFCBDE /* ChatConversationCreateView.m in Sources */, - 634610061B61330300548952 /* UILabel+Boldify.m in Sources */, - 2248E90E12F7E4CF00220D9C /* UIDigitButton.m in Sources */, - D7CBC0F72A8E1669009182D8 /* Mode.swift in Sources */, - 633756391B67BAF400E21BAD /* SideMenuTableView.m in Sources */, - C63F7245285A24B10066163B /* VoipConferenceAudioOnlyView.swift in Sources */, - 2214EB7A12F846B1002A5394 /* UICallButton.m in Sources */, - C63F7258285A24B10066163B /* ControlsView.swift in Sources */, - 630CF5571AF7CE1500539F7A /* UITextField+DoneButton.m in Sources */, - C63F720D285A24B10066163B /* ConfigManager.swift in Sources */, - 8C9C5E111F83BD97006987FA /* UIChatCreateCollectionViewCell.m in Sources */, - C63F7231285A24B10066163B /* PayloadType.swift in Sources */, - 63701DDF1BA32039006A9AE3 /* UIConfirmationDialog.m in Sources */, - 22AA8B0113D83F6300B30535 /* UICamSwitch.m in Sources */, - 63B8D6A21BCBF43100C12B09 /* UIChatCreateCell.m in Sources */, - 636BC9971B5F921B00C754CE /* UIIconButton.m in Sources */, - C63F7263285A24B10066163B /* FormButton.swift in Sources */, - C63F7215285A24B10066163B /* ConferenceWaitingRoomView.swift in Sources */, - C6548820292D32FA00BF646B /* SingleCallView.swift in Sources */, - 63423C0A1C4501D000D9A050 /* Contact.m in Sources */, - C63F7262285A24B10066163B /* RotatingSpinner.swift in Sources */, - C63F723A285A24B10066163B /* CallData.swift in Sources */, - CF7602D7210867E800749F76 /* RecordingsListView.m in Sources */, - C63F7226285A24B10066163B /* UIVIewExtensions.swift in Sources */, - C63F7259285A24B10066163B /* RemotelyRecording.swift in Sources */, - C63F7236285A24B10066163B /* ControlsViewModel.swift in Sources */, - C63F7214285A24B10066163B /* Duration.swift in Sources */, - C63F723B285A24B10066163B /* AudioRouteUtils.swift in Sources */, - C63F7269285A24B10066163B /* StyledLabel.swift in Sources */, - D7CBC0FD2A8E3D3F009182D8 /* VoipSpeakerCell.swift in Sources */, - C63F722C285A24B10066163B /* UIColorExtensions.swift in Sources */, - D3F83F8E15822ABE00336684 /* PhoneMainView.m in Sources */, - C63F7251285A24B10066163B /* NumpadView.swift in Sources */, - C63F723F285A24B10066163B /* ButtonTheme.swift in Sources */, - C63F7213285A24B10066163B /* TimeZoneData.swift in Sources */, - C6A1BB3E26E882D000540D50 /* UIChatReplyBubbleView.m in Sources */, - 6377AC801BDE4069007F7625 /* UIBackToCallButton.m in Sources */, - 6308F9C51BF0DD6600D1234B /* XMLRPCHelper.m in Sources */, - C63F7235285A24B10066163B /* CallsViewModel.swift in Sources */, - D779D39E29AC9E93007B8087 /* AudioPlayer.swift in Sources */, - C63F722D285A24B10066163B /* CoreExtensions.swift in Sources */, - C63F722F285A24B10066163B /* AddressExtensions.swift in Sources */, - D3ED3E871586291E006C0DE4 /* TabBarView.m in Sources */, - 617C242A263022690042FB4A /* UIChatContentView.m in Sources */, - C63F7261285A24B10066163B /* CallControlButton.swift in Sources */, - D3ED3EA71587334E006C0DE4 /* HistoryListTableView.m in Sources */, - D768763529CDA88200570747 /* UploadMessageCell.swift in Sources */, - C63F7220285A24B10066163B /* TimestampUtils.swift in Sources */, - 61AEBEBD2191990A00F35E7F /* DevicesListView.m in Sources */, - D3ED3EB81587392C006C0DE4 /* HistoryListView.m in Sources */, - 24A345A61D95798A00881A5C /* UIShopTableCell.m in Sources */, - C63F7268285A24B10066163B /* Avatar.swift in Sources */, - C63F7247285A24B10066163B /* VoipAudioOnlyParticipantCell.swift in Sources */, - D35497FE15875372000081D8 /* ContactsListView.m in Sources */, - 635173F91BA082A40095EB0A /* UIChatBubblePhotoCell.m in Sources */, - C63F723E285A24B10066163B /* VoipTexts.swift in Sources */, - C63F722A285A24B10066163B /* UIImageViewExtensions.swift in Sources */, - D3549816158761D0000081D8 /* ContactsListTableView.m in Sources */, - D77057F1292E4A340031A970 /* ChatConversationViewModel.swift in Sources */, - 633888461BFB2C49001D5E7B /* HPTextViewInternal.m in Sources */, - C63F7242285A24B10066163B /* VoipParticipantCell.swift in Sources */, - D35498211587716B000081D8 /* StatusBarView.m in Sources */, - D3A55FBC15877E5E003FD403 /* UIContactCell.m in Sources */, - 6341807C1BBC103100F71761 /* ChatConversationCreateTableView.m in Sources */, - C63F7254285A24B10066163B /* CallsListView.swift in Sources */, - 63BE7A781D75BDF6000990EF /* ShopTableView.m in Sources */, - D779D39A29A4C285007B8087 /* MultilineMessageCell.swift in Sources */, - D326483815887D5200930C67 /* OrderedDictionary.m in Sources */, - D32648441588F6FC00930C67 /* UIToggleButton.m in Sources */, - D31C9C98158A1CDF00756B45 /* UIHistoryCell.m in Sources */, - D35E7597159460580066B1C1 /* ChatsListView.m in Sources */, - D35E759F159460B70066B1C1 /* SettingsView.m in Sources */, - C63F7216285A24B10066163B /* ScheduledConferencesView.swift in Sources */, - 662B73332A73C331002135F3 /* CopyableLabel.swift in Sources */, - C63F7255285A24B10066163B /* VoipCallCell.swift in Sources */, - 63B81A101B57DA33009604A6 /* UIScrollView+TPKeyboardAvoidingAdditions.m in Sources */, - C63F7211285A24B10066163B /* ScheduledConferencesViewModel.swift in Sources */, - F03CA84318C72F1A0008889D /* UITextViewNoDefine.m in Sources */, - C63F7212285A24B10066163B /* ScheduledConferenceData.swift in Sources */, - C63F7239285A24B10066163B /* ConferenceParticipantDeviceData.swift in Sources */, - C63F7238285A24B10066163B /* ConferenceParticipantData.swift in Sources */, - 63B81A0D1B57DA33009604A6 /* TPKeyboardAvoidingCollectionView.m in Sources */, - D7C6DE832948CF3100756E03 /* DropDownCell.swift in Sources */, - D7CBC0FF2A8E3E11009182D8 /* ConferenceSpeakerData.swift in Sources */, - C63F726D285A24B10066163B /* ProviderDelegate.swift in Sources */, - C63F7266285A24B10066163B /* UICallTimer.swift in Sources */, - C6548821292D32FA00BF646B /* ConferenceCallView.swift in Sources */, - C63F726C285A24B10066163B /* StyledTextView.swift in Sources */, - 570742611D5A09B8004B9C84 /* ShopView.m in Sources */, - D37DC6C11594AE1800B2A5EB /* LinphoneCoreSettingsStore.m in Sources */, - 63CD4B4F1A5AAC8C00B84282 /* DTAlertView.m in Sources */, - D3EA53FD159850E80037DC6B /* LinphoneManager.m in Sources */, - 63B81A0E1B57DA33009604A6 /* TPKeyboardAvoidingScrollView.m in Sources */, - 633888451BFB2C49001D5E7B /* HPGrowingTextView.m in Sources */, - D7097B35296D684900AEF6C5 /* FileType.swift in Sources */, - 63F1DF441BCE618E00EDED90 /* UIAddressTextField.m in Sources */, - D3EA540D1598528B0037DC6B /* ChatsListTableView.m in Sources */, - C63F725E285A24B10066163B /* VoipDialog.swift in Sources */, - C63F724E285A24B10066163B /* PausedCallOrConferenceView.swift in Sources */, - D3EA5411159853750037DC6B /* UIChatCell.m in Sources */, - D72F27AA2AA8B42D00CFB13D /* SheetViewController.swift in Sources */, - D31B4B21159876C0002E6C72 /* UICompositeView.m in Sources */, - C63F7267285A24B10066163B /* StyledCheckBox.swift in Sources */, - 8C9C5E0D1F83B2EF006987FA /* ChatConversationCreateCollectionViewController.m in Sources */, - 631098491D4660580041F2B3 /* CountryListView.m in Sources */, - D32B9DFC15A2F131000B6DEC /* FastAddressBook.m in Sources */, - C684F1FA2913D65500736775 /* SnapkitBridge.swift in Sources */, - C63F7228285A24B10066163B /* OptionalExtensions.swift in Sources */, - C63F7241285A24B10066163B /* ParticipantsListView.swift in Sources */, - D350F20E15A43BB100149E54 /* AssistantView.m in Sources */, - D3F795D615A582810077328B /* ChatConversationView.m in Sources */, - C63F723C285A24B10066163B /* LightDarkColor.swift in Sources */, - D32B6E2915A5BC440033019F /* ChatConversationTableView.m in Sources */, - C63F7233285A24B10066163B /* ConferenceExtensions.swift in Sources */, - C63F7260285A24B10066163B /* StyledSwitch.swift in Sources */, - C63F7252285A24B10066163B /* VoipExtraButtonsView.swift in Sources */, - D7DA18712A02598700FABA0D /* TextViewer.swift in Sources */, - 669B140C27A29D140012220A /* FloatingScrollDownButton.swift in Sources */, - C63F7219285A24B10066163B /* ConferenceHistoryDetailsView.swift in Sources */, - D779D3A229B5E365007B8087 /* UIImageExtension.swift in Sources */, - D3A8BB7015A6C7D500F96BE5 /* UIChatBubbleTextCell.m in Sources */, - 63D11C531C3D501200E8FCEE /* Log.m in Sources */, - D3128FE115AABC7E00A2147A /* ContactDetailsView.m in Sources */, - 6135761F240E81D0005304D4 /* UIInterfaceStyleToggleButton.m in Sources */, - C63F7221285A24B10066163B /* AppManager.swift in Sources */, - D37C639B15AADEF6009D0BAC /* ContactDetailsTableView.m in Sources */, - 63E59A3F1ADE70D900646FB3 /* InAppProductsManager.m in Sources */, - D3C6526715AC1A8F0092A874 /* UIContactDetailsCell.m in Sources */, - D7421D9E29228A5200290CAB /* ChatConversationViewSwift.swift in Sources */, - C63F7227285A24B10066163B /* UILabelExtensions.swift in Sources */, - 631348301B6F7B6600C6BDCB /* UIRoundBorderedButton.m in Sources */, - C90FAA7915AF54E6002091CB /* HistoryDetailsView.m in Sources */, - C63F7253285A24B10066163B /* VoipCallContextMenu.swift in Sources */, - C63F725A285A24B10066163B /* OutgoingCallView.swift in Sources */, - 63FB30351A680E73008CA393 /* UIRoundedImageView.m in Sources */, - 635775251B6673EC00C8B704 /* HistoryDetailsTableView.m in Sources */, - D7CBC0FB2A8E3D1E009182D8 /* SpeakersListView.swift in Sources */, - C63F720E285A24B10066163B /* CallManager.swift in Sources */, - 63C441C31BBC23ED0053DC5E /* UIAssistantTextField.m in Sources */, - D35860D615B549B500513429 /* Utils.m in Sources */, - D3F7998115BD32370018C273 /* TPMultiLayoutViewController.m in Sources */, - C63F721A285A24B10066163B /* ConferenceSchedulingView.swift in Sources */, - C63F7232285A24B10066163B /* CallExtensions.swift in Sources */, - D3807FBF15C28940005BE9BC /* DCRoundSwitch.m in Sources */, - D3807FC115C28940005BE9BC /* DCRoundSwitchKnobLayer.m in Sources */, - 61CCC3DF21933B580060EDEA /* UIDeviceCell.m in Sources */, - D74A44912923BAF90017D063 /* BackActionsNavigationView.swift in Sources */, - C63F725D285A24B10066163B /* SharedLayoutConstants.swift in Sources */, - C63F7250285A24B10066163B /* CallStatsView.swift in Sources */, - 6306440E1BECB08500134C72 /* FirstLoginView.m in Sources */, - C63F721F285A24B10066163B /* BackNextNavigationView.swift in Sources */, - D71418E529C9E2CD002EEF75 /* CircularProgressBarView.swift in Sources */, - D3807FC315C28940005BE9BC /* DCRoundSwitchOutlineLayer.m in Sources */, - C63F723D285A24B10066163B /* TextStyle.swift in Sources */, - C6548823292D369500BF646B /* AbstractCallView.swift in Sources */, - C63F7229285A24B10066163B /* UIButtonExtensions.swift in Sources */, - C63F722B285A24B10066163B /* UIDeviceExtensions.swift in Sources */, - C63F724B285A24B10066163B /* VoipConferenceDisplayModeSelectionView.swift in Sources */, - C63D2F1529029536008F0F66 /* FileUtil.swift in Sources */, - CF7602E221086EB200749F76 /* RecordingsListTableView.m in Sources */, - C63F721E285A24B10066163B /* Pair.swift in Sources */, - D3807FC515C28940005BE9BC /* DCRoundSwitchToggleLayer.m in Sources */, - 633E41821D74259000320475 /* AssistantLinkView.m in Sources */, - C63F724A285A24B10066163B /* VoipConferenceActiveSpeakerView.swift in Sources */, - C63F7210285A24B10066163B /* ConferenceSchedulingViewModel.swift in Sources */, - D3807FE815C2894A005BE9BC /* IASKAppSettingsViewController.m in Sources */, - D3807FEC15C2894A005BE9BC /* IASKSpecifierValuesViewController.m in Sources */, - 8CA70AE41F9E39E400A3D2EB /* UIChatConversationInfoTableViewCell.m in Sources */, - D3807FEE15C2894A005BE9BC /* IASKSettingsReader.m in Sources */, - D3807FF015C2894A005BE9BC /* IASKSettingsStore.m in Sources */, - C63F7234285A24B10066163B /* ConferenceViewModel.swift in Sources */, - 8CA70AD11F9E0AE100A3D2EB /* ChatConversationInfoView.m in Sources */, - D7A7545029507038005C9D4A /* CustomAlertController.swift in Sources */, - D3807FF215C2894A005BE9BC /* IASKSettingsStoreFile.m in Sources */, - C63F720F285A24B10066163B /* ConferenceWaitingRoomViewModel.swift in Sources */, - C63F7248285A24B10066163B /* MicMuted.swift in Sources */, - C63F7243285A24B10066163B /* AudioRoutesView.swift in Sources */, - D3807FF415C2894A005BE9BC /* IASKSettingsStoreUserDefaults.m in Sources */, - D71418E329C9B4E0002EEF75 /* DownloadMessageCell.swift in Sources */, - C63F7240285A24B10066163B /* VoipTheme.swift in Sources */, - C63F7265285A24B10066163B /* VoipExtraButton.swift in Sources */, - 639E9C801C0DB13D00019A75 /* UICheckBoxTableView.m in Sources */, - CF7602E72108759A00749F76 /* UIRecordingCell.m in Sources */, - D3807FF615C2894A005BE9BC /* IASKSpecifier.m in Sources */, - D3807FF815C2894A005BE9BC /* IASKPSSliderSpecifierViewCell.m in Sources */, - C63F726A285A24B10066163B /* StyledDatePicker.swift in Sources */, - C63F7237285A24B10066163B /* CallStatisticsData.swift in Sources */, - D3807FFA15C2894A005BE9BC /* IASKPSTextFieldSpecifierViewCell.m in Sources */, - C63F721B285A24B10066163B /* ConferenceSchedulingSummaryView.swift in Sources */, - D779D39829A3C933007B8087 /* ChatConversationTableViewSwift.swift in Sources */, - D3807FFE15C2894A005BE9BC /* IASKSlider.m in Sources */, - D380800015C2894A005BE9BC /* IASKSwitch.m in Sources */, - 662553B427EDFB35007F67D8 /* MagicSearch.swift in Sources */, - C63F725F285A24B10066163B /* StyledValuePicker.swift in Sources */, - C63F7224285A24B10066163B /* UIVIewControllerExtensions.swift in Sources */, - D380800215C2894A005BE9BC /* IASKTextField.m in Sources */, - D380801315C299D0005BE9BC /* ColorSpaceUtilites.m in Sources */, - C63F721D285A24B10066163B /* MutableLiveData.swift in Sources */, - C63F7256285A24B10066163B /* DismissableView.swift in Sources */, - C63F724C285A24B10066163B /* ActiveCallView.swift in Sources */, - C63F7225285A24B10066163B /* UIImageExtensions.swift in Sources */, - C64A854E2667B67200252AD2 /* EphemeralSettingsView.m in Sources */, - D780FF7D2A459CE3001535E6 /* MediaViewer.swift in Sources */, - 8C92ABF31FA773E50006FB5D /* UIChatNotifiedEventCell.m in Sources */, - C63F726E285A24B10066163B /* VFSUtil.swift in Sources */, - 633FEF581D3CD5E00014B822 /* UIAvatarPresence.m in Sources */, - C63F7230285A24B10066163B /* ParticipantExtensions.swift in Sources */, - 637157A11B283FE200C91677 /* FileTransferDelegate.m in Sources */, - D378AB2A15DCDB4A0098505D /* ImagePickerView.m in Sources */, - 22405F001601C19200B92522 /* ImageView.m in Sources */, - C63F724D285A24B10066163B /* AbstractIncomingOutgoingCallView.swift in Sources */, - D37EE162160377D7003608A6 /* DTActionSheet.m in Sources */, - D306459E1611EC2A00BB571E /* UILoadingImageView.m in Sources */, - C63F7246285A24B10066163B /* VoipGridParticipantCell.swift in Sources */, - C63F7244285A24B10066163B /* VoipActiveSpeakerParticipantCell.swift in Sources */, - 6381DA7D1C1AD5EA00DF3BBD /* UIBouncingView.m in Sources */, - C63F7217285A24B10066163B /* ICSBubbleView.swift in Sources */, - C63F7222285A24B10066163B /* UIApplication+Extension.swift in Sources */, - C63F7249285A24B10066163B /* VoipConferenceGridView.swift in Sources */, - D37E3ECD1619C27A0087659A /* CAAnimation+Blocks.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 61AE364720C00B370089D9D3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 61AE364F20C00B370089D9D3 /* ShareViewController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6637AF89288593AF00965733 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 6643501C28D1CD3300AEA777 /* UIColorExtensions.swift in Sources */, - 662F570028C0AA0800E851BF /* UITestsCoreManager.swift in Sources */, - 6693A1D428D0FCE900489A39 /* ActiveCallViewUITestsMethods.swift in Sources */, - 66631CE828D37AA300115E36 /* ExtraMenuActiveCallActionsUITestsMethods.swift in Sources */, - 6637AF90288593AF00965733 /* IncomingCallUITests.swift in Sources */, - 66305A5B28B9105D00838792 /* UITestsScreenshots.swift in Sources */, - 662F570228C2506600E851BF /* OutgoingCallUITests.swift in Sources */, - 662F56FE28C00DF300E851BF /* UITestsUtils.swift in Sources */, - 66631CE728D37A2400115E36 /* ExtraMenuUITests.swift in Sources */, - 662F56FF28C0A9FE00E851BF /* IncomingOutgoingCallViewUITestsMethods.swift in Sources */, - 6693A1D328D0FCE400489A39 /* ActiveCallUITests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EA5F25D5232BD3E200475F2E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - C63F726F285A24E90066163B /* VFSUtil.swift in Sources */, - EA3650DB2330D2E30001148A /* NotificationService.swift in Sources */, - EAE6C88423FABF690076A018 /* Utils.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EA8CB823239F96CA00C330CC /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - C63F7270285A24E90066163B /* VFSUtil.swift in Sources */, - EA8CB82C239F96CA00C330CC /* NotificationViewController.swift in Sources */, - EAE6C88523FABF690076A018 /* Utils.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 61AE365520C00B370089D9D3 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 61AE364A20C00B370089D9D3 /* linphoneExtension */; - targetProxy = 61AE365420C00B370089D9D3 /* PBXContainerItemProxy */; - }; - 6637AF94288593AF00965733 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1D6058900D05DD3D006BFB54 /* linphone */; - targetProxy = 6637AF93288593AF00965733 /* PBXContainerItemProxy */; - }; - EA8CB83A239F9A3000C330CC /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = EA5F25D8232BD3E200475F2E /* msgNotificationService */; - targetProxy = EA88F393241BC1F400E66528 /* PBXContainerItemProxy */; - }; - EA8CB83C239F9A3000C330CC /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = EA8CB826239F96CA00C330CC /* msgNotificationContent */; - targetProxy = EA88F394241BC1F400E66528 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 570742561D5A0691004B9C84 /* ShopView.xib */ = { - isa = PBXVariantGroup; - children = ( - 570742571D5A0691004B9C84 /* Base */, - 61E8E46B23C5EA2E00434E71 /* fr */, - 6187B1DC24B3272500D580FB /* hu */, - ); - name = ShopView.xib; - sourceTree = ""; - }; - 617B4A62260A2B7800A87337 /* RecordingsListView.xib */ = { - isa = PBXVariantGroup; - children = ( - 617B4A61260A2B7800A87337 /* Base */, - 617B4A64260A2B8500A87337 /* fr */, - 617B4A75260A3F5500A87337 /* en */, - ); - name = RecordingsListView.xib; - sourceTree = ""; - }; - 61AE365020C00B370089D9D3 /* MainInterface.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 61AE365120C00B370089D9D3 /* Base */, - ); - name = MainInterface.storyboard; - sourceTree = ""; - }; - 631098501D4660630041F2B3 /* CountryListView.xib */ = { - isa = PBXVariantGroup; - children = ( - 631098511D4660630041F2B3 /* Base */, - 8CBD7BBE20B6B87400E5DCC0 /* fr */, - 6187B1C424B3271B00D580FB /* hu */, - ); - name = CountryListView.xib; - sourceTree = ""; - }; - 63130FB01C1ED06900371918 /* SideMenuView~ipad.xib */ = { - isa = PBXVariantGroup; - children = ( - 63130FB11C1ED06900371918 /* Base */, - 8CBD7BD820B6B88F00E5DCC0 /* fr */, - 6187B1DE24B3272600D580FB /* hu */, - ); - name = "SideMenuView~ipad.xib"; - sourceTree = ""; - }; - 636316D31A1DEBCB0009B839 /* AboutView.xib */ = { - isa = PBXVariantGroup; - children = ( - 636316D21A1DEBCB0009B839 /* Base */, - 61E8E46323C5E8EC00434E71 /* ar */, - 61E8E46523C5E8F000434E71 /* fr */, - 6187B1B524B3271500D580FB /* hu */, - ); - name = AboutView.xib; - sourceTree = ""; - }; - 636316D61A1DEC650009B839 /* SettingsView.xib */ = { - isa = PBXVariantGroup; - children = ( - 636316D51A1DEC650009B839 /* Base */, - F0AF070E1A24BA770086C9C1 /* ar */, - 8CBD7BD520B6B88C00E5DCC0 /* fr */, - 6187B1DB24B3272400D580FB /* hu */, - ); - name = SettingsView.xib; - sourceTree = ""; - }; - 638F1A601C2021B2004B8E02 /* DialerView~ipad.xib */ = { - isa = PBXVariantGroup; - children = ( - 638F1A611C2021B2004B8E02 /* Base */, - 8CBD7BC020B6B87500E5DCC0 /* fr */, - 6187B1C624B3271C00D580FB /* hu */, - ); - name = "DialerView~ipad.xib"; - sourceTree = ""; - }; - 638F1A8F1C21993D004B8E02 /* UICompositeView~ipad.xib */ = { - isa = PBXVariantGroup; - children = ( - 638F1A901C21993D004B8E02 /* Base */, - 8CBD7BCF20B6B88200E5DCC0 /* fr */, - 6187B1D524B3272200D580FB /* hu */, - ); - name = "UICompositeView~ipad.xib"; - sourceTree = ""; - }; - 639CEAFF1A1DF4D9004DE38F /* StatusBarView.xib */ = { - isa = PBXVariantGroup; - children = ( - 639CEAFE1A1DF4D9004DE38F /* Base */, - F0AF070C1A24BA770086C9C1 /* ar */, - 8CBD7BD920B6B89000E5DCC0 /* fr */, - 6187B1DF24B3272600D580FB /* hu */, - ); - name = StatusBarView.xib; - path = LinphoneUI; - sourceTree = ""; - }; - 639CEB021A1DF4E4004DE38F /* UIHistoryCell.xib */ = { - isa = PBXVariantGroup; - children = ( - 639CEB011A1DF4E4004DE38F /* Base */, - F0AF07091A24BA770086C9C1 /* ar */, - 8CBD7BD320B6B88900E5DCC0 /* fr */, - 6187B1D924B3272400D580FB /* hu */, - ); - name = UIHistoryCell.xib; - sourceTree = ""; - }; - 639CEB051A1DF4EB004DE38F /* UICompositeView.xib */ = { - isa = PBXVariantGroup; - children = ( - 639CEB041A1DF4EB004DE38F /* Base */, - F0AF07041A24BA770086C9C1 /* ar */, - 8CBD7BCE20B6B88100E5DCC0 /* fr */, - 6187B1D424B3272100D580FB /* hu */, - ); - name = UICompositeView.xib; - sourceTree = ""; - }; - 639CEB0B1A1DF4FA004DE38F /* UIChatCell.xib */ = { - isa = PBXVariantGroup; - children = ( - 639CEB0A1A1DF4FA004DE38F /* Base */, - F0AF07021A24BA770086C9C1 /* ar */, - 8CBD7BC920B6B87B00E5DCC0 /* fr */, - 6187B1CF24B3271F00D580FB /* hu */, - ); - name = UIChatCell.xib; - sourceTree = ""; - }; - 639E9C951C0DB7BE00019A75 /* FirstLoginView.xib */ = { - isa = PBXVariantGroup; - children = ( - 639E9C941C0DB7BE00019A75 /* Base */, - 8CBD7BC120B6B87600E5DCC0 /* fr */, - 6187B1C724B3271C00D580FB /* hu */, - ); - name = FirstLoginView.xib; - sourceTree = ""; - }; - 639E9CA21C0DB7E500019A75 /* UIChatBubblePhotoCell.xib */ = { - isa = PBXVariantGroup; - children = ( - 639E9CA11C0DB7E500019A75 /* Base */, - 8CBD7BC720B6B87A00E5DCC0 /* fr */, - 6187B1CD24B3271F00D580FB /* hu */, - ); - name = UIChatBubblePhotoCell.xib; - sourceTree = ""; - }; - 639E9CA51C0DB7EA00019A75 /* UIChatBubbleTextCell.xib */ = { - isa = PBXVariantGroup; - children = ( - 639E9CA41C0DB7EA00019A75 /* Base */, - 8CBD7BC820B6B87B00E5DCC0 /* fr */, - 6187B1CE24B3271F00D580FB /* hu */, - ); - name = UIChatBubbleTextCell.xib; - sourceTree = ""; - }; - 639E9CA81C0DB7F200019A75 /* UIChatCreateCell.xib */ = { - isa = PBXVariantGroup; - children = ( - 639E9CA71C0DB7F200019A75 /* Base */, - 8CBD7BCD20B6B88000E5DCC0 /* fr */, - 6187B1D224B3272100D580FB /* hu */, - ); - name = UIChatCreateCell.xib; - sourceTree = ""; - }; - 639E9CAB1C0DB7FB00019A75 /* UIConfirmationDialog.xib */ = { - isa = PBXVariantGroup; - children = ( - 639E9CAA1C0DB7FB00019A75 /* Base */, - 8CBD7BD020B6B88400E5DCC0 /* fr */, - 6187B1D624B3272200D580FB /* hu */, - ); - name = UIConfirmationDialog.xib; - sourceTree = ""; - }; - 639E9CAE1C0DB80300019A75 /* UIContactDetailsCell.xib */ = { - isa = PBXVariantGroup; - children = ( - 639E9CAD1C0DB80300019A75 /* Base */, - 8CBD7BD220B6B88700E5DCC0 /* fr */, - 6187B1D824B3272300D580FB /* hu */, - ); - name = UIContactDetailsCell.xib; - sourceTree = ""; - }; - 639E9CB21C0DB83000019A75 /* SideMenuView.xib */ = { - isa = PBXVariantGroup; - children = ( - 639E9CB11C0DB83000019A75 /* Base */, - 8CBD7BD720B6B88E00E5DCC0 /* fr */, - 6187B1DD24B3272500D580FB /* hu */, - ); - name = SideMenuView.xib; - sourceTree = ""; - }; - 639E9CB31C0DB88200019A75 /* PhoneMainView.xib */ = { - isa = PBXVariantGroup; - children = ( - 639E9CB41C0DB88200019A75 /* Base */, - 8CBD7BD420B6B88A00E5DCC0 /* fr */, - 6187B1DA24B3272400D580FB /* hu */, - ); - name = PhoneMainView.xib; - sourceTree = ""; - }; - 63AADBC41B6A0FF200AA16FD /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 63AADBC51B6A0FF200AA16FD /* ar */, - 63AADBC61B6A0FF200AA16FD /* de */, - 63AADBC71B6A0FF200AA16FD /* en */, - 63AADBCB1B6A0FF200AA16FD /* ja */, - 63AADBDD1B6A0FF200AA16FD /* nl */, - 63AADBE11B6A0FF200AA16FD /* ru */, - 666D795C283E67E300B07215 /* fr */, - 66EADAF62A939485002DDCEE /* pl */, - 66EADAF72A939485002DDCEE /* es */, - 66EADAF82A939486002DDCEE /* sv */, - 66EADAF92A939486002DDCEE /* pt_BR */, - 66EADAFA2A939486002DDCEE /* zh_TW */, - 66EADAFB2A939486002DDCEE /* it */, - 66EADAFC2A939486002DDCEE /* uk */, - 66EADAFD2A939486002DDCEE /* tr */, - 66EADAFE2A939487002DDCEE /* ka */, - 66EADAFF2A939487002DDCEE /* es_AR */, - 66EADB002A939487002DDCEE /* cs */, - 66EADB012A939487002DDCEE /* hu */, - 66EADB022A939487002DDCEE /* zh_CN */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 63B8D68E1BCBE65600C12B09 /* ChatConversationCreateView.xib */ = { - isa = PBXVariantGroup; - children = ( - 63B8D68D1BCBE65600C12B09 /* Base */, - 8CBD7BB920B6B87000E5DCC0 /* fr */, - 6187B1BD24B3271800D580FB /* hu */, - ); - name = ChatConversationCreateView.xib; - sourceTree = ""; - }; - 63EC8D3B1D7438660066547B /* AssistantLinkView.xib */ = { - isa = PBXVariantGroup; - children = ( - 63EC8D3A1D7438660066547B /* Base */, - 61E8E46723C5E9B400434E71 /* fr */, - 6187B1B624B3271500D580FB /* hu */, - ); - name = AssistantLinkView.xib; - sourceTree = ""; - }; - 8CBD7BA220B6B7FD00E5DCC0 /* ChatConversationInfoView.xib */ = { - isa = PBXVariantGroup; - children = ( - 8CBD7BA120B6B7FD00E5DCC0 /* Base */, - 8CBD7BB720B6B86E00E5DCC0 /* fr */, - 6187B1BF24B3271900D580FB /* hu */, - ); - name = ChatConversationInfoView.xib; - sourceTree = ""; - }; - 8CBD7BA520B6B80D00E5DCC0 /* ChatConversationImdnView.xib */ = { - isa = PBXVariantGroup; - children = ( - 8CBD7BA420B6B80D00E5DCC0 /* Base */, - 8CBD7BB820B6B86F00E5DCC0 /* fr */, - 6187B1BE24B3271900D580FB /* hu */, - ); - name = ChatConversationImdnView.xib; - sourceTree = ""; - }; - 8CBD7BA820B6B82400E5DCC0 /* UIChatConversationInfoTableViewCell.xib */ = { - isa = PBXVariantGroup; - children = ( - 8CBD7BA720B6B82400E5DCC0 /* Base */, - 8CBD7BCA20B6B87D00E5DCC0 /* fr */, - 6187B1D124B3272000D580FB /* hu */, - ); - name = UIChatConversationInfoTableViewCell.xib; - sourceTree = ""; - }; - 8CBD7BAB20B6B82A00E5DCC0 /* UIChatConversationImdnTableViewCell.xib */ = { - isa = PBXVariantGroup; - children = ( - 8CBD7BAA20B6B82A00E5DCC0 /* Base */, - 8CBD7BCB20B6B87E00E5DCC0 /* fr */, - 6187B1D024B3272000D580FB /* hu */, - ); - name = UIChatConversationImdnTableViewCell.xib; - sourceTree = ""; - }; - C66B03BD26E8EB1A009B5EDC /* UIChatReplyBubbleView.xib */ = { - isa = PBXVariantGroup; - children = ( - C66B03BC26E8EB1A009B5EDC /* Base */, - C66B03C126E8EB82009B5EDC /* en */, - C66B03C326E8EB87009B5EDC /* fr */, - ); - name = UIChatReplyBubbleView.xib; - sourceTree = ""; - }; - D37EE11016035793003608A6 /* ImageView.xib */ = { - isa = PBXVariantGroup; - children = ( - F09548221883F15400E8A69B /* Base */, - F09548441883F52900E8A69B /* ru */, - F0AF06FB1A24BA770086C9C1 /* ar */, - 8CBD7BC420B6B87800E5DCC0 /* fr */, - 6187B1CA24B3271E00D580FB /* hu */, - ); - name = ImageView.xib; - sourceTree = ""; - }; - D38187B015FE340100C3EDCA /* ChatConversationView.xib */ = { - isa = PBXVariantGroup; - children = ( - F09548181883F15300E8A69B /* Base */, - F09548321883F20A00E8A69B /* ru */, - F0AF06F11A24BA760086C9C1 /* ar */, - 8CBD7BBA20B6B87000E5DCC0 /* fr */, - 6187B1C024B3271A00D580FB /* hu */, - ); - name = ChatConversationView.xib; - sourceTree = ""; - }; - D38187B415FE340500C3EDCA /* ChatsListView.xib */ = { - isa = PBXVariantGroup; - children = ( - F09548191883F15300E8A69B /* Base */, - F09548341883F25F00E8A69B /* ru */, - F0AF06F21A24BA760086C9C1 /* ar */, - 8CBD7BBB20B6B87100E5DCC0 /* fr */, - 6187B1C124B3271A00D580FB /* hu */, - ); - name = ChatsListView.xib; - sourceTree = ""; - }; - D38187BC15FE342200C3EDCA /* ContactDetailsView.xib */ = { - isa = PBXVariantGroup; - children = ( - F095481B1883F15300E8A69B /* Base */, - F09548381883F29C00E8A69B /* ru */, - F0AF06F41A24BA760086C9C1 /* ar */, - 8CBD7BBC20B6B87200E5DCC0 /* fr */, - 6187B1C224B3271A00D580FB /* hu */, - ); - name = ContactDetailsView.xib; - sourceTree = ""; - }; - D38187C015FE342800C3EDCA /* ContactsListView.xib */ = { - isa = PBXVariantGroup; - children = ( - F095481C1883F15300E8A69B /* Base */, - F095483A1883F2CA00E8A69B /* ru */, - F0AF06F51A24BA760086C9C1 /* ar */, - 8CBD7BBD20B6B87300E5DCC0 /* fr */, - 6187B1C324B3271B00D580FB /* hu */, - ); - name = ContactsListView.xib; - sourceTree = ""; - }; - D38187C415FE345B00C3EDCA /* DialerView.xib */ = { - isa = PBXVariantGroup; - children = ( - F095481D1883F15300E8A69B /* Base */, - F095483C1883F2E300E8A69B /* ru */, - F0AF06F61A24BA760086C9C1 /* ar */, - 8CBD7BBF20B6B87400E5DCC0 /* fr */, - 6187B1C524B3271B00D580FB /* hu */, - ); - name = DialerView.xib; - sourceTree = ""; - }; - D38187D015FE346700C3EDCA /* HistoryDetailsView.xib */ = { - isa = PBXVariantGroup; - children = ( - F09548201883F15400E8A69B /* Base */, - 636316DB1A1DEDD80009B839 /* ru */, - F0AF06F91A24BA760086C9C1 /* ar */, - 8CBD7BC220B6B87600E5DCC0 /* fr */, - 6187B1C824B3271D00D580FB /* hu */, - ); - name = HistoryDetailsView.xib; - sourceTree = ""; - }; - D38187D415FE346B00C3EDCA /* HistoryListView.xib */ = { - isa = PBXVariantGroup; - children = ( - F09548211883F15400E8A69B /* Base */, - F09548421883F51B00E8A69B /* ru */, - F0AF06FA1A24BA770086C9C1 /* ar */, - 8CBD7BC320B6B87700E5DCC0 /* fr */, - 6187B1C924B3271D00D580FB /* hu */, - ); - name = HistoryListView.xib; - sourceTree = ""; - }; - D38187E015FE348A00C3EDCA /* AssistantView.xib */ = { - isa = PBXVariantGroup; - children = ( - F095482E1883F15500E8A69B /* Base */, - F095485A1883F67B00E8A69B /* ru */, - F0AF070F1A24BA770086C9C1 /* ar */, - 8CBD7BB120B6B86900E5DCC0 /* fr */, - 6187B1B724B3271600D580FB /* hu */, - ); - name = AssistantView.xib; - sourceTree = ""; - }; - D38187FB15FE355D00C3EDCA /* TabBarView.xib */ = { - isa = PBXVariantGroup; - children = ( - F095482C1883F15400E8A69B /* Base */, - F09548561883F61600E8A69B /* ru */, - F0AF070A1A24BA770086C9C1 /* ar */, - 8CBD7BDA20B6B89000E5DCC0 /* fr */, - 6187B1E024B3272700D580FB /* hu */, - ); - name = TabBarView.xib; - path = LinphoneUI; - sourceTree = ""; - }; - D3D5126A160B3A8E00946DF8 /* AssistantViewScreens.xib */ = { - isa = PBXVariantGroup; - children = ( - F09548301883F15500E8A69B /* Base */, - F095485E1883F6EA00E8A69B /* ru */, - F0AF07111A24BA770086C9C1 /* ar */, - 8CBD7BB220B6B86A00E5DCC0 /* fr */, - 6187B1B824B3271600D580FB /* hu */, - ); - name = AssistantViewScreens.xib; - sourceTree = ""; - }; - EA8CB82D239F96CA00C330CC /* MainInterface.storyboard */ = { - isa = PBXVariantGroup; - children = ( - EA8CB82E239F96CA00C330CC /* Base */, - ); - name = MainInterface.storyboard; - sourceTree = ""; - }; - F088488D19FF8C41007FFCF3 /* UIContactCell.xib */ = { - isa = PBXVariantGroup; - children = ( - F088488C19FF8C41007FFCF3 /* Base */, - F0AF07061A24BA770086C9C1 /* ar */, - 8CBD7BD120B6B88500E5DCC0 /* fr */, - 6187B1D724B3272300D580FB /* hu */, - ); - name = UIContactCell.xib; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 1D6058940D05DD3E006BFB54 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO; - CLANG_WARN_UNREACHABLE_CODE = NO; - CODE_SIGN_ENTITLEMENTS = linphone.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - COMPRESS_PNG_FILES = NO; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = linphone_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - "DEBUG=1", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; - GCC_TREAT_WARNINGS_AS_ERRORS = NO; - GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO; - HEADER_SEARCH_PATHS = ( - "$(SRCROOT)/Classes/Utils/XMLRPC/", - "$(SRCROOT)/Classes/Utils/NinePatch/", - "$(inherited)", - ); - IBC_MODULE = linphoneapp; - IBSC_MODULE = linphoneapp; - INFOPLIST_FILE = "linphone-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(BUILT_PRODUCTS_DIR)", - "$(inherited)", - ); - LINK_WITH_STANDARD_LIBRARIES = YES; - MARKETING_VERSION = 5.2.1; - OTHER_CFLAGS = ( - "-DBCTBX_LOG_DOMAIN=\\\"ios\\\"", - "-DCHECK_VERSION_UPDATE=FALSE", - "-DENABLE_QRCODE=TRUE", - "-DENABLE_SMS_INVITE=TRUE", - "$(inherited)", - "-DLINPHONE_SDK_VERSION=\\\"5.3.0-alpha.173+990473d73\\\"", - ); - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone; - PRODUCT_MODULE_NAME = "$(PRODUCT_NAME:c99extidentifier)app"; - PRODUCT_NAME = linphone; - PROVISIONING_PROFILE = ""; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = NO; - STRIP_SWIFT_SYMBOLS = NO; - SWIFT_OBJC_BRIDGING_HEADER = "Classes/linphone-Bridging-Header.h"; - SWIFT_OBJC_INTERFACE_HEADER_NAME = "linphoneapp-Swift.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - WARNING_CFLAGS = ( - "-Werror=objc-method-access", - "-Werror=incomplete-implementation", - "-Wno-error-deprecated", - ); - }; - name = Debug; - }; - 228B19A61302902F00F154D3 /* DistributionAdhoc */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LIBRARY = "compiler-default"; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = NO; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ""; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LIBRARY_SEARCH_PATHS = ""; - ONLY_ACTIVE_ARCH = NO; - OTHER_CFLAGS = "-DBCTBX_LOG_DOMAIN=\\\"ios\\\""; - OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)"; - PROVISIONING_PROFILE = ""; - "PROVISIONING_PROFILE[arch=*]" = ""; - SDKROOT = iphoneos; - STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; - TARGETED_DEVICE_FAMILY = "1,2"; - VALID_ARCHS = "arm64 armv7 i386 x86_64"; - }; - name = DistributionAdhoc; - }; - 228B19A71302902F00F154D3 /* DistributionAdhoc */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO; - CLANG_WARN_UNREACHABLE_CODE = NO; - CODE_SIGN_ENTITLEMENTS = linphone.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - COMPRESS_PNG_FILES = NO; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = s; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = linphone_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; - GCC_TREAT_WARNINGS_AS_ERRORS = NO; - GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO; - HEADER_SEARCH_PATHS = ( - "$(SRCROOT)/Classes/Utils/XMLRPC/", - "$(SRCROOT)/Classes/Utils/NinePatch/", - "$(inherited)", - ); - IBC_MODULE = linphoneapp; - IBSC_MODULE = linphoneapp; - INFOPLIST_FILE = "linphone-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(BUILT_PRODUCTS_DIR)", - "$(inherited)", - ); - LINK_WITH_STANDARD_LIBRARIES = YES; - MARKETING_VERSION = 5.2.1; - OTHER_CFLAGS = ( - "-DBCTBX_LOG_DOMAIN=\\\"ios\\\"", - "-DCHECK_VERSION_UPDATE=FALSE", - "-DENABLE_QRCODE=TRUE", - "-DENABLE_SMS_INVITE=TRUE", - "$(inherited)", - "-DLINPHONE_SDK_VERSION=\\\"5.3.0-alpha.173+990473d73\\\"", - ); - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone; - PRODUCT_MODULE_NAME = "$(PRODUCT_NAME:c99extidentifier)app"; - PRODUCT_NAME = linphone; - PROVISIONING_PROFILE = ""; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = NO; - STRIP_SWIFT_SYMBOLS = NO; - SWIFT_OBJC_BRIDGING_HEADER = "Classes/linphone-Bridging-Header.h"; - SWIFT_OBJC_INTERFACE_HEADER_NAME = "linphoneapp-Swift.h"; - SWIFT_VERSION = 5.0; - WARNING_CFLAGS = ( - "-Werror=objc-method-access", - "-Werror=incomplete-implementation", - "-Wno-error-deprecated", - ); - }; - name = DistributionAdhoc; - }; - 22F3D55513CC3C9100A0DA02 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LIBRARY = "compiler-default"; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = NO; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ""; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LIBRARY_SEARCH_PATHS = ""; - ONLY_ACTIVE_ARCH = NO; - OTHER_CFLAGS = "-DBCTBX_LOG_DOMAIN=\\\"ios\\\""; - OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)"; - PROVISIONING_PROFILE = ""; - SDKROOT = iphoneos; - STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; - SWIFT_COMPILATION_MODE = wholemodule; - TARGETED_DEVICE_FAMILY = "1,2"; - VALID_ARCHS = "arm64 armv7 i386 x86_64"; - }; - name = Release; - }; - 22F3D55613CC3C9100A0DA02 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO; - CLANG_WARN_UNREACHABLE_CODE = NO; - CODE_SIGN_ENTITLEMENTS = linphone.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - COMPRESS_PNG_FILES = NO; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = s; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = linphone_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; - GCC_TREAT_WARNINGS_AS_ERRORS = NO; - GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO; - HEADER_SEARCH_PATHS = ( - "$(SRCROOT)/Classes/Utils/XMLRPC/", - "$(SRCROOT)/Classes/Utils/NinePatch/", - "$(inherited)", - ); - IBC_MODULE = linphoneapp; - IBSC_MODULE = linphoneapp; - INFOPLIST_FILE = "linphone-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(BUILT_PRODUCTS_DIR)", - "$(inherited)", - ); - LINK_WITH_STANDARD_LIBRARIES = YES; - MARKETING_VERSION = 5.2.1; - OTHER_CFLAGS = ( - "-DBCTBX_LOG_DOMAIN=\\\"ios\\\"", - "-DCHECK_VERSION_UPDATE=FALSE", - "-DENABLE_QRCODE=TRUE", - "-DENABLE_SMS_INVITE=TRUE", - "$(inherited)", - "-DLINPHONE_SDK_VERSION=\\\"5.3.0-alpha.173+990473d73\\\"", - ); - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone; - PRODUCT_MODULE_NAME = "$(PRODUCT_NAME:c99extidentifier)app"; - PRODUCT_NAME = linphone; - PROVISIONING_PROFILE = ""; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = NO; - STRIP_SWIFT_SYMBOLS = NO; - SWIFT_OBJC_BRIDGING_HEADER = "Classes/linphone-Bridging-Header.h"; - SWIFT_OBJC_INTERFACE_HEADER_NAME = "linphoneapp-Swift.h"; - SWIFT_VERSION = 5.0; - WARNING_CFLAGS = ( - "-Werror=objc-method-access", - "-Werror=incomplete-implementation", - "-Wno-error-deprecated", - ); - }; - name = Release; - }; - 22F51EE7107FA53D00F98953 /* Distribution */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LIBRARY = "compiler-default"; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = NO; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ""; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LIBRARY_SEARCH_PATHS = ""; - ONLY_ACTIVE_ARCH = NO; - OTHER_CFLAGS = "-DBCTBX_LOG_DOMAIN=\\\"ios\\\""; - OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)"; - PROVISIONING_PROFILE = ""; - SDKROOT = iphoneos; - STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; - TARGETED_DEVICE_FAMILY = "1,2"; - VALID_ARCHS = "arm64 armv7 i386 x86_64"; - }; - name = Distribution; - }; - 22F51EE8107FA53D00F98953 /* Distribution */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO; - CLANG_WARN_UNREACHABLE_CODE = NO; - CODE_SIGN_ENTITLEMENTS = linphone.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - COMPRESS_PNG_FILES = NO; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = s; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = linphone_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; - GCC_TREAT_WARNINGS_AS_ERRORS = NO; - GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO; - HEADER_SEARCH_PATHS = ( - "$(SRCROOT)/Classes/Utils/XMLRPC/", - "$(SRCROOT)/Classes/Utils/NinePatch/", - "$(inherited)", - ); - IBC_MODULE = linphoneapp; - IBSC_MODULE = linphoneapp; - INFOPLIST_FILE = "linphone-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(BUILT_PRODUCTS_DIR)", - "$(inherited)", - ); - LINK_WITH_STANDARD_LIBRARIES = YES; - MARKETING_VERSION = 5.2.1; - OTHER_CFLAGS = ( - "-DBCTBX_LOG_DOMAIN=\\\"ios\\\"", - "-DCHECK_VERSION_UPDATE=FALSE", - "-DENABLE_QRCODE=TRUE", - "-DENABLE_SMS_INVITE=TRUE", - "$(inherited)", - "-DLINPHONE_SDK_VERSION=\\\"5.3.0-alpha.173+990473d73\\\"", - ); - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone; - PRODUCT_MODULE_NAME = "$(PRODUCT_NAME:c99extidentifier)app"; - PRODUCT_NAME = linphone; - PROVISIONING_PROFILE = ""; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = NO; - STRIP_SWIFT_SYMBOLS = NO; - SWIFT_OBJC_BRIDGING_HEADER = "Classes/linphone-Bridging-Header.h"; - SWIFT_OBJC_INTERFACE_HEADER_NAME = "linphoneapp-Swift.h"; - SWIFT_VERSION = 5.0; - WARNING_CFLAGS = ( - "-Werror=objc-method-access", - "-Werror=incomplete-implementation", - "-Wno-error-deprecated", - ); - }; - name = Distribution; - }; - 61AE365720C00B370089D9D3 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = linphoneExtension/linphoneExtension.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = linphoneExtension/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - MARKETING_VERSION = 5.2.0; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.linphoneExtension; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; - SKIP_INSTALL = YES; - STRIP_SWIFT_SYMBOLS = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 61AE365820C00B370089D9D3 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = linphoneExtension/linphoneExtension.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = linphoneExtension/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - MARKETING_VERSION = 5.2.0; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.linphoneExtension; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - STRIP_SWIFT_SYMBOLS = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 61AE365920C00B370089D9D3 /* Distribution */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = linphoneExtension/linphoneExtension.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = linphoneExtension/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - MARKETING_VERSION = 5.2.0; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.linphoneExtension; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - STRIP_SWIFT_SYMBOLS = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Distribution; - }; - 61AE365A20C00B370089D9D3 /* DistributionAdhoc */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = linphoneExtension/linphoneExtension.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = linphoneExtension/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - MARKETING_VERSION = 5.2.0; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.linphoneExtension; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; - SKIP_INSTALL = YES; - STRIP_SWIFT_SYMBOLS = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = DistributionAdhoc; - }; - 6637AF95288593AF00965733 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = Z2V957B3D6; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"${PODS_CONFIGURATION_BUILD_DIR}/linphone-sdk\"", - "\"${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/XCFrameworks\"", - "\"${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk\"", - "\"${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks\"", - "\"${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension\"", - "\"${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/basic-frameworks\"", - ); - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - "DEBUG=1", - ); - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "CallUITests-Info.plist"; - INFOPLIST_KEY_UIRequiredDeviceCapabilities = "wifi microphone"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; - MARKETING_VERSION = 1.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.IncommingCallUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - REEXPORTED_FRAMEWORK_NAMES = ""; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_OBJC_BRIDGING_HEADER = ""; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = linphone; - }; - name = Debug; - }; - 6637AF96288593AF00965733 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "CallUITests-Info.plist"; - INFOPLIST_KEY_UIRequiredDeviceCapabilities = "wifi microphone"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; - MARKETING_VERSION = 1.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.IncommingCallUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_OBJC_BRIDGING_HEADER = ""; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = linphone; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 6637AF97288593AF00965733 /* Distribution */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "CallUITests-Info.plist"; - INFOPLIST_KEY_UIRequiredDeviceCapabilities = "wifi microphone"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; - MARKETING_VERSION = 1.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.IncommingCallUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_OBJC_BRIDGING_HEADER = ""; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = linphone; - VALIDATE_PRODUCT = YES; - }; - name = Distribution; - }; - 6637AF98288593AF00965733 /* DistributionAdhoc */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "CallUITests-Info.plist"; - INFOPLIST_KEY_UIRequiredDeviceCapabilities = "wifi microphone"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; - MARKETING_VERSION = 1.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.IncommingCallUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_OBJC_BRIDGING_HEADER = ""; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = linphone; - VALIDATE_PRODUCT = YES; - }; - name = DistributionAdhoc; - }; - C01FCF4F08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LIBRARY = "compiler-default"; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = NO; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ""; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LIBRARY_SEARCH_PATHS = ""; - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = "-DBCTBX_LOG_DOMAIN=\\\"ios\\\""; - OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)"; - SDKROOT = iphoneos; - STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; - TARGETED_DEVICE_FAMILY = "1,2"; - VALID_ARCHS = "arm64 armv7 i386 x86_64"; - }; - name = Debug; - }; - EA5F25E2232BD3E300475F2E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = msgNotificationService/msgNotificationService.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - "DEBUG=1", - ); - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "$(SRCROOT)/msgNotificationService/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 5.2.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.msgNotificationService; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - EA5F25E3232BD3E300475F2E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = msgNotificationService/msgNotificationService.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "$(SRCROOT)/msgNotificationService/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 5.2.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.msgNotificationService; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - EA5F25E4232BD3E300475F2E /* Distribution */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = msgNotificationService/msgNotificationService.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "$(SRCROOT)/msgNotificationService/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 5.2.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.msgNotificationService; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Distribution; - }; - EA5F25E5232BD3E300475F2E /* DistributionAdhoc */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = msgNotificationService/msgNotificationService.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "$(SRCROOT)/msgNotificationService/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 5.2.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.msgNotificationService; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = DistributionAdhoc; - }; - EA8CB835239F96CA00C330CC /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = msgNotificationContent/msgNotificationContent.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - "DEBUG=1", - ); - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = msgNotificationContent/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 5.2.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.msgNotificationContent; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - EA8CB836239F96CA00C330CC /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = msgNotificationContent/msgNotificationContent.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = msgNotificationContent/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 5.2.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.msgNotificationContent; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - EA8CB837239F96CA00C330CC /* Distribution */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = msgNotificationContent/msgNotificationContent.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = msgNotificationContent/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 5.2.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.msgNotificationContent; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Distribution; - }; - EA8CB838239F96CA00C330CC /* DistributionAdhoc */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = msgNotificationContent/msgNotificationContent.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = msgNotificationContent/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 5.2.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.msgNotificationContent; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = DistributionAdhoc; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "linphone" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1D6058940D05DD3E006BFB54 /* Debug */, - 22F3D55613CC3C9100A0DA02 /* Release */, - 22F51EE8107FA53D00F98953 /* Distribution */, - 228B19A71302902F00F154D3 /* DistributionAdhoc */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; - 61AE366120C00B370089D9D3 /* Build configuration list for PBXNativeTarget "linphoneExtension" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 61AE365720C00B370089D9D3 /* Debug */, - 61AE365820C00B370089D9D3 /* Release */, - 61AE365920C00B370089D9D3 /* Distribution */, - 61AE365A20C00B370089D9D3 /* DistributionAdhoc */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; - 6637AF99288593AF00965733 /* Build configuration list for PBXNativeTarget "CallUITests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 6637AF95288593AF00965733 /* Debug */, - 6637AF96288593AF00965733 /* Release */, - 6637AF97288593AF00965733 /* Distribution */, - 6637AF98288593AF00965733 /* DistributionAdhoc */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; - C01FCF4E08A954540054247B /* Build configuration list for PBXProject "linphone" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF4F08A954540054247B /* Debug */, - 22F3D55513CC3C9100A0DA02 /* Release */, - 22F51EE7107FA53D00F98953 /* Distribution */, - 228B19A61302902F00F154D3 /* DistributionAdhoc */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; - EA5F25E1232BD3E300475F2E /* Build configuration list for PBXNativeTarget "msgNotificationService" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - EA5F25E2232BD3E300475F2E /* Debug */, - EA5F25E3232BD3E300475F2E /* Release */, - EA5F25E4232BD3E300475F2E /* Distribution */, - EA5F25E5232BD3E300475F2E /* DistributionAdhoc */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; - EA8CB834239F96CA00C330CC /* Build configuration list for PBXNativeTarget "msgNotificationContent" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - EA8CB835239F96CA00C330CC /* Debug */, - EA8CB836239F96CA00C330CC /* Release */, - EA8CB837239F96CA00C330CC /* Distribution */, - EA8CB838239F96CA00C330CC /* DistributionAdhoc */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; -/* End XCConfigurationList section */ - }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; -} diff --git a/linphone.xcodeproj/project.pbxproj.orig b/linphone.xcodeproj/project.pbxproj.orig deleted file mode 100644 index 053bb6c2a..000000000 --- a/linphone.xcodeproj/project.pbxproj.orig +++ /dev/null @@ -1,8000 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 152F22361B15E889008C0621 /* libxml2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 152F22351B15E889008C0621 /* libxml2.dylib */; }; - 1D3623260D0F684500981E51 /* LinphoneAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* LinphoneAppDelegate.m */; }; - 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 2214EB7A12F846B1002A5394 /* UICallButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 2214EB7912F846B1002A5394 /* UICallButton.m */; }; - 22276E8913C73DC000210156 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8813C73DC000210156 /* CoreMedia.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 22405EEE1600B4E400B92522 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22405EED1600B4E400B92522 /* AssetsLibrary.framework */; }; - 22405F001601C19200B92522 /* ImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 22405EFE1601C19100B92522 /* ImageView.m */; }; - 224567C2107B968500F10948 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 224567C1107B968500F10948 /* AVFoundation.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 2248E90E12F7E4CF00220D9C /* UIDigitButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 2248E90D12F7E4CF00220D9C /* UIDigitButton.m */; }; - 2264B6D211200342002C2C53 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2264B6D111200342002C2C53 /* SystemConfiguration.framework */; }; - 226EF06C15FA256B005865C7 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 226EF06B15FA256B005865C7 /* MobileCoreServices.framework */; }; - 2274401A106F31BD006EC466 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22744019106F31BD006EC466 /* CoreAudio.framework */; }; - 2274402F106F335E006EC466 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2274402E106F335E006EC466 /* AudioToolbox.framework */; }; - 228697C411AC29B800E9E0CA /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 228697C311AC29B800E9E0CA /* CFNetwork.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 22AA8B0113D83F6300B30535 /* UICamSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = 22AA8B0013D83F6300B30535 /* UICamSwitch.m */; }; - 22D1B68112A3E0BE001AE361 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 22D1B68012A3E0BE001AE361 /* libresolv.dylib */; }; - 22E0A822111C44E100B04932 /* AboutView.m in Sources */ = {isa = PBXBuildFile; fileRef = 22E0A81C111C44E100B04932 /* AboutView.m */; }; - 22F2508E107141E100AC9B3F /* DialerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 22F2508C107141E100AC9B3F /* DialerView.m */; }; - 244523AF1E8266CC0037A187 /* chat_delivered.png in Resources */ = {isa = PBXBuildFile; fileRef = 244523AC1E8266CC0037A187 /* chat_delivered.png */; }; - 244523B01E8266CC0037A187 /* chat_error.png in Resources */ = {isa = PBXBuildFile; fileRef = 244523AD1E8266CC0037A187 /* chat_error.png */; }; - 244523B11E8266CC0037A187 /* chat_read.png in Resources */ = {isa = PBXBuildFile; fileRef = 244523AE1E8266CC0037A187 /* chat_read.png */; }; - 244523BE1E8D3A6C0037A187 /* chat_unsecure.png in Resources */ = {isa = PBXBuildFile; fileRef = 244523BC1E8D3A6C0037A187 /* chat_unsecure.png */; }; - 249660951FD6A35F001D55AA /* Photos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 249660941FD6A359001D55AA /* Photos.framework */; }; - 24A3459E1D95797700881A5C /* UIShopTableCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 24A3459D1D95797700881A5C /* UIShopTableCell.xib */; }; - 24A345A61D95798A00881A5C /* UIShopTableCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 24A345A51D95798A00881A5C /* UIShopTableCell.m */; }; - 24BFAA9E209B0630004F47A7 /* dialer_background.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA8C209B062B004F47A7 /* dialer_background.png */; }; - 24BFAA9F209B0630004F47A7 /* linphone_user.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA93209B062C004F47A7 /* linphone_user.png */; }; - 24BFAAA0209B0630004F47A7 /* contacts_sip_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA94209B062C004F47A7 /* contacts_sip_default@2x.png */; }; - 24BFAAA1209B0630004F47A7 /* linphone_user@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA95209B062D004F47A7 /* linphone_user@2x.png */; }; - 24BFAAA2209B0630004F47A7 /* linphone_user~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA96209B062D004F47A7 /* linphone_user~ipad@2x.png */; }; - 24BFAAA3209B0630004F47A7 /* contacts_sip_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA97209B062E004F47A7 /* contacts_sip_selected.png */; }; - 24BFAAA4209B0630004F47A7 /* linphone_logo.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA98209B062E004F47A7 /* linphone_logo.png */; }; - 24BFAAA5209B0630004F47A7 /* contacts_sip_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA99209B062E004F47A7 /* contacts_sip_default.png */; }; - 24BFAAA6209B0630004F47A7 /* linphone_user~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA9A209B062F004F47A7 /* linphone_user~ipad.png */; }; - 24BFAAA7209B0630004F47A7 /* callkit_logo.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA9B209B062F004F47A7 /* callkit_logo.png */; }; - 24BFAAA8209B0630004F47A7 /* contacts_sip_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 24BFAA9C209B062F004F47A7 /* contacts_sip_selected@2x.png */; }; - 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 */; }; - 340751971506459A00B89C47 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 340751961506459A00B89C47 /* CoreTelephony.framework */; }; - 344ABDF114850AE9007420B6 /* libc++.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 344ABDEF14850AE9007420B6 /* libc++.1.dylib */; settings = {ATTRIBUTES = (Weak, ); }; }; - 36C8883CF9CD21240125CC74 /* Pods_msgNotificationService.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 943C756D8C523B63A9BA4022 /* Pods_msgNotificationService.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 */; }; - 6112A01C243B31A700DBD5F5 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 6112A01B243B31A600DBD5F5 /* GoogleService-Info.plist */; }; - 6112A01E243B5FD500DBD5F5 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 6112A01D243B5FD500DBD5F5 /* GoogleService-Info.plist */; }; - 6135761C240E81BB005304D4 /* UIInterfaceStyleButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 6135761B240E81BA005304D4 /* UIInterfaceStyleButton.m */; }; - 6135761F240E81D0005304D4 /* UIInterfaceStyleToggleButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 6135761E240E81D0005304D4 /* UIInterfaceStyleToggleButton.m */; }; - 614D09CE21E74D5400C43EDF /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 614D09CD21E74D5400C43EDF /* GoogleService-Info.plist */; }; - 61586B81217A16EE0038AC45 /* menu_about.png in Resources */ = {isa = PBXBuildFile; fileRef = 61586B7A217A16EE0038AC45 /* menu_about.png */; }; - 61586B83217A16FD0038AC45 /* menu_about@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 61586B82217A16FD0038AC45 /* menu_about@2x.png */; }; - 61586B85217A17070038AC45 /* menu_assistant.png in Resources */ = {isa = PBXBuildFile; fileRef = 61586B84217A17070038AC45 /* menu_assistant.png */; }; - 61586B87217A17160038AC45 /* menu_assistant@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 61586B86217A17150038AC45 /* menu_assistant@2x.png */; }; - 61586B89217A17220038AC45 /* menu_link_account.png in Resources */ = {isa = PBXBuildFile; fileRef = 61586B88217A17220038AC45 /* menu_link_account.png */; }; - 61586B8B217A17320038AC45 /* menu_link_account@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 61586B8A217A17320038AC45 /* menu_link_account@2x.png */; }; - 61586B8D217A173F0038AC45 /* menu_options.png in Resources */ = {isa = PBXBuildFile; fileRef = 61586B8C217A173F0038AC45 /* menu_options.png */; }; - 61586B8F217A174F0038AC45 /* menu_options@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 61586B8E217A174F0038AC45 /* menu_options@2x.png */; }; - 61586B91217A175D0038AC45 /* menu_recordings.png in Resources */ = {isa = PBXBuildFile; fileRef = 61586B90217A175C0038AC45 /* menu_recordings.png */; }; - 61586B93217A17700038AC45 /* menu_recordings@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 61586B92217A176F0038AC45 /* menu_recordings@2x.png */; }; - 615A280F217F1FD50060F920 /* chat_add_group.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A2808217F1FD40060F920 /* chat_add_group.png */; }; - 615A2811217F1FDE0060F920 /* chat_add_group@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A2810217F1FDE0060F920 /* chat_add_group@2x.png */; }; - 615A2813217F24D40060F920 /* security_1_indicator.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A2812217F24D40060F920 /* security_1_indicator.png */; }; - 615A2815217F24E00060F920 /* security_1_indicator@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A2814217F24E00060F920 /* security_1_indicator@2x.png */; }; - 615A2817217F280C0060F920 /* chat_list_indicator.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A2816217F280C0060F920 /* chat_list_indicator.png */; }; - 615A2819217F28160060F920 /* chat_list_indicator@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A2818217F28160060F920 /* chat_list_indicator@2x.png */; }; - 615A281B217F6F9C0060F920 /* security_2_indicator.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A281A217F6F9B0060F920 /* security_2_indicator.png */; }; - 615A281D217F6FA80060F920 /* security_2_indicator@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A281C217F6FA80060F920 /* security_2_indicator@2x.png */; }; - 615A281F217F6FB40060F920 /* security_alert_indicator.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A281E217F6FB30060F920 /* security_alert_indicator.png */; }; - 615A2821217F6FBF0060F920 /* security_alert_indicator@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A2820217F6FBF0060F920 /* security_alert_indicator@2x.png */; }; - 615A282421805B260060F920 /* security_toogle_icon_green.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A282321805B250060F920 /* security_toogle_icon_green.png */; }; - 615A282621805B320060F920 /* security_toogle_icon_green@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A282521805B320060F920 /* security_toogle_icon_green@2x.png */; }; - 615A282821805B400060F920 /* security_toogle_icon_grey.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A282721805B400060F920 /* security_toogle_icon_grey.png */; }; - 615A282A21805B4C0060F920 /* security_toogle_icon_grey@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A282921805B4C0060F920 /* security_toogle_icon_grey@2x.png */; }; - 615A2830218071E80060F920 /* security_toogle_background_green.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A282F218071E80060F920 /* security_toogle_background_green.png */; }; - 615A2832218071F30060F920 /* security_toogle_background_green@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A2831218071F30060F920 /* security_toogle_background_green@2x.png */; }; - 615A2834218071FF0060F920 /* security_toogle_background_grey.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A2833218071FF0060F920 /* security_toogle_background_grey.png */; }; - 615A28362180720D0060F920 /* security_toogle_background_grey@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A28352180720D0060F920 /* security_toogle_background_grey@2x.png */; }; - 615A283A2180788E0060F920 /* security_toogle_button.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A28392180788E0060F920 /* security_toogle_button.png */; }; - 615A283C2180789C0060F920 /* security_toogle_button@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A283B2180789C0060F920 /* security_toogle_button@2x.png */; }; - 615A283E2180A2560060F920 /* invite_linphone.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A283D2180A2550060F920 /* invite_linphone.png */; }; - 615A28402180A2620060F920 /* invite_linphone@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A283F2180A2620060F920 /* invite_linphone@2x.png */; }; - 615A28422180C0870060F920 /* recording.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A28412180C0820060F920 /* recording.png */; }; - 615A28442180C0900060F920 /* recording@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 615A28432180C08F0060F920 /* recording@2x.png */; }; - 617B4A60260A2B7800A87337 /* RecordingsListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 617B4A62260A2B7800A87337 /* RecordingsListView.xib */; }; - 617C242A263022690042FB4A /* UIChatContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = 617C2429263022690042FB4A /* UIChatContentView.m */; }; - 6180D6FE21EE41A800AD9CB6 /* QuickLook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6180D6FD21EE41A800AD9CB6 /* QuickLook.framework */; }; - 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, ); }; }; - 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 */; }; - 61AEBEC82191E48400F35E7F /* chevron_list_close@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 61AEBEC72191E48400F35E7F /* chevron_list_close@2x.png */; }; - 61AEBECA2191E49300F35E7F /* chevron_list_open.png in Resources */ = {isa = PBXBuildFile; fileRef = 61AEBEC92191E49200F35E7F /* chevron_list_open.png */; }; - 61AEBECC2191E4A300F35E7F /* chevron_list_open@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 61AEBECB2191E4A300F35E7F /* chevron_list_open@2x.png */; }; - 61CCC3DF21933B580060EDEA /* UIDeviceCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 61CCC3DE21933B580060EDEA /* UIDeviceCell.m */; }; - 61CCC3E121933B660060EDEA /* UIDeviceCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 61CCC3E021933B660060EDEA /* UIDeviceCell.xib */; }; - 61DD7E1F2372E88F001BDD01 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61DD7E1E2372E88F001BDD01 /* CoreLocation.framework */; }; - 61F1997520C6B1D5006B069A /* AVKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61F1996E20C6B1D5006B069A /* AVKit.framework */; }; - 6306440E1BECB08500134C72 /* FirstLoginView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6306440C1BECB08500134C72 /* FirstLoginView.m */; }; - 6308F9C51BF0DD6600D1234B /* XMLRPCHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 6308F9C41BF0DD6600D1234B /* XMLRPCHelper.m */; }; - 630CF5571AF7CE1500539F7A /* UITextField+DoneButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 630CF5561AF7CE1500539F7A /* UITextField+DoneButton.m */; }; - 631098491D4660580041F2B3 /* CountryListView.m in Sources */ = {isa = PBXBuildFile; fileRef = 631098481D4660580041F2B3 /* CountryListView.m */; }; - 631098521D4660630041F2B3 /* CountryListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 631098501D4660630041F2B3 /* CountryListView.xib */; }; - 63130FB21C1ED06900371918 /* SideMenuView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 63130FB01C1ED06900371918 /* SideMenuView~ipad.xib */; }; - 631348301B6F7B6600C6BDCB /* UIRoundBorderedButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 6313482F1B6F7B6600C6BDCB /* UIRoundBorderedButton.m */; }; - 63177FBF1C86E68C00ADE58D /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22276E8613C73D8A00210156 /* CoreVideo.framework */; }; - 6334DDFA1BBAC97C00631900 /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = D32B6E2E15A5C0AC0033019F /* libsqlite3.dylib */; settings = {ATTRIBUTES = (Required, ); }; }; - 633671611BCBAAD200BFCBDE /* ChatConversationCreateView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6336715F1BCBAAD200BFCBDE /* ChatConversationCreateView.m */; }; - 633756391B67BAF400E21BAD /* SideMenuTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 633756381B67BAF400E21BAD /* SideMenuTableView.m */; }; - 633756451B67D2B200E21BAD /* SideMenuView.m in Sources */ = {isa = PBXBuildFile; fileRef = 633756431B67D2B100E21BAD /* SideMenuView.m */; }; - 633888451BFB2C49001D5E7B /* HPGrowingTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 633888421BFB2C49001D5E7B /* HPGrowingTextView.m */; }; - 633888461BFB2C49001D5E7B /* HPTextViewInternal.m in Sources */ = {isa = PBXBuildFile; fileRef = 633888441BFB2C49001D5E7B /* HPTextViewInternal.m */; }; - 633E41821D74259000320475 /* AssistantLinkView.m in Sources */ = {isa = PBXBuildFile; fileRef = 633E41801D74258F00320475 /* AssistantLinkView.m */; }; - 633FED9C1D3CD5590014B822 /* add_field_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBE21D3CD5570014B822 /* add_field_default.png */; }; - 633FED9D1D3CD5590014B822 /* add_field_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBE31D3CD5570014B822 /* add_field_default@2x.png */; }; - 633FED9E1D3CD5590014B822 /* add_field_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBE41D3CD5570014B822 /* add_field_over.png */; }; - 633FED9F1D3CD5590014B822 /* add_field_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBE51D3CD5570014B822 /* add_field_over@2x.png */; }; - 633FEDA01D3CD5590014B822 /* avatar.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBE61D3CD5570014B822 /* avatar.png */; }; - 633FEDA11D3CD5590014B822 /* avatar@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBE71D3CD5570014B822 /* avatar@2x.png */; }; - 633FEDA21D3CD5590014B822 /* avatar~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBE81D3CD5570014B822 /* avatar~ipad.png */; }; - 633FEDA31D3CD5590014B822 /* avatar~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBE91D3CD5570014B822 /* avatar~ipad@2x.png */; }; - 633FEDA41D3CD5590014B822 /* back_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBEA1D3CD5570014B822 /* back_default.png */; }; - 633FEDA51D3CD5590014B822 /* back_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBEB1D3CD5570014B822 /* back_default@2x.png */; }; - 633FEDA61D3CD5590014B822 /* back_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBEC1D3CD5570014B822 /* back_disabled.png */; }; - 633FEDA71D3CD5590014B822 /* back_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBED1D3CD5570014B822 /* back_disabled@2x.png */; }; - 633FEDA81D3CD5590014B822 /* backspace_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBEE1D3CD5570014B822 /* backspace_default.png */; }; - 633FEDA91D3CD5590014B822 /* backspace_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBEF1D3CD5570014B822 /* backspace_default@2x.png */; }; - 633FEDAA1D3CD5590014B822 /* backspace_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBF01D3CD5570014B822 /* backspace_disabled.png */; }; - 633FEDAB1D3CD5590014B822 /* backspace_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBF11D3CD5570014B822 /* backspace_disabled@2x.png */; }; - 633FEDAC1D3CD5590014B822 /* backspace_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBF21D3CD5570014B822 /* backspace_over.png */; }; - 633FEDAD1D3CD5590014B822 /* backspace_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBF31D3CD5570014B822 /* backspace_over@2x.png */; }; - 633FEDAE1D3CD5590014B822 /* call_add_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBF41D3CD5570014B822 /* call_add_default.png */; }; - 633FEDAF1D3CD5590014B822 /* call_add_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBF51D3CD5570014B822 /* call_add_default@2x.png */; }; - 633FEDB01D3CD5590014B822 /* call_add_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBF61D3CD5570014B822 /* call_add_disabled.png */; }; - 633FEDB11D3CD5590014B822 /* call_add_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBF71D3CD5570014B822 /* call_add_disabled@2x.png */; }; - 633FEDB21D3CD5590014B822 /* call_alt_back_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBF81D3CD5570014B822 /* call_alt_back_default.png */; }; - 633FEDB31D3CD5590014B822 /* call_alt_back_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBF91D3CD5570014B822 /* call_alt_back_default@2x.png */; }; - 633FEDB41D3CD5590014B822 /* call_alt_back_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBFA1D3CD5570014B822 /* call_alt_back_disabled.png */; }; - 633FEDB51D3CD5590014B822 /* call_alt_back_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBFB1D3CD5570014B822 /* call_alt_back_disabled@2x.png */; }; - 633FEDB61D3CD5590014B822 /* call_alt_start_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBFC1D3CD5570014B822 /* call_alt_start_default.png */; }; - 633FEDB71D3CD5590014B822 /* call_alt_start_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBFD1D3CD5570014B822 /* call_alt_start_default@2x.png */; }; - 633FEDB81D3CD5590014B822 /* call_alt_start_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBFE1D3CD5570014B822 /* call_alt_start_disabled.png */; }; - 633FEDB91D3CD5590014B822 /* call_alt_start_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEBFF1D3CD5570014B822 /* call_alt_start_disabled@2x.png */; }; - 633FEDBA1D3CD5590014B822 /* call_audio_start_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC001D3CD5570014B822 /* call_audio_start_default.png */; }; - 633FEDBB1D3CD5590014B822 /* call_audio_start_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC011D3CD5570014B822 /* call_audio_start_default@2x.png */; }; - 633FEDBC1D3CD5590014B822 /* call_audio_start_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC021D3CD5570014B822 /* call_audio_start_disabled.png */; }; - 633FEDBD1D3CD5590014B822 /* call_audio_start_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC031D3CD5570014B822 /* call_audio_start_disabled@2x.png */; }; - 633FEDBE1D3CD5590014B822 /* call_back_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC041D3CD5570014B822 /* call_back_default.png */; }; - 633FEDBF1D3CD5590014B822 /* call_back_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC051D3CD5570014B822 /* call_back_default@2x.png */; }; - 633FEDC01D3CD5590014B822 /* call_back_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC061D3CD5570014B822 /* call_back_disabled.png */; }; - 633FEDC11D3CD5590014B822 /* call_back_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC071D3CD5570014B822 /* call_back_disabled@2x.png */; }; - 633FEDC21D3CD5590014B822 /* call_hangup_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC081D3CD5570014B822 /* call_hangup_default.png */; }; - 633FEDC31D3CD5590014B822 /* call_hangup_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC091D3CD5570014B822 /* call_hangup_default@2x.png */; }; - 633FEDC41D3CD5590014B822 /* call_hangup_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC0A1D3CD5570014B822 /* call_hangup_disabled.png */; }; - 633FEDC51D3CD5590014B822 /* call_hangup_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC0B1D3CD5570014B822 /* call_hangup_disabled@2x.png */; }; - 633FEDC61D3CD5590014B822 /* call_incoming.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC0C1D3CD5570014B822 /* call_incoming.png */; }; - 633FEDC71D3CD5590014B822 /* call_incoming@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC0D1D3CD5570014B822 /* call_incoming@2x.png */; }; - 633FEDC81D3CD5590014B822 /* call_missed.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC0E1D3CD5570014B822 /* call_missed.png */; }; - 633FEDC91D3CD5590014B822 /* call_missed@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC0F1D3CD5570014B822 /* call_missed@2x.png */; }; - 633FEDCA1D3CD5590014B822 /* call_outgoing.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC101D3CD5570014B822 /* call_outgoing.png */; }; - 633FEDCB1D3CD5590014B822 /* call_outgoing@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC111D3CD5570014B822 /* call_outgoing@2x.png */; }; - 633FEDCC1D3CD5590014B822 /* call_quality_indicator_0.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC121D3CD5570014B822 /* call_quality_indicator_0.png */; }; - 633FEDCD1D3CD5590014B822 /* call_quality_indicator_0@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC131D3CD5570014B822 /* call_quality_indicator_0@2x.png */; }; - 633FEDCE1D3CD5590014B822 /* call_quality_indicator_1.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC141D3CD5570014B822 /* call_quality_indicator_1.png */; }; - 633FEDCF1D3CD5590014B822 /* call_quality_indicator_1@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC151D3CD5570014B822 /* call_quality_indicator_1@2x.png */; }; - 633FEDD01D3CD5590014B822 /* call_quality_indicator_2.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC161D3CD5570014B822 /* call_quality_indicator_2.png */; }; - 633FEDD11D3CD5590014B822 /* call_quality_indicator_2@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC171D3CD5570014B822 /* call_quality_indicator_2@2x.png */; }; - 633FEDD21D3CD5590014B822 /* call_quality_indicator_3.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC181D3CD5570014B822 /* call_quality_indicator_3.png */; }; - 633FEDD31D3CD5590014B822 /* call_quality_indicator_3@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC191D3CD5570014B822 /* call_quality_indicator_3@2x.png */; }; - 633FEDD41D3CD5590014B822 /* call_quality_indicator_4.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC1A1D3CD5570014B822 /* call_quality_indicator_4.png */; }; - 633FEDD51D3CD5590014B822 /* call_quality_indicator_4@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC1B1D3CD5570014B822 /* call_quality_indicator_4@2x.png */; }; - 633FEDD61D3CD5590014B822 /* call_start_body_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC1C1D3CD5570014B822 /* call_start_body_default.png */; }; - 633FEDD71D3CD5590014B822 /* call_start_body_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC1D1D3CD5570014B822 /* call_start_body_default@2x.png */; }; - 633FEDD81D3CD5590014B822 /* call_start_body_default~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC1E1D3CD5570014B822 /* call_start_body_default~ipad.png */; }; - 633FEDD91D3CD5590014B822 /* call_start_body_default~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC1F1D3CD5570014B822 /* call_start_body_default~ipad@2x.png */; }; - 633FEDDA1D3CD5590014B822 /* call_start_body_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC201D3CD5570014B822 /* call_start_body_disabled.png */; }; - 633FEDDB1D3CD5590014B822 /* call_start_body_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC211D3CD5570014B822 /* call_start_body_disabled@2x.png */; }; - 633FEDDC1D3CD5590014B822 /* call_start_body_disabled~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC221D3CD5570014B822 /* call_start_body_disabled~ipad.png */; }; - 633FEDDD1D3CD5590014B822 /* call_start_body_disabled~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC231D3CD5570014B822 /* call_start_body_disabled~ipad@2x.png */; }; - 633FEDDE1D3CD5590014B822 /* call_start_body_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC241D3CD5570014B822 /* call_start_body_over.png */; }; - 633FEDDF1D3CD5590014B822 /* call_start_body_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC251D3CD5570014B822 /* call_start_body_over@2x.png */; }; - 633FEDE01D3CD5590014B822 /* call_start_body_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC261D3CD5570014B822 /* call_start_body_over~ipad.png */; }; - 633FEDE11D3CD5590014B822 /* call_start_body_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC271D3CD5570014B822 /* call_start_body_over~ipad@2x.png */; }; - 633FEDE21D3CD5590014B822 /* call_status_incoming.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC281D3CD5570014B822 /* call_status_incoming.png */; }; - 633FEDE31D3CD5590014B822 /* call_status_incoming@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC291D3CD5570014B822 /* call_status_incoming@2x.png */; }; - 633FEDE41D3CD5590014B822 /* call_status_incoming~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC2A1D3CD5570014B822 /* call_status_incoming~ipad.png */; }; - 633FEDE51D3CD5590014B822 /* call_status_incoming~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC2B1D3CD5570014B822 /* call_status_incoming~ipad@2x.png */; }; - 633FEDE61D3CD5590014B822 /* call_status_missed.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC2C1D3CD5570014B822 /* call_status_missed.png */; }; - 633FEDE71D3CD5590014B822 /* call_status_missed@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC2D1D3CD5570014B822 /* call_status_missed@2x.png */; }; - 633FEDE81D3CD5590014B822 /* call_status_missed~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC2E1D3CD5570014B822 /* call_status_missed~ipad.png */; }; - 633FEDE91D3CD5590014B822 /* call_status_missed~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC2F1D3CD5570014B822 /* call_status_missed~ipad@2x.png */; }; - 633FEDEA1D3CD5590014B822 /* call_status_outgoing.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC301D3CD5570014B822 /* call_status_outgoing.png */; }; - 633FEDEB1D3CD5590014B822 /* call_status_outgoing@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC311D3CD5570014B822 /* call_status_outgoing@2x.png */; }; - 633FEDEC1D3CD5590014B822 /* call_status_outgoing~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC321D3CD5570014B822 /* call_status_outgoing~ipad.png */; }; - 633FEDED1D3CD5590014B822 /* call_status_outgoing~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC331D3CD5570014B822 /* call_status_outgoing~ipad@2x.png */; }; - 633FEDEE1D3CD5590014B822 /* call_transfer_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC341D3CD5570014B822 /* call_transfer_default.png */; }; - 633FEDEF1D3CD5590014B822 /* call_transfer_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC351D3CD5570014B822 /* call_transfer_default@2x.png */; }; - 633FEDF01D3CD5590014B822 /* call_transfer_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC361D3CD5570014B822 /* call_transfer_disabled.png */; }; - 633FEDF11D3CD5590014B822 /* call_transfer_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC371D3CD5570014B822 /* call_transfer_disabled@2x.png */; }; - 633FEDF21D3CD5590014B822 /* call_video_start_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC381D3CD5570014B822 /* call_video_start_default.png */; }; - 633FEDF31D3CD5590014B822 /* call_video_start_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC391D3CD5570014B822 /* call_video_start_default@2x.png */; }; - 633FEDF41D3CD5590014B822 /* call_video_start_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC3A1D3CD5570014B822 /* call_video_start_disabled.png */; }; - 633FEDF51D3CD5590014B822 /* call_video_start_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC3B1D3CD5570014B822 /* call_video_start_disabled@2x.png */; }; - 633FEDF61D3CD5590014B822 /* camera_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC3C1D3CD5570014B822 /* camera_default.png */; }; - 633FEDF71D3CD5590014B822 /* camera_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC3D1D3CD5570014B822 /* camera_default@2x.png */; }; - 633FEDF81D3CD5590014B822 /* camera_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC3E1D3CD5570014B822 /* camera_disabled.png */; }; - 633FEDF91D3CD5590014B822 /* camera_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC3F1D3CD5570014B822 /* camera_disabled@2x.png */; }; - 633FEDFA1D3CD5590014B822 /* camera_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC401D3CD5570014B822 /* camera_selected.png */; }; - 633FEDFB1D3CD5590014B822 /* camera_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC411D3CD5570014B822 /* camera_selected@2x.png */; }; - 633FEDFC1D3CD5590014B822 /* camera_switch_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC421D3CD5570014B822 /* camera_switch_default.png */; }; - 633FEDFD1D3CD5590014B822 /* camera_switch_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC431D3CD5570014B822 /* camera_switch_default@2x.png */; }; - 633FEDFE1D3CD5590014B822 /* camera_switch_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC441D3CD5570014B822 /* camera_switch_disabled.png */; }; - 633FEDFF1D3CD5590014B822 /* camera_switch_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC451D3CD5570014B822 /* camera_switch_disabled@2x.png */; }; - 633FEE001D3CD5590014B822 /* camera_switch_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC461D3CD5570014B822 /* camera_switch_over.png */; }; - 633FEE011D3CD5590014B822 /* camera_switch_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC471D3CD5570014B822 /* camera_switch_over@2x.png */; }; - 633FEE021D3CD5590014B822 /* cancel_edit_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC481D3CD5570014B822 /* cancel_edit_default.png */; }; - 633FEE031D3CD5590014B822 /* cancel_edit_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC491D3CD5570014B822 /* cancel_edit_default@2x.png */; }; - 633FEE041D3CD5590014B822 /* cancel_edit_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC4A1D3CD5570014B822 /* cancel_edit_disabled.png */; }; - 633FEE051D3CD5590014B822 /* cancel_edit_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC4B1D3CD5570014B822 /* cancel_edit_disabled@2x.png */; }; - 633FEE061D3CD5590014B822 /* chat_add_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC4C1D3CD5570014B822 /* chat_add_default.png */; }; - 633FEE071D3CD5590014B822 /* chat_add_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC4D1D3CD5570014B822 /* chat_add_default@2x.png */; }; - 633FEE081D3CD5590014B822 /* chat_add_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC4E1D3CD5570014B822 /* chat_add_disabled.png */; }; - 633FEE091D3CD5590014B822 /* chat_add_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC4F1D3CD5570014B822 /* chat_add_disabled@2x.png */; }; - 633FEE0A1D3CD5590014B822 /* chat_attachment_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC501D3CD5570014B822 /* chat_attachment_default.png */; }; - 633FEE0B1D3CD5590014B822 /* chat_attachment_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC511D3CD5570014B822 /* chat_attachment_default@2x.png */; }; - 633FEE0C1D3CD5590014B822 /* chat_attachment_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC521D3CD5570014B822 /* chat_attachment_disabled.png */; }; - 633FEE0D1D3CD5590014B822 /* chat_attachment_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC531D3CD5570014B822 /* chat_attachment_disabled@2x.png */; }; - 633FEE0E1D3CD5590014B822 /* chat_attachment_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC541D3CD5570014B822 /* chat_attachment_over.png */; }; - 633FEE0F1D3CD5590014B822 /* chat_attachment_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC551D3CD5570014B822 /* chat_attachment_over@2x.png */; }; - 633FEE101D3CD5590014B822 /* chat_list_indicator~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC561D3CD5570014B822 /* chat_list_indicator~ipad.png */; }; - 633FEE111D3CD5590014B822 /* chat_list_indicator~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC571D3CD5570014B822 /* chat_list_indicator~ipad@2x.png */; }; - 633FEE121D3CD5590014B822 /* chat_message_not_delivered.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC581D3CD5570014B822 /* chat_message_not_delivered.png */; }; - 633FEE131D3CD5590014B822 /* chat_message_not_delivered@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC591D3CD5570014B822 /* chat_message_not_delivered@2x.png */; }; - 633FEE141D3CD5590014B822 /* chat_send_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC5A1D3CD5570014B822 /* chat_send_default.png */; }; - 633FEE151D3CD5590014B822 /* chat_send_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC5B1D3CD5570014B822 /* chat_send_default@2x.png */; }; - 633FEE161D3CD5590014B822 /* chat_send_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC5C1D3CD5570014B822 /* chat_send_disabled.png */; }; - 633FEE171D3CD5590014B822 /* chat_send_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC5D1D3CD5570014B822 /* chat_send_disabled@2x.png */; }; - 633FEE181D3CD5590014B822 /* chat_send_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC5E1D3CD5570014B822 /* chat_send_over.png */; }; - 633FEE191D3CD5590014B822 /* chat_send_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC5F1D3CD5570014B822 /* chat_send_over@2x.png */; }; - 633FEE1A1D3CD5590014B822 /* chat_start_body_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC601D3CD5570014B822 /* chat_start_body_default.png */; }; - 633FEE1B1D3CD5590014B822 /* chat_start_body_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC611D3CD5570014B822 /* chat_start_body_default@2x.png */; }; - 633FEE1C1D3CD5590014B822 /* chat_start_body_default~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC621D3CD5570014B822 /* chat_start_body_default~ipad.png */; }; - 633FEE1D1D3CD5590014B822 /* chat_start_body_default~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC631D3CD5570014B822 /* chat_start_body_default~ipad@2x.png */; }; - 633FEE1E1D3CD5590014B822 /* chat_start_body_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC641D3CD5570014B822 /* chat_start_body_disabled.png */; }; - 633FEE1F1D3CD5590014B822 /* chat_start_body_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC651D3CD5570014B822 /* chat_start_body_disabled@2x.png */; }; - 633FEE201D3CD5590014B822 /* chat_start_body_disabled~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC661D3CD5570014B822 /* chat_start_body_disabled~ipad.png */; }; - 633FEE211D3CD5590014B822 /* chat_start_body_disabled~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC671D3CD5570014B822 /* chat_start_body_disabled~ipad@2x.png */; }; - 633FEE221D3CD5590014B822 /* chat_start_body_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC681D3CD5570014B822 /* chat_start_body_over.png */; }; - 633FEE231D3CD5590014B822 /* chat_start_body_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC691D3CD5570014B822 /* chat_start_body_over@2x.png */; }; - 633FEE241D3CD5590014B822 /* chat_start_body_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC6A1D3CD5570014B822 /* chat_start_body_over~ipad.png */; }; - 633FEE251D3CD5590014B822 /* chat_start_body_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC6B1D3CD5570014B822 /* chat_start_body_over~ipad@2x.png */; }; - 633FEE261D3CD5590014B822 /* checkbox_checked.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC6C1D3CD5570014B822 /* checkbox_checked.png */; }; - 633FEE271D3CD5590014B822 /* checkbox_checked@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC6D1D3CD5570014B822 /* checkbox_checked@2x.png */; }; - 633FEE281D3CD5590014B822 /* checkbox_unchecked.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC6E1D3CD5570014B822 /* checkbox_unchecked.png */; }; - 633FEE291D3CD5590014B822 /* checkbox_unchecked@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC6F1D3CD5570014B822 /* checkbox_unchecked@2x.png */; }; - 633FEE2A1D3CD5590014B822 /* color_A.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC701D3CD5570014B822 /* color_A.png */; }; - 633FEE2B1D3CD5590014B822 /* color_C.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC711D3CD5570014B822 /* color_C.png */; }; - 633FEE2C1D3CD5590014B822 /* color_D.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC721D3CD5570014B822 /* color_D.png */; }; - 633FEE2D1D3CD5590014B822 /* color_E.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC731D3CD5570014B822 /* color_E.png */; }; - 633FEE2E1D3CD5590014B822 /* color_F.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC741D3CD5570014B822 /* color_F.png */; }; - 633FEE2F1D3CD5590014B822 /* color_G.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC751D3CD5570014B822 /* color_G.png */; }; - 633FEE301D3CD5590014B822 /* color_H.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC761D3CD5570014B822 /* color_H.png */; }; - 633FEE311D3CD5590014B822 /* color_I.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC771D3CD5570014B822 /* color_I.png */; }; - 633FEE321D3CD5590014B822 /* color_L.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC781D3CD5570014B822 /* color_L.png */; }; - 633FEE331D3CD5590014B822 /* color_M.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC791D3CD5570014B822 /* color_M.png */; }; - 633FEE341D3CD5590014B822 /* conference_exit_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC7A1D3CD5570014B822 /* conference_exit_default.png */; }; - 633FEE351D3CD5590014B822 /* conference_exit_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC7B1D3CD5570014B822 /* conference_exit_default@2x.png */; }; - 633FEE361D3CD5590014B822 /* conference_exit_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC7C1D3CD5570014B822 /* conference_exit_over.png */; }; - 633FEE371D3CD5590014B822 /* conference_exit_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC7D1D3CD5570014B822 /* conference_exit_over@2x.png */; }; - 633FEE381D3CD5590014B822 /* contact_add_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC7E1D3CD5570014B822 /* contact_add_default.png */; }; - 633FEE391D3CD5590014B822 /* contact_add_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC7F1D3CD5570014B822 /* contact_add_default@2x.png */; }; - 633FEE3A1D3CD5590014B822 /* contact_add_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC801D3CD5570014B822 /* contact_add_disabled.png */; }; - 633FEE3B1D3CD5590014B822 /* contact_add_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC811D3CD5570014B822 /* contact_add_disabled@2x.png */; }; - 633FEE3C1D3CD5590014B822 /* contacts_all_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC821D3CD5570014B822 /* contacts_all_default.png */; }; - 633FEE3D1D3CD5590014B822 /* contacts_all_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC831D3CD5570014B822 /* contacts_all_default@2x.png */; }; - 633FEE3E1D3CD5590014B822 /* contacts_all_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC841D3CD5570014B822 /* contacts_all_disabled.png */; }; - 633FEE3F1D3CD5590014B822 /* contacts_all_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC851D3CD5570014B822 /* contacts_all_disabled@2x.png */; }; - 633FEE401D3CD5590014B822 /* contacts_all_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC861D3CD5570014B822 /* contacts_all_selected.png */; }; - 633FEE411D3CD5590014B822 /* contacts_all_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC871D3CD5570014B822 /* contacts_all_selected@2x.png */; }; - 633FEE481D3CD5590014B822 /* delete_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC8E1D3CD5570014B822 /* delete_default.png */; }; - 633FEE491D3CD5590014B822 /* delete_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC8F1D3CD5570014B822 /* delete_default@2x.png */; }; - 633FEE4A1D3CD5590014B822 /* delete_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC901D3CD5570014B822 /* delete_disabled.png */; }; - 633FEE4B1D3CD5590014B822 /* delete_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC911D3CD5570014B822 /* delete_disabled@2x.png */; }; - 633FEE4C1D3CD5590014B822 /* delete_field_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC921D3CD5570014B822 /* delete_field_default.png */; }; - 633FEE4D1D3CD5590014B822 /* delete_field_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC931D3CD5570014B822 /* delete_field_default@2x.png */; }; - 633FEE4E1D3CD5590014B822 /* delete_field_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC941D3CD5570014B822 /* delete_field_over.png */; }; - 633FEE4F1D3CD5590014B822 /* delete_field_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC951D3CD5570014B822 /* delete_field_over@2x.png */; }; - 633FEE501D3CD5590014B822 /* deselect_all.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC961D3CD5570014B822 /* deselect_all.png */; }; - 633FEE511D3CD5590014B822 /* deselect_all@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC971D3CD5570014B822 /* deselect_all@2x.png */; }; - 633FEE521D3CD5590014B822 /* dialer_alt_back.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC981D3CD5570014B822 /* dialer_alt_back.png */; }; - 633FEE531D3CD5590014B822 /* dialer_alt_back@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC991D3CD5570014B822 /* dialer_alt_back@2x.png */; }; - 633FEE541D3CD5590014B822 /* dialer_back_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC9A1D3CD5570014B822 /* dialer_back_default.png */; }; - 633FEE551D3CD5590014B822 /* dialer_back_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC9B1D3CD5570014B822 /* dialer_back_default@2x.png */; }; - 633FEE561D3CD5590014B822 /* dialer_back_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC9C1D3CD5570014B822 /* dialer_back_disabled.png */; }; - 633FEE571D3CD5590014B822 /* dialer_back_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FEC9D1D3CD5570014B822 /* dialer_back_disabled@2x.png */; }; - 633FEE5A1D3CD5590014B822 /* edit_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECA01D3CD5570014B822 /* edit_default.png */; }; - 633FEE5B1D3CD5590014B822 /* edit_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECA11D3CD5570014B822 /* edit_default@2x.png */; }; - 633FEE5C1D3CD5590014B822 /* edit_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECA21D3CD5570014B822 /* edit_disabled.png */; }; - 633FEE5D1D3CD5590014B822 /* edit_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECA31D3CD5570014B822 /* edit_disabled@2x.png */; }; - 633FEE5E1D3CD5590014B822 /* edit_list_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECA41D3CD5570014B822 /* edit_list_default.png */; }; - 633FEE5F1D3CD5590014B822 /* edit_list_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECA51D3CD5570014B822 /* edit_list_default@2x.png */; }; - 633FEE601D3CD5590014B822 /* edit_list_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECA61D3CD5570014B822 /* edit_list_disabled.png */; }; - 633FEE611D3CD5590014B822 /* edit_list_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECA71D3CD5570014B822 /* edit_list_disabled@2x.png */; }; - 633FEE621D3CD5590014B822 /* footer_chat_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECA81D3CD5570014B822 /* footer_chat_default.png */; }; - 633FEE631D3CD5590014B822 /* footer_chat_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECA91D3CD5570014B822 /* footer_chat_default@2x.png */; }; - 633FEE641D3CD5590014B822 /* footer_chat_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECAA1D3CD5570014B822 /* footer_chat_disabled.png */; }; - 633FEE651D3CD5590014B822 /* footer_chat_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECAB1D3CD5570014B822 /* footer_chat_disabled@2x.png */; }; - 633FEE661D3CD5590014B822 /* footer_contacts_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECAC1D3CD5570014B822 /* footer_contacts_default.png */; }; - 633FEE671D3CD5590014B822 /* footer_contacts_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECAD1D3CD5570014B822 /* footer_contacts_default@2x.png */; }; - 633FEE681D3CD5590014B822 /* footer_contacts_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECAE1D3CD5570014B822 /* footer_contacts_disabled.png */; }; - 633FEE691D3CD5590014B822 /* footer_contacts_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECAF1D3CD5570014B822 /* footer_contacts_disabled@2x.png */; }; - 633FEE6A1D3CD5590014B822 /* footer_dialer_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECB01D3CD5570014B822 /* footer_dialer_default.png */; }; - 633FEE6B1D3CD5590014B822 /* footer_dialer_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECB11D3CD5570014B822 /* footer_dialer_default@2x.png */; }; - 633FEE6C1D3CD5590014B822 /* footer_dialer_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECB21D3CD5570014B822 /* footer_dialer_disabled.png */; }; - 633FEE6D1D3CD5590014B822 /* footer_dialer_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECB31D3CD5570014B822 /* footer_dialer_disabled@2x.png */; }; - 633FEE6E1D3CD5590014B822 /* footer_history_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECB41D3CD5570014B822 /* footer_history_default.png */; }; - 633FEE6F1D3CD5590014B822 /* footer_history_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECB51D3CD5570014B822 /* footer_history_default@2x.png */; }; - 633FEE701D3CD5590014B822 /* footer_history_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECB61D3CD5570014B822 /* footer_history_disabled.png */; }; - 633FEE711D3CD5590014B822 /* footer_history_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECB71D3CD5570014B822 /* footer_history_disabled@2x.png */; }; - 633FEE721D3CD5590014B822 /* history_all_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECB81D3CD5570014B822 /* history_all_default.png */; }; - 633FEE731D3CD5590014B822 /* history_all_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECB91D3CD5570014B822 /* history_all_default@2x.png */; }; - 633FEE741D3CD5590014B822 /* history_all_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECBA1D3CD5570014B822 /* history_all_disabled.png */; }; - 633FEE751D3CD5590014B822 /* history_all_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECBB1D3CD5570014B822 /* history_all_disabled@2x.png */; }; - 633FEE761D3CD5590014B822 /* history_all_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECBC1D3CD5570014B822 /* history_all_selected.png */; }; - 633FEE771D3CD5590014B822 /* history_all_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECBD1D3CD5570014B822 /* history_all_selected@2x.png */; }; - 633FEE781D3CD5590014B822 /* history_chat_indicator.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECBE1D3CD5570014B822 /* history_chat_indicator.png */; }; - 633FEE791D3CD5590014B822 /* history_chat_indicator@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECBF1D3CD5570014B822 /* history_chat_indicator@2x.png */; }; - 633FEE7A1D3CD5590014B822 /* history_missed_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECC01D3CD5570014B822 /* history_missed_default.png */; }; - 633FEE7B1D3CD5590014B822 /* history_missed_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECC11D3CD5570014B822 /* history_missed_default@2x.png */; }; - 633FEE7C1D3CD5590014B822 /* history_missed_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECC21D3CD5570014B822 /* history_missed_disabled.png */; }; - 633FEE7D1D3CD5590014B822 /* history_missed_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECC31D3CD5570014B822 /* history_missed_disabled@2x.png */; }; - 633FEE7E1D3CD5590014B822 /* history_missed_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECC41D3CD5570014B822 /* history_missed_selected.png */; }; - 633FEE7F1D3CD5590014B822 /* history_missed_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECC51D3CD5570014B822 /* history_missed_selected@2x.png */; }; - 633FEE801D3CD5590014B822 /* led_connected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECC61D3CD5570014B822 /* led_connected.png */; }; - 633FEE811D3CD5590014B822 /* led_connected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECC71D3CD5570014B822 /* led_connected@2x.png */; }; - 633FEE821D3CD5590014B822 /* led_disconnected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECC81D3CD5570014B822 /* led_disconnected.png */; }; - 633FEE831D3CD5590014B822 /* led_disconnected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECC91D3CD5570014B822 /* led_disconnected@2x.png */; }; - 633FEE841D3CD5590014B822 /* led_error.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECCA1D3CD5570014B822 /* led_error.png */; }; - 633FEE851D3CD5590014B822 /* led_error@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECCB1D3CD5570014B822 /* led_error@2x.png */; }; - 633FEE861D3CD5590014B822 /* led_inprogress.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECCC1D3CD5570014B822 /* led_inprogress.png */; }; - 633FEE871D3CD5590014B822 /* led_inprogress@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECCD1D3CD5570014B822 /* led_inprogress@2x.png */; }; - 633FEE8E1D3CD55A0014B822 /* list_details_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECD41D3CD5580014B822 /* list_details_default.png */; }; - 633FEE8F1D3CD55A0014B822 /* list_details_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECD51D3CD5580014B822 /* list_details_default@2x.png */; }; - 633FEE901D3CD55A0014B822 /* list_details_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECD61D3CD5580014B822 /* list_details_over.png */; }; - 633FEE911D3CD55A0014B822 /* list_details_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECD71D3CD5580014B822 /* list_details_over@2x.png */; }; - 633FEE921D3CD55A0014B822 /* menu.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECD81D3CD5580014B822 /* menu.png */; }; - 633FEE931D3CD55A0014B822 /* menu@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECD91D3CD5580014B822 /* menu@2x.png */; }; - 633FEE941D3CD55A0014B822 /* micro_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECDA1D3CD5580014B822 /* micro_default.png */; }; - 633FEE951D3CD55A0014B822 /* micro_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECDB1D3CD5580014B822 /* micro_default@2x.png */; }; - 633FEE961D3CD55A0014B822 /* micro_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECDC1D3CD5580014B822 /* micro_disabled.png */; }; - 633FEE971D3CD55A0014B822 /* micro_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECDD1D3CD5580014B822 /* micro_disabled@2x.png */; }; - 633FEE981D3CD55A0014B822 /* micro_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECDE1D3CD5580014B822 /* micro_selected.png */; }; - 633FEE991D3CD55A0014B822 /* micro_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECDF1D3CD5580014B822 /* micro_selected@2x.png */; }; - 633FEE9A1D3CD55A0014B822 /* nowebcamCIF.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 633FECE01D3CD5580014B822 /* nowebcamCIF.jpg */; }; - 633FEE9B1D3CD55A0014B822 /* numpad_0_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECE11D3CD5580014B822 /* numpad_0_default.png */; }; - 633FEE9C1D3CD55A0014B822 /* numpad_0_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECE21D3CD5580014B822 /* numpad_0_default@2x.png */; }; - 633FEE9D1D3CD55A0014B822 /* numpad_0_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECE31D3CD5580014B822 /* numpad_0_over.png */; }; - 633FEE9E1D3CD55A0014B822 /* numpad_0_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECE41D3CD5580014B822 /* numpad_0_over@2x.png */; }; - 633FEE9F1D3CD55A0014B822 /* numpad_0_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECE51D3CD5580014B822 /* numpad_0_over~ipad.png */; }; - 633FEEA01D3CD55A0014B822 /* numpad_0_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECE61D3CD5580014B822 /* numpad_0_over~ipad@2x.png */; }; - 633FEEA11D3CD55A0014B822 /* numpad_0~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECE71D3CD5580014B822 /* numpad_0~ipad.png */; }; - 633FEEA21D3CD55A0014B822 /* numpad_0~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECE81D3CD5580014B822 /* numpad_0~ipad@2x.png */; }; - 633FEEA31D3CD55A0014B822 /* numpad_1_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECE91D3CD5580014B822 /* numpad_1_default.png */; }; - 633FEEA41D3CD55A0014B822 /* numpad_1_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECEA1D3CD5580014B822 /* numpad_1_default@2x.png */; }; - 633FEEA51D3CD55A0014B822 /* numpad_1_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECEB1D3CD5580014B822 /* numpad_1_over.png */; }; - 633FEEA61D3CD55A0014B822 /* numpad_1_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECEC1D3CD5580014B822 /* numpad_1_over@2x.png */; }; - 633FEEA71D3CD55A0014B822 /* numpad_1_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECED1D3CD5580014B822 /* numpad_1_over~ipad.png */; }; - 633FEEA81D3CD55A0014B822 /* numpad_1_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECEE1D3CD5580014B822 /* numpad_1_over~ipad@2x.png */; }; - 633FEEA91D3CD55A0014B822 /* numpad_1~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECEF1D3CD5580014B822 /* numpad_1~ipad.png */; }; - 633FEEAA1D3CD55A0014B822 /* numpad_1~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECF01D3CD5580014B822 /* numpad_1~ipad@2x.png */; }; - 633FEEAB1D3CD55A0014B822 /* numpad_2_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECF11D3CD5580014B822 /* numpad_2_default.png */; }; - 633FEEAC1D3CD55A0014B822 /* numpad_2_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECF21D3CD5580014B822 /* numpad_2_default@2x.png */; }; - 633FEEAD1D3CD55A0014B822 /* numpad_2_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECF31D3CD5580014B822 /* numpad_2_over.png */; }; - 633FEEAE1D3CD55A0014B822 /* numpad_2_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECF41D3CD5580014B822 /* numpad_2_over@2x.png */; }; - 633FEEAF1D3CD55A0014B822 /* numpad_2_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECF51D3CD5580014B822 /* numpad_2_over~ipad.png */; }; - 633FEEB01D3CD55A0014B822 /* numpad_2_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECF61D3CD5580014B822 /* numpad_2_over~ipad@2x.png */; }; - 633FEEB11D3CD55A0014B822 /* numpad_2~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECF71D3CD5580014B822 /* numpad_2~ipad.png */; }; - 633FEEB21D3CD55A0014B822 /* numpad_2~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECF81D3CD5580014B822 /* numpad_2~ipad@2x.png */; }; - 633FEEB31D3CD55A0014B822 /* numpad_3_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECF91D3CD5580014B822 /* numpad_3_default.png */; }; - 633FEEB41D3CD55A0014B822 /* numpad_3_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECFA1D3CD5580014B822 /* numpad_3_default@2x.png */; }; - 633FEEB51D3CD55A0014B822 /* numpad_3_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECFB1D3CD5580014B822 /* numpad_3_over.png */; }; - 633FEEB61D3CD55A0014B822 /* numpad_3_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECFC1D3CD5580014B822 /* numpad_3_over@2x.png */; }; - 633FEEB71D3CD55A0014B822 /* numpad_3_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECFD1D3CD5580014B822 /* numpad_3_over~ipad.png */; }; - 633FEEB81D3CD55A0014B822 /* numpad_3_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECFE1D3CD5580014B822 /* numpad_3_over~ipad@2x.png */; }; - 633FEEB91D3CD55A0014B822 /* numpad_3~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FECFF1D3CD5580014B822 /* numpad_3~ipad.png */; }; - 633FEEBA1D3CD55A0014B822 /* numpad_3~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED001D3CD5580014B822 /* numpad_3~ipad@2x.png */; }; - 633FEEBB1D3CD55A0014B822 /* numpad_4_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED011D3CD5580014B822 /* numpad_4_default.png */; }; - 633FEEBC1D3CD55A0014B822 /* numpad_4_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED021D3CD5580014B822 /* numpad_4_default@2x.png */; }; - 633FEEBD1D3CD55A0014B822 /* numpad_4_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED031D3CD5580014B822 /* numpad_4_over.png */; }; - 633FEEBE1D3CD55A0014B822 /* numpad_4_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED041D3CD5580014B822 /* numpad_4_over@2x.png */; }; - 633FEEBF1D3CD55A0014B822 /* numpad_4_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED051D3CD5580014B822 /* numpad_4_over~ipad.png */; }; - 633FEEC01D3CD55A0014B822 /* numpad_4_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED061D3CD5580014B822 /* numpad_4_over~ipad@2x.png */; }; - 633FEEC11D3CD55A0014B822 /* numpad_4~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED071D3CD5580014B822 /* numpad_4~ipad.png */; }; - 633FEEC21D3CD55A0014B822 /* numpad_4~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED081D3CD5580014B822 /* numpad_4~ipad@2x.png */; }; - 633FEEC31D3CD55A0014B822 /* numpad_5_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED091D3CD5580014B822 /* numpad_5_default.png */; }; - 633FEEC41D3CD55A0014B822 /* numpad_5_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED0A1D3CD5580014B822 /* numpad_5_default@2x.png */; }; - 633FEEC51D3CD55A0014B822 /* numpad_5_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED0B1D3CD5580014B822 /* numpad_5_over.png */; }; - 633FEEC61D3CD55A0014B822 /* numpad_5_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED0C1D3CD5580014B822 /* numpad_5_over@2x.png */; }; - 633FEEC71D3CD55A0014B822 /* numpad_5_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED0D1D3CD5580014B822 /* numpad_5_over~ipad.png */; }; - 633FEEC81D3CD55A0014B822 /* numpad_5_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED0E1D3CD5580014B822 /* numpad_5_over~ipad@2x.png */; }; - 633FEEC91D3CD55A0014B822 /* numpad_5~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED0F1D3CD5580014B822 /* numpad_5~ipad.png */; }; - 633FEECA1D3CD55A0014B822 /* numpad_5~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED101D3CD5580014B822 /* numpad_5~ipad@2x.png */; }; - 633FEECB1D3CD55A0014B822 /* numpad_6_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED111D3CD5580014B822 /* numpad_6_default.png */; }; - 633FEECC1D3CD55A0014B822 /* numpad_6_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED121D3CD5580014B822 /* numpad_6_default@2x.png */; }; - 633FEECD1D3CD55A0014B822 /* numpad_6_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED131D3CD5580014B822 /* numpad_6_over.png */; }; - 633FEECE1D3CD55A0014B822 /* numpad_6_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED141D3CD5580014B822 /* numpad_6_over@2x.png */; }; - 633FEECF1D3CD55A0014B822 /* numpad_6_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED151D3CD5580014B822 /* numpad_6_over~ipad.png */; }; - 633FEED01D3CD55A0014B822 /* numpad_6_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED161D3CD5580014B822 /* numpad_6_over~ipad@2x.png */; }; - 633FEED11D3CD55A0014B822 /* numpad_6~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED171D3CD5580014B822 /* numpad_6~ipad.png */; }; - 633FEED21D3CD55A0014B822 /* numpad_6~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED181D3CD5580014B822 /* numpad_6~ipad@2x.png */; }; - 633FEED31D3CD55A0014B822 /* numpad_7_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED191D3CD5580014B822 /* numpad_7_default.png */; }; - 633FEED41D3CD55A0014B822 /* numpad_7_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED1A1D3CD5580014B822 /* numpad_7_default@2x.png */; }; - 633FEED51D3CD55A0014B822 /* numpad_7_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED1B1D3CD5580014B822 /* numpad_7_over.png */; }; - 633FEED61D3CD55A0014B822 /* numpad_7_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED1C1D3CD5580014B822 /* numpad_7_over@2x.png */; }; - 633FEED71D3CD55A0014B822 /* numpad_7_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED1D1D3CD5580014B822 /* numpad_7_over~ipad.png */; }; - 633FEED81D3CD55A0014B822 /* numpad_7_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED1E1D3CD5580014B822 /* numpad_7_over~ipad@2x.png */; }; - 633FEED91D3CD55A0014B822 /* numpad_7~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED1F1D3CD5580014B822 /* numpad_7~ipad.png */; }; - 633FEEDA1D3CD55A0014B822 /* numpad_7~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED201D3CD5580014B822 /* numpad_7~ipad@2x.png */; }; - 633FEEDB1D3CD55A0014B822 /* numpad_8_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED211D3CD5580014B822 /* numpad_8_default.png */; }; - 633FEEDC1D3CD55A0014B822 /* numpad_8_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED221D3CD5580014B822 /* numpad_8_default@2x.png */; }; - 633FEEDD1D3CD55A0014B822 /* numpad_8_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED231D3CD5580014B822 /* numpad_8_over.png */; }; - 633FEEDE1D3CD55A0014B822 /* numpad_8_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED241D3CD5580014B822 /* numpad_8_over@2x.png */; }; - 633FEEDF1D3CD55A0014B822 /* numpad_8_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED251D3CD5580014B822 /* numpad_8_over~ipad.png */; }; - 633FEEE01D3CD55A0014B822 /* numpad_8_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED261D3CD5580014B822 /* numpad_8_over~ipad@2x.png */; }; - 633FEEE11D3CD55A0014B822 /* numpad_8~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED271D3CD5580014B822 /* numpad_8~ipad.png */; }; - 633FEEE21D3CD55A0014B822 /* numpad_8~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED281D3CD5580014B822 /* numpad_8~ipad@2x.png */; }; - 633FEEE31D3CD55A0014B822 /* numpad_9_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED291D3CD5580014B822 /* numpad_9_default.png */; }; - 633FEEE41D3CD55A0014B822 /* numpad_9_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED2A1D3CD5580014B822 /* numpad_9_default@2x.png */; }; - 633FEEE51D3CD55A0014B822 /* numpad_9_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED2B1D3CD5580014B822 /* numpad_9_over.png */; }; - 633FEEE61D3CD55A0014B822 /* numpad_9_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED2C1D3CD5580014B822 /* numpad_9_over@2x.png */; }; - 633FEEE71D3CD55A0014B822 /* numpad_9_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED2D1D3CD5580014B822 /* numpad_9_over~ipad.png */; }; - 633FEEE81D3CD55A0014B822 /* numpad_9_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED2E1D3CD5580014B822 /* numpad_9_over~ipad@2x.png */; }; - 633FEEE91D3CD55A0014B822 /* numpad_9~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED2F1D3CD5580014B822 /* numpad_9~ipad.png */; }; - 633FEEEA1D3CD55A0014B822 /* numpad_9~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED301D3CD5580014B822 /* numpad_9~ipad@2x.png */; }; - 633FEEEB1D3CD55A0014B822 /* numpad_hash_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED311D3CD5580014B822 /* numpad_hash_default.png */; }; - 633FEEEC1D3CD55A0014B822 /* numpad_hash_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED321D3CD5580014B822 /* numpad_hash_default@2x.png */; }; - 633FEEED1D3CD55A0014B822 /* numpad_hash_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED331D3CD5580014B822 /* numpad_hash_over.png */; }; - 633FEEEE1D3CD55A0014B822 /* numpad_hash_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED341D3CD5580014B822 /* numpad_hash_over@2x.png */; }; - 633FEEEF1D3CD55A0014B822 /* numpad_hash_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED351D3CD5580014B822 /* numpad_hash_over~ipad.png */; }; - 633FEEF01D3CD55A0014B822 /* numpad_hash_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED361D3CD5580014B822 /* numpad_hash_over~ipad@2x.png */; }; - 633FEEF11D3CD55A0014B822 /* numpad_hash~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED371D3CD5580014B822 /* numpad_hash~ipad.png */; }; - 633FEEF21D3CD55A0014B822 /* numpad_hash~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED381D3CD5580014B822 /* numpad_hash~ipad@2x.png */; }; - 633FEEF31D3CD55A0014B822 /* numpad_over_background.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED391D3CD5580014B822 /* numpad_over_background.png */; }; - 633FEEF41D3CD55A0014B822 /* numpad_star_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED3A1D3CD5580014B822 /* numpad_star_default.png */; }; - 633FEEF51D3CD55A0014B822 /* numpad_star_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED3B1D3CD5580014B822 /* numpad_star_default@2x.png */; }; - 633FEEF61D3CD55A0014B822 /* numpad_star_over.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED3C1D3CD5580014B822 /* numpad_star_over.png */; }; - 633FEEF71D3CD55A0014B822 /* numpad_star_over@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED3D1D3CD5580014B822 /* numpad_star_over@2x.png */; }; - 633FEEF81D3CD55A0014B822 /* numpad_star_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED3E1D3CD5580014B822 /* numpad_star_over~ipad.png */; }; - 633FEEF91D3CD55A0014B822 /* numpad_star_over~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED3F1D3CD5580014B822 /* numpad_star_over~ipad@2x.png */; }; - 633FEEFA1D3CD55A0014B822 /* numpad_star~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED401D3CD5580014B822 /* numpad_star~ipad.png */; }; - 633FEEFB1D3CD55A0014B822 /* numpad_star~ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED411D3CD5580014B822 /* numpad_star~ipad@2x.png */; }; - 633FEEFC1D3CD55A0014B822 /* options_add_call_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED421D3CD5580014B822 /* options_add_call_default.png */; }; - 633FEEFD1D3CD55A0014B822 /* options_add_call_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED431D3CD5580014B822 /* options_add_call_default@2x.png */; }; - 633FEEFE1D3CD55A0014B822 /* options_add_call_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED441D3CD5580014B822 /* options_add_call_disabled.png */; }; - 633FEEFF1D3CD55A0014B822 /* options_add_call_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED451D3CD5580014B822 /* options_add_call_disabled@2x.png */; }; - 633FEF001D3CD55A0014B822 /* options_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED461D3CD5580014B822 /* options_default.png */; }; - 633FEF011D3CD55A0014B822 /* options_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED471D3CD5580014B822 /* options_default@2x.png */; }; - 633FEF021D3CD55A0014B822 /* options_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED481D3CD5580014B822 /* options_disabled.png */; }; - 633FEF031D3CD55A0014B822 /* options_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED491D3CD5580014B822 /* options_disabled@2x.png */; }; - 633FEF041D3CD55A0014B822 /* options_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED4A1D3CD5580014B822 /* options_selected.png */; }; - 633FEF051D3CD55A0014B822 /* options_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED4B1D3CD5580014B822 /* options_selected@2x.png */; }; - 633FEF061D3CD55A0014B822 /* options_start_conference_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED4C1D3CD5580014B822 /* options_start_conference_default.png */; }; - 633FEF071D3CD55A0014B822 /* options_start_conference_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED4D1D3CD5580014B822 /* options_start_conference_default@2x.png */; }; - 633FEF081D3CD55A0014B822 /* options_start_conference_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED4E1D3CD5580014B822 /* options_start_conference_disabled.png */; }; - 633FEF091D3CD55A0014B822 /* options_start_conference_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED4F1D3CD5580014B822 /* options_start_conference_disabled@2x.png */; }; - 633FEF0A1D3CD55A0014B822 /* options_transfer_call_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED501D3CD5580014B822 /* options_transfer_call_default.png */; }; - 633FEF0B1D3CD55A0014B822 /* options_transfer_call_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED511D3CD5580014B822 /* options_transfer_call_default@2x.png */; }; - 633FEF0C1D3CD55A0014B822 /* options_transfer_call_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED521D3CD5580014B822 /* options_transfer_call_disabled.png */; }; - 633FEF0D1D3CD55A0014B822 /* options_transfer_call_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED531D3CD5580014B822 /* options_transfer_call_disabled@2x.png */; }; - 633FEF0E1D3CD55A0014B822 /* pause_big_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED541D3CD5580014B822 /* pause_big_default.png */; }; - 633FEF0F1D3CD55A0014B822 /* pause_big_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED551D3CD5580014B822 /* pause_big_default@2x.png */; }; - 633FEF101D3CD55A0014B822 /* pause_big_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED561D3CD5580014B822 /* pause_big_disabled.png */; }; - 633FEF111D3CD55A0014B822 /* pause_big_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED571D3CD5580014B822 /* pause_big_disabled@2x.png */; }; - 633FEF121D3CD55A0014B822 /* pause_big_over_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED581D3CD5580014B822 /* pause_big_over_selected.png */; }; - 633FEF131D3CD55A0014B822 /* pause_big_over_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED591D3CD5580014B822 /* pause_big_over_selected@2x.png */; }; - 633FEF141D3CD55A0014B822 /* pause_small_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED5A1D3CD5580014B822 /* pause_small_default.png */; }; - 633FEF151D3CD55A0014B822 /* pause_small_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED5B1D3CD5590014B822 /* pause_small_default@2x.png */; }; - 633FEF161D3CD55A0014B822 /* pause_small_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED5C1D3CD5590014B822 /* pause_small_disabled.png */; }; - 633FEF171D3CD55A0014B822 /* pause_small_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED5D1D3CD5590014B822 /* pause_small_disabled@2x.png */; }; - 633FEF181D3CD55A0014B822 /* pause_small_over_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED5E1D3CD5590014B822 /* pause_small_over_selected.png */; }; - 633FEF191D3CD55A0014B822 /* pause_small_over_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED5F1D3CD5590014B822 /* pause_small_over_selected@2x.png */; }; - 633FEF1A1D3CD55A0014B822 /* presence_away.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED601D3CD5590014B822 /* presence_away.png */; }; - 633FEF1B1D3CD55A0014B822 /* presence_away@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED611D3CD5590014B822 /* presence_away@2x.png */; }; - 633FEF1C1D3CD55A0014B822 /* presence_offline.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED621D3CD5590014B822 /* presence_offline.png */; }; - 633FEF1D1D3CD55A0014B822 /* presence_offline@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED631D3CD5590014B822 /* presence_offline@2x.png */; }; - 633FEF1E1D3CD55A0014B822 /* presence_online.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED641D3CD5590014B822 /* presence_online.png */; }; - 633FEF1F1D3CD55A0014B822 /* presence_online@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED651D3CD5590014B822 /* presence_online@2x.png */; }; - 633FEF201D3CD55A0014B822 /* presence_unregistered.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED661D3CD5590014B822 /* presence_unregistered.png */; }; - 633FEF211D3CD55A0014B822 /* presence_unregistered@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED671D3CD5590014B822 /* presence_unregistered@2x.png */; }; - 633FEF221D3CD55A0014B822 /* route_bluetooth_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED681D3CD5590014B822 /* route_bluetooth_default.png */; }; - 633FEF231D3CD55A0014B822 /* route_bluetooth_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED691D3CD5590014B822 /* route_bluetooth_default@2x.png */; }; - 633FEF241D3CD55A0014B822 /* route_bluetooth_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED6A1D3CD5590014B822 /* route_bluetooth_disabled.png */; }; - 633FEF251D3CD55A0014B822 /* route_bluetooth_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED6B1D3CD5590014B822 /* route_bluetooth_disabled@2x.png */; }; - 633FEF261D3CD55A0014B822 /* route_bluetooth_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED6C1D3CD5590014B822 /* route_bluetooth_selected.png */; }; - 633FEF271D3CD55A0014B822 /* route_bluetooth_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED6D1D3CD5590014B822 /* route_bluetooth_selected@2x.png */; }; - 633FEF281D3CD55A0014B822 /* route_earpiece_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED6E1D3CD5590014B822 /* route_earpiece_default.png */; }; - 633FEF291D3CD55A0014B822 /* route_earpiece_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED6F1D3CD5590014B822 /* route_earpiece_default@2x.png */; }; - 633FEF2A1D3CD55A0014B822 /* route_earpiece_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED701D3CD5590014B822 /* route_earpiece_disabled.png */; }; - 633FEF2B1D3CD55A0014B822 /* route_earpiece_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED711D3CD5590014B822 /* route_earpiece_disabled@2x.png */; }; - 633FEF2C1D3CD55A0014B822 /* route_earpiece_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED721D3CD5590014B822 /* route_earpiece_selected.png */; }; - 633FEF2D1D3CD55A0014B822 /* route_earpiece_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED731D3CD5590014B822 /* route_earpiece_selected@2x.png */; }; - 633FEF2E1D3CD55A0014B822 /* route_speaker_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED741D3CD5590014B822 /* route_speaker_default.png */; }; - 633FEF2F1D3CD55A0014B822 /* route_speaker_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED751D3CD5590014B822 /* route_speaker_default@2x.png */; }; - 633FEF301D3CD55A0014B822 /* route_speaker_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED761D3CD5590014B822 /* route_speaker_disabled.png */; }; - 633FEF311D3CD55A0014B822 /* route_speaker_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED771D3CD5590014B822 /* route_speaker_disabled@2x.png */; }; - 633FEF321D3CD55A0014B822 /* route_speaker_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED781D3CD5590014B822 /* route_speaker_selected.png */; }; - 633FEF331D3CD55A0014B822 /* route_speaker_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED791D3CD5590014B822 /* route_speaker_selected@2x.png */; }; - 633FEF341D3CD55A0014B822 /* routes_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED7A1D3CD5590014B822 /* routes_default.png */; }; - 633FEF351D3CD55A0014B822 /* routes_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED7B1D3CD5590014B822 /* routes_default@2x.png */; }; - 633FEF361D3CD55A0014B822 /* routes_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED7C1D3CD5590014B822 /* routes_disabled.png */; }; - 633FEF371D3CD55A0014B822 /* routes_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED7D1D3CD5590014B822 /* routes_disabled@2x.png */; }; - 633FEF381D3CD55A0014B822 /* routes_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED7E1D3CD5590014B822 /* routes_selected.png */; }; - 633FEF391D3CD55A0014B822 /* routes_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED7F1D3CD5590014B822 /* routes_selected@2x.png */; }; - 633FEF3A1D3CD55A0014B822 /* security_ko.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED801D3CD5590014B822 /* security_ko.png */; }; - 633FEF3B1D3CD55A0014B822 /* security_ko@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED811D3CD5590014B822 /* security_ko@2x.png */; }; - 633FEF3C1D3CD55A0014B822 /* security_ok.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED821D3CD5590014B822 /* security_ok.png */; }; - 633FEF3D1D3CD55A0014B822 /* security_ok@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED831D3CD5590014B822 /* security_ok@2x.png */; }; - 633FEF3E1D3CD55A0014B822 /* security_pending.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED841D3CD5590014B822 /* security_pending.png */; }; - 633FEF3F1D3CD55A0014B822 /* security_pending@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED851D3CD5590014B822 /* security_pending@2x.png */; }; - 633FEF401D3CD55A0014B822 /* select_all_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED861D3CD5590014B822 /* select_all_default.png */; }; - 633FEF411D3CD55A0014B822 /* select_all_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED871D3CD5590014B822 /* select_all_default@2x.png */; }; - 633FEF421D3CD55A0014B822 /* select_all_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED881D3CD5590014B822 /* select_all_disabled.png */; }; - 633FEF431D3CD55A0014B822 /* select_all_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED891D3CD5590014B822 /* select_all_disabled@2x.png */; }; - 633FEF441D3CD55A0014B822 /* speaker_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED8A1D3CD5590014B822 /* speaker_default.png */; }; - 633FEF451D3CD55A0014B822 /* speaker_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED8B1D3CD5590014B822 /* speaker_default@2x.png */; }; - 633FEF461D3CD55A0014B822 /* speaker_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED8C1D3CD5590014B822 /* speaker_disabled.png */; }; - 633FEF471D3CD55A0014B822 /* speaker_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED8D1D3CD5590014B822 /* speaker_disabled@2x.png */; }; - 633FEF481D3CD55A0014B822 /* speaker_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED8E1D3CD5590014B822 /* speaker_selected.png */; }; - 633FEF491D3CD55A0014B822 /* speaker_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED8F1D3CD5590014B822 /* speaker_selected@2x.png */; }; - 633FEF4E1D3CD55A0014B822 /* valid_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED941D3CD5590014B822 /* valid_default.png */; }; - 633FEF4F1D3CD55A0014B822 /* valid_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED951D3CD5590014B822 /* valid_default@2x.png */; }; - 633FEF501D3CD55A0014B822 /* valid_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED961D3CD5590014B822 /* valid_disabled.png */; }; - 633FEF511D3CD55A0014B822 /* valid_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED971D3CD5590014B822 /* valid_disabled@2x.png */; }; - 633FEF521D3CD55A0014B822 /* voicemail.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED981D3CD5590014B822 /* voicemail.png */; }; - 633FEF531D3CD55A0014B822 /* voicemail@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED991D3CD5590014B822 /* voicemail@2x.png */; }; - 633FEF541D3CD55A0014B822 /* waiting_time.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED9A1D3CD5590014B822 /* waiting_time.png */; }; - 633FEF551D3CD55A0014B822 /* waiting_time@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 633FED9B1D3CD5590014B822 /* waiting_time@2x.png */; }; - 633FEF581D3CD5E00014B822 /* UIAvatarPresence.m in Sources */ = {isa = PBXBuildFile; fileRef = 633FEF571D3CD5E00014B822 /* UIAvatarPresence.m */; }; - 6341807C1BBC103100F71761 /* ChatConversationCreateTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6341807B1BBC103100F71761 /* ChatConversationCreateTableView.m */; }; - 63423C0A1C4501D000D9A050 /* Contact.m in Sources */ = {isa = PBXBuildFile; fileRef = 63423C091C4501D000D9A050 /* Contact.m */; }; - 634610061B61330300548952 /* UILabel+Boldify.m in Sources */ = {isa = PBXBuildFile; fileRef = 634610051B61330300548952 /* UILabel+Boldify.m */; }; - 635173F91BA082A40095EB0A /* UIChatBubblePhotoCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 635173F81BA082A40095EB0A /* UIChatBubblePhotoCell.m */; }; - 635775251B6673EC00C8B704 /* HistoryDetailsTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 635775241B6673EC00C8B704 /* HistoryDetailsTableView.m */; }; - 636316D11A1DEBCB0009B839 /* AboutView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 636316D31A1DEBCB0009B839 /* AboutView.xib */; }; - 636316D41A1DEC650009B839 /* SettingsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 636316D61A1DEC650009B839 /* SettingsView.xib */; }; - 636BC9971B5F921B00C754CE /* UIIconButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 636BC9961B5F921B00C754CE /* UIIconButton.m */; }; - 63701DDF1BA32039006A9AE3 /* UIConfirmationDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = 63701DDE1BA32039006A9AE3 /* UIConfirmationDialog.m */; }; - 637157A11B283FE200C91677 /* FileTransferDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 637157A01B283FE200C91677 /* FileTransferDelegate.m */; }; - 6377AC801BDE4069007F7625 /* UIBackToCallButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 6377AC7F1BDE4069007F7625 /* UIBackToCallButton.m */; }; - 6381DA7D1C1AD5EA00DF3BBD /* UIBouncingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6381DA7C1C1AD5EA00DF3BBD /* UIBouncingView.m */; }; - 638F1A621C2021B2004B8E02 /* DialerView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 638F1A601C2021B2004B8E02 /* DialerView~ipad.xib */; }; - 638F1A911C21993D004B8E02 /* UICompositeView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 638F1A8F1C21993D004B8E02 /* UICompositeView~ipad.xib */; }; - 639CEAFD1A1DF4D9004DE38F /* StatusBarView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639CEAFF1A1DF4D9004DE38F /* StatusBarView.xib */; }; - 639CEB001A1DF4E4004DE38F /* UIHistoryCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639CEB021A1DF4E4004DE38F /* UIHistoryCell.xib */; }; - 639CEB031A1DF4EB004DE38F /* UICompositeView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639CEB051A1DF4EB004DE38F /* UICompositeView.xib */; }; - 639CEB091A1DF4FA004DE38F /* UIChatCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639CEB0B1A1DF4FA004DE38F /* UIChatCell.xib */; }; - 639E9C801C0DB13D00019A75 /* UICheckBoxTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 639E9C7F1C0DB13D00019A75 /* UICheckBoxTableView.m */; }; - 639E9C931C0DB7BE00019A75 /* FirstLoginView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639E9C951C0DB7BE00019A75 /* FirstLoginView.xib */; }; - 639E9CA01C0DB7E500019A75 /* UIChatBubblePhotoCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639E9CA21C0DB7E500019A75 /* UIChatBubblePhotoCell.xib */; }; - 639E9CA31C0DB7EA00019A75 /* UIChatBubbleTextCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639E9CA51C0DB7EA00019A75 /* UIChatBubbleTextCell.xib */; }; - 639E9CA61C0DB7F200019A75 /* UIChatCreateCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639E9CA81C0DB7F200019A75 /* UIChatCreateCell.xib */; }; - 639E9CA91C0DB7FB00019A75 /* UIConfirmationDialog.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639E9CAB1C0DB7FB00019A75 /* UIConfirmationDialog.xib */; }; - 639E9CAC1C0DB80300019A75 /* UIContactDetailsCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639E9CAE1C0DB80300019A75 /* UIContactDetailsCell.xib */; }; - 639E9CB01C0DB83000019A75 /* SideMenuView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639E9CB21C0DB83000019A75 /* SideMenuView.xib */; }; - 639E9CB51C0DB88200019A75 /* PhoneMainView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 639E9CB31C0DB88200019A75 /* PhoneMainView.xib */; }; - 63AADBE81B6A0FF200AA16FD /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBC41B6A0FF200AA16FD /* Localizable.strings */; }; - 63AADBEA1B6A0FF200AA16FD /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBCA1B6A0FF200AA16FD /* Images.xcassets */; }; - 63AADBF51B6A0FF200AA16FD /* linphonerc in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBD71B6A0FF200AA16FD /* linphonerc */; }; - 63AADBF61B6A0FF200AA16FD /* linphonerc-factory in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBD81B6A0FF200AA16FD /* linphonerc-factory */; }; - 63AADBF81B6A0FF200AA16FD /* linphonerc~ipad in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBDA1B6A0FF200AA16FD /* linphonerc~ipad */; }; - 63AADBFF1B6A0FF200AA16FD /* assistant_external_sip.rc in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBE31B6A0FF200AA16FD /* assistant_external_sip.rc */; }; - 63AADC001B6A0FF200AA16FD /* assistant_linphone_create.rc in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBE41B6A0FF200AA16FD /* assistant_linphone_create.rc */; }; - 63AADC011B6A0FF200AA16FD /* assistant_linphone_existing.rc in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBE51B6A0FF200AA16FD /* assistant_linphone_existing.rc */; }; - 63AADC021B6A0FF200AA16FD /* assistant_remote.rc in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBE61B6A0FF200AA16FD /* assistant_remote.rc */; }; - 63B81A0C1B57DA33009604A6 /* LICENSE.txt in Resources */ = {isa = PBXBuildFile; fileRef = 63B81A031B57DA33009604A6 /* LICENSE.txt */; }; - 63B81A0D1B57DA33009604A6 /* TPKeyboardAvoidingCollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B81A051B57DA33009604A6 /* TPKeyboardAvoidingCollectionView.m */; }; - 63B81A0E1B57DA33009604A6 /* TPKeyboardAvoidingScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B81A071B57DA33009604A6 /* TPKeyboardAvoidingScrollView.m */; }; - 63B81A0F1B57DA33009604A6 /* TPKeyboardAvoidingTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B81A091B57DA33009604A6 /* TPKeyboardAvoidingTableView.m */; }; - 63B81A101B57DA33009604A6 /* UIScrollView+TPKeyboardAvoidingAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B81A0B1B57DA33009604A6 /* UIScrollView+TPKeyboardAvoidingAdditions.m */; }; - 63B8D68C1BCBE65600C12B09 /* ChatConversationCreateView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 63B8D68E1BCBE65600C12B09 /* ChatConversationCreateView.xib */; }; - 63B8D6A21BCBF43100C12B09 /* UIChatCreateCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B8D6A01BCBF43100C12B09 /* UIChatCreateCell.m */; }; - 63BE7A781D75BDF6000990EF /* ShopTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 63BE7A771D75BDF6000990EF /* ShopTableView.m */; }; - 63C441C31BBC23ED0053DC5E /* UIAssistantTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 63C441C21BBC23ED0053DC5E /* UIAssistantTextField.m */; }; - 63CD4B4F1A5AAC8C00B84282 /* DTAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 63CD4B4E1A5AAC8C00B84282 /* DTAlertView.m */; }; - 63CDC45E1C3BDE370085F529 /* msg.caf in Resources */ = {isa = PBXBuildFile; fileRef = 63CDC4531C3BDE370085F529 /* msg.caf */; }; - 63CDC45F1C3BDE370085F529 /* ringback.wav in Resources */ = {isa = PBXBuildFile; fileRef = 63CDC4541C3BDE370085F529 /* ringback.wav */; }; - 63CDC4661C3BDE370085F529 /* shortring.caf in Resources */ = {isa = PBXBuildFile; fileRef = 63CDC45C1C3BDE370085F529 /* shortring.caf */; }; - 63CE58401C85EBF400304800 /* VideoToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63CE583F1C85EBF400304800 /* VideoToolbox.framework */; }; - 63D11C531C3D501200E8FCEE /* Log.m in Sources */ = {isa = PBXBuildFile; fileRef = 63D11C521C3D501200E8FCEE /* Log.m */; }; - 63DFE04B1C40161700DA5E87 /* notes_of_the_optimistic.caf in Resources */ = {isa = PBXBuildFile; fileRef = 63DFE0451C40161700DA5E87 /* notes_of_the_optimistic.caf */; }; - 63E27A321C4FECD000D332AE /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 63E27A311C4FECD000D332AE /* LaunchScreen.xib */; }; - 63E27A521C50EDB000D332AE /* hold.mkv in Resources */ = {isa = PBXBuildFile; fileRef = 63E27A511C50EB2700D332AE /* hold.mkv */; }; - 63E59A3F1ADE70D900646FB3 /* InAppProductsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 63E59A3E1ADE70D900646FB3 /* InAppProductsManager.m */; }; - 63E802DB1C625AEF000D5509 /* BuildFile in Resources */ = {isa = PBXBuildFile; }; - 63EC8D391D7438660066547B /* AssistantLinkView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 63EC8D3B1D7438660066547B /* AssistantLinkView.xib */; }; - 63F1DF441BCE618E00EDED90 /* UIAddressTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 63F1DF431BCE618E00EDED90 /* UIAddressTextField.m */; }; - 63FB30351A680E73008CA393 /* UIRoundedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 63FB30341A680E73008CA393 /* UIRoundedImageView.m */; }; - 662553B427EDFB35007F67D8 /* MagicSearch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 662553B327EDFB35007F67D8 /* MagicSearch.swift */; }; - 662F56FE28C00DF300E851BF /* UITestsUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 662F13B52887E8A10084C28C /* UITestsUtils.swift */; }; - 662F56FF28C0A9FE00E851BF /* IncomingOutgoingCallViewUITestsMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6643AD54287F25A500701703 /* IncomingOutgoingCallViewUITestsMethods.swift */; }; - 662F570028C0AA0800E851BF /* UITestsCoreManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6643AD51287EF56200701703 /* UITestsCoreManager.swift */; }; - 662F570228C2506600E851BF /* OutgoingCallUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663B06592886B54F00E41889 /* OutgoingCallUITests.swift */; }; - 66305A5B28B9105D00838792 /* UITestsScreenshots.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66689D3F28A2443A0054E633 /* UITestsScreenshots.swift */; }; - 6637AF90288593AF00965733 /* IncomingCallUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6637AF8F288593AF00965733 /* IncomingCallUITests.swift */; }; -<<<<<<< HEAD - 6643501C28D1CD3300AEA777 /* UIColorExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71BE285A24B10066163B /* UIColorExtensions.swift */; }; - 66631CE728D37A2400115E36 /* ExtraMenuUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663B06652886F0DB00E41889 /* ExtraMenuUITests.swift */; }; - 66631CE828D37AA300115E36 /* ExtraMenuActiveCallActionsUITestsMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663B06672886F16300E41889 /* ExtraMenuActiveCallActionsUITestsMethods.swift */; }; - 6693A1D328D0FCE400489A39 /* ActiveCallUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663B065F2886E38100E41889 /* ActiveCallUITests.swift */; }; - 6693A1D428D0FCE900489A39 /* ActiveCallViewUITestsMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663B065B2886DA8500E41889 /* ActiveCallViewUITestsMethods.swift */; }; -======= - 6637AF9A2885986300965733 /* GhostAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6643AD51287EF56200701703 /* GhostAccount.swift */; }; - 6637AF9B2885995A00965733 /* IncomingOutgoingCallViewUITestsMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6643AD54287F25A500701703 /* IncomingOutgoingCallViewUITestsMethods.swift */; }; - 663B065A2886B54F00E41889 /* OutgoingCallUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663B06592886B54F00E41889 /* OutgoingCallUITests.swift */; }; - 663B065C2886DA8500E41889 /* ActiveCallViewUITestsMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663B065B2886DA8500E41889 /* ActiveCallViewUITestsMethods.swift */; }; - 663B06602886E38100E41889 /* ActiveCallUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663B065F2886E38100E41889 /* ActiveCallUITests.swift */; }; - 663B06662886F0DB00E41889 /* ExtraMenuUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663B06652886F0DB00E41889 /* ExtraMenuUITests.swift */; }; - 663B06682886F16300E41889 /* ExtraMenuActiveCallActionsUITestsMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = 663B06672886F16300E41889 /* ExtraMenuActiveCallActionsUITestsMethods.swift */; }; - 66495CFE288FF346002780DE /* AutoConnectLinphoneAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66495CFD288FF346002780DE /* AutoConnectLinphoneAccount.swift */; }; ->>>>>>> 8e16f1fad (new test plans) - 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 */; }; - 66E399F72857869300E73456 /* menu_notifications_off.png in Resources */ = {isa = PBXBuildFile; fileRef = 66E399F52857869200E73456 /* menu_notifications_off.png */; }; - 66E399F82857869300E73456 /* menu_notifications_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 66E399F62857869200E73456 /* menu_notifications_on.png */; }; - 70E542F313E147E3002BA2C0 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F213E147E3002BA2C0 /* OpenGLES.framework */; }; - 70E542F513E147EB002BA2C0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F413E147EB002BA2C0 /* QuartzCore.framework */; }; - 8C2595DF1DEDCC8E007A6424 /* CallKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C2595DE1DEDCC8E007A6424 /* CallKit.framework */; }; - 8C2A81951F87B8000012A66B /* chat_group_avatar@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C2A81931F87B7FF0012A66B /* chat_group_avatar@2x.png */; }; - 8C2A81961F87B8000012A66B /* chat_group_avatar.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C2A81941F87B8000012A66B /* chat_group_avatar.png */; }; - 8C300D9A1E40E0CC00728EF3 /* lime_ko.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C300D981E40E0CC00728EF3 /* lime_ko.png */; }; - 8C300D9B1E40E0CC00728EF3 /* lime_ko@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C300D991E40E0CC00728EF3 /* lime_ko@2x.png */; }; - 8C73477C1D9BA3A00022EE8C /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C73477B1D9BA3A00022EE8C /* UserNotifications.framework */; }; - 8C92ABE81FA773190006FB5D /* UIChatNotifiedEventCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8C92ABE71FA773190006FB5D /* UIChatNotifiedEventCell.xib */; }; - 8C92ABF31FA773E50006FB5D /* UIChatNotifiedEventCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C92ABF21FA773E50006FB5D /* UIChatNotifiedEventCell.m */; }; - 8C9C5E0D1F83B2EF006987FA /* ChatConversationCreateCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C9C5E0C1F83B2EF006987FA /* ChatConversationCreateCollectionViewController.m */; }; - 8C9C5E111F83BD97006987FA /* UIChatCreateCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C9C5E0F1F83BD97006987FA /* UIChatCreateCollectionViewCell.m */; }; - 8CA2004C1D8158440095F859 /* PushKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8CA2004B1D8158440095F859 /* PushKit.framework */; }; - 8CA70AD11F9E0AE100A3D2EB /* ChatConversationInfoView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CA70AD01F9E0AE100A3D2EB /* ChatConversationInfoView.m */; }; - 8CA70AD41F9E285C00A3D2EB /* chat_group_add@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CA70AD21F9E285B00A3D2EB /* chat_group_add@2x.png */; }; - 8CA70AD51F9E285C00A3D2EB /* chat_group_add.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CA70AD31F9E285B00A3D2EB /* chat_group_add.png */; }; - 8CA70AE41F9E39E400A3D2EB /* UIChatConversationInfoTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CA70AE21F9E39E400A3D2EB /* UIChatConversationInfoTableViewCell.m */; }; - 8CB2B8F91F86229E0015CEE2 /* chat_secure.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CB2B8F61F86229B0015CEE2 /* chat_secure.png */; }; - 8CB2B8FA1F86229E0015CEE2 /* next_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CB2B8F71F86229C0015CEE2 /* next_disabled.png */; }; - 8CB2B8FB1F86229E0015CEE2 /* next_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CB2B8F81F86229D0015CEE2 /* next_disabled@2x.png */; }; - 8CBD7BA020B6B7FD00E5DCC0 /* ChatConversationInfoView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8CBD7BA220B6B7FD00E5DCC0 /* ChatConversationInfoView.xib */; }; - 8CBD7BA320B6B80D00E5DCC0 /* ChatConversationImdnView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8CBD7BA520B6B80D00E5DCC0 /* ChatConversationImdnView.xib */; }; - 8CBD7BA620B6B82400E5DCC0 /* UIChatConversationInfoTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8CBD7BA820B6B82400E5DCC0 /* UIChatConversationInfoTableViewCell.xib */; }; - 8CBD7BA920B6B82A00E5DCC0 /* UIChatConversationImdnTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8CBD7BAB20B6B82A00E5DCC0 /* UIChatConversationImdnTableViewCell.xib */; }; - 8CBD7BAC20B6B82F00E5DCC0 /* UIChatCreateCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8CBD7BAE20B6B82F00E5DCC0 /* UIChatCreateCollectionViewCell.xib */; }; - 8CD99A1C20908C27008A7CDA /* callkit_logo@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD99A1B20908C27008A7CDA /* callkit_logo@2x.png */; }; - 8CD99A372090A824008A7CDA /* splashscreen@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD99A352090A823008A7CDA /* splashscreen@2x.png */; }; - 8CD99A382090A824008A7CDA /* splashscreen.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CD99A362090A824008A7CDA /* splashscreen.png */; }; - 8CD99A3C2090B9FA008A7CDA /* ChatConversationImdnView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD99A3B2090B9FA008A7CDA /* ChatConversationImdnView.m */; }; - 8CD99A422090CE6F008A7CDA /* UIChatConversationImdnTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD99A412090CE6F008A7CDA /* UIChatConversationImdnTableViewCell.m */; }; - 8CDC61951F84D89B0087CF7F /* check_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CDC618C1F84D89B0087CF7F /* check_selected.png */; }; - 8CDC61971F84D9270087CF7F /* check_selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CDC61961F84D9270087CF7F /* check_selected@2x.png */; }; - 8CE24F4B1F8234A30077AC0A /* next_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CE24F491F8234A20077AC0A /* next_default.png */; }; - 8CE24F4C1F8234A30077AC0A /* next_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CE24F4A1F8234A30077AC0A /* next_default@2x.png */; }; - 8CE24F571F8268850077AC0A /* conference_delete.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CE24F551F8268840077AC0A /* conference_delete.png */; }; - 8CE24F581F8268850077AC0A /* conference_delete@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CE24F561F8268840077AC0A /* conference_delete@2x.png */; }; - 8CF25D951F9F336100BEA0C1 /* check_unselected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CF25D8B1F9F336000BEA0C1 /* check_unselected@2x.png */; }; - 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 */; }; - AC76CCEFDCD59EB01C2DE3F8 /* Pods_msgNotificationContent.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DA35546364BBF65F0DF5E8F /* Pods_msgNotificationContent.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 */; }; - C622E3EF26A81290004F5434 /* vr_stop.png in Resources */ = {isa = PBXBuildFile; fileRef = C622E3E926A8128F004F5434 /* vr_stop.png */; }; - C622E3F026A81290004F5434 /* vr_wave.png in Resources */ = {isa = PBXBuildFile; fileRef = C622E3EA26A8128F004F5434 /* vr_wave.png */; }; - C622E3F126A81290004F5434 /* vr_on.png in Resources */ = {isa = PBXBuildFile; fileRef = C622E3EB26A8128F004F5434 /* vr_on.png */; }; - C622E3F226A81290004F5434 /* vr_off.png in Resources */ = {isa = PBXBuildFile; fileRef = C622E3EC26A8128F004F5434 /* vr_off.png */; }; - C622E3F326A81290004F5434 /* vr_pause.png in Resources */ = {isa = PBXBuildFile; fileRef = C622E3ED26A8128F004F5434 /* vr_pause.png */; }; - C622E3F426A81290004F5434 /* vr_play.png in Resources */ = {isa = PBXBuildFile; fileRef = C622E3EE26A81290004F5434 /* vr_play.png */; }; - C63F720D285A24B10066163B /* ConfigManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7197285A24B10066163B /* ConfigManager.swift */; }; - C63F720E285A24B10066163B /* CallManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7198285A24B10066163B /* CallManager.swift */; }; - C63F720F285A24B10066163B /* ConferenceWaitingRoomViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F719B285A24B10066163B /* ConferenceWaitingRoomViewModel.swift */; }; - C63F7210285A24B10066163B /* ConferenceSchedulingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F719C285A24B10066163B /* ConferenceSchedulingViewModel.swift */; }; - C63F7211285A24B10066163B /* ScheduledConferencesViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F719D285A24B10066163B /* ScheduledConferencesViewModel.swift */; }; - C63F7212285A24B10066163B /* ScheduledConferenceData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F719F285A24B10066163B /* ScheduledConferenceData.swift */; }; - C63F7213285A24B10066163B /* TimeZoneData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71A0285A24B10066163B /* TimeZoneData.swift */; }; - C63F7214285A24B10066163B /* Duration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71A1285A24B10066163B /* Duration.swift */; }; - C63F7215285A24B10066163B /* ConferenceWaitingRoomFragment.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71A3285A24B10066163B /* ConferenceWaitingRoomFragment.swift */; }; - C63F7216285A24B10066163B /* ScheduledConferencesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71A4285A24B10066163B /* ScheduledConferencesView.swift */; }; - C63F7217285A24B10066163B /* ICSBubbleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71A5285A24B10066163B /* ICSBubbleView.swift */; }; - C63F7218285A24B10066163B /* ScheduledConferencesCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71A6285A24B10066163B /* ScheduledConferencesCell.swift */; }; - C63F7219285A24B10066163B /* ConferenceHistoryDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71A7285A24B10066163B /* ConferenceHistoryDetailsView.swift */; }; - C63F721A285A24B10066163B /* ConferenceSchedulingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71A8285A24B10066163B /* ConferenceSchedulingView.swift */; }; - C63F721B285A24B10066163B /* ConferenceSchedulingSummaryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71A9285A24B10066163B /* ConferenceSchedulingSummaryView.swift */; }; - C63F721C285A24B10066163B /* MediatorLiveData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71AC285A24B10066163B /* MediatorLiveData.swift */; }; - C63F721D285A24B10066163B /* MutableLiveData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71AD285A24B10066163B /* MutableLiveData.swift */; }; - C63F721E285A24B10066163B /* Pair.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71AE285A24B10066163B /* Pair.swift */; }; - C63F721F285A24B10066163B /* BackNextNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71AF285A24B10066163B /* BackNextNavigationView.swift */; }; - C63F7220285A24B10066163B /* TimestampUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71B0285A24B10066163B /* TimestampUtils.swift */; }; - C63F7221285A24B10066163B /* AppManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71B1285A24B10066163B /* AppManager.swift */; }; - C63F7222285A24B10066163B /* UIApplication+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71B4285A24B10066163B /* UIApplication+Extension.swift */; }; - C63F7224285A24B10066163B /* UIVIewControllerExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71B6285A24B10066163B /* UIVIewControllerExtensions.swift */; }; - C63F7225285A24B10066163B /* UIImageExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71B7285A24B10066163B /* UIImageExtensions.swift */; }; - C63F7226285A24B10066163B /* UIVIewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71B8285A24B10066163B /* UIVIewExtensions.swift */; }; - C63F7227285A24B10066163B /* UILabelExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71B9285A24B10066163B /* UILabelExtensions.swift */; }; - C63F7228285A24B10066163B /* OptionalExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71BA285A24B10066163B /* OptionalExtensions.swift */; }; - C63F7229285A24B10066163B /* UIButtonExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71BB285A24B10066163B /* UIButtonExtensions.swift */; }; - C63F722A285A24B10066163B /* UIImageViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71BC285A24B10066163B /* UIImageViewExtensions.swift */; }; - C63F722B285A24B10066163B /* UIDeviceExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71BD285A24B10066163B /* UIDeviceExtensions.swift */; }; - C63F722C285A24B10066163B /* UIColorExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71BE285A24B10066163B /* UIColorExtensions.swift */; }; - C63F722D285A24B10066163B /* CoreExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71C0285A24B10066163B /* CoreExtensions.swift */; }; - C63F722E285A24B10066163B /* IceState.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71C1285A24B10066163B /* IceState.swift */; }; - C63F722F285A24B10066163B /* AddressExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71C2285A24B10066163B /* AddressExtensions.swift */; }; - C63F7230285A24B10066163B /* ParticipantExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71C3285A24B10066163B /* ParticipantExtensions.swift */; }; - C63F7231285A24B10066163B /* PayloadType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71C4285A24B10066163B /* PayloadType.swift */; }; - C63F7232285A24B10066163B /* CallExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71C5285A24B10066163B /* CallExtensions.swift */; }; - C63F7233285A24B10066163B /* ConferenceExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71C6285A24B10066163B /* ConferenceExtensions.swift */; }; - C63F7234285A24B10066163B /* ConferenceViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71C9285A24B10066163B /* ConferenceViewModel.swift */; }; - C63F7235285A24B10066163B /* CallsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71CA285A24B10066163B /* CallsViewModel.swift */; }; - C63F7236285A24B10066163B /* ControlsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71CB285A24B10066163B /* ControlsViewModel.swift */; }; - C63F7237285A24B10066163B /* CallStatisticsData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71CC285A24B10066163B /* CallStatisticsData.swift */; }; - C63F7238285A24B10066163B /* ConferenceParticipantData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71CD285A24B10066163B /* ConferenceParticipantData.swift */; }; - C63F7239285A24B10066163B /* ConferenceParticipantDeviceData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71CE285A24B10066163B /* ConferenceParticipantDeviceData.swift */; }; - C63F723A285A24B10066163B /* CallData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71CF285A24B10066163B /* CallData.swift */; }; - C63F723B285A24B10066163B /* AudioRouteUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71D0285A24B10066163B /* AudioRouteUtils.swift */; }; - C63F723C285A24B10066163B /* LightDarkColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71D2285A24B10066163B /* LightDarkColor.swift */; }; - C63F723D285A24B10066163B /* TextStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71D3285A24B10066163B /* TextStyle.swift */; }; - C63F723E285A24B10066163B /* VoipTexts.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71D4285A24B10066163B /* VoipTexts.swift */; }; - C63F723F285A24B10066163B /* ButtonTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71D5285A24B10066163B /* ButtonTheme.swift */; }; - C63F7240285A24B10066163B /* VoipTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71D6285A24B10066163B /* VoipTheme.swift */; }; - C63F7241285A24B10066163B /* ParticipantsListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71DA285A24B10066163B /* ParticipantsListView.swift */; }; - C63F7242285A24B10066163B /* VoipParticipantCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71DB285A24B10066163B /* VoipParticipantCell.swift */; }; - C63F7243285A24B10066163B /* AudioRoutesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71DC285A24B10066163B /* AudioRoutesView.swift */; }; - C63F7244285A24B10066163B /* VoipActiveSpeakerParticipantCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71DE285A24B10066163B /* VoipActiveSpeakerParticipantCell.swift */; }; - C63F7245285A24B10066163B /* VoipConferenceAudioOnlyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71DF285A24B10066163B /* VoipConferenceAudioOnlyView.swift */; }; - C63F7246285A24B10066163B /* VoipGridParticipantCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71E0285A24B10066163B /* VoipGridParticipantCell.swift */; }; - C63F7247285A24B10066163B /* VoipAudioOnlyParticipantCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71E1285A24B10066163B /* VoipAudioOnlyParticipantCell.swift */; }; - C63F7248285A24B10066163B /* MicMuted.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71E2285A24B10066163B /* MicMuted.swift */; }; - C63F7249285A24B10066163B /* VoipConferenceGridView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71E3285A24B10066163B /* VoipConferenceGridView.swift */; }; - C63F724A285A24B10066163B /* VoipConferenceActiveSpeakerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71E4285A24B10066163B /* VoipConferenceActiveSpeakerView.swift */; }; - C63F724B285A24B10066163B /* VoipConferenceDisplayModeSelectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71E5285A24B10066163B /* VoipConferenceDisplayModeSelectionView.swift */; }; - C63F724C285A24B10066163B /* ActiveCallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71E7285A24B10066163B /* ActiveCallView.swift */; }; - C63F724D285A24B10066163B /* IncomingOuntgoingCommonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71E8285A24B10066163B /* IncomingOuntgoingCommonView.swift */; }; - C63F724E285A24B10066163B /* PausedCallOrConferenceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71E9285A24B10066163B /* PausedCallOrConferenceView.swift */; }; - C63F724F285A24B10066163B /* LocalVideoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71EA285A24B10066163B /* LocalVideoView.swift */; }; - C63F7250285A24B10066163B /* CallStatsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71EB285A24B10066163B /* CallStatsView.swift */; }; - C63F7251285A24B10066163B /* NumpadView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71EC285A24B10066163B /* NumpadView.swift */; }; - C63F7252285A24B10066163B /* VoipExtraButtonsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71ED285A24B10066163B /* VoipExtraButtonsView.swift */; }; - C63F7253285A24B10066163B /* VoipCallContextMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71EF285A24B10066163B /* VoipCallContextMenu.swift */; }; - C63F7254285A24B10066163B /* CallsListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71F0285A24B10066163B /* CallsListView.swift */; }; - C63F7255285A24B10066163B /* VoipCallCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71F1285A24B10066163B /* VoipCallCell.swift */; }; - C63F7256285A24B10066163B /* DismissableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71F2285A24B10066163B /* DismissableView.swift */; }; - C63F7257285A24B10066163B /* ConferenceLayoutPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71F3285A24B10066163B /* ConferenceLayoutPickerView.swift */; }; - C63F7258285A24B10066163B /* ControlsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71F4285A24B10066163B /* ControlsView.swift */; }; - C63F7259285A24B10066163B /* RemotelyRecording.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71F5285A24B10066163B /* RemotelyRecording.swift */; }; - C63F725A285A24B10066163B /* OutgoingCallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71F7285A24B10066163B /* OutgoingCallView.swift */; }; - C63F725B285A24B10066163B /* ActiveCallOrConferenceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71F8285A24B10066163B /* ActiveCallOrConferenceView.swift */; }; - C63F725C285A24B10066163B /* IncomingCallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71F9285A24B10066163B /* IncomingCallView.swift */; }; - C63F725D285A24B10066163B /* SharedLayoutConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71FA285A24B10066163B /* SharedLayoutConstants.swift */; }; - C63F725E285A24B10066163B /* VoipDialog.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71FB285A24B10066163B /* VoipDialog.swift */; }; - C63F725F285A24B10066163B /* StyledValuePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71FD285A24B10066163B /* StyledValuePicker.swift */; }; - C63F7260285A24B10066163B /* StyledSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71FE285A24B10066163B /* StyledSwitch.swift */; }; - C63F7261285A24B10066163B /* CallControlButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F71FF285A24B10066163B /* CallControlButton.swift */; }; - C63F7262285A24B10066163B /* RotatingSpinner.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7200285A24B10066163B /* RotatingSpinner.swift */; }; - C63F7263285A24B10066163B /* FormButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7201285A24B10066163B /* FormButton.swift */; }; - C63F7264285A24B10066163B /* BouncingCounter.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7202285A24B10066163B /* BouncingCounter.swift */; }; - C63F7265285A24B10066163B /* VoipExtraButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7203285A24B10066163B /* VoipExtraButton.swift */; }; - C63F7266285A24B10066163B /* UICallTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7204285A24B10066163B /* UICallTimer.swift */; }; - C63F7267285A24B10066163B /* StyledCheckBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7205285A24B10066163B /* StyledCheckBox.swift */; }; - C63F7268285A24B10066163B /* Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7206285A24B10066163B /* Avatar.swift */; }; - C63F7269285A24B10066163B /* StyledLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7207285A24B10066163B /* StyledLabel.swift */; }; - C63F726A285A24B10066163B /* StyledDatePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7208285A24B10066163B /* StyledDatePicker.swift */; }; - C63F726B285A24B10066163B /* ButtonWithStateBackgrounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F7209285A24B10066163B /* ButtonWithStateBackgrounds.swift */; }; - C63F726C285A24B10066163B /* StyledTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F720A285A24B10066163B /* StyledTextView.swift */; }; - C63F726D285A24B10066163B /* ProviderDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F720B285A24B10066163B /* ProviderDelegate.swift */; }; - C63F726E285A24B10066163B /* VFSUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F720C285A24B10066163B /* VFSUtil.swift */; }; - C63F726F285A24E90066163B /* VFSUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F720C285A24B10066163B /* VFSUtil.swift */; }; - C63F7270285A24E90066163B /* VFSUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F720C285A24B10066163B /* VFSUtil.swift */; }; - C63F72B5285A2F1D0066163B /* voip_dropdown.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7271285A2F140066163B /* voip_dropdown.png */; }; - C63F72B6285A2F1D0066163B /* voip_spinner.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7272285A2F140066163B /* voip_spinner.png */; }; - C63F72B7285A2F1D0066163B /* voip_numpad_7.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7273285A2F140066163B /* voip_numpad_7.png */; }; - C63F72B8285A2F1D0066163B /* voip_radio_off.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7274285A2F150066163B /* voip_radio_off.png */; }; - C63F72B9285A2F1D0066163B /* voip_export.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7275285A2F150066163B /* voip_export.png */; }; - C63F72BA285A2F1D0066163B /* voip_call_numpad.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7276285A2F150066163B /* voip_call_numpad.png */; }; - C63F72BB285A2F1D0066163B /* voip_chat_rooms_list.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7277285A2F150066163B /* voip_chat_rooms_list.png */; }; - C63F72BC285A2F1D0066163B /* voip_numpad_4.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7278285A2F150066163B /* voip_numpad_4.png */; }; - C63F72BD285A2F1D0066163B /* voip_call_header_incoming.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7279285A2F150066163B /* voip_call_header_incoming.png */; }; - C63F72BE285A2F1D0066163B /* voip_calls_list.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F727A285A2F150066163B /* voip_calls_list.png */; }; - C63F72BF285A2F1D0066163B /* voip_call_header_paused.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F727B285A2F160066163B /* voip_call_header_paused.png */; }; - C63F72C0285A2F1D0066163B /* voip_numpad_0.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F727C285A2F160066163B /* voip_numpad_0.png */; }; - C63F72C1285A2F1D0066163B /* voip_numpad_3.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F727D285A2F160066163B /* voip_numpad_3.png */; }; - C63F72C2285A2F1D0066163B /* voip_numpad_9.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F727E285A2F160066163B /* voip_numpad_9.png */; }; - C63F72C3285A2F1D0066163B /* voip_speaker_on.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F727F285A2F160066163B /* voip_speaker_on.png */; }; - C63F72C4285A2F1D0066163B /* voip_audio_routes.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7280285A2F160066163B /* voip_audio_routes.png */; }; - C63F72C5285A2F1E0066163B /* voip_call_record.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7281285A2F160066163B /* voip_call_record.png */; }; - C63F72C6285A2F1E0066163B /* voip_call_forward.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7282285A2F170066163B /* voip_call_forward.png */; }; - C63F72C7285A2F1E0066163B /* voip_change_camera.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7283285A2F170066163B /* voip_change_camera.png */; }; - C63F72C8285A2F1E0066163B /* voip_checkbox_checked.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7284285A2F170066163B /* voip_checkbox_checked.png */; }; - C63F72C9285A2F1E0066163B /* voip_info.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7285285A2F170066163B /* voip_info.png */; }; - C63F72CA285A2F1E0066163B /* voip_speaker_off.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7286285A2F170066163B /* voip_speaker_off.png */; }; - C63F72CB285A2F1E0066163B /* voip_call_more.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7287285A2F170066163B /* voip_call_more.png */; }; - C63F72CC285A2F1E0066163B /* voip_call_stats.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7288285A2F170066163B /* voip_call_stats.png */; }; - C63F72CD285A2F1E0066163B /* voip_numpad_8.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7289285A2F180066163B /* voip_numpad_8.png */; }; - C63F72CE285A2F1E0066163B /* voip_call_add.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F728A285A2F180066163B /* voip_call_add.png */; }; - C63F72CF285A2F1E0066163B /* voip_copy.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F728B285A2F180066163B /* voip_copy.png */; }; - C63F72D0285A2F1E0066163B /* voip_conference_paused_big.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F728C285A2F180066163B /* voip_conference_paused_big.png */; }; - C63F72D1285A2F1E0066163B /* voip_numpad_star.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F728D285A2F180066163B /* voip_numpad_star.png */; }; - C63F72D2285A2F1E0066163B /* voip_numpad_hash.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F728E285A2F180066163B /* voip_numpad_hash.png */; }; - C63F72D3285A2F1E0066163B /* voip_multiple_contacts_avatar.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F728F285A2F180066163B /* voip_multiple_contacts_avatar.png */; }; - C63F72D4285A2F1E0066163B /* voip_remote_recording.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7290285A2F180066163B /* voip_remote_recording.png */; }; - C63F72D5285A2F1E0066163B /* voip_hangup.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7291285A2F190066163B /* voip_hangup.png */; }; - C63F72D6285A2F1E0066163B /* voip_pause.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7292285A2F190066163B /* voip_pause.png */; }; - C63F72D7285A2F1E0066163B /* voip_numpad_1.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7293285A2F190066163B /* voip_numpad_1.png */; }; - C63F72D8285A2F1E0066163B /* voip_mandatory.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7294285A2F190066163B /* voip_mandatory.png */; }; - C63F72D9285A2F1E0066163B /* voip_earpiece.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7295285A2F190066163B /* voip_earpiece.png */; }; - C63F72DA285A2F1E0066163B /* voip_numpad_2.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7296285A2F190066163B /* voip_numpad_2.png */; }; - C63F72DB285A2F1E0066163B /* voip_conference_audio_only.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7297285A2F190066163B /* voip_conference_audio_only.png */; }; - C63F72DC285A2F1E0066163B /* voip_menu_more.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7298285A2F1A0066163B /* voip_menu_more.png */; }; - C63F72DD285A2F1E0066163B /* voip_conference_new.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F7299285A2F1A0066163B /* voip_conference_new.png */; }; - C63F72DE285A2F1E0066163B /* voip_call_header_active.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F729A285A2F1A0066163B /* voip_call_header_active.png */; }; - C63F72DF285A2F1E0066163B /* voip_bluetooth.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F729B285A2F1A0066163B /* voip_bluetooth.png */; }; - C63F72E0285A2F1E0066163B /* voip_micro_off.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F729C285A2F1A0066163B /* voip_micro_off.png */; }; - C63F72E1285A2F1E0066163B /* voip_camera_on.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F729D285A2F1A0066163B /* voip_camera_on.png */; }; - C63F72E2285A2F1E0066163B /* voip_conference_play_big.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F729E285A2F1A0066163B /* voip_conference_play_big.png */; }; - C63F72E3285A2F1E0066163B /* voip_call.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F729F285A2F1B0066163B /* voip_call.png */; }; - C63F72E4285A2F1E0066163B /* voip_call_list_menu.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72A0285A2F1B0066163B /* voip_call_list_menu.png */; }; - C63F72E5285A2F1E0066163B /* voip_conference_active_speaker.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72A1285A2F1B0066163B /* voip_conference_active_speaker.png */; }; - C63F72E6285A2F1E0066163B /* voip_numpad_6.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72A2285A2F1B0066163B /* voip_numpad_6.png */; }; - C63F72E7285A2F1E0066163B /* voip_call_participants.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72A3285A2F1B0066163B /* voip_call_participants.png */; }; - C63F72E8285A2F1E0066163B /* conference_schedule_calendar_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72A4285A2F1B0066163B /* conference_schedule_calendar_default.png */; }; - C63F72E9285A2F1E0066163B /* voip_call_chat.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72A5285A2F1B0066163B /* voip_call_chat.png */; }; - C63F72EA285A2F1E0066163B /* voip_checkbox_unchecked.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72A6285A2F1B0066163B /* voip_checkbox_unchecked.png */; }; - C63F72EB285A2F1E0066163B /* voip_edit.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72A7285A2F1C0066163B /* voip_edit.png */; }; - C63F72EC285A2F1E0066163B /* conference_schedule_time_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72A8285A2F1C0066163B /* conference_schedule_time_default.png */; }; - C63F72ED285A2F1E0066163B /* voip_merge_calls.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72A9285A2F1C0066163B /* voip_merge_calls.png */; }; - C63F72EE285A2F1E0066163B /* voip_camera_off.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72AA285A2F1C0066163B /* voip_camera_off.png */; }; - C63F72EF285A2F1E0066163B /* voip_micro_on.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72AB285A2F1C0066163B /* voip_micro_on.png */; }; - C63F72F0285A2F1E0066163B /* voip_radio_on.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72AC285A2F1C0066163B /* voip_radio_on.png */; }; - C63F72F1285A2F1E0066163B /* conference_schedule_participants_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72AD285A2F1C0066163B /* conference_schedule_participants_default.png */; }; - C63F72F2285A2F1E0066163B /* voip_conference_mosaic.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72AE285A2F1D0066163B /* voip_conference_mosaic.png */; }; - C63F72F3285A2F1E0066163B /* voip_numpad_5.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72AF285A2F1D0066163B /* voip_numpad_5.png */; }; - C63F72F4285A2F1E0066163B /* voip_conference_new_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72B0285A2F1D0066163B /* voip_conference_new_selected.png */; }; - C63F72F5285A2F1E0066163B /* voip_single_contact_avatar.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72B1285A2F1D0066163B /* voip_single_contact_avatar.png */; }; - C63F72F6285A2F1E0066163B /* voip_delete.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72B2285A2F1D0066163B /* voip_delete.png */; }; - C63F72F7285A2F1E0066163B /* voip_cancel.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72B3285A2F1D0066163B /* voip_cancel.png */; }; - C63F72F8285A2F1E0066163B /* voip_call_header_outgoing.png in Resources */ = {isa = PBXBuildFile; fileRef = C63F72B4285A2F1D0066163B /* voip_call_header_outgoing.png */; }; - C63F72FD285A31DA0066163B /* Roboto-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C63F72FA285A31DA0066163B /* Roboto-Regular.ttf */; }; - C63F72FE285A31DA0066163B /* Roboto-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C63F72FB285A31DA0066163B /* Roboto-Italic.ttf */; }; - C63F72FF285A31DA0066163B /* Roboto-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C63F72FC285A31DA0066163B /* Roboto-Bold.ttf */; }; - C64A854E2667B67200252AD2 /* EphemeralSettingsView.m in Sources */ = {isa = PBXBuildFile; fileRef = C64A854D2667B67200252AD2 /* EphemeralSettingsView.m */; }; - C64A85502667B67A00252AD2 /* EphemeralSettingsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C64A854F2667B67A00252AD2 /* EphemeralSettingsView.xib */; }; - C64A85522667B74100252AD2 /* ephemeral_messages_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C64A85512667B74100252AD2 /* ephemeral_messages_default.png */; }; - C66B03BB26E8EB1A009B5EDC /* UIChatReplyBubbleView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C66B03BD26E8EB1A009B5EDC /* UIChatReplyBubbleView.xib */; }; - C66B040A26EFDA55009B5EDC /* reply_cancel.png in Resources */ = {isa = PBXBuildFile; fileRef = C66B040926EFDA54009B5EDC /* reply_cancel.png */; }; - C66B040E26F095D1009B5EDC /* cancel_forward.png in Resources */ = {isa = PBXBuildFile; fileRef = C66B040D26F095CE009B5EDC /* cancel_forward.png */; }; - C6A1BB3526E8815400540D50 /* menu_info.png in Resources */ = {isa = PBXBuildFile; fileRef = C6A1BB3126E8815300540D50 /* menu_info.png */; }; - C6A1BB3626E8815400540D50 /* menu_forward_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6A1BB3226E8815400540D50 /* menu_forward_default.png */; }; - C6A1BB3726E8815400540D50 /* menu_copy_text_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6A1BB3326E8815400540D50 /* menu_copy_text_default.png */; }; - C6A1BB3826E8815400540D50 /* menu_reply_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6A1BB3426E8815400540D50 /* menu_reply_default.png */; }; - C6A1BB3A26E881E100540D50 /* menu_delete.png in Resources */ = {isa = PBXBuildFile; fileRef = C6A1BB3926E881E100540D50 /* menu_delete.png */; }; - C6A1BB3E26E882D000540D50 /* UIChatReplyBubbleView.m in Sources */ = {isa = PBXBuildFile; fileRef = C6A1BB3C26E882D000540D50 /* UIChatReplyBubbleView.m */; }; - C6A1BB4126E889AD00540D50 /* forward_message_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6A1BB4026E889AD00540D50 /* forward_message_default.png */; }; - C6A1BB4326E88F7C00540D50 /* menu_resend_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6A1BB4226E88F7C00540D50 /* menu_resend_default.png */; }; - C6A1BB4526E890BD00540D50 /* file_voice_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6A1BB4426E890BD00540D50 /* file_voice_default.png */; }; - C6B4444226AAD0980076C517 /* file_video_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6B4443D26AAD0970076C517 /* file_video_default.png */; }; - C6B4444326AAD0980076C517 /* file_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6B4443E26AAD0970076C517 /* file_default.png */; }; - C6B4444426AAD0980076C517 /* file_picture_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6B4443F26AAD0970076C517 /* file_picture_default.png */; }; - C6B4444526AAD0980076C517 /* file_audio_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6B4444026AAD0970076C517 /* file_audio_default.png */; }; - C6B4444626AAD0980076C517 /* file_pdf_default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6B4444126AAD0970076C517 /* file_pdf_default.png */; }; - C6B4444826AADA530076C517 /* SwiftUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6B4444726AADA530076C517 /* SwiftUtil.swift */; }; - C6F55645287CC69F0056E213 /* voip_meeting_schedule.png in Resources */ = {isa = PBXBuildFile; fileRef = C6F55644287CC69F0056E213 /* voip_meeting_schedule.png */; }; - C6F55647287CCFB70056E213 /* menu_voip_meeting_schedule.png in Resources */ = {isa = PBXBuildFile; fileRef = C6F55646287CCFB60056E213 /* menu_voip_meeting_schedule.png */; }; - C90FAA7915AF54E6002091CB /* HistoryDetailsView.m in Sources */ = {isa = PBXBuildFile; fileRef = C90FAA7715AF54E6002091CB /* HistoryDetailsView.m */; }; - CF15F21E20E4F9A3008B1DE6 /* UIImageViewDeletable.m in Sources */ = {isa = PBXBuildFile; fileRef = CF15F21C20E4F9A3008B1DE6 /* UIImageViewDeletable.m */; }; - CF15F21F20E4F9A3008B1DE6 /* UIImageViewDeletable.xib in Resources */ = {isa = PBXBuildFile; fileRef = CF15F21D20E4F9A3008B1DE6 /* UIImageViewDeletable.xib */; }; - CF1DE92D210A0F5D00A0A97E /* UILinphoneAudioPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = CF1DE924210A0F5A00A0A97E /* UILinphoneAudioPlayer.m */; }; - CF1DE92E210A0F5D00A0A97E /* UILinphoneAudioPlayer.xib in Resources */ = {isa = PBXBuildFile; fileRef = CF1DE92B210A0F5B00A0A97E /* UILinphoneAudioPlayer.xib */; }; - CF7602D7210867E800749F76 /* RecordingsListView.m in Sources */ = {isa = PBXBuildFile; fileRef = CF7602D5210867E800749F76 /* RecordingsListView.m */; }; - CF7602E221086EB200749F76 /* RecordingsListTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = CF7602E021086EB200749F76 /* RecordingsListTableView.m */; }; - CF7602E72108759A00749F76 /* UIRecordingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CF7602E52108759A00749F76 /* UIRecordingCell.m */; }; - CF7602E82108759A00749F76 /* UIRecordingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CF7602E62108759A00749F76 /* UIRecordingCell.xib */; }; - CF7602F5210898CC00749F76 /* rec_off_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CF7602EB210898C100749F76 /* rec_off_default@2x.png */; }; - CF7602F6210898CC00749F76 /* rec_on_default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CF7602F2210898C400749F76 /* rec_on_default@2x.png */; }; - CF7602F7210898CC00749F76 /* rec_off_default.png in Resources */ = {isa = PBXBuildFile; fileRef = CF7602F3210898C600749F76 /* rec_off_default.png */; }; - CF7602F8210898CC00749F76 /* rec_on_default.png in Resources */ = {isa = PBXBuildFile; fileRef = CF7602F4210898C800749F76 /* rec_on_default.png */; }; - CFBD7A2A20E504AE007C5286 /* delete_img.png in Resources */ = {isa = PBXBuildFile; fileRef = CFBD7A2320E504AD007C5286 /* delete_img.png */; }; - D306459E1611EC2A00BB571E /* UILoadingImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = D306459D1611EC2900BB571E /* UILoadingImageView.m */; }; - D3128FE115AABC7E00A2147A /* ContactDetailsView.m in Sources */ = {isa = PBXBuildFile; fileRef = D3128FDF15AABC7E00A2147A /* ContactDetailsView.m */; }; - D31B4B21159876C0002E6C72 /* UICompositeView.m in Sources */ = {isa = PBXBuildFile; fileRef = D31B4B1F159876C0002E6C72 /* UICompositeView.m */; }; - D31C9C98158A1CDF00756B45 /* UIHistoryCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D31C9C97158A1CDE00756B45 /* UIHistoryCell.m */; }; - D326483815887D5200930C67 /* OrderedDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = D326483715887D5200930C67 /* OrderedDictionary.m */; }; - D32648441588F6FC00930C67 /* UIToggleButton.m in Sources */ = {isa = PBXBuildFile; fileRef = D32648431588F6FB00930C67 /* UIToggleButton.m */; }; - D32B6E2915A5BC440033019F /* ChatConversationTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = D32B6E2815A5BC430033019F /* ChatConversationTableView.m */; }; - D32B9DFC15A2F131000B6DEC /* FastAddressBook.m in Sources */ = {isa = PBXBuildFile; fileRef = D32B9DFB15A2F131000B6DEC /* FastAddressBook.m */; }; - D34F6F9E1594D3FB0095705B /* InAppSettings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = D34F6F9D1594D3FB0095705B /* InAppSettings.bundle */; }; - D350F20E15A43BB100149E54 /* AssistantView.m in Sources */ = {isa = PBXBuildFile; fileRef = D350F20C15A43BB100149E54 /* AssistantView.m */; }; - D35497FE15875372000081D8 /* ContactsListView.m in Sources */ = {isa = PBXBuildFile; fileRef = D35497FC15875372000081D8 /* ContactsListView.m */; }; - D3549816158761D0000081D8 /* ContactsListTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = D3549815158761D0000081D8 /* ContactsListTableView.m */; }; - D35498211587716B000081D8 /* StatusBarView.m in Sources */ = {isa = PBXBuildFile; fileRef = D354981F1587716B000081D8 /* StatusBarView.m */; }; - D35860D615B549B500513429 /* Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = D35860D515B549B500513429 /* Utils.m */; }; - D35C5F1B660753F3FF79848A /* Pods_CallUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49381ABF67DC815C5F299A43 /* Pods_CallUITests.framework */; }; - D35E7597159460580066B1C1 /* ChatsListView.m in Sources */ = {isa = PBXBuildFile; fileRef = D35E7595159460560066B1C1 /* ChatsListView.m */; }; - D35E759F159460B70066B1C1 /* SettingsView.m in Sources */ = {isa = PBXBuildFile; fileRef = D35E759D159460B50066B1C1 /* SettingsView.m */; }; - D378AB2A15DCDB4A0098505D /* ImagePickerView.m in Sources */ = {isa = PBXBuildFile; fileRef = D378AB2915DCDB490098505D /* ImagePickerView.m */; }; - D37C639B15AADEF6009D0BAC /* ContactDetailsTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = D37C639A15AADEF5009D0BAC /* ContactDetailsTableView.m */; }; - D37DC6C11594AE1800B2A5EB /* LinphoneCoreSettingsStore.m in Sources */ = {isa = PBXBuildFile; fileRef = D37DC6C01594AE1800B2A5EB /* LinphoneCoreSettingsStore.m */; }; - D37DC7181594AF3400B2A5EB /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D37DC7171594AF3400B2A5EB /* MessageUI.framework */; }; - D37E3ECD1619C27A0087659A /* CAAnimation+Blocks.m in Sources */ = {isa = PBXBuildFile; fileRef = D37E3ECC1619C27A0087659A /* CAAnimation+Blocks.m */; }; - D37EE10D16035793003608A6 /* ImageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D37EE11016035793003608A6 /* ImageView.xib */; }; - D37EE162160377D7003608A6 /* DTActionSheet.m in Sources */ = {isa = PBXBuildFile; fileRef = D37EE161160377D7003608A6 /* DTActionSheet.m */; }; - D3807FBF15C28940005BE9BC /* DCRoundSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FB815C28940005BE9BC /* DCRoundSwitch.m */; }; - D3807FC115C28940005BE9BC /* DCRoundSwitchKnobLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FBA15C28940005BE9BC /* DCRoundSwitchKnobLayer.m */; }; - D3807FC315C28940005BE9BC /* DCRoundSwitchOutlineLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FBC15C28940005BE9BC /* DCRoundSwitchOutlineLayer.m */; }; - D3807FC515C28940005BE9BC /* DCRoundSwitchToggleLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FBE15C28940005BE9BC /* DCRoundSwitchToggleLayer.m */; }; - D3807FE815C2894A005BE9BC /* IASKAppSettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FCA15C2894A005BE9BC /* IASKAppSettingsViewController.m */; settings = {COMPILER_FLAGS = "-Wno-deprecated-declarations -Wno-objc-designated-initializers"; }; }; - D3807FEC15C2894A005BE9BC /* IASKSpecifierValuesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FCE15C2894A005BE9BC /* IASKSpecifierValuesViewController.m */; }; - D3807FEE15C2894A005BE9BC /* IASKSettingsReader.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FD215C2894A005BE9BC /* IASKSettingsReader.m */; }; - D3807FF015C2894A005BE9BC /* IASKSettingsStore.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FD415C2894A005BE9BC /* IASKSettingsStore.m */; }; - D3807FF215C2894A005BE9BC /* IASKSettingsStoreFile.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FD615C2894A005BE9BC /* IASKSettingsStoreFile.m */; }; - D3807FF415C2894A005BE9BC /* IASKSettingsStoreUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FD815C2894A005BE9BC /* IASKSettingsStoreUserDefaults.m */; }; - D3807FF615C2894A005BE9BC /* IASKSpecifier.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FDA15C2894A005BE9BC /* IASKSpecifier.m */; settings = {COMPILER_FLAGS = "-Wno-deprecated-declarations"; }; }; - D3807FF815C2894A005BE9BC /* IASKPSSliderSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FDD15C2894A005BE9BC /* IASKPSSliderSpecifierViewCell.m */; }; - D3807FFA15C2894A005BE9BC /* IASKPSTextFieldSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FDF15C2894A005BE9BC /* IASKPSTextFieldSpecifierViewCell.m */; settings = {COMPILER_FLAGS = "-Wno-deprecated-declarations"; }; }; - D3807FFC15C2894A005BE9BC /* IASKPSTitleValueSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FE115C2894A005BE9BC /* IASKPSTitleValueSpecifierViewCell.m */; }; - D3807FFE15C2894A005BE9BC /* IASKSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FE315C2894A005BE9BC /* IASKSlider.m */; }; - D380800015C2894A005BE9BC /* IASKSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FE515C2894A005BE9BC /* IASKSwitch.m */; }; - D380800215C2894A005BE9BC /* IASKTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = D3807FE715C2894A005BE9BC /* IASKTextField.m */; }; - D380801315C299D0005BE9BC /* ColorSpaceUtilites.m in Sources */ = {isa = PBXBuildFile; fileRef = D380801215C299D0005BE9BC /* ColorSpaceUtilites.m */; }; - D38187AD15FE340100C3EDCA /* ChatConversationView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D38187B015FE340100C3EDCA /* ChatConversationView.xib */; }; - D38187B115FE340500C3EDCA /* ChatsListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D38187B415FE340500C3EDCA /* ChatsListView.xib */; }; - D38187B915FE342200C3EDCA /* ContactDetailsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D38187BC15FE342200C3EDCA /* ContactDetailsView.xib */; }; - D38187BD15FE342800C3EDCA /* ContactsListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D38187C015FE342800C3EDCA /* ContactsListView.xib */; }; - D38187C115FE345B00C3EDCA /* DialerView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D38187C415FE345B00C3EDCA /* DialerView.xib */; }; - D38187CD15FE346700C3EDCA /* HistoryDetailsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D38187D015FE346700C3EDCA /* HistoryDetailsView.xib */; }; - D38187D115FE346B00C3EDCA /* HistoryListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D38187D415FE346B00C3EDCA /* HistoryListView.xib */; }; - D38187DD15FE348A00C3EDCA /* AssistantView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D38187E015FE348A00C3EDCA /* AssistantView.xib */; }; - D38187F815FE355D00C3EDCA /* TabBarView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D38187FB15FE355D00C3EDCA /* TabBarView.xib */; }; - D3A55FBC15877E5E003FD403 /* UIContactCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D3A55FBB15877E5E003FD403 /* UIContactCell.m */; }; - D3A8BB7015A6C7D500F96BE5 /* UIChatBubbleTextCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D3A8BB6F15A6C7D500F96BE5 /* UIChatBubbleTextCell.m */; }; - D3C6526715AC1A8F0092A874 /* UIContactDetailsCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D3C6526615AC1A8F0092A874 /* UIContactDetailsCell.m */; }; - D3D5126C160B3A8E00946DF8 /* AssistantViewScreens.xib in Resources */ = {isa = PBXBuildFile; fileRef = D3D5126A160B3A8E00946DF8 /* AssistantViewScreens.xib */; }; - D3EA53FD159850E80037DC6B /* LinphoneManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D3EA53FC159850E80037DC6B /* LinphoneManager.m */; }; - D3EA540D1598528B0037DC6B /* ChatsListTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = D3EA540C1598528B0037DC6B /* ChatsListTableView.m */; }; - D3EA5411159853750037DC6B /* UIChatCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D3EA5410159853750037DC6B /* UIChatCell.m */; }; - D3ED3E871586291E006C0DE4 /* TabBarView.m in Sources */ = {isa = PBXBuildFile; fileRef = D3ED3E851586291B006C0DE4 /* TabBarView.m */; }; - D3ED3EA71587334E006C0DE4 /* HistoryListTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = D3ED3EA51587334C006C0DE4 /* HistoryListTableView.m */; }; - D3ED3EB81587392C006C0DE4 /* HistoryListView.m in Sources */ = {isa = PBXBuildFile; fileRef = D3ED3EB615873929006C0DE4 /* HistoryListView.m */; }; - D3F795D615A582810077328B /* ChatConversationView.m in Sources */ = {isa = PBXBuildFile; fileRef = D3F795D415A582800077328B /* ChatConversationView.m */; }; - D3F7998115BD32370018C273 /* TPMultiLayoutViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D3F7998015BD32370018C273 /* TPMultiLayoutViewController.m */; }; - D3F83F8E15822ABE00336684 /* PhoneMainView.m in Sources */ = {isa = PBXBuildFile; fileRef = D3F83F8D15822ABD00336684 /* PhoneMainView.m */; }; - E4440DC2FC040E5FE40BA5AF /* Pods_linphone.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A6FD9930E5B1F4149D45BB1C /* Pods_linphone.framework */; }; - EA0007A62356008F003CC6BF /* msgNotificationService.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = EA5F25D9232BD3E200475F2E /* msgNotificationService.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - EA3650DB2330D2E30001148A /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA5F25DB232BD3E200475F2E /* NotificationService.swift */; }; - EA88A405242A6216007FEC61 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBC41B6A0FF200AA16FD /* Localizable.strings */; }; - EA88A407242A6235007FEC61 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 63AADBC41B6A0FF200AA16FD /* Localizable.strings */; }; - EA88F3AB241BD05200E66528 /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C73477B1D9BA3A00022EE8C /* UserNotifications.framework */; }; - EA88F3AC241BD05200E66528 /* UserNotificationsUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E58962520DCE5700030868C /* UserNotificationsUI.framework */; }; - EA88F3AF241BD1F700E66528 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = EA8CB82D239F96CA00C330CC /* MainInterface.storyboard */; }; - EA8CB82C239F96CA00C330CC /* NotificationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA8CB82B239F96CA00C330CC /* NotificationViewController.swift */; }; - EA8CB833239F96CA00C330CC /* msgNotificationContent.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = EA8CB827239F96CA00C330CC /* msgNotificationContent.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - EAE6C88423FABF690076A018 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAE6C88323FABF690076A018 /* Utils.swift */; }; - EAE6C88523FABF690076A018 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAE6C88323FABF690076A018 /* Utils.swift */; }; - F03CA84318C72F1A0008889D /* UITextViewNoDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = F03CA84218C72F1A0008889D /* UITextViewNoDefine.m */; }; - F05BAA621A5D594E00411815 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F05BAA611A5D594E00411815 /* libz.dylib */; }; - F0642EF119DAC891009DB336 /* MainStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F0642EF019DAC891009DB336 /* MainStoryboard.storyboard */; }; - F088488A19FF8C41007FFCF3 /* UIContactCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F088488D19FF8C41007FFCF3 /* UIContactCell.xib */; }; - F0938159188E629800A55DFA /* iTunesArtwork in Resources */ = {isa = PBXBuildFile; fileRef = F0938158188E629800A55DFA /* iTunesArtwork */; }; - F0B026F31AA710AF00FF49F7 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F0B026F21AA710AF00FF49F7 /* libiconv.dylib */; }; - F0B89C2218DC89E30050B60E /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F0B89C2118DC89E30050B60E /* MediaPlayer.framework */; }; - FDC67FA1FCA8461F10C4F5DA /* Pods_AutoConnectLinphoneAccount.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D7EC2D3C18D2264B85F21385 /* Pods_AutoConnectLinphoneAccount.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 61AE365420C00B370089D9D3 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 61AE364A20C00B370089D9D3; - remoteInfo = linphoneExtension; - }; - 6637AF93288593AF00965733 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1D6058900D05DD3D006BFB54; - remoteInfo = linphone; - }; - 66495CFF288FF346002780DE /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1D6058900D05DD3D006BFB54; - remoteInfo = linphone; - }; - EA88F393241BC1F400E66528 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = EA5F25D8232BD3E200475F2E; - remoteInfo = msgNotificationService; - }; - EA88F394241BC1F400E66528 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = EA8CB826239F96CA00C330CC; - remoteInfo = msgNotificationContent; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 5EF0C35020C806A5005081B0 /* Embed App Extensions */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 13; - files = ( - 61AE365620C00B370089D9D3 /* linphoneExtension.appex in Embed App Extensions */, - EA8CB833239F96CA00C330CC /* msgNotificationContent.appex in Embed App Extensions */, - EA0007A62356008F003CC6BF /* msgNotificationService.appex in Embed App Extensions */, - ); - name = "Embed App Extensions"; - runOnlyForDeploymentPostprocessing = 0; - }; - 8CDC89061EAF89A8006B5652 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 152F22351B15E889008C0621 /* libxml2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libxml2.dylib; path = usr/lib/libxml2.dylib; sourceTree = SDKROOT; }; - 1A10E1CD088B6550326F433E /* 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 = ""; }; - 1CAD1CF40E820DA7F1752DD2 /* Pods-CallUITests.distribution.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CallUITests.distribution.xcconfig"; path = "Target Support Files/Pods-CallUITests/Pods-CallUITests.distribution.xcconfig"; sourceTree = ""; }; - 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; }; - 1DA35546364BBF65F0DF5E8F /* Pods_msgNotificationContent.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_msgNotificationContent.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 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 = ""; }; - 22276E8613C73D8A00210156 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; - 22276E8813C73DC000210156 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; - 22405EED1600B4E400B92522 /* AssetsLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AssetsLibrary.framework; path = System/Library/Frameworks/AssetsLibrary.framework; sourceTree = SDKROOT; }; - 22405EFD1601C19000B92522 /* ImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageView.h; sourceTree = ""; }; - 22405EFE1601C19100B92522 /* ImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ImageView.m; sourceTree = ""; }; - 224567C1107B968500F10948 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - 2248E90C12F7E4CF00220D9C /* UIDigitButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIDigitButton.h; sourceTree = ""; }; - 2248E90D12F7E4CF00220D9C /* UIDigitButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIDigitButton.m; sourceTree = ""; }; - 2264B6D111200342002C2C53 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - 226EF06B15FA256B005865C7 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; - 22744019106F31BD006EC466 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; - 2274402E106F335E006EC466 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - 22744043106F33FC006EC466 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; - 22744056106F9BC9006EC466 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; }; - 228697C311AC29B800E9E0CA /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; - 22AA8AFF13D83F6300B30535 /* UICamSwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UICamSwitch.h; sourceTree = ""; }; - 22AA8B0013D83F6300B30535 /* UICamSwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UICamSwitch.m; sourceTree = ""; }; - 22B5EFA210CE50BD00777D97 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; - 22B5F03410CE6B2F00777D97 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; - 22D1B68012A3E0BE001AE361 /* libresolv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libresolv.dylib; path = usr/lib/libresolv.dylib; sourceTree = SDKROOT; }; - 22E0A81C111C44E100B04932 /* AboutView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AboutView.m; sourceTree = ""; }; - 22E0A81D111C44E100B04932 /* AboutView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AboutView.h; sourceTree = ""; }; - 22F2508B107141E100AC9B3F /* DialerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DialerView.h; sourceTree = ""; }; - 22F2508C107141E100AC9B3F /* DialerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = DialerView.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - 244523AC1E8266CC0037A187 /* chat_delivered.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_delivered.png; sourceTree = ""; }; - 244523AD1E8266CC0037A187 /* chat_error.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_error.png; sourceTree = ""; }; - 244523AE1E8266CC0037A187 /* chat_read.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_read.png; sourceTree = ""; }; - 244523BC1E8D3A6C0037A187 /* chat_unsecure.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_unsecure.png; sourceTree = ""; }; - 249660941FD6A359001D55AA /* Photos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Photos.framework; path = System/Library/Frameworks/Photos.framework; sourceTree = SDKROOT; }; - 24A3459D1D95797700881A5C /* UIShopTableCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UIShopTableCell.xib; sourceTree = ""; }; - 24A345A51D95798A00881A5C /* UIShopTableCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIShopTableCell.m; sourceTree = ""; }; - 24A345A71D95799900881A5C /* UIShopTableCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIShopTableCell.h; sourceTree = ""; }; - 24BFAA8C209B062B004F47A7 /* dialer_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = dialer_background.png; sourceTree = ""; }; - 24BFAA93209B062C004F47A7 /* linphone_user.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = linphone_user.png; sourceTree = ""; }; - 24BFAA94209B062C004F47A7 /* contacts_sip_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "contacts_sip_default@2x.png"; sourceTree = ""; }; - 24BFAA95209B062D004F47A7 /* linphone_user@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "linphone_user@2x.png"; sourceTree = ""; }; - 24BFAA96209B062D004F47A7 /* linphone_user~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "linphone_user~ipad@2x.png"; sourceTree = ""; }; - 24BFAA97209B062E004F47A7 /* contacts_sip_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = contacts_sip_selected.png; sourceTree = ""; }; - 24BFAA98209B062E004F47A7 /* linphone_logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = linphone_logo.png; sourceTree = ""; }; - 24BFAA99209B062E004F47A7 /* contacts_sip_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = contacts_sip_default.png; sourceTree = ""; }; - 24BFAA9A209B062F004F47A7 /* linphone_user~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "linphone_user~ipad.png"; sourceTree = ""; }; - 24BFAA9B209B062F004F47A7 /* callkit_logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = callkit_logo.png; sourceTree = ""; }; - 24BFAA9C209B062F004F47A7 /* contacts_sip_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "contacts_sip_selected@2x.png"; sourceTree = ""; }; - 24BFAA9D209B0630004F47A7 /* linphone_logo@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "linphone_logo@2x.png"; sourceTree = ""; }; - 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 = ""; }; - 32CA4F630368D1EE00C91783 /* linphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linphone_Prefix.pch; sourceTree = ""; }; - 340751961506459A00B89C47 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; }; - 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; }; - 3E068193AC70B1F268F7A3AC /* Pods-ConferenceUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ConferenceUITests.release.xcconfig"; path = "Target Support Files/Pods-ConferenceUITests/Pods-ConferenceUITests.release.xcconfig"; sourceTree = ""; }; - 3EDEA8FA8B616DA71EDE51E5 /* 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 = ""; }; - 49381ABF67DC815C5F299A43 /* Pods_CallUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CallUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 49BCAA5D96F3C5BE44D20A5C /* 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 = ""; }; - 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 = ""; }; - 570742661D5A63DB004B9C84 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; - 595A41ABC48A62CE11868F9E /* 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 = ""; }; - 5BF3D86E8AD8910810048241 /* 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 = ""; }; - 5E58962520DCE5700030868C /* UserNotificationsUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotificationsUI.framework; path = System/Library/Frameworks/UserNotificationsUI.framework; sourceTree = SDKROOT; }; - 5EF0C33820C806A5005081B0 /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; }; - 5F0358460E4E618A3DC6E2E8 /* Pods-CallUITests.distribution.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CallUITests.distribution.xcconfig"; path = "Target Support Files/Pods-CallUITests/Pods-CallUITests.distribution.xcconfig"; sourceTree = ""; }; - 6112A01B243B31A600DBD5F5 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - 6112A01D243B5FD500DBD5F5 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - 6130C85B22BBB493009CC79C /* LaunchScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LaunchScreen.h; sourceTree = ""; }; - 6135761A240E81AC005304D4 /* UIInterfaceStyleButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIInterfaceStyleButton.h; sourceTree = ""; }; - 6135761B240E81BA005304D4 /* UIInterfaceStyleButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIInterfaceStyleButton.m; sourceTree = ""; }; - 6135761D240E81C7005304D4 /* UIInterfaceStyleToggleButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIInterfaceStyleToggleButton.h; sourceTree = ""; }; - 6135761E240E81D0005304D4 /* UIInterfaceStyleToggleButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIInterfaceStyleToggleButton.m; sourceTree = ""; }; - 614C087623D1A35E00217F80 /* linphone-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "linphone-Bridging-Header.h"; sourceTree = ""; }; - 614D09CD21E74D5400C43EDF /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - 61586B7A217A16EE0038AC45 /* menu_about.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_about.png; sourceTree = ""; }; - 61586B82217A16FD0038AC45 /* menu_about@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu_about@2x.png"; sourceTree = ""; }; - 61586B84217A17070038AC45 /* menu_assistant.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_assistant.png; sourceTree = ""; }; - 61586B86217A17150038AC45 /* menu_assistant@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu_assistant@2x.png"; sourceTree = ""; }; - 61586B88217A17220038AC45 /* menu_link_account.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_link_account.png; sourceTree = ""; }; - 61586B8A217A17320038AC45 /* menu_link_account@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu_link_account@2x.png"; sourceTree = ""; }; - 61586B8C217A173F0038AC45 /* menu_options.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_options.png; sourceTree = ""; }; - 61586B8E217A174F0038AC45 /* menu_options@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu_options@2x.png"; sourceTree = ""; }; - 61586B90217A175C0038AC45 /* menu_recordings.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_recordings.png; sourceTree = ""; }; - 61586B92217A176F0038AC45 /* menu_recordings@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu_recordings@2x.png"; sourceTree = ""; }; - 615A2808217F1FD40060F920 /* chat_add_group.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_add_group.png; sourceTree = ""; }; - 615A2810217F1FDE0060F920 /* chat_add_group@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_add_group@2x.png"; sourceTree = ""; }; - 615A2812217F24D40060F920 /* security_1_indicator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = security_1_indicator.png; sourceTree = ""; }; - 615A2814217F24E00060F920 /* security_1_indicator@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "security_1_indicator@2x.png"; sourceTree = ""; }; - 615A2816217F280C0060F920 /* chat_list_indicator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_list_indicator.png; sourceTree = ""; }; - 615A2818217F28160060F920 /* chat_list_indicator@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_list_indicator@2x.png"; sourceTree = ""; }; - 615A281A217F6F9B0060F920 /* security_2_indicator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = security_2_indicator.png; sourceTree = ""; }; - 615A281C217F6FA80060F920 /* security_2_indicator@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "security_2_indicator@2x.png"; sourceTree = ""; }; - 615A281E217F6FB30060F920 /* security_alert_indicator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = security_alert_indicator.png; sourceTree = ""; }; - 615A2820217F6FBF0060F920 /* security_alert_indicator@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "security_alert_indicator@2x.png"; sourceTree = ""; }; - 615A282321805B250060F920 /* security_toogle_icon_green.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = security_toogle_icon_green.png; sourceTree = ""; }; - 615A282521805B320060F920 /* security_toogle_icon_green@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "security_toogle_icon_green@2x.png"; sourceTree = ""; }; - 615A282721805B400060F920 /* security_toogle_icon_grey.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = security_toogle_icon_grey.png; sourceTree = ""; }; - 615A282921805B4C0060F920 /* security_toogle_icon_grey@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "security_toogle_icon_grey@2x.png"; sourceTree = ""; }; - 615A282F218071E80060F920 /* security_toogle_background_green.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = security_toogle_background_green.png; sourceTree = ""; }; - 615A2831218071F30060F920 /* security_toogle_background_green@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "security_toogle_background_green@2x.png"; sourceTree = ""; }; - 615A2833218071FF0060F920 /* security_toogle_background_grey.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = security_toogle_background_grey.png; sourceTree = ""; }; - 615A28352180720D0060F920 /* security_toogle_background_grey@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "security_toogle_background_grey@2x.png"; sourceTree = ""; }; - 615A28392180788E0060F920 /* security_toogle_button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = security_toogle_button.png; sourceTree = ""; }; - 615A283B2180789C0060F920 /* security_toogle_button@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "security_toogle_button@2x.png"; sourceTree = ""; }; - 615A283D2180A2550060F920 /* invite_linphone.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = invite_linphone.png; sourceTree = ""; }; - 615A283F2180A2620060F920 /* invite_linphone@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "invite_linphone@2x.png"; sourceTree = ""; }; - 615A28412180C0820060F920 /* recording.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = recording.png; sourceTree = ""; }; - 615A28432180C08F0060F920 /* recording@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "recording@2x.png"; sourceTree = ""; }; - 617B4A61260A2B7800A87337 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/RecordingsListView.xib; sourceTree = ""; }; - 617B4A64260A2B8500A87337 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/RecordingsListView.strings; sourceTree = ""; }; - 617B4A75260A3F5500A87337 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/RecordingsListView.strings; sourceTree = ""; }; - 617C2428263022430042FB4A /* UIChatContentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIChatContentView.h; sourceTree = ""; }; - 617C2429263022690042FB4A /* UIChatContentView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UIChatContentView.m; sourceTree = ""; }; - 6180D6FD21EE41A800AD9CB6 /* QuickLook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickLook.framework; path = System/Library/Frameworks/QuickLook.framework; sourceTree = SDKROOT; }; - 6187B1B524B3271500D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/AboutView.strings; sourceTree = ""; }; - 6187B1B624B3271500D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/AssistantLinkView.strings; sourceTree = ""; }; - 6187B1B724B3271600D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/AssistantView.strings; sourceTree = ""; }; - 6187B1B824B3271600D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/AssistantViewScreens.strings; sourceTree = ""; }; - 6187B1BD24B3271800D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/ChatConversationCreateView.strings; sourceTree = ""; }; - 6187B1BE24B3271900D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/ChatConversationImdnView.strings; sourceTree = ""; }; - 6187B1BF24B3271900D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/ChatConversationInfoView.strings; sourceTree = ""; }; - 6187B1C024B3271A00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/ChatConversationView.strings; sourceTree = ""; }; - 6187B1C124B3271A00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/ChatsListView.strings; sourceTree = ""; }; - 6187B1C224B3271A00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/ContactDetailsView.strings; sourceTree = ""; }; - 6187B1C324B3271B00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/ContactsListView.strings; sourceTree = ""; }; - 6187B1C424B3271B00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/CountryListView.strings; sourceTree = ""; }; - 6187B1C524B3271B00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/DialerView.strings; sourceTree = ""; }; - 6187B1C624B3271C00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = "hu.lproj/DialerView~ipad.strings"; sourceTree = ""; }; - 6187B1C724B3271C00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/FirstLoginView.strings; sourceTree = ""; }; - 6187B1C824B3271D00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/HistoryDetailsView.strings; sourceTree = ""; }; - 6187B1C924B3271D00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/HistoryListView.strings; sourceTree = ""; }; - 6187B1CA24B3271E00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/ImageView.strings; sourceTree = ""; }; - 6187B1CD24B3271F00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UIChatBubblePhotoCell.strings; sourceTree = ""; }; - 6187B1CE24B3271F00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UIChatBubbleTextCell.strings; sourceTree = ""; }; - 6187B1CF24B3271F00D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UIChatCell.strings; sourceTree = ""; }; - 6187B1D024B3272000D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UIChatConversationImdnTableViewCell.strings; sourceTree = ""; }; - 6187B1D124B3272000D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UIChatConversationInfoTableViewCell.strings; sourceTree = ""; }; - 6187B1D224B3272100D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UIChatCreateCell.strings; sourceTree = ""; }; - 6187B1D324B3272100D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UIChatCreateCollectionViewCell.strings; sourceTree = ""; }; - 6187B1D424B3272100D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UICompositeView.strings; sourceTree = ""; }; - 6187B1D524B3272200D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = "hu.lproj/UICompositeView~ipad.strings"; sourceTree = ""; }; - 6187B1D624B3272200D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UIConfirmationDialog.strings; sourceTree = ""; }; - 6187B1D724B3272300D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UIContactCell.strings; sourceTree = ""; }; - 6187B1D824B3272300D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UIContactDetailsCell.strings; sourceTree = ""; }; - 6187B1D924B3272400D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/UIHistoryCell.strings; sourceTree = ""; }; - 6187B1DA24B3272400D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/PhoneMainView.strings; sourceTree = ""; }; - 6187B1DB24B3272400D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/SettingsView.strings; sourceTree = ""; }; - 6187B1DC24B3272500D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/ShopView.strings; sourceTree = ""; }; - 6187B1DD24B3272500D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/SideMenuView.strings; sourceTree = ""; }; - 6187B1DE24B3272600D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = "hu.lproj/SideMenuView~ipad.strings"; sourceTree = ""; }; - 6187B1DF24B3272600D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/StatusBarView.strings; sourceTree = ""; }; - 6187B1E024B3272700D580FB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/TabBarView.strings; sourceTree = ""; }; - 61AE364B20C00B370089D9D3 /* linphoneExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = linphoneExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; - 61AE364D20C00B370089D9D3 /* ShareViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ShareViewController.h; sourceTree = ""; }; - 61AE364E20C00B370089D9D3 /* ShareViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ShareViewController.m; sourceTree = ""; }; - 61AE365120C00B370089D9D3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; - 61AE365320C00B370089D9D3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 61AE366320C00C810089D9D3 /* linphoneExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = linphoneExtension.entitlements; sourceTree = ""; }; - 61AEBEB5219198EF00F35E7F /* DevicesListView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DevicesListView.h; sourceTree = ""; }; - 61AEBEBC2191990A00F35E7F /* DevicesListView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DevicesListView.m; sourceTree = ""; }; - 61AEBEBE2191991F00F35E7F /* DevicesListView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DevicesListView.xib; sourceTree = ""; }; - 61AEBEC52191E47500F35E7F /* chevron_list_close.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chevron_list_close.png; sourceTree = ""; }; - 61AEBEC72191E48400F35E7F /* chevron_list_close@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chevron_list_close@2x.png"; sourceTree = ""; }; - 61AEBEC92191E49200F35E7F /* chevron_list_open.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chevron_list_open.png; sourceTree = ""; }; - 61AEBECB2191E4A300F35E7F /* chevron_list_open@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chevron_list_open@2x.png"; sourceTree = ""; }; - 61CCC3D721933B380060EDEA /* UIDeviceCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIDeviceCell.h; sourceTree = ""; }; - 61CCC3DE21933B580060EDEA /* UIDeviceCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UIDeviceCell.m; sourceTree = ""; }; - 61CCC3E021933B660060EDEA /* UIDeviceCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UIDeviceCell.xib; sourceTree = ""; }; - 61DD7E1E2372E88F001BDD01 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; - 61E8E46323C5E8EC00434E71 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/AboutView.strings; sourceTree = ""; }; - 61E8E46523C5E8F000434E71 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/AboutView.strings; sourceTree = ""; }; - 61E8E46723C5E9B400434E71 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/AssistantLinkView.strings; sourceTree = ""; }; - 61E8E46B23C5EA2E00434E71 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ShopView.strings; sourceTree = ""; }; - 61F1996E20C6B1D5006B069A /* AVKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVKit.framework; path = System/Library/Frameworks/AVKit.framework; sourceTree = SDKROOT; }; - 6306440B1BECB08500134C72 /* FirstLoginView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FirstLoginView.h; sourceTree = ""; }; - 6306440C1BECB08500134C72 /* FirstLoginView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FirstLoginView.m; sourceTree = ""; }; - 6308F9C31BF0DD6600D1234B /* XMLRPCHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XMLRPCHelper.h; path = Utils/XMLRPCHelper.h; sourceTree = ""; }; - 6308F9C41BF0DD6600D1234B /* XMLRPCHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = XMLRPCHelper.m; path = Utils/XMLRPCHelper.m; sourceTree = ""; }; - 630CF5551AF7CE1500539F7A /* UITextField+DoneButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UITextField+DoneButton.h"; sourceTree = ""; }; - 630CF5561AF7CE1500539F7A /* UITextField+DoneButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITextField+DoneButton.m"; sourceTree = ""; }; - 631098471D4660580041F2B3 /* CountryListView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CountryListView.h; sourceTree = ""; }; - 631098481D4660580041F2B3 /* CountryListView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CountryListView.m; sourceTree = ""; }; - 631098511D4660630041F2B3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/CountryListView.xib; sourceTree = ""; }; - 63130FB11C1ED06900371918 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = "Base.lproj/SideMenuView~ipad.xib"; sourceTree = ""; }; - 6313482E1B6F7B6600C6BDCB /* UIRoundBorderedButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIRoundBorderedButton.h; sourceTree = ""; }; - 6313482F1B6F7B6600C6BDCB /* UIRoundBorderedButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIRoundBorderedButton.m; sourceTree = ""; }; - 6336715E1BCBAAD200BFCBDE /* ChatConversationCreateView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChatConversationCreateView.h; sourceTree = ""; }; - 6336715F1BCBAAD200BFCBDE /* ChatConversationCreateView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ChatConversationCreateView.m; sourceTree = ""; }; - 633756371B67BAF400E21BAD /* SideMenuTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SideMenuTableView.h; sourceTree = ""; }; - 633756381B67BAF400E21BAD /* SideMenuTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SideMenuTableView.m; sourceTree = ""; }; - 633756421B67D2B100E21BAD /* SideMenuView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SideMenuView.h; sourceTree = ""; }; - 633756431B67D2B100E21BAD /* SideMenuView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SideMenuView.m; sourceTree = ""; }; - 633888411BFB2C49001D5E7B /* HPGrowingTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HPGrowingTextView.h; sourceTree = ""; }; - 633888421BFB2C49001D5E7B /* HPGrowingTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HPGrowingTextView.m; sourceTree = ""; }; - 633888431BFB2C49001D5E7B /* HPTextViewInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HPTextViewInternal.h; sourceTree = ""; }; - 633888441BFB2C49001D5E7B /* HPTextViewInternal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HPTextViewInternal.m; sourceTree = ""; }; - 633E388219FFB0F400936D1C /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; - 633E417F1D74258F00320475 /* AssistantLinkView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AssistantLinkView.h; sourceTree = ""; }; - 633E41801D74258F00320475 /* AssistantLinkView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AssistantLinkView.m; sourceTree = ""; }; - 633FEBE21D3CD5570014B822 /* add_field_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = add_field_default.png; sourceTree = ""; }; - 633FEBE31D3CD5570014B822 /* add_field_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "add_field_default@2x.png"; sourceTree = ""; }; - 633FEBE41D3CD5570014B822 /* add_field_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = add_field_over.png; sourceTree = ""; }; - 633FEBE51D3CD5570014B822 /* add_field_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "add_field_over@2x.png"; sourceTree = ""; }; - 633FEBE61D3CD5570014B822 /* avatar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = avatar.png; sourceTree = ""; }; - 633FEBE71D3CD5570014B822 /* avatar@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "avatar@2x.png"; sourceTree = ""; }; - 633FEBE81D3CD5570014B822 /* avatar~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "avatar~ipad.png"; sourceTree = ""; }; - 633FEBE91D3CD5570014B822 /* avatar~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "avatar~ipad@2x.png"; sourceTree = ""; }; - 633FEBEA1D3CD5570014B822 /* back_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = back_default.png; sourceTree = ""; }; - 633FEBEB1D3CD5570014B822 /* back_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "back_default@2x.png"; sourceTree = ""; }; - 633FEBEC1D3CD5570014B822 /* back_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = back_disabled.png; sourceTree = ""; }; - 633FEBED1D3CD5570014B822 /* back_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "back_disabled@2x.png"; sourceTree = ""; }; - 633FEBEE1D3CD5570014B822 /* backspace_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = backspace_default.png; sourceTree = ""; }; - 633FEBEF1D3CD5570014B822 /* backspace_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "backspace_default@2x.png"; sourceTree = ""; }; - 633FEBF01D3CD5570014B822 /* backspace_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = backspace_disabled.png; sourceTree = ""; }; - 633FEBF11D3CD5570014B822 /* backspace_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "backspace_disabled@2x.png"; sourceTree = ""; }; - 633FEBF21D3CD5570014B822 /* backspace_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = backspace_over.png; sourceTree = ""; }; - 633FEBF31D3CD5570014B822 /* backspace_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "backspace_over@2x.png"; sourceTree = ""; }; - 633FEBF41D3CD5570014B822 /* call_add_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_add_default.png; sourceTree = ""; }; - 633FEBF51D3CD5570014B822 /* call_add_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_add_default@2x.png"; sourceTree = ""; }; - 633FEBF61D3CD5570014B822 /* call_add_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_add_disabled.png; sourceTree = ""; }; - 633FEBF71D3CD5570014B822 /* call_add_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_add_disabled@2x.png"; sourceTree = ""; }; - 633FEBF81D3CD5570014B822 /* call_alt_back_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_alt_back_default.png; sourceTree = ""; }; - 633FEBF91D3CD5570014B822 /* call_alt_back_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_alt_back_default@2x.png"; sourceTree = ""; }; - 633FEBFA1D3CD5570014B822 /* call_alt_back_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_alt_back_disabled.png; sourceTree = ""; }; - 633FEBFB1D3CD5570014B822 /* call_alt_back_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_alt_back_disabled@2x.png"; sourceTree = ""; }; - 633FEBFC1D3CD5570014B822 /* call_alt_start_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_alt_start_default.png; sourceTree = ""; }; - 633FEBFD1D3CD5570014B822 /* call_alt_start_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_alt_start_default@2x.png"; sourceTree = ""; }; - 633FEBFE1D3CD5570014B822 /* call_alt_start_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_alt_start_disabled.png; sourceTree = ""; }; - 633FEBFF1D3CD5570014B822 /* call_alt_start_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_alt_start_disabled@2x.png"; sourceTree = ""; }; - 633FEC001D3CD5570014B822 /* call_audio_start_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_audio_start_default.png; sourceTree = ""; }; - 633FEC011D3CD5570014B822 /* call_audio_start_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_audio_start_default@2x.png"; sourceTree = ""; }; - 633FEC021D3CD5570014B822 /* call_audio_start_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_audio_start_disabled.png; sourceTree = ""; }; - 633FEC031D3CD5570014B822 /* call_audio_start_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_audio_start_disabled@2x.png"; sourceTree = ""; }; - 633FEC041D3CD5570014B822 /* call_back_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_back_default.png; sourceTree = ""; }; - 633FEC051D3CD5570014B822 /* call_back_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_back_default@2x.png"; sourceTree = ""; }; - 633FEC061D3CD5570014B822 /* call_back_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_back_disabled.png; sourceTree = ""; }; - 633FEC071D3CD5570014B822 /* call_back_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_back_disabled@2x.png"; sourceTree = ""; }; - 633FEC081D3CD5570014B822 /* call_hangup_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_hangup_default.png; sourceTree = ""; }; - 633FEC091D3CD5570014B822 /* call_hangup_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_hangup_default@2x.png"; sourceTree = ""; }; - 633FEC0A1D3CD5570014B822 /* call_hangup_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_hangup_disabled.png; sourceTree = ""; }; - 633FEC0B1D3CD5570014B822 /* call_hangup_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_hangup_disabled@2x.png"; sourceTree = ""; }; - 633FEC0C1D3CD5570014B822 /* call_incoming.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_incoming.png; sourceTree = ""; }; - 633FEC0D1D3CD5570014B822 /* call_incoming@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_incoming@2x.png"; sourceTree = ""; }; - 633FEC0E1D3CD5570014B822 /* call_missed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_missed.png; sourceTree = ""; }; - 633FEC0F1D3CD5570014B822 /* call_missed@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_missed@2x.png"; sourceTree = ""; }; - 633FEC101D3CD5570014B822 /* call_outgoing.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_outgoing.png; sourceTree = ""; }; - 633FEC111D3CD5570014B822 /* call_outgoing@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_outgoing@2x.png"; sourceTree = ""; }; - 633FEC121D3CD5570014B822 /* call_quality_indicator_0.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_quality_indicator_0.png; sourceTree = ""; }; - 633FEC131D3CD5570014B822 /* call_quality_indicator_0@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_quality_indicator_0@2x.png"; sourceTree = ""; }; - 633FEC141D3CD5570014B822 /* call_quality_indicator_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_quality_indicator_1.png; sourceTree = ""; }; - 633FEC151D3CD5570014B822 /* call_quality_indicator_1@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_quality_indicator_1@2x.png"; sourceTree = ""; }; - 633FEC161D3CD5570014B822 /* call_quality_indicator_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_quality_indicator_2.png; sourceTree = ""; }; - 633FEC171D3CD5570014B822 /* call_quality_indicator_2@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_quality_indicator_2@2x.png"; sourceTree = ""; }; - 633FEC181D3CD5570014B822 /* call_quality_indicator_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_quality_indicator_3.png; sourceTree = ""; }; - 633FEC191D3CD5570014B822 /* call_quality_indicator_3@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_quality_indicator_3@2x.png"; sourceTree = ""; }; - 633FEC1A1D3CD5570014B822 /* call_quality_indicator_4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_quality_indicator_4.png; sourceTree = ""; }; - 633FEC1B1D3CD5570014B822 /* call_quality_indicator_4@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_quality_indicator_4@2x.png"; sourceTree = ""; }; - 633FEC1C1D3CD5570014B822 /* call_start_body_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_start_body_default.png; sourceTree = ""; }; - 633FEC1D1D3CD5570014B822 /* call_start_body_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_start_body_default@2x.png"; sourceTree = ""; }; - 633FEC1E1D3CD5570014B822 /* call_start_body_default~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_start_body_default~ipad.png"; sourceTree = ""; }; - 633FEC1F1D3CD5570014B822 /* call_start_body_default~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_start_body_default~ipad@2x.png"; sourceTree = ""; }; - 633FEC201D3CD5570014B822 /* call_start_body_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_start_body_disabled.png; sourceTree = ""; }; - 633FEC211D3CD5570014B822 /* call_start_body_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_start_body_disabled@2x.png"; sourceTree = ""; }; - 633FEC221D3CD5570014B822 /* call_start_body_disabled~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_start_body_disabled~ipad.png"; sourceTree = ""; }; - 633FEC231D3CD5570014B822 /* call_start_body_disabled~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_start_body_disabled~ipad@2x.png"; sourceTree = ""; }; - 633FEC241D3CD5570014B822 /* call_start_body_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_start_body_over.png; sourceTree = ""; }; - 633FEC251D3CD5570014B822 /* call_start_body_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_start_body_over@2x.png"; sourceTree = ""; }; - 633FEC261D3CD5570014B822 /* call_start_body_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_start_body_over~ipad.png"; sourceTree = ""; }; - 633FEC271D3CD5570014B822 /* call_start_body_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_start_body_over~ipad@2x.png"; sourceTree = ""; }; - 633FEC281D3CD5570014B822 /* call_status_incoming.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_status_incoming.png; sourceTree = ""; }; - 633FEC291D3CD5570014B822 /* call_status_incoming@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_status_incoming@2x.png"; sourceTree = ""; }; - 633FEC2A1D3CD5570014B822 /* call_status_incoming~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_status_incoming~ipad.png"; sourceTree = ""; }; - 633FEC2B1D3CD5570014B822 /* call_status_incoming~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_status_incoming~ipad@2x.png"; sourceTree = ""; }; - 633FEC2C1D3CD5570014B822 /* call_status_missed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_status_missed.png; sourceTree = ""; }; - 633FEC2D1D3CD5570014B822 /* call_status_missed@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_status_missed@2x.png"; sourceTree = ""; }; - 633FEC2E1D3CD5570014B822 /* call_status_missed~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_status_missed~ipad.png"; sourceTree = ""; }; - 633FEC2F1D3CD5570014B822 /* call_status_missed~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_status_missed~ipad@2x.png"; sourceTree = ""; }; - 633FEC301D3CD5570014B822 /* call_status_outgoing.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_status_outgoing.png; sourceTree = ""; }; - 633FEC311D3CD5570014B822 /* call_status_outgoing@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_status_outgoing@2x.png"; sourceTree = ""; }; - 633FEC321D3CD5570014B822 /* call_status_outgoing~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_status_outgoing~ipad.png"; sourceTree = ""; }; - 633FEC331D3CD5570014B822 /* call_status_outgoing~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_status_outgoing~ipad@2x.png"; sourceTree = ""; }; - 633FEC341D3CD5570014B822 /* call_transfer_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_transfer_default.png; sourceTree = ""; }; - 633FEC351D3CD5570014B822 /* call_transfer_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_transfer_default@2x.png"; sourceTree = ""; }; - 633FEC361D3CD5570014B822 /* call_transfer_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_transfer_disabled.png; sourceTree = ""; }; - 633FEC371D3CD5570014B822 /* call_transfer_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_transfer_disabled@2x.png"; sourceTree = ""; }; - 633FEC381D3CD5570014B822 /* call_video_start_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_video_start_default.png; sourceTree = ""; }; - 633FEC391D3CD5570014B822 /* call_video_start_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_video_start_default@2x.png"; sourceTree = ""; }; - 633FEC3A1D3CD5570014B822 /* call_video_start_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = call_video_start_disabled.png; sourceTree = ""; }; - 633FEC3B1D3CD5570014B822 /* call_video_start_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_video_start_disabled@2x.png"; sourceTree = ""; }; - 633FEC3C1D3CD5570014B822 /* camera_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = camera_default.png; sourceTree = ""; }; - 633FEC3D1D3CD5570014B822 /* camera_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "camera_default@2x.png"; sourceTree = ""; }; - 633FEC3E1D3CD5570014B822 /* camera_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = camera_disabled.png; sourceTree = ""; }; - 633FEC3F1D3CD5570014B822 /* camera_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "camera_disabled@2x.png"; sourceTree = ""; }; - 633FEC401D3CD5570014B822 /* camera_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = camera_selected.png; sourceTree = ""; }; - 633FEC411D3CD5570014B822 /* camera_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "camera_selected@2x.png"; sourceTree = ""; }; - 633FEC421D3CD5570014B822 /* camera_switch_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = camera_switch_default.png; sourceTree = ""; }; - 633FEC431D3CD5570014B822 /* camera_switch_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "camera_switch_default@2x.png"; sourceTree = ""; }; - 633FEC441D3CD5570014B822 /* camera_switch_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = camera_switch_disabled.png; sourceTree = ""; }; - 633FEC451D3CD5570014B822 /* camera_switch_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "camera_switch_disabled@2x.png"; sourceTree = ""; }; - 633FEC461D3CD5570014B822 /* camera_switch_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = camera_switch_over.png; sourceTree = ""; }; - 633FEC471D3CD5570014B822 /* camera_switch_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "camera_switch_over@2x.png"; sourceTree = ""; }; - 633FEC481D3CD5570014B822 /* cancel_edit_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cancel_edit_default.png; sourceTree = ""; }; - 633FEC491D3CD5570014B822 /* cancel_edit_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "cancel_edit_default@2x.png"; sourceTree = ""; }; - 633FEC4A1D3CD5570014B822 /* cancel_edit_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cancel_edit_disabled.png; sourceTree = ""; }; - 633FEC4B1D3CD5570014B822 /* cancel_edit_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "cancel_edit_disabled@2x.png"; sourceTree = ""; }; - 633FEC4C1D3CD5570014B822 /* chat_add_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_add_default.png; sourceTree = ""; }; - 633FEC4D1D3CD5570014B822 /* chat_add_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_add_default@2x.png"; sourceTree = ""; }; - 633FEC4E1D3CD5570014B822 /* chat_add_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_add_disabled.png; sourceTree = ""; }; - 633FEC4F1D3CD5570014B822 /* chat_add_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_add_disabled@2x.png"; sourceTree = ""; }; - 633FEC501D3CD5570014B822 /* chat_attachment_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_attachment_default.png; sourceTree = ""; }; - 633FEC511D3CD5570014B822 /* chat_attachment_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_attachment_default@2x.png"; sourceTree = ""; }; - 633FEC521D3CD5570014B822 /* chat_attachment_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_attachment_disabled.png; sourceTree = ""; }; - 633FEC531D3CD5570014B822 /* chat_attachment_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_attachment_disabled@2x.png"; sourceTree = ""; }; - 633FEC541D3CD5570014B822 /* chat_attachment_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_attachment_over.png; sourceTree = ""; }; - 633FEC551D3CD5570014B822 /* chat_attachment_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_attachment_over@2x.png"; sourceTree = ""; }; - 633FEC561D3CD5570014B822 /* chat_list_indicator~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_list_indicator~ipad.png"; sourceTree = ""; }; - 633FEC571D3CD5570014B822 /* chat_list_indicator~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_list_indicator~ipad@2x.png"; sourceTree = ""; }; - 633FEC581D3CD5570014B822 /* chat_message_not_delivered.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_message_not_delivered.png; sourceTree = ""; }; - 633FEC591D3CD5570014B822 /* chat_message_not_delivered@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_message_not_delivered@2x.png"; sourceTree = ""; }; - 633FEC5A1D3CD5570014B822 /* chat_send_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_send_default.png; sourceTree = ""; }; - 633FEC5B1D3CD5570014B822 /* chat_send_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_send_default@2x.png"; sourceTree = ""; }; - 633FEC5C1D3CD5570014B822 /* chat_send_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_send_disabled.png; sourceTree = ""; }; - 633FEC5D1D3CD5570014B822 /* chat_send_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_send_disabled@2x.png"; sourceTree = ""; }; - 633FEC5E1D3CD5570014B822 /* chat_send_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_send_over.png; sourceTree = ""; }; - 633FEC5F1D3CD5570014B822 /* chat_send_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_send_over@2x.png"; sourceTree = ""; }; - 633FEC601D3CD5570014B822 /* chat_start_body_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_start_body_default.png; sourceTree = ""; }; - 633FEC611D3CD5570014B822 /* chat_start_body_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_start_body_default@2x.png"; sourceTree = ""; }; - 633FEC621D3CD5570014B822 /* chat_start_body_default~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_start_body_default~ipad.png"; sourceTree = ""; }; - 633FEC631D3CD5570014B822 /* chat_start_body_default~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_start_body_default~ipad@2x.png"; sourceTree = ""; }; - 633FEC641D3CD5570014B822 /* chat_start_body_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_start_body_disabled.png; sourceTree = ""; }; - 633FEC651D3CD5570014B822 /* chat_start_body_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_start_body_disabled@2x.png"; sourceTree = ""; }; - 633FEC661D3CD5570014B822 /* chat_start_body_disabled~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_start_body_disabled~ipad.png"; sourceTree = ""; }; - 633FEC671D3CD5570014B822 /* chat_start_body_disabled~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_start_body_disabled~ipad@2x.png"; sourceTree = ""; }; - 633FEC681D3CD5570014B822 /* chat_start_body_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_start_body_over.png; sourceTree = ""; }; - 633FEC691D3CD5570014B822 /* chat_start_body_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_start_body_over@2x.png"; sourceTree = ""; }; - 633FEC6A1D3CD5570014B822 /* chat_start_body_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_start_body_over~ipad.png"; sourceTree = ""; }; - 633FEC6B1D3CD5570014B822 /* chat_start_body_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_start_body_over~ipad@2x.png"; sourceTree = ""; }; - 633FEC6C1D3CD5570014B822 /* checkbox_checked.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = checkbox_checked.png; sourceTree = ""; }; - 633FEC6D1D3CD5570014B822 /* checkbox_checked@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "checkbox_checked@2x.png"; sourceTree = ""; }; - 633FEC6E1D3CD5570014B822 /* checkbox_unchecked.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = checkbox_unchecked.png; sourceTree = ""; }; - 633FEC6F1D3CD5570014B822 /* checkbox_unchecked@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "checkbox_unchecked@2x.png"; sourceTree = ""; }; - 633FEC701D3CD5570014B822 /* color_A.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = color_A.png; sourceTree = ""; }; - 633FEC711D3CD5570014B822 /* color_C.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = color_C.png; sourceTree = ""; }; - 633FEC721D3CD5570014B822 /* color_D.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = color_D.png; sourceTree = ""; }; - 633FEC731D3CD5570014B822 /* color_E.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = color_E.png; sourceTree = ""; }; - 633FEC741D3CD5570014B822 /* color_F.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = color_F.png; sourceTree = ""; }; - 633FEC751D3CD5570014B822 /* color_G.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = color_G.png; sourceTree = ""; }; - 633FEC761D3CD5570014B822 /* color_H.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = color_H.png; sourceTree = ""; }; - 633FEC771D3CD5570014B822 /* color_I.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = color_I.png; sourceTree = ""; }; - 633FEC781D3CD5570014B822 /* color_L.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = color_L.png; sourceTree = ""; }; - 633FEC791D3CD5570014B822 /* color_M.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = color_M.png; sourceTree = ""; }; - 633FEC7A1D3CD5570014B822 /* conference_exit_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = conference_exit_default.png; sourceTree = ""; }; - 633FEC7B1D3CD5570014B822 /* conference_exit_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "conference_exit_default@2x.png"; sourceTree = ""; }; - 633FEC7C1D3CD5570014B822 /* conference_exit_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = conference_exit_over.png; sourceTree = ""; }; - 633FEC7D1D3CD5570014B822 /* conference_exit_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "conference_exit_over@2x.png"; sourceTree = ""; }; - 633FEC7E1D3CD5570014B822 /* contact_add_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = contact_add_default.png; sourceTree = ""; }; - 633FEC7F1D3CD5570014B822 /* contact_add_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "contact_add_default@2x.png"; sourceTree = ""; }; - 633FEC801D3CD5570014B822 /* contact_add_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = contact_add_disabled.png; sourceTree = ""; }; - 633FEC811D3CD5570014B822 /* contact_add_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "contact_add_disabled@2x.png"; sourceTree = ""; }; - 633FEC821D3CD5570014B822 /* contacts_all_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = contacts_all_default.png; sourceTree = ""; }; - 633FEC831D3CD5570014B822 /* contacts_all_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "contacts_all_default@2x.png"; sourceTree = ""; }; - 633FEC841D3CD5570014B822 /* contacts_all_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = contacts_all_disabled.png; sourceTree = ""; }; - 633FEC851D3CD5570014B822 /* contacts_all_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "contacts_all_disabled@2x.png"; sourceTree = ""; }; - 633FEC861D3CD5570014B822 /* contacts_all_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = contacts_all_selected.png; sourceTree = ""; }; - 633FEC871D3CD5570014B822 /* contacts_all_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "contacts_all_selected@2x.png"; sourceTree = ""; }; - 633FEC8E1D3CD5570014B822 /* delete_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = delete_default.png; sourceTree = ""; }; - 633FEC8F1D3CD5570014B822 /* delete_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "delete_default@2x.png"; sourceTree = ""; }; - 633FEC901D3CD5570014B822 /* delete_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = delete_disabled.png; sourceTree = ""; }; - 633FEC911D3CD5570014B822 /* delete_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "delete_disabled@2x.png"; sourceTree = ""; }; - 633FEC921D3CD5570014B822 /* delete_field_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = delete_field_default.png; sourceTree = ""; }; - 633FEC931D3CD5570014B822 /* delete_field_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "delete_field_default@2x.png"; sourceTree = ""; }; - 633FEC941D3CD5570014B822 /* delete_field_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = delete_field_over.png; sourceTree = ""; }; - 633FEC951D3CD5570014B822 /* delete_field_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "delete_field_over@2x.png"; sourceTree = ""; }; - 633FEC961D3CD5570014B822 /* deselect_all.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = deselect_all.png; sourceTree = ""; }; - 633FEC971D3CD5570014B822 /* deselect_all@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "deselect_all@2x.png"; sourceTree = ""; }; - 633FEC981D3CD5570014B822 /* dialer_alt_back.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = dialer_alt_back.png; sourceTree = ""; }; - 633FEC991D3CD5570014B822 /* dialer_alt_back@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "dialer_alt_back@2x.png"; sourceTree = ""; }; - 633FEC9A1D3CD5570014B822 /* dialer_back_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = dialer_back_default.png; sourceTree = ""; }; - 633FEC9B1D3CD5570014B822 /* dialer_back_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "dialer_back_default@2x.png"; sourceTree = ""; }; - 633FEC9C1D3CD5570014B822 /* dialer_back_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = dialer_back_disabled.png; sourceTree = ""; }; - 633FEC9D1D3CD5570014B822 /* dialer_back_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "dialer_back_disabled@2x.png"; sourceTree = ""; }; - 633FECA01D3CD5570014B822 /* edit_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = edit_default.png; sourceTree = ""; }; - 633FECA11D3CD5570014B822 /* edit_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "edit_default@2x.png"; sourceTree = ""; }; - 633FECA21D3CD5570014B822 /* edit_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = edit_disabled.png; sourceTree = ""; }; - 633FECA31D3CD5570014B822 /* edit_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "edit_disabled@2x.png"; sourceTree = ""; }; - 633FECA41D3CD5570014B822 /* edit_list_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = edit_list_default.png; sourceTree = ""; }; - 633FECA51D3CD5570014B822 /* edit_list_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "edit_list_default@2x.png"; sourceTree = ""; }; - 633FECA61D3CD5570014B822 /* edit_list_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = edit_list_disabled.png; sourceTree = ""; }; - 633FECA71D3CD5570014B822 /* edit_list_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "edit_list_disabled@2x.png"; sourceTree = ""; }; - 633FECA81D3CD5570014B822 /* footer_chat_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = footer_chat_default.png; sourceTree = ""; }; - 633FECA91D3CD5570014B822 /* footer_chat_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "footer_chat_default@2x.png"; sourceTree = ""; }; - 633FECAA1D3CD5570014B822 /* footer_chat_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = footer_chat_disabled.png; sourceTree = ""; }; - 633FECAB1D3CD5570014B822 /* footer_chat_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "footer_chat_disabled@2x.png"; sourceTree = ""; }; - 633FECAC1D3CD5570014B822 /* footer_contacts_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = footer_contacts_default.png; sourceTree = ""; }; - 633FECAD1D3CD5570014B822 /* footer_contacts_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "footer_contacts_default@2x.png"; sourceTree = ""; }; - 633FECAE1D3CD5570014B822 /* footer_contacts_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = footer_contacts_disabled.png; sourceTree = ""; }; - 633FECAF1D3CD5570014B822 /* footer_contacts_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "footer_contacts_disabled@2x.png"; sourceTree = ""; }; - 633FECB01D3CD5570014B822 /* footer_dialer_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = footer_dialer_default.png; sourceTree = ""; }; - 633FECB11D3CD5570014B822 /* footer_dialer_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "footer_dialer_default@2x.png"; sourceTree = ""; }; - 633FECB21D3CD5570014B822 /* footer_dialer_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = footer_dialer_disabled.png; sourceTree = ""; }; - 633FECB31D3CD5570014B822 /* footer_dialer_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "footer_dialer_disabled@2x.png"; sourceTree = ""; }; - 633FECB41D3CD5570014B822 /* footer_history_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = footer_history_default.png; sourceTree = ""; }; - 633FECB51D3CD5570014B822 /* footer_history_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "footer_history_default@2x.png"; sourceTree = ""; }; - 633FECB61D3CD5570014B822 /* footer_history_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = footer_history_disabled.png; sourceTree = ""; }; - 633FECB71D3CD5570014B822 /* footer_history_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "footer_history_disabled@2x.png"; sourceTree = ""; }; - 633FECB81D3CD5570014B822 /* history_all_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = history_all_default.png; sourceTree = ""; }; - 633FECB91D3CD5570014B822 /* history_all_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "history_all_default@2x.png"; sourceTree = ""; }; - 633FECBA1D3CD5570014B822 /* history_all_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = history_all_disabled.png; sourceTree = ""; }; - 633FECBB1D3CD5570014B822 /* history_all_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "history_all_disabled@2x.png"; sourceTree = ""; }; - 633FECBC1D3CD5570014B822 /* history_all_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = history_all_selected.png; sourceTree = ""; }; - 633FECBD1D3CD5570014B822 /* history_all_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "history_all_selected@2x.png"; sourceTree = ""; }; - 633FECBE1D3CD5570014B822 /* history_chat_indicator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = history_chat_indicator.png; sourceTree = ""; }; - 633FECBF1D3CD5570014B822 /* history_chat_indicator@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "history_chat_indicator@2x.png"; sourceTree = ""; }; - 633FECC01D3CD5570014B822 /* history_missed_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = history_missed_default.png; sourceTree = ""; }; - 633FECC11D3CD5570014B822 /* history_missed_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "history_missed_default@2x.png"; sourceTree = ""; }; - 633FECC21D3CD5570014B822 /* history_missed_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = history_missed_disabled.png; sourceTree = ""; }; - 633FECC31D3CD5570014B822 /* history_missed_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "history_missed_disabled@2x.png"; sourceTree = ""; }; - 633FECC41D3CD5570014B822 /* history_missed_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = history_missed_selected.png; sourceTree = ""; }; - 633FECC51D3CD5570014B822 /* history_missed_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "history_missed_selected@2x.png"; sourceTree = ""; }; - 633FECC61D3CD5570014B822 /* led_connected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = led_connected.png; sourceTree = ""; }; - 633FECC71D3CD5570014B822 /* led_connected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "led_connected@2x.png"; sourceTree = ""; }; - 633FECC81D3CD5570014B822 /* led_disconnected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = led_disconnected.png; sourceTree = ""; }; - 633FECC91D3CD5570014B822 /* led_disconnected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "led_disconnected@2x.png"; sourceTree = ""; }; - 633FECCA1D3CD5570014B822 /* led_error.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = led_error.png; sourceTree = ""; }; - 633FECCB1D3CD5570014B822 /* led_error@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "led_error@2x.png"; sourceTree = ""; }; - 633FECCC1D3CD5570014B822 /* led_inprogress.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = led_inprogress.png; sourceTree = ""; }; - 633FECCD1D3CD5570014B822 /* led_inprogress@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "led_inprogress@2x.png"; sourceTree = ""; }; - 633FECD41D3CD5580014B822 /* list_details_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = list_details_default.png; sourceTree = ""; }; - 633FECD51D3CD5580014B822 /* list_details_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "list_details_default@2x.png"; sourceTree = ""; }; - 633FECD61D3CD5580014B822 /* list_details_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = list_details_over.png; sourceTree = ""; }; - 633FECD71D3CD5580014B822 /* list_details_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "list_details_over@2x.png"; sourceTree = ""; }; - 633FECD81D3CD5580014B822 /* menu.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu.png; sourceTree = ""; }; - 633FECD91D3CD5580014B822 /* menu@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu@2x.png"; sourceTree = ""; }; - 633FECDA1D3CD5580014B822 /* micro_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = micro_default.png; sourceTree = ""; }; - 633FECDB1D3CD5580014B822 /* micro_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "micro_default@2x.png"; sourceTree = ""; }; - 633FECDC1D3CD5580014B822 /* micro_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = micro_disabled.png; sourceTree = ""; }; - 633FECDD1D3CD5580014B822 /* micro_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "micro_disabled@2x.png"; sourceTree = ""; }; - 633FECDE1D3CD5580014B822 /* micro_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = micro_selected.png; sourceTree = ""; }; - 633FECDF1D3CD5580014B822 /* micro_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "micro_selected@2x.png"; sourceTree = ""; }; - 633FECE01D3CD5580014B822 /* nowebcamCIF.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = nowebcamCIF.jpg; sourceTree = ""; }; - 633FECE11D3CD5580014B822 /* numpad_0_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_0_default.png; sourceTree = ""; }; - 633FECE21D3CD5580014B822 /* numpad_0_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_0_default@2x.png"; sourceTree = ""; }; - 633FECE31D3CD5580014B822 /* numpad_0_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_0_over.png; sourceTree = ""; }; - 633FECE41D3CD5580014B822 /* numpad_0_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_0_over@2x.png"; sourceTree = ""; }; - 633FECE51D3CD5580014B822 /* numpad_0_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_0_over~ipad.png"; sourceTree = ""; }; - 633FECE61D3CD5580014B822 /* numpad_0_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_0_over~ipad@2x.png"; sourceTree = ""; }; - 633FECE71D3CD5580014B822 /* numpad_0~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_0~ipad.png"; sourceTree = ""; }; - 633FECE81D3CD5580014B822 /* numpad_0~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_0~ipad@2x.png"; sourceTree = ""; }; - 633FECE91D3CD5580014B822 /* numpad_1_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_1_default.png; sourceTree = ""; }; - 633FECEA1D3CD5580014B822 /* numpad_1_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_1_default@2x.png"; sourceTree = ""; }; - 633FECEB1D3CD5580014B822 /* numpad_1_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_1_over.png; sourceTree = ""; }; - 633FECEC1D3CD5580014B822 /* numpad_1_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_1_over@2x.png"; sourceTree = ""; }; - 633FECED1D3CD5580014B822 /* numpad_1_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_1_over~ipad.png"; sourceTree = ""; }; - 633FECEE1D3CD5580014B822 /* numpad_1_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_1_over~ipad@2x.png"; sourceTree = ""; }; - 633FECEF1D3CD5580014B822 /* numpad_1~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_1~ipad.png"; sourceTree = ""; }; - 633FECF01D3CD5580014B822 /* numpad_1~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_1~ipad@2x.png"; sourceTree = ""; }; - 633FECF11D3CD5580014B822 /* numpad_2_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_2_default.png; sourceTree = ""; }; - 633FECF21D3CD5580014B822 /* numpad_2_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_2_default@2x.png"; sourceTree = ""; }; - 633FECF31D3CD5580014B822 /* numpad_2_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_2_over.png; sourceTree = ""; }; - 633FECF41D3CD5580014B822 /* numpad_2_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_2_over@2x.png"; sourceTree = ""; }; - 633FECF51D3CD5580014B822 /* numpad_2_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_2_over~ipad.png"; sourceTree = ""; }; - 633FECF61D3CD5580014B822 /* numpad_2_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_2_over~ipad@2x.png"; sourceTree = ""; }; - 633FECF71D3CD5580014B822 /* numpad_2~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_2~ipad.png"; sourceTree = ""; }; - 633FECF81D3CD5580014B822 /* numpad_2~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_2~ipad@2x.png"; sourceTree = ""; }; - 633FECF91D3CD5580014B822 /* numpad_3_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_3_default.png; sourceTree = ""; }; - 633FECFA1D3CD5580014B822 /* numpad_3_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_3_default@2x.png"; sourceTree = ""; }; - 633FECFB1D3CD5580014B822 /* numpad_3_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_3_over.png; sourceTree = ""; }; - 633FECFC1D3CD5580014B822 /* numpad_3_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_3_over@2x.png"; sourceTree = ""; }; - 633FECFD1D3CD5580014B822 /* numpad_3_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_3_over~ipad.png"; sourceTree = ""; }; - 633FECFE1D3CD5580014B822 /* numpad_3_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_3_over~ipad@2x.png"; sourceTree = ""; }; - 633FECFF1D3CD5580014B822 /* numpad_3~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_3~ipad.png"; sourceTree = ""; }; - 633FED001D3CD5580014B822 /* numpad_3~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_3~ipad@2x.png"; sourceTree = ""; }; - 633FED011D3CD5580014B822 /* numpad_4_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_4_default.png; sourceTree = ""; }; - 633FED021D3CD5580014B822 /* numpad_4_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_4_default@2x.png"; sourceTree = ""; }; - 633FED031D3CD5580014B822 /* numpad_4_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_4_over.png; sourceTree = ""; }; - 633FED041D3CD5580014B822 /* numpad_4_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_4_over@2x.png"; sourceTree = ""; }; - 633FED051D3CD5580014B822 /* numpad_4_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_4_over~ipad.png"; sourceTree = ""; }; - 633FED061D3CD5580014B822 /* numpad_4_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_4_over~ipad@2x.png"; sourceTree = ""; }; - 633FED071D3CD5580014B822 /* numpad_4~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_4~ipad.png"; sourceTree = ""; }; - 633FED081D3CD5580014B822 /* numpad_4~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_4~ipad@2x.png"; sourceTree = ""; }; - 633FED091D3CD5580014B822 /* numpad_5_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_5_default.png; sourceTree = ""; }; - 633FED0A1D3CD5580014B822 /* numpad_5_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_5_default@2x.png"; sourceTree = ""; }; - 633FED0B1D3CD5580014B822 /* numpad_5_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_5_over.png; sourceTree = ""; }; - 633FED0C1D3CD5580014B822 /* numpad_5_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_5_over@2x.png"; sourceTree = ""; }; - 633FED0D1D3CD5580014B822 /* numpad_5_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_5_over~ipad.png"; sourceTree = ""; }; - 633FED0E1D3CD5580014B822 /* numpad_5_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_5_over~ipad@2x.png"; sourceTree = ""; }; - 633FED0F1D3CD5580014B822 /* numpad_5~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_5~ipad.png"; sourceTree = ""; }; - 633FED101D3CD5580014B822 /* numpad_5~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_5~ipad@2x.png"; sourceTree = ""; }; - 633FED111D3CD5580014B822 /* numpad_6_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_6_default.png; sourceTree = ""; }; - 633FED121D3CD5580014B822 /* numpad_6_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_6_default@2x.png"; sourceTree = ""; }; - 633FED131D3CD5580014B822 /* numpad_6_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_6_over.png; sourceTree = ""; }; - 633FED141D3CD5580014B822 /* numpad_6_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_6_over@2x.png"; sourceTree = ""; }; - 633FED151D3CD5580014B822 /* numpad_6_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_6_over~ipad.png"; sourceTree = ""; }; - 633FED161D3CD5580014B822 /* numpad_6_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_6_over~ipad@2x.png"; sourceTree = ""; }; - 633FED171D3CD5580014B822 /* numpad_6~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_6~ipad.png"; sourceTree = ""; }; - 633FED181D3CD5580014B822 /* numpad_6~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_6~ipad@2x.png"; sourceTree = ""; }; - 633FED191D3CD5580014B822 /* numpad_7_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_7_default.png; sourceTree = ""; }; - 633FED1A1D3CD5580014B822 /* numpad_7_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_7_default@2x.png"; sourceTree = ""; }; - 633FED1B1D3CD5580014B822 /* numpad_7_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_7_over.png; sourceTree = ""; }; - 633FED1C1D3CD5580014B822 /* numpad_7_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_7_over@2x.png"; sourceTree = ""; }; - 633FED1D1D3CD5580014B822 /* numpad_7_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_7_over~ipad.png"; sourceTree = ""; }; - 633FED1E1D3CD5580014B822 /* numpad_7_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_7_over~ipad@2x.png"; sourceTree = ""; }; - 633FED1F1D3CD5580014B822 /* numpad_7~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_7~ipad.png"; sourceTree = ""; }; - 633FED201D3CD5580014B822 /* numpad_7~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_7~ipad@2x.png"; sourceTree = ""; }; - 633FED211D3CD5580014B822 /* numpad_8_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_8_default.png; sourceTree = ""; }; - 633FED221D3CD5580014B822 /* numpad_8_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_8_default@2x.png"; sourceTree = ""; }; - 633FED231D3CD5580014B822 /* numpad_8_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_8_over.png; sourceTree = ""; }; - 633FED241D3CD5580014B822 /* numpad_8_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_8_over@2x.png"; sourceTree = ""; }; - 633FED251D3CD5580014B822 /* numpad_8_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_8_over~ipad.png"; sourceTree = ""; }; - 633FED261D3CD5580014B822 /* numpad_8_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_8_over~ipad@2x.png"; sourceTree = ""; }; - 633FED271D3CD5580014B822 /* numpad_8~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_8~ipad.png"; sourceTree = ""; }; - 633FED281D3CD5580014B822 /* numpad_8~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_8~ipad@2x.png"; sourceTree = ""; }; - 633FED291D3CD5580014B822 /* numpad_9_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_9_default.png; sourceTree = ""; }; - 633FED2A1D3CD5580014B822 /* numpad_9_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_9_default@2x.png"; sourceTree = ""; }; - 633FED2B1D3CD5580014B822 /* numpad_9_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_9_over.png; sourceTree = ""; }; - 633FED2C1D3CD5580014B822 /* numpad_9_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_9_over@2x.png"; sourceTree = ""; }; - 633FED2D1D3CD5580014B822 /* numpad_9_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_9_over~ipad.png"; sourceTree = ""; }; - 633FED2E1D3CD5580014B822 /* numpad_9_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_9_over~ipad@2x.png"; sourceTree = ""; }; - 633FED2F1D3CD5580014B822 /* numpad_9~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_9~ipad.png"; sourceTree = ""; }; - 633FED301D3CD5580014B822 /* numpad_9~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_9~ipad@2x.png"; sourceTree = ""; }; - 633FED311D3CD5580014B822 /* numpad_hash_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_hash_default.png; sourceTree = ""; }; - 633FED321D3CD5580014B822 /* numpad_hash_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_hash_default@2x.png"; sourceTree = ""; }; - 633FED331D3CD5580014B822 /* numpad_hash_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_hash_over.png; sourceTree = ""; }; - 633FED341D3CD5580014B822 /* numpad_hash_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_hash_over@2x.png"; sourceTree = ""; }; - 633FED351D3CD5580014B822 /* numpad_hash_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_hash_over~ipad.png"; sourceTree = ""; }; - 633FED361D3CD5580014B822 /* numpad_hash_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_hash_over~ipad@2x.png"; sourceTree = ""; }; - 633FED371D3CD5580014B822 /* numpad_hash~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_hash~ipad.png"; sourceTree = ""; }; - 633FED381D3CD5580014B822 /* numpad_hash~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_hash~ipad@2x.png"; sourceTree = ""; }; - 633FED391D3CD5580014B822 /* numpad_over_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_over_background.png; sourceTree = ""; }; - 633FED3A1D3CD5580014B822 /* numpad_star_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_star_default.png; sourceTree = ""; }; - 633FED3B1D3CD5580014B822 /* numpad_star_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_star_default@2x.png"; sourceTree = ""; }; - 633FED3C1D3CD5580014B822 /* numpad_star_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = numpad_star_over.png; sourceTree = ""; }; - 633FED3D1D3CD5580014B822 /* numpad_star_over@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_star_over@2x.png"; sourceTree = ""; }; - 633FED3E1D3CD5580014B822 /* numpad_star_over~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_star_over~ipad.png"; sourceTree = ""; }; - 633FED3F1D3CD5580014B822 /* numpad_star_over~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_star_over~ipad@2x.png"; sourceTree = ""; }; - 633FED401D3CD5580014B822 /* numpad_star~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_star~ipad.png"; sourceTree = ""; }; - 633FED411D3CD5580014B822 /* numpad_star~ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "numpad_star~ipad@2x.png"; sourceTree = ""; }; - 633FED421D3CD5580014B822 /* options_add_call_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = options_add_call_default.png; sourceTree = ""; }; - 633FED431D3CD5580014B822 /* options_add_call_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "options_add_call_default@2x.png"; sourceTree = ""; }; - 633FED441D3CD5580014B822 /* options_add_call_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = options_add_call_disabled.png; sourceTree = ""; }; - 633FED451D3CD5580014B822 /* options_add_call_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "options_add_call_disabled@2x.png"; sourceTree = ""; }; - 633FED461D3CD5580014B822 /* options_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = options_default.png; sourceTree = ""; }; - 633FED471D3CD5580014B822 /* options_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "options_default@2x.png"; sourceTree = ""; }; - 633FED481D3CD5580014B822 /* options_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = options_disabled.png; sourceTree = ""; }; - 633FED491D3CD5580014B822 /* options_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "options_disabled@2x.png"; sourceTree = ""; }; - 633FED4A1D3CD5580014B822 /* options_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = options_selected.png; sourceTree = ""; }; - 633FED4B1D3CD5580014B822 /* options_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "options_selected@2x.png"; sourceTree = ""; }; - 633FED4C1D3CD5580014B822 /* options_start_conference_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = options_start_conference_default.png; sourceTree = ""; }; - 633FED4D1D3CD5580014B822 /* options_start_conference_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "options_start_conference_default@2x.png"; sourceTree = ""; }; - 633FED4E1D3CD5580014B822 /* options_start_conference_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = options_start_conference_disabled.png; sourceTree = ""; }; - 633FED4F1D3CD5580014B822 /* options_start_conference_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "options_start_conference_disabled@2x.png"; sourceTree = ""; }; - 633FED501D3CD5580014B822 /* options_transfer_call_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = options_transfer_call_default.png; sourceTree = ""; }; - 633FED511D3CD5580014B822 /* options_transfer_call_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "options_transfer_call_default@2x.png"; sourceTree = ""; }; - 633FED521D3CD5580014B822 /* options_transfer_call_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = options_transfer_call_disabled.png; sourceTree = ""; }; - 633FED531D3CD5580014B822 /* options_transfer_call_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "options_transfer_call_disabled@2x.png"; sourceTree = ""; }; - 633FED541D3CD5580014B822 /* pause_big_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pause_big_default.png; sourceTree = ""; }; - 633FED551D3CD5580014B822 /* pause_big_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pause_big_default@2x.png"; sourceTree = ""; }; - 633FED561D3CD5580014B822 /* pause_big_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pause_big_disabled.png; sourceTree = ""; }; - 633FED571D3CD5580014B822 /* pause_big_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pause_big_disabled@2x.png"; sourceTree = ""; }; - 633FED581D3CD5580014B822 /* pause_big_over_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pause_big_over_selected.png; sourceTree = ""; }; - 633FED591D3CD5580014B822 /* pause_big_over_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pause_big_over_selected@2x.png"; sourceTree = ""; }; - 633FED5A1D3CD5580014B822 /* pause_small_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pause_small_default.png; sourceTree = ""; }; - 633FED5B1D3CD5590014B822 /* pause_small_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pause_small_default@2x.png"; sourceTree = ""; }; - 633FED5C1D3CD5590014B822 /* pause_small_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pause_small_disabled.png; sourceTree = ""; }; - 633FED5D1D3CD5590014B822 /* pause_small_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pause_small_disabled@2x.png"; sourceTree = ""; }; - 633FED5E1D3CD5590014B822 /* pause_small_over_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pause_small_over_selected.png; sourceTree = ""; }; - 633FED5F1D3CD5590014B822 /* pause_small_over_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pause_small_over_selected@2x.png"; sourceTree = ""; }; - 633FED601D3CD5590014B822 /* presence_away.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = presence_away.png; sourceTree = ""; }; - 633FED611D3CD5590014B822 /* presence_away@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "presence_away@2x.png"; sourceTree = ""; }; - 633FED621D3CD5590014B822 /* presence_offline.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = presence_offline.png; sourceTree = ""; }; - 633FED631D3CD5590014B822 /* presence_offline@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "presence_offline@2x.png"; sourceTree = ""; }; - 633FED641D3CD5590014B822 /* presence_online.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = presence_online.png; sourceTree = ""; }; - 633FED651D3CD5590014B822 /* presence_online@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "presence_online@2x.png"; sourceTree = ""; }; - 633FED661D3CD5590014B822 /* presence_unregistered.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = presence_unregistered.png; sourceTree = ""; }; - 633FED671D3CD5590014B822 /* presence_unregistered@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "presence_unregistered@2x.png"; sourceTree = ""; }; - 633FED681D3CD5590014B822 /* route_bluetooth_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route_bluetooth_default.png; sourceTree = ""; }; - 633FED691D3CD5590014B822 /* route_bluetooth_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "route_bluetooth_default@2x.png"; sourceTree = ""; }; - 633FED6A1D3CD5590014B822 /* route_bluetooth_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route_bluetooth_disabled.png; sourceTree = ""; }; - 633FED6B1D3CD5590014B822 /* route_bluetooth_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "route_bluetooth_disabled@2x.png"; sourceTree = ""; }; - 633FED6C1D3CD5590014B822 /* route_bluetooth_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route_bluetooth_selected.png; sourceTree = ""; }; - 633FED6D1D3CD5590014B822 /* route_bluetooth_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "route_bluetooth_selected@2x.png"; sourceTree = ""; }; - 633FED6E1D3CD5590014B822 /* route_earpiece_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route_earpiece_default.png; sourceTree = ""; }; - 633FED6F1D3CD5590014B822 /* route_earpiece_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "route_earpiece_default@2x.png"; sourceTree = ""; }; - 633FED701D3CD5590014B822 /* route_earpiece_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route_earpiece_disabled.png; sourceTree = ""; }; - 633FED711D3CD5590014B822 /* route_earpiece_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "route_earpiece_disabled@2x.png"; sourceTree = ""; }; - 633FED721D3CD5590014B822 /* route_earpiece_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route_earpiece_selected.png; sourceTree = ""; }; - 633FED731D3CD5590014B822 /* route_earpiece_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "route_earpiece_selected@2x.png"; sourceTree = ""; }; - 633FED741D3CD5590014B822 /* route_speaker_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route_speaker_default.png; sourceTree = ""; }; - 633FED751D3CD5590014B822 /* route_speaker_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "route_speaker_default@2x.png"; sourceTree = ""; }; - 633FED761D3CD5590014B822 /* route_speaker_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route_speaker_disabled.png; sourceTree = ""; }; - 633FED771D3CD5590014B822 /* route_speaker_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "route_speaker_disabled@2x.png"; sourceTree = ""; }; - 633FED781D3CD5590014B822 /* route_speaker_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = route_speaker_selected.png; sourceTree = ""; }; - 633FED791D3CD5590014B822 /* route_speaker_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "route_speaker_selected@2x.png"; sourceTree = ""; }; - 633FED7A1D3CD5590014B822 /* routes_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = routes_default.png; sourceTree = ""; }; - 633FED7B1D3CD5590014B822 /* routes_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "routes_default@2x.png"; sourceTree = ""; }; - 633FED7C1D3CD5590014B822 /* routes_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = routes_disabled.png; sourceTree = ""; }; - 633FED7D1D3CD5590014B822 /* routes_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "routes_disabled@2x.png"; sourceTree = ""; }; - 633FED7E1D3CD5590014B822 /* routes_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = routes_selected.png; sourceTree = ""; }; - 633FED7F1D3CD5590014B822 /* routes_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "routes_selected@2x.png"; sourceTree = ""; }; - 633FED801D3CD5590014B822 /* security_ko.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = security_ko.png; sourceTree = ""; }; - 633FED811D3CD5590014B822 /* security_ko@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "security_ko@2x.png"; sourceTree = ""; }; - 633FED821D3CD5590014B822 /* security_ok.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = security_ok.png; sourceTree = ""; }; - 633FED831D3CD5590014B822 /* security_ok@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "security_ok@2x.png"; sourceTree = ""; }; - 633FED841D3CD5590014B822 /* security_pending.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = security_pending.png; sourceTree = ""; }; - 633FED851D3CD5590014B822 /* security_pending@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "security_pending@2x.png"; sourceTree = ""; }; - 633FED861D3CD5590014B822 /* select_all_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = select_all_default.png; sourceTree = ""; }; - 633FED871D3CD5590014B822 /* select_all_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "select_all_default@2x.png"; sourceTree = ""; }; - 633FED881D3CD5590014B822 /* select_all_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = select_all_disabled.png; sourceTree = ""; }; - 633FED891D3CD5590014B822 /* select_all_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "select_all_disabled@2x.png"; sourceTree = ""; }; - 633FED8A1D3CD5590014B822 /* speaker_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = speaker_default.png; sourceTree = ""; }; - 633FED8B1D3CD5590014B822 /* speaker_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "speaker_default@2x.png"; sourceTree = ""; }; - 633FED8C1D3CD5590014B822 /* speaker_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = speaker_disabled.png; sourceTree = ""; }; - 633FED8D1D3CD5590014B822 /* speaker_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "speaker_disabled@2x.png"; sourceTree = ""; }; - 633FED8E1D3CD5590014B822 /* speaker_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = speaker_selected.png; sourceTree = ""; }; - 633FED8F1D3CD5590014B822 /* speaker_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "speaker_selected@2x.png"; sourceTree = ""; }; - 633FED941D3CD5590014B822 /* valid_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = valid_default.png; sourceTree = ""; }; - 633FED951D3CD5590014B822 /* valid_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "valid_default@2x.png"; sourceTree = ""; }; - 633FED961D3CD5590014B822 /* valid_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = valid_disabled.png; sourceTree = ""; }; - 633FED971D3CD5590014B822 /* valid_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "valid_disabled@2x.png"; sourceTree = ""; }; - 633FED981D3CD5590014B822 /* voicemail.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voicemail.png; sourceTree = ""; }; - 633FED991D3CD5590014B822 /* voicemail@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "voicemail@2x.png"; sourceTree = ""; }; - 633FED9A1D3CD5590014B822 /* waiting_time.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = waiting_time.png; sourceTree = ""; }; - 633FED9B1D3CD5590014B822 /* waiting_time@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "waiting_time@2x.png"; sourceTree = ""; }; - 633FEF561D3CD5E00014B822 /* UIAvatarPresence.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIAvatarPresence.h; sourceTree = ""; }; - 633FEF571D3CD5E00014B822 /* UIAvatarPresence.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIAvatarPresence.m; sourceTree = ""; }; - 6341807A1BBC103100F71761 /* ChatConversationCreateTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChatConversationCreateTableView.h; sourceTree = ""; }; - 6341807B1BBC103100F71761 /* ChatConversationCreateTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ChatConversationCreateTableView.m; sourceTree = ""; }; - 63423C081C4501D000D9A050 /* Contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Contact.h; sourceTree = ""; }; - 63423C091C4501D000D9A050 /* Contact.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Contact.m; sourceTree = ""; }; - 634610041B61330300548952 /* UILabel+Boldify.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UILabel+Boldify.h"; sourceTree = ""; }; - 634610051B61330300548952 /* UILabel+Boldify.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UILabel+Boldify.m"; sourceTree = ""; }; - 635173F71BA082A40095EB0A /* UIChatBubblePhotoCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIChatBubblePhotoCell.h; sourceTree = ""; }; - 635173F81BA082A40095EB0A /* UIChatBubblePhotoCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIChatBubblePhotoCell.m; sourceTree = ""; }; - 635775231B6673EC00C8B704 /* HistoryDetailsTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HistoryDetailsTableView.h; sourceTree = ""; }; - 635775241B6673EC00C8B704 /* HistoryDetailsTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HistoryDetailsTableView.m; sourceTree = ""; }; - 636316D21A1DEBCB0009B839 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/AboutView.xib; sourceTree = ""; }; - 636316D51A1DEC650009B839 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/SettingsView.xib; sourceTree = ""; }; - 636316DB1A1DEDD80009B839 /* ru */ = {isa = PBXFileReference; fileEncoding = 2483028224; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/HistoryDetailsView.strings; sourceTree = ""; }; - 636BC9951B5F921B00C754CE /* UIIconButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIIconButton.h; sourceTree = ""; }; - 636BC9961B5F921B00C754CE /* UIIconButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIIconButton.m; sourceTree = ""; }; - 63701DDD1BA32039006A9AE3 /* UIConfirmationDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIConfirmationDialog.h; sourceTree = ""; }; - 63701DDE1BA32039006A9AE3 /* UIConfirmationDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIConfirmationDialog.m; sourceTree = ""; }; - 6371579F1B283FE200C91677 /* FileTransferDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FileTransferDelegate.h; path = Utils/FileTransferDelegate.h; sourceTree = ""; }; - 637157A01B283FE200C91677 /* FileTransferDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FileTransferDelegate.m; path = Utils/FileTransferDelegate.m; sourceTree = ""; }; - 6377AC7E1BDE4068007F7625 /* UIBackToCallButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIBackToCallButton.h; sourceTree = ""; }; - 6377AC7F1BDE4069007F7625 /* UIBackToCallButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIBackToCallButton.m; sourceTree = ""; }; - 6381DA7B1C1AD5EA00DF3BBD /* UIBouncingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIBouncingView.h; sourceTree = ""; }; - 6381DA7C1C1AD5EA00DF3BBD /* UIBouncingView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIBouncingView.m; sourceTree = ""; }; - 638F1A611C2021B2004B8E02 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = "Base.lproj/DialerView~ipad.xib"; sourceTree = ""; }; - 638F1A901C21993D004B8E02 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = "Base.lproj/UICompositeView~ipad.xib"; sourceTree = ""; }; - 639CEAFE1A1DF4D9004DE38F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/StatusBarView.xib; sourceTree = ""; }; - 639CEB011A1DF4E4004DE38F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIHistoryCell.xib; sourceTree = ""; }; - 639CEB041A1DF4EB004DE38F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UICompositeView.xib; sourceTree = ""; }; - 639CEB0A1A1DF4FA004DE38F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIChatCell.xib; sourceTree = ""; }; - 639E9C7E1C0DB13D00019A75 /* UICheckBoxTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UICheckBoxTableView.h; sourceTree = ""; }; - 639E9C7F1C0DB13D00019A75 /* UICheckBoxTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UICheckBoxTableView.m; sourceTree = ""; }; - 639E9C941C0DB7BE00019A75 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/FirstLoginView.xib; sourceTree = ""; }; - 639E9CA11C0DB7E500019A75 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIChatBubblePhotoCell.xib; sourceTree = ""; }; - 639E9CA41C0DB7EA00019A75 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIChatBubbleTextCell.xib; sourceTree = ""; }; - 639E9CA71C0DB7F200019A75 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIChatCreateCell.xib; sourceTree = ""; }; - 639E9CAA1C0DB7FB00019A75 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIConfirmationDialog.xib; sourceTree = ""; }; - 639E9CAD1C0DB80300019A75 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIContactDetailsCell.xib; sourceTree = ""; }; - 639E9CB11C0DB83000019A75 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/SideMenuView.xib; sourceTree = ""; }; - 639E9CB41C0DB88200019A75 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/PhoneMainView.xib; sourceTree = ""; }; - 63AADBC51B6A0FF200AA16FD /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Localizable.strings; sourceTree = ""; }; - 63AADBC61B6A0FF200AA16FD /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; - 63AADBC71B6A0FF200AA16FD /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; - 63AADBCA1B6A0FF200AA16FD /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - 63AADBCB1B6A0FF200AA16FD /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; - 63AADBD71B6A0FF200AA16FD /* linphonerc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = linphonerc; sourceTree = ""; }; - 63AADBD81B6A0FF200AA16FD /* linphonerc-factory */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "linphonerc-factory"; sourceTree = ""; }; - 63AADBDA1B6A0FF200AA16FD /* linphonerc~ipad */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "linphonerc~ipad"; sourceTree = ""; }; - 63AADBDD1B6A0FF200AA16FD /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; }; - 63AADBE11B6A0FF200AA16FD /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; - 63AADBE31B6A0FF200AA16FD /* assistant_external_sip.rc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = assistant_external_sip.rc; sourceTree = ""; }; - 63AADBE41B6A0FF200AA16FD /* assistant_linphone_create.rc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = assistant_linphone_create.rc; sourceTree = ""; }; - 63AADBE51B6A0FF200AA16FD /* assistant_linphone_existing.rc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = assistant_linphone_existing.rc; sourceTree = ""; }; - 63AADBE61B6A0FF200AA16FD /* assistant_remote.rc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = assistant_remote.rc; sourceTree = ""; }; - 63B81A031B57DA33009604A6 /* LICENSE.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE.txt; sourceTree = ""; }; - 63B81A041B57DA33009604A6 /* TPKeyboardAvoidingCollectionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TPKeyboardAvoidingCollectionView.h; sourceTree = ""; }; - 63B81A051B57DA33009604A6 /* TPKeyboardAvoidingCollectionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TPKeyboardAvoidingCollectionView.m; sourceTree = ""; }; - 63B81A061B57DA33009604A6 /* TPKeyboardAvoidingScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TPKeyboardAvoidingScrollView.h; sourceTree = ""; }; - 63B81A071B57DA33009604A6 /* TPKeyboardAvoidingScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TPKeyboardAvoidingScrollView.m; sourceTree = ""; }; - 63B81A081B57DA33009604A6 /* TPKeyboardAvoidingTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TPKeyboardAvoidingTableView.h; sourceTree = ""; }; - 63B81A091B57DA33009604A6 /* TPKeyboardAvoidingTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TPKeyboardAvoidingTableView.m; sourceTree = ""; }; - 63B81A0A1B57DA33009604A6 /* UIScrollView+TPKeyboardAvoidingAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIScrollView+TPKeyboardAvoidingAdditions.h"; sourceTree = ""; }; - 63B81A0B1B57DA33009604A6 /* UIScrollView+TPKeyboardAvoidingAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIScrollView+TPKeyboardAvoidingAdditions.m"; sourceTree = ""; }; - 63B8D68D1BCBE65600C12B09 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ChatConversationCreateView.xib; sourceTree = ""; }; - 63B8D69F1BCBF43100C12B09 /* UIChatCreateCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIChatCreateCell.h; sourceTree = ""; }; - 63B8D6A01BCBF43100C12B09 /* UIChatCreateCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIChatCreateCell.m; sourceTree = ""; }; - 63BE7A761D75BDF6000990EF /* ShopTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShopTableView.h; sourceTree = ""; }; - 63BE7A771D75BDF6000990EF /* ShopTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ShopTableView.m; sourceTree = ""; }; - 63C441C11BBC23ED0053DC5E /* UIAssistantTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIAssistantTextField.h; sourceTree = ""; }; - 63C441C21BBC23ED0053DC5E /* UIAssistantTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIAssistantTextField.m; sourceTree = ""; }; - 63CD4B4D1A5AAC8C00B84282 /* DTAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DTAlertView.h; sourceTree = ""; }; - 63CD4B4E1A5AAC8C00B84282 /* DTAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DTAlertView.m; sourceTree = ""; }; - 63CDC4531C3BDE370085F529 /* msg.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = msg.caf; sourceTree = ""; }; - 63CDC4541C3BDE370085F529 /* ringback.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = ringback.wav; sourceTree = ""; }; - 63CDC45C1C3BDE370085F529 /* shortring.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = shortring.caf; sourceTree = ""; }; - 63CE583F1C85EBF400304800 /* VideoToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VideoToolbox.framework; path = System/Library/Frameworks/VideoToolbox.framework; sourceTree = SDKROOT; }; - 63D11C521C3D501200E8FCEE /* Log.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Log.m; path = Utils/Log.m; sourceTree = ""; }; - 63D11C541C3D503A00E8FCEE /* Log.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Log.h; sourceTree = ""; }; - 63DFE0451C40161700DA5E87 /* notes_of_the_optimistic.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = notes_of_the_optimistic.caf; sourceTree = ""; }; - 63E27A311C4FECD000D332AE /* LaunchScreen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LaunchScreen.xib; sourceTree = ""; }; - 63E27A511C50EB2700D332AE /* hold.mkv */ = {isa = PBXFileReference; lastKnownFileType = file; path = hold.mkv; sourceTree = ""; }; - 63E59A3D1ADE6ECB00646FB3 /* InAppProductsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InAppProductsManager.h; sourceTree = ""; }; - 63E59A3E1ADE70D900646FB3 /* InAppProductsManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InAppProductsManager.m; sourceTree = ""; }; - 63EC8D3A1D7438660066547B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/AssistantLinkView.xib; sourceTree = ""; }; - 63EEE4091BBA9B110087D3AF /* libxml2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libxml2.tbd; path = usr/lib/libxml2.tbd; sourceTree = SDKROOT; }; - 63EEE40B1BBA9B1B0087D3AF /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; - 63EEE40D1BBA9B250087D3AF /* libiconv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libiconv.tbd; path = usr/lib/libiconv.tbd; sourceTree = SDKROOT; }; - 63F1DF421BCE618E00EDED90 /* UIAddressTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIAddressTextField.h; sourceTree = ""; }; - 63F1DF431BCE618E00EDED90 /* UIAddressTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIAddressTextField.m; 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 = ""; }; - 662553B327EDFB35007F67D8 /* MagicSearch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagicSearch.swift; sourceTree = ""; }; -<<<<<<< HEAD - 662F13B52887E8A10084C28C /* UITestsUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITestsUtils.swift; sourceTree = ""; }; -======= - 662F13B52887E8A10084C28C /* Utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; ->>>>>>> 8e16f1fad (new test plans) - 6637AF8D288593AF00965733 /* CallUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CallUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 6637AF8F288593AF00965733 /* IncomingCallUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IncomingCallUITests.swift; sourceTree = ""; }; - 663B06592886B54F00E41889 /* OutgoingCallUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OutgoingCallUITests.swift; sourceTree = ""; }; - 663B065B2886DA8500E41889 /* ActiveCallViewUITestsMethods.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActiveCallViewUITestsMethods.swift; sourceTree = ""; }; - 663B065F2886E38100E41889 /* ActiveCallUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActiveCallUITests.swift; sourceTree = ""; }; - 663B06652886F0DB00E41889 /* ExtraMenuUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtraMenuUITests.swift; sourceTree = ""; }; - 663B06672886F16300E41889 /* ExtraMenuActiveCallActionsUITestsMethods.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtraMenuActiveCallActionsUITestsMethods.swift; sourceTree = ""; }; - 6643AD51287EF56200701703 /* UITestsCoreManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITestsCoreManager.swift; sourceTree = ""; }; - 6643AD54287F25A500701703 /* IncomingOutgoingCallViewUITestsMethods.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IncomingOutgoingCallViewUITestsMethods.swift; sourceTree = ""; }; -<<<<<<< HEAD - 66495D0B28901429002780DE /* Default.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = Default.xctestplan; sourceTree = ""; }; - 66495D0C289014E2002780DE /* PauseMode_extended.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = PauseMode_extended.xctestplan; sourceTree = ""; }; - 664F8220289A66ED00D8C470 /* Debug.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = Debug.xctestplan; sourceTree = ""; }; - 66689D3F28A2443A0054E633 /* UITestsScreenshots.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITestsScreenshots.swift; sourceTree = ""; }; -======= - 66495CFB288FF346002780DE /* AutoConnectLinphoneAccount.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AutoConnectLinphoneAccount.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 66495CFD288FF346002780DE /* AutoConnectLinphoneAccount.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoConnectLinphoneAccount.swift; sourceTree = ""; }; - 66495D0A289013F6002780DE /* Init.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = Init.xctestplan; sourceTree = ""; }; - 66495D0B28901429002780DE /* Default.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = Default.xctestplan; sourceTree = ""; }; - 66495D0C289014E2002780DE /* PauseMode_extended.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = PauseMode_extended.xctestplan; sourceTree = ""; }; ->>>>>>> 8e16f1fad (new test plans) - 666D795C283E67E300B07215 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; - 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 = ""; }; - 66E399F52857869200E73456 /* menu_notifications_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_notifications_off.png; sourceTree = ""; }; - 66E399F62857869200E73456 /* menu_notifications_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_notifications_on.png; sourceTree = ""; }; - 6872242062F852BE19E78D5A /* 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 = ""; }; - 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; }; -<<<<<<< HEAD - 71361846551F180407CA4B43 /* 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 = ""; }; - 799B9EAE0655DBE81E9B29FF /* Pods-ConferenceUITests.distributionadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ConferenceUITests.distributionadhoc.xcconfig"; path = "Target Support Files/Pods-ConferenceUITests/Pods-ConferenceUITests.distributionadhoc.xcconfig"; sourceTree = ""; }; - 842B7EC5D5497903DF48A6A1 /* 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 = ""; }; - 8751F1E7083FF5EDF43CEEF1 /* Pods-CallUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CallUITests.release.xcconfig"; path = "Target Support Files/Pods-CallUITests/Pods-CallUITests.release.xcconfig"; sourceTree = ""; }; -======= - 712CE82EEF35C1881B8E98E7 /* Pods-AutoConnectLinphoneAccount.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AutoConnectLinphoneAccount.debug.xcconfig"; path = "Target Support Files/Pods-AutoConnectLinphoneAccount/Pods-AutoConnectLinphoneAccount.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 = ""; }; ->>>>>>> 8e16f1fad (new test plans) - 8C1A1F7C1FA331D40064BE00 /* libsoci_sqlite3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsoci_sqlite3.a; path = "liblinphone-sdk/apple-darwin/lib/libsoci_sqlite3.a"; sourceTree = ""; }; - 8C23BCB71D82AAC3005F19BB /* linphone.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = linphone.entitlements; sourceTree = ""; }; - 8C2595DE1DEDCC8E007A6424 /* CallKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CallKit.framework; path = System/Library/Frameworks/CallKit.framework; sourceTree = SDKROOT; }; - 8C2A81931F87B7FF0012A66B /* chat_group_avatar@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_group_avatar@2x.png"; sourceTree = ""; }; - 8C2A81941F87B8000012A66B /* chat_group_avatar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_group_avatar.png; sourceTree = ""; }; - 8C300D981E40E0CC00728EF3 /* lime_ko.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = lime_ko.png; sourceTree = ""; }; - 8C300D991E40E0CC00728EF3 /* lime_ko@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "lime_ko@2x.png"; sourceTree = ""; }; - 8C3EAA191EB8D9C300B732B6 /* linphonetester.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = linphonetester.framework; path = "liblinphone-sdk/apple-darwin/Frameworks/linphonetester.framework"; sourceTree = ""; }; - 8C5BCEC61EB3859200A9AAEF /* bctoolbox-tester.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = "bctoolbox-tester.framework"; path = "liblinphone-sdk/apple-darwin/Frameworks/bctoolbox-tester.framework"; sourceTree = ""; }; - 8C5D1B991D9BC48100DC6539 /* UIShopTableCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIShopTableCell.h; sourceTree = ""; }; - 8C5D1B9B1D9BC48100DC6539 /* UIShopTableCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UIShopTableCell.xib; sourceTree = ""; }; - 8C73477B1D9BA3A00022EE8C /* UserNotifications.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotifications.framework; path = System/Library/Frameworks/UserNotifications.framework; sourceTree = SDKROOT; }; - 8C92ABE71FA773190006FB5D /* UIChatNotifiedEventCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UIChatNotifiedEventCell.xib; sourceTree = ""; }; - 8C92ABF11FA773C20006FB5D /* UIChatNotifiedEventCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIChatNotifiedEventCell.h; sourceTree = ""; }; - 8C92ABF21FA773E50006FB5D /* UIChatNotifiedEventCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UIChatNotifiedEventCell.m; sourceTree = ""; }; - 8C9C5E0B1F83B2EF006987FA /* ChatConversationCreateCollectionViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ChatConversationCreateCollectionViewController.h; sourceTree = ""; }; - 8C9C5E0C1F83B2EF006987FA /* ChatConversationCreateCollectionViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ChatConversationCreateCollectionViewController.m; sourceTree = ""; }; - 8C9C5E0E1F83BD97006987FA /* UIChatCreateCollectionViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIChatCreateCollectionViewCell.h; sourceTree = ""; }; - 8C9C5E0F1F83BD97006987FA /* UIChatCreateCollectionViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UIChatCreateCollectionViewCell.m; sourceTree = ""; }; - 8CA2004B1D8158440095F859 /* PushKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PushKit.framework; path = System/Library/Frameworks/PushKit.framework; sourceTree = SDKROOT; }; - 8CA70ACF1F9E0ABA00A3D2EB /* ChatConversationInfoView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ChatConversationInfoView.h; sourceTree = ""; }; - 8CA70AD01F9E0AE100A3D2EB /* ChatConversationInfoView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ChatConversationInfoView.m; sourceTree = ""; }; - 8CA70AD21F9E285B00A3D2EB /* chat_group_add@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "chat_group_add@2x.png"; sourceTree = ""; }; - 8CA70AD31F9E285B00A3D2EB /* chat_group_add.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_group_add.png; sourceTree = ""; }; - 8CA70AE11F9E39E400A3D2EB /* UIChatConversationInfoTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIChatConversationInfoTableViewCell.h; sourceTree = ""; }; - 8CA70AE21F9E39E400A3D2EB /* UIChatConversationInfoTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UIChatConversationInfoTableViewCell.m; sourceTree = ""; }; - 8CB2B8F61F86229B0015CEE2 /* chat_secure.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chat_secure.png; sourceTree = ""; }; - 8CB2B8F71F86229C0015CEE2 /* next_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = next_disabled.png; sourceTree = ""; }; - 8CB2B8F81F86229D0015CEE2 /* next_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "next_disabled@2x.png"; sourceTree = ""; }; - 8CBD7BA120B6B7FD00E5DCC0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ChatConversationInfoView.xib; sourceTree = ""; }; - 8CBD7BA420B6B80D00E5DCC0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ChatConversationImdnView.xib; sourceTree = ""; }; - 8CBD7BA720B6B82400E5DCC0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIChatConversationInfoTableViewCell.xib; sourceTree = ""; }; - 8CBD7BAA20B6B82A00E5DCC0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIChatConversationImdnTableViewCell.xib; sourceTree = ""; }; - 8CBD7BAD20B6B82F00E5DCC0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIChatCreateCollectionViewCell.xib; sourceTree = ""; }; - 8CBD7BB120B6B86900E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/AssistantView.strings; sourceTree = ""; }; - 8CBD7BB220B6B86A00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/AssistantViewScreens.strings; sourceTree = ""; }; - 8CBD7BB720B6B86E00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ChatConversationInfoView.strings; sourceTree = ""; }; - 8CBD7BB820B6B86F00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ChatConversationImdnView.strings; sourceTree = ""; }; - 8CBD7BB920B6B87000E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ChatConversationCreateView.strings; sourceTree = ""; }; - 8CBD7BBA20B6B87000E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ChatConversationView.strings; sourceTree = ""; }; - 8CBD7BBB20B6B87100E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ChatsListView.strings; sourceTree = ""; }; - 8CBD7BBC20B6B87200E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ContactDetailsView.strings; sourceTree = ""; }; - 8CBD7BBD20B6B87300E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ContactsListView.strings; sourceTree = ""; }; - 8CBD7BBE20B6B87400E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/CountryListView.strings; sourceTree = ""; }; - 8CBD7BBF20B6B87400E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/DialerView.strings; sourceTree = ""; }; - 8CBD7BC020B6B87500E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = "fr.lproj/DialerView~ipad.strings"; sourceTree = ""; }; - 8CBD7BC120B6B87600E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/FirstLoginView.strings; sourceTree = ""; }; - 8CBD7BC220B6B87600E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/HistoryDetailsView.strings; sourceTree = ""; }; - 8CBD7BC320B6B87700E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/HistoryListView.strings; sourceTree = ""; }; - 8CBD7BC420B6B87800E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ImageView.strings; sourceTree = ""; }; - 8CBD7BC720B6B87A00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatBubblePhotoCell.strings; sourceTree = ""; }; - 8CBD7BC820B6B87B00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatBubbleTextCell.strings; sourceTree = ""; }; - 8CBD7BC920B6B87B00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatCell.strings; sourceTree = ""; }; - 8CBD7BCA20B6B87D00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatConversationInfoTableViewCell.strings; sourceTree = ""; }; - 8CBD7BCB20B6B87E00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatConversationImdnTableViewCell.strings; sourceTree = ""; }; - 8CBD7BCC20B6B87E00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatCreateCollectionViewCell.strings; sourceTree = ""; }; - 8CBD7BCD20B6B88000E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatCreateCell.strings; sourceTree = ""; }; - 8CBD7BCE20B6B88100E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UICompositeView.strings; sourceTree = ""; }; - 8CBD7BCF20B6B88200E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = "fr.lproj/UICompositeView~ipad.strings"; sourceTree = ""; }; - 8CBD7BD020B6B88400E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIConfirmationDialog.strings; sourceTree = ""; }; - 8CBD7BD120B6B88500E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIContactCell.strings; sourceTree = ""; }; - 8CBD7BD220B6B88700E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIContactDetailsCell.strings; sourceTree = ""; }; - 8CBD7BD320B6B88900E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIHistoryCell.strings; sourceTree = ""; }; - 8CBD7BD420B6B88A00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/PhoneMainView.strings; sourceTree = ""; }; - 8CBD7BD520B6B88C00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/SettingsView.strings; sourceTree = ""; }; - 8CBD7BD720B6B88E00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/SideMenuView.strings; sourceTree = ""; }; - 8CBD7BD820B6B88F00E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = "fr.lproj/SideMenuView~ipad.strings"; sourceTree = ""; }; - 8CBD7BD920B6B89000E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/StatusBarView.strings; sourceTree = ""; }; - 8CBD7BDA20B6B89000E5DCC0 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/TabBarView.strings; sourceTree = ""; }; - 8CD0B3BE1FA22CBA008FEB16 /* libsoci_core.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsoci_core.a; path = "liblinphone-sdk/apple-darwin/lib/libsoci_core.a"; sourceTree = ""; }; - 8CD99A1B20908C27008A7CDA /* callkit_logo@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "callkit_logo@2x.png"; sourceTree = ""; }; - 8CD99A352090A823008A7CDA /* splashscreen@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "splashscreen@2x.png"; sourceTree = ""; }; - 8CD99A362090A824008A7CDA /* splashscreen.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = splashscreen.png; sourceTree = ""; }; - 8CD99A3B2090B9FA008A7CDA /* ChatConversationImdnView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ChatConversationImdnView.m; sourceTree = ""; }; - 8CD99A3D2090BA24008A7CDA /* ChatConversationImdnView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ChatConversationImdnView.h; sourceTree = ""; }; - 8CD99A402090CE25008A7CDA /* UIChatConversationImdnTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIChatConversationImdnTableViewCell.h; sourceTree = ""; }; - 8CD99A412090CE6F008A7CDA /* UIChatConversationImdnTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UIChatConversationImdnTableViewCell.m; sourceTree = ""; }; - 8CDC618C1F84D89B0087CF7F /* check_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = check_selected.png; sourceTree = ""; }; - 8CDC61961F84D9270087CF7F /* check_selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "check_selected@2x.png"; sourceTree = ""; }; - 8CE24F491F8234A20077AC0A /* next_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = next_default.png; sourceTree = ""; }; - 8CE24F4A1F8234A30077AC0A /* next_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "next_default@2x.png"; sourceTree = ""; }; - 8CE24F551F8268840077AC0A /* conference_delete.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = conference_delete.png; sourceTree = ""; }; - 8CE24F561F8268840077AC0A /* conference_delete@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "conference_delete@2x.png"; sourceTree = ""; }; - 8CF25D8B1F9F336000BEA0C1 /* check_unselected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "check_unselected@2x.png"; sourceTree = ""; }; - 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 = ""; }; -<<<<<<< HEAD - 943C756D8C523B63A9BA4022 /* Pods_msgNotificationService.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_msgNotificationService.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 95AD7F004071737738D4BCF2 /* Pods-CallUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CallUITests.debug.xcconfig"; path = "Target Support Files/Pods-CallUITests/Pods-CallUITests.debug.xcconfig"; sourceTree = ""; }; - 9B3B6B861461E656FAF443CC /* Pods-CallUITests.distributionadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CallUITests.distributionadhoc.xcconfig"; path = "Target Support Files/Pods-CallUITests/Pods-CallUITests.distributionadhoc.xcconfig"; sourceTree = ""; }; - 9B7FA931ED086404EBA1A1DF /* Pods-ConferenceUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ConferenceUITests.debug.xcconfig"; path = "Target Support Files/Pods-ConferenceUITests/Pods-ConferenceUITests.debug.xcconfig"; sourceTree = ""; }; - A52DBCC32989FB3510AF3B1E /* 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 = ""; }; - A6FD9930E5B1F4149D45BB1C /* Pods_linphone.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_linphone.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AD31E0BAAE2E50305E05B683 /* 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 = ""; }; - B0D404E542E5871F7437A060 /* 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 = ""; }; -======= - 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 = ""; }; - B4847F48A899455D4B85F8BF /* Pods-AutoConnectLinphoneAccount.distribution.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AutoConnectLinphoneAccount.distribution.xcconfig"; path = "Target Support Files/Pods-AutoConnectLinphoneAccount/Pods-AutoConnectLinphoneAccount.distribution.xcconfig"; sourceTree = ""; }; ->>>>>>> 8e16f1fad (new test plans) - 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 = ""; }; - C622E3E926A8128F004F5434 /* vr_stop.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = vr_stop.png; sourceTree = ""; }; - C622E3EA26A8128F004F5434 /* vr_wave.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = vr_wave.png; sourceTree = ""; }; - C622E3EB26A8128F004F5434 /* vr_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = vr_on.png; sourceTree = ""; }; - C622E3EC26A8128F004F5434 /* vr_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = vr_off.png; sourceTree = ""; }; - C622E3ED26A8128F004F5434 /* vr_pause.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = vr_pause.png; sourceTree = ""; }; - C622E3EE26A81290004F5434 /* vr_play.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = vr_play.png; sourceTree = ""; }; - C63F7197285A24B10066163B /* ConfigManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfigManager.swift; sourceTree = ""; }; - C63F7198285A24B10066163B /* CallManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallManager.swift; sourceTree = ""; }; - C63F719B285A24B10066163B /* ConferenceWaitingRoomViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceWaitingRoomViewModel.swift; sourceTree = ""; }; - C63F719C285A24B10066163B /* ConferenceSchedulingViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceSchedulingViewModel.swift; sourceTree = ""; }; - C63F719D285A24B10066163B /* ScheduledConferencesViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScheduledConferencesViewModel.swift; sourceTree = ""; }; - C63F719F285A24B10066163B /* ScheduledConferenceData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScheduledConferenceData.swift; sourceTree = ""; }; - C63F71A0285A24B10066163B /* TimeZoneData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TimeZoneData.swift; sourceTree = ""; }; - C63F71A1285A24B10066163B /* Duration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Duration.swift; sourceTree = ""; }; - C63F71A3285A24B10066163B /* ConferenceWaitingRoomFragment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceWaitingRoomFragment.swift; sourceTree = ""; }; - C63F71A4285A24B10066163B /* ScheduledConferencesView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScheduledConferencesView.swift; sourceTree = ""; }; - C63F71A5285A24B10066163B /* ICSBubbleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ICSBubbleView.swift; sourceTree = ""; }; - C63F71A6285A24B10066163B /* ScheduledConferencesCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScheduledConferencesCell.swift; sourceTree = ""; }; - C63F71A7285A24B10066163B /* ConferenceHistoryDetailsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceHistoryDetailsView.swift; sourceTree = ""; }; - C63F71A8285A24B10066163B /* ConferenceSchedulingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceSchedulingView.swift; sourceTree = ""; }; - C63F71A9285A24B10066163B /* ConferenceSchedulingSummaryView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceSchedulingSummaryView.swift; sourceTree = ""; }; - C63F71AC285A24B10066163B /* MediatorLiveData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediatorLiveData.swift; sourceTree = ""; }; - C63F71AD285A24B10066163B /* MutableLiveData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MutableLiveData.swift; sourceTree = ""; }; - C63F71AE285A24B10066163B /* Pair.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Pair.swift; sourceTree = ""; }; - C63F71AF285A24B10066163B /* BackNextNavigationView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BackNextNavigationView.swift; sourceTree = ""; }; - C63F71B0285A24B10066163B /* TimestampUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TimestampUtils.swift; sourceTree = ""; }; - C63F71B1285A24B10066163B /* AppManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppManager.swift; sourceTree = ""; }; - C63F71B4285A24B10066163B /* UIApplication+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIApplication+Extension.swift"; sourceTree = ""; }; - C63F71B6285A24B10066163B /* UIVIewControllerExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIVIewControllerExtensions.swift; sourceTree = ""; }; - C63F71B7285A24B10066163B /* UIImageExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageExtensions.swift; sourceTree = ""; }; - C63F71B8285A24B10066163B /* UIVIewExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIVIewExtensions.swift; sourceTree = ""; }; - C63F71B9285A24B10066163B /* UILabelExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UILabelExtensions.swift; sourceTree = ""; }; - C63F71BA285A24B10066163B /* OptionalExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OptionalExtensions.swift; sourceTree = ""; }; - C63F71BB285A24B10066163B /* UIButtonExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIButtonExtensions.swift; sourceTree = ""; }; - C63F71BC285A24B10066163B /* UIImageViewExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageViewExtensions.swift; sourceTree = ""; }; - C63F71BD285A24B10066163B /* UIDeviceExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIDeviceExtensions.swift; sourceTree = ""; }; - C63F71BE285A24B10066163B /* UIColorExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIColorExtensions.swift; sourceTree = ""; }; - C63F71C0285A24B10066163B /* CoreExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreExtensions.swift; sourceTree = ""; }; - C63F71C1285A24B10066163B /* IceState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IceState.swift; sourceTree = ""; }; - C63F71C2285A24B10066163B /* AddressExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddressExtensions.swift; sourceTree = ""; }; - C63F71C3285A24B10066163B /* ParticipantExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParticipantExtensions.swift; sourceTree = ""; }; - C63F71C4285A24B10066163B /* PayloadType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PayloadType.swift; sourceTree = ""; }; - C63F71C5285A24B10066163B /* CallExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallExtensions.swift; sourceTree = ""; }; - C63F71C6285A24B10066163B /* ConferenceExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceExtensions.swift; sourceTree = ""; }; - C63F71C9285A24B10066163B /* ConferenceViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceViewModel.swift; sourceTree = ""; }; - C63F71CA285A24B10066163B /* CallsViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallsViewModel.swift; sourceTree = ""; }; - C63F71CB285A24B10066163B /* ControlsViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ControlsViewModel.swift; sourceTree = ""; }; - C63F71CC285A24B10066163B /* CallStatisticsData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallStatisticsData.swift; sourceTree = ""; }; - C63F71CD285A24B10066163B /* ConferenceParticipantData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceParticipantData.swift; sourceTree = ""; }; - C63F71CE285A24B10066163B /* ConferenceParticipantDeviceData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceParticipantDeviceData.swift; sourceTree = ""; }; - C63F71CF285A24B10066163B /* CallData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallData.swift; sourceTree = ""; }; - C63F71D0285A24B10066163B /* AudioRouteUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AudioRouteUtils.swift; sourceTree = ""; }; - C63F71D2285A24B10066163B /* LightDarkColor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LightDarkColor.swift; sourceTree = ""; }; - C63F71D3285A24B10066163B /* TextStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextStyle.swift; sourceTree = ""; }; - C63F71D4285A24B10066163B /* VoipTexts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipTexts.swift; sourceTree = ""; }; - C63F71D5285A24B10066163B /* ButtonTheme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ButtonTheme.swift; sourceTree = ""; }; - C63F71D6285A24B10066163B /* VoipTheme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipTheme.swift; sourceTree = ""; }; - C63F71DA285A24B10066163B /* ParticipantsListView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParticipantsListView.swift; sourceTree = ""; }; - C63F71DB285A24B10066163B /* VoipParticipantCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipParticipantCell.swift; sourceTree = ""; }; - C63F71DC285A24B10066163B /* AudioRoutesView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AudioRoutesView.swift; sourceTree = ""; }; - C63F71DE285A24B10066163B /* VoipActiveSpeakerParticipantCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipActiveSpeakerParticipantCell.swift; sourceTree = ""; }; - C63F71DF285A24B10066163B /* VoipConferenceAudioOnlyView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipConferenceAudioOnlyView.swift; sourceTree = ""; }; - C63F71E0285A24B10066163B /* VoipGridParticipantCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipGridParticipantCell.swift; sourceTree = ""; }; - C63F71E1285A24B10066163B /* VoipAudioOnlyParticipantCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipAudioOnlyParticipantCell.swift; sourceTree = ""; }; - C63F71E2285A24B10066163B /* MicMuted.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MicMuted.swift; sourceTree = ""; }; - C63F71E3285A24B10066163B /* VoipConferenceGridView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipConferenceGridView.swift; sourceTree = ""; }; - C63F71E4285A24B10066163B /* VoipConferenceActiveSpeakerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipConferenceActiveSpeakerView.swift; sourceTree = ""; }; - C63F71E5285A24B10066163B /* VoipConferenceDisplayModeSelectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipConferenceDisplayModeSelectionView.swift; sourceTree = ""; }; - C63F71E7285A24B10066163B /* ActiveCallView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActiveCallView.swift; sourceTree = ""; }; - C63F71E8285A24B10066163B /* IncomingOuntgoingCommonView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IncomingOuntgoingCommonView.swift; sourceTree = ""; }; - C63F71E9285A24B10066163B /* PausedCallOrConferenceView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PausedCallOrConferenceView.swift; sourceTree = ""; }; - C63F71EA285A24B10066163B /* LocalVideoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocalVideoView.swift; sourceTree = ""; }; - C63F71EB285A24B10066163B /* CallStatsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallStatsView.swift; sourceTree = ""; }; - C63F71EC285A24B10066163B /* NumpadView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NumpadView.swift; sourceTree = ""; }; - C63F71ED285A24B10066163B /* VoipExtraButtonsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipExtraButtonsView.swift; sourceTree = ""; }; - C63F71EF285A24B10066163B /* VoipCallContextMenu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipCallContextMenu.swift; sourceTree = ""; }; - C63F71F0285A24B10066163B /* CallsListView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallsListView.swift; sourceTree = ""; }; - C63F71F1285A24B10066163B /* VoipCallCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipCallCell.swift; sourceTree = ""; }; - C63F71F2285A24B10066163B /* DismissableView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DismissableView.swift; sourceTree = ""; }; - C63F71F3285A24B10066163B /* ConferenceLayoutPickerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceLayoutPickerView.swift; sourceTree = ""; }; - C63F71F4285A24B10066163B /* ControlsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ControlsView.swift; sourceTree = ""; }; - C63F71F5285A24B10066163B /* RemotelyRecording.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemotelyRecording.swift; sourceTree = ""; }; - C63F71F7285A24B10066163B /* OutgoingCallView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OutgoingCallView.swift; sourceTree = ""; }; - C63F71F8285A24B10066163B /* ActiveCallOrConferenceView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActiveCallOrConferenceView.swift; sourceTree = ""; }; - C63F71F9285A24B10066163B /* IncomingCallView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IncomingCallView.swift; sourceTree = ""; }; - C63F71FA285A24B10066163B /* SharedLayoutConstants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SharedLayoutConstants.swift; sourceTree = ""; }; - C63F71FB285A24B10066163B /* VoipDialog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipDialog.swift; sourceTree = ""; }; - C63F71FD285A24B10066163B /* StyledValuePicker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StyledValuePicker.swift; sourceTree = ""; }; - C63F71FE285A24B10066163B /* StyledSwitch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StyledSwitch.swift; sourceTree = ""; }; - C63F71FF285A24B10066163B /* CallControlButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallControlButton.swift; sourceTree = ""; }; - C63F7200285A24B10066163B /* RotatingSpinner.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RotatingSpinner.swift; sourceTree = ""; }; - C63F7201285A24B10066163B /* FormButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FormButton.swift; sourceTree = ""; }; - C63F7202285A24B10066163B /* BouncingCounter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BouncingCounter.swift; sourceTree = ""; }; - C63F7203285A24B10066163B /* VoipExtraButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VoipExtraButton.swift; sourceTree = ""; }; - C63F7204285A24B10066163B /* UICallTimer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UICallTimer.swift; sourceTree = ""; }; - C63F7205285A24B10066163B /* StyledCheckBox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StyledCheckBox.swift; sourceTree = ""; }; - C63F7206285A24B10066163B /* Avatar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Avatar.swift; sourceTree = ""; }; - C63F7207285A24B10066163B /* StyledLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StyledLabel.swift; sourceTree = ""; }; - C63F7208285A24B10066163B /* StyledDatePicker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StyledDatePicker.swift; sourceTree = ""; }; - C63F7209285A24B10066163B /* ButtonWithStateBackgrounds.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ButtonWithStateBackgrounds.swift; sourceTree = ""; }; - C63F720A285A24B10066163B /* StyledTextView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StyledTextView.swift; sourceTree = ""; }; - C63F720B285A24B10066163B /* ProviderDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProviderDelegate.swift; sourceTree = ""; }; - C63F720C285A24B10066163B /* VFSUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VFSUtil.swift; sourceTree = ""; }; - C63F7271285A2F140066163B /* voip_dropdown.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_dropdown.png; sourceTree = ""; }; - C63F7272285A2F140066163B /* voip_spinner.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_spinner.png; sourceTree = ""; }; - C63F7273285A2F140066163B /* voip_numpad_7.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_7.png; sourceTree = ""; }; - C63F7274285A2F150066163B /* voip_radio_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_radio_off.png; sourceTree = ""; }; - C63F7275285A2F150066163B /* voip_export.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_export.png; sourceTree = ""; }; - C63F7276285A2F150066163B /* voip_call_numpad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_numpad.png; sourceTree = ""; }; - C63F7277285A2F150066163B /* voip_chat_rooms_list.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_chat_rooms_list.png; sourceTree = ""; }; - C63F7278285A2F150066163B /* voip_numpad_4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_4.png; sourceTree = ""; }; - C63F7279285A2F150066163B /* voip_call_header_incoming.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_header_incoming.png; sourceTree = ""; }; - C63F727A285A2F150066163B /* voip_calls_list.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_calls_list.png; sourceTree = ""; }; - C63F727B285A2F160066163B /* voip_call_header_paused.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_header_paused.png; sourceTree = ""; }; - C63F727C285A2F160066163B /* voip_numpad_0.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_0.png; sourceTree = ""; }; - C63F727D285A2F160066163B /* voip_numpad_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_3.png; sourceTree = ""; }; - C63F727E285A2F160066163B /* voip_numpad_9.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_9.png; sourceTree = ""; }; - C63F727F285A2F160066163B /* voip_speaker_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_speaker_on.png; sourceTree = ""; }; - C63F7280285A2F160066163B /* voip_audio_routes.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_audio_routes.png; sourceTree = ""; }; - C63F7281285A2F160066163B /* voip_call_record.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_record.png; sourceTree = ""; }; - C63F7282285A2F170066163B /* voip_call_forward.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_forward.png; sourceTree = ""; }; - C63F7283285A2F170066163B /* voip_change_camera.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_change_camera.png; sourceTree = ""; }; - C63F7284285A2F170066163B /* voip_checkbox_checked.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_checkbox_checked.png; sourceTree = ""; }; - C63F7285285A2F170066163B /* voip_info.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_info.png; sourceTree = ""; }; - C63F7286285A2F170066163B /* voip_speaker_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_speaker_off.png; sourceTree = ""; }; - C63F7287285A2F170066163B /* voip_call_more.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_more.png; sourceTree = ""; }; - C63F7288285A2F170066163B /* voip_call_stats.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_stats.png; sourceTree = ""; }; - C63F7289285A2F180066163B /* voip_numpad_8.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_8.png; sourceTree = ""; }; - C63F728A285A2F180066163B /* voip_call_add.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_add.png; sourceTree = ""; }; - C63F728B285A2F180066163B /* voip_copy.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_copy.png; sourceTree = ""; }; - C63F728C285A2F180066163B /* voip_conference_paused_big.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_conference_paused_big.png; sourceTree = ""; }; - C63F728D285A2F180066163B /* voip_numpad_star.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_star.png; sourceTree = ""; }; - C63F728E285A2F180066163B /* voip_numpad_hash.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_hash.png; sourceTree = ""; }; - C63F728F285A2F180066163B /* voip_multiple_contacts_avatar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_multiple_contacts_avatar.png; sourceTree = ""; }; - C63F7290285A2F180066163B /* voip_remote_recording.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_remote_recording.png; sourceTree = ""; }; - C63F7291285A2F190066163B /* voip_hangup.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_hangup.png; sourceTree = ""; }; - C63F7292285A2F190066163B /* voip_pause.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_pause.png; sourceTree = ""; }; - C63F7293285A2F190066163B /* voip_numpad_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_1.png; sourceTree = ""; }; - C63F7294285A2F190066163B /* voip_mandatory.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_mandatory.png; sourceTree = ""; }; - C63F7295285A2F190066163B /* voip_earpiece.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_earpiece.png; sourceTree = ""; }; - C63F7296285A2F190066163B /* voip_numpad_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_2.png; sourceTree = ""; }; - C63F7297285A2F190066163B /* voip_conference_audio_only.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_conference_audio_only.png; sourceTree = ""; }; - C63F7298285A2F1A0066163B /* voip_menu_more.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_menu_more.png; sourceTree = ""; }; - C63F7299285A2F1A0066163B /* voip_conference_new.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_conference_new.png; sourceTree = ""; }; - C63F729A285A2F1A0066163B /* voip_call_header_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_header_active.png; sourceTree = ""; }; - C63F729B285A2F1A0066163B /* voip_bluetooth.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_bluetooth.png; sourceTree = ""; }; - C63F729C285A2F1A0066163B /* voip_micro_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_micro_off.png; sourceTree = ""; }; - C63F729D285A2F1A0066163B /* voip_camera_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_camera_on.png; sourceTree = ""; }; - C63F729E285A2F1A0066163B /* voip_conference_play_big.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_conference_play_big.png; sourceTree = ""; }; - C63F729F285A2F1B0066163B /* voip_call.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call.png; sourceTree = ""; }; - C63F72A0285A2F1B0066163B /* voip_call_list_menu.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_list_menu.png; sourceTree = ""; }; - C63F72A1285A2F1B0066163B /* voip_conference_active_speaker.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_conference_active_speaker.png; sourceTree = ""; }; - C63F72A2285A2F1B0066163B /* voip_numpad_6.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_6.png; sourceTree = ""; }; - C63F72A3285A2F1B0066163B /* voip_call_participants.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_participants.png; sourceTree = ""; }; - C63F72A4285A2F1B0066163B /* conference_schedule_calendar_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = conference_schedule_calendar_default.png; sourceTree = ""; }; - C63F72A5285A2F1B0066163B /* voip_call_chat.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_chat.png; sourceTree = ""; }; - C63F72A6285A2F1B0066163B /* voip_checkbox_unchecked.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_checkbox_unchecked.png; sourceTree = ""; }; - C63F72A7285A2F1C0066163B /* voip_edit.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_edit.png; sourceTree = ""; }; - C63F72A8285A2F1C0066163B /* conference_schedule_time_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = conference_schedule_time_default.png; sourceTree = ""; }; - C63F72A9285A2F1C0066163B /* voip_merge_calls.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_merge_calls.png; sourceTree = ""; }; - C63F72AA285A2F1C0066163B /* voip_camera_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_camera_off.png; sourceTree = ""; }; - C63F72AB285A2F1C0066163B /* voip_micro_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_micro_on.png; sourceTree = ""; }; - C63F72AC285A2F1C0066163B /* voip_radio_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_radio_on.png; sourceTree = ""; }; - C63F72AD285A2F1C0066163B /* conference_schedule_participants_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = conference_schedule_participants_default.png; sourceTree = ""; }; - C63F72AE285A2F1D0066163B /* voip_conference_mosaic.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_conference_mosaic.png; sourceTree = ""; }; - C63F72AF285A2F1D0066163B /* voip_numpad_5.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_numpad_5.png; sourceTree = ""; }; - C63F72B0285A2F1D0066163B /* voip_conference_new_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_conference_new_selected.png; sourceTree = ""; }; - C63F72B1285A2F1D0066163B /* voip_single_contact_avatar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_single_contact_avatar.png; sourceTree = ""; }; - C63F72B2285A2F1D0066163B /* voip_delete.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_delete.png; sourceTree = ""; }; - C63F72B3285A2F1D0066163B /* voip_cancel.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_cancel.png; sourceTree = ""; }; - C63F72B4285A2F1D0066163B /* voip_call_header_outgoing.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_call_header_outgoing.png; sourceTree = ""; }; - C63F72FA285A31DA0066163B /* Roboto-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Roboto-Regular.ttf"; sourceTree = ""; }; - C63F72FB285A31DA0066163B /* Roboto-Italic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Roboto-Italic.ttf"; sourceTree = ""; }; - C63F72FC285A31DA0066163B /* Roboto-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Roboto-Bold.ttf"; sourceTree = ""; }; - C64A854C2667B66900252AD2 /* EphemeralSettingsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EphemeralSettingsView.h; sourceTree = ""; }; - C64A854D2667B67200252AD2 /* EphemeralSettingsView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EphemeralSettingsView.m; sourceTree = ""; }; - C64A854F2667B67A00252AD2 /* EphemeralSettingsView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = EphemeralSettingsView.xib; sourceTree = ""; }; - C64A85512667B74100252AD2 /* ephemeral_messages_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ephemeral_messages_default.png; sourceTree = ""; }; - C66B03BC26E8EB1A009B5EDC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIChatReplyBubbleView.xib; sourceTree = ""; }; - C66B03C126E8EB82009B5EDC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/UIChatReplyBubbleView.strings; sourceTree = ""; }; - C66B03C326E8EB87009B5EDC /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UIChatReplyBubbleView.strings; sourceTree = ""; }; - C66B040926EFDA54009B5EDC /* reply_cancel.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = reply_cancel.png; sourceTree = ""; }; - C66B040D26F095CE009B5EDC /* cancel_forward.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cancel_forward.png; sourceTree = ""; }; - C6A1BB3126E8815300540D50 /* menu_info.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_info.png; sourceTree = ""; }; - C6A1BB3226E8815400540D50 /* menu_forward_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_forward_default.png; sourceTree = ""; }; - C6A1BB3326E8815400540D50 /* menu_copy_text_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_copy_text_default.png; sourceTree = ""; }; - C6A1BB3426E8815400540D50 /* menu_reply_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_reply_default.png; sourceTree = ""; }; - C6A1BB3926E881E100540D50 /* menu_delete.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_delete.png; sourceTree = ""; }; - C6A1BB3B26E882D000540D50 /* UIChatReplyBubbleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIChatReplyBubbleView.h; sourceTree = ""; }; - C6A1BB3C26E882D000540D50 /* UIChatReplyBubbleView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIChatReplyBubbleView.m; sourceTree = ""; }; - C6A1BB4026E889AD00540D50 /* forward_message_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = forward_message_default.png; sourceTree = ""; }; - C6A1BB4226E88F7C00540D50 /* menu_resend_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_resend_default.png; sourceTree = ""; }; - C6A1BB4426E890BD00540D50 /* file_voice_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = file_voice_default.png; sourceTree = ""; }; - C6B4443D26AAD0970076C517 /* file_video_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = file_video_default.png; sourceTree = ""; }; - C6B4443E26AAD0970076C517 /* file_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = file_default.png; sourceTree = ""; }; - C6B4443F26AAD0970076C517 /* file_picture_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = file_picture_default.png; sourceTree = ""; }; - C6B4444026AAD0970076C517 /* file_audio_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = file_audio_default.png; sourceTree = ""; }; - C6B4444126AAD0970076C517 /* file_pdf_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = file_pdf_default.png; sourceTree = ""; }; - C6B4444726AADA530076C517 /* SwiftUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUtil.swift; sourceTree = ""; }; - C6F55644287CC69F0056E213 /* voip_meeting_schedule.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voip_meeting_schedule.png; sourceTree = ""; }; - C6F55646287CCFB60056E213 /* menu_voip_meeting_schedule.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_voip_meeting_schedule.png; sourceTree = ""; }; - 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 = ""; }; - 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 = ""; }; - CF1DE924210A0F5A00A0A97E /* UILinphoneAudioPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UILinphoneAudioPlayer.m; sourceTree = ""; }; - CF1DE92B210A0F5B00A0A97E /* UILinphoneAudioPlayer.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UILinphoneAudioPlayer.xib; sourceTree = ""; }; - CF1DE92C210A0F5C00A0A97E /* UILinphoneAudioPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UILinphoneAudioPlayer.h; sourceTree = ""; }; - CF7602D4210867E800749F76 /* RecordingsListView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RecordingsListView.h; sourceTree = ""; }; - CF7602D5210867E800749F76 /* RecordingsListView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RecordingsListView.m; sourceTree = ""; }; - CF7602DF21086EB100749F76 /* RecordingsListTableView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RecordingsListTableView.h; sourceTree = ""; }; - CF7602E021086EB200749F76 /* RecordingsListTableView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RecordingsListTableView.m; sourceTree = ""; }; - CF7602E42108759A00749F76 /* UIRecordingCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIRecordingCell.h; sourceTree = ""; }; - CF7602E52108759A00749F76 /* UIRecordingCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UIRecordingCell.m; sourceTree = ""; }; - CF7602E62108759A00749F76 /* UIRecordingCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UIRecordingCell.xib; sourceTree = ""; }; - CF7602EB210898C100749F76 /* rec_off_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "rec_off_default@2x.png"; sourceTree = ""; }; - CF7602F2210898C400749F76 /* rec_on_default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "rec_on_default@2x.png"; sourceTree = ""; }; - 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 = ""; }; - 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 = ""; }; - D3128FDF15AABC7E00A2147A /* ContactDetailsView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ContactDetailsView.m; sourceTree = ""; }; - D31B4B1E159876C0002E6C72 /* UICompositeView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UICompositeView.h; sourceTree = ""; }; - D31B4B1F159876C0002E6C72 /* UICompositeView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UICompositeView.m; sourceTree = ""; }; - D31C9C96158A1CDE00756B45 /* UIHistoryCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIHistoryCell.h; sourceTree = ""; }; - D31C9C97158A1CDE00756B45 /* UIHistoryCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIHistoryCell.m; sourceTree = ""; }; - D326483615887D5200930C67 /* OrderedDictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OrderedDictionary.h; path = Utils/OrderedDictionary.h; sourceTree = ""; }; - D326483715887D5200930C67 /* OrderedDictionary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OrderedDictionary.m; path = Utils/OrderedDictionary.m; sourceTree = ""; }; - D32648421588F6FA00930C67 /* UIToggleButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIToggleButton.h; sourceTree = ""; }; - D32648431588F6FB00930C67 /* UIToggleButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIToggleButton.m; sourceTree = ""; }; - D32B6E2715A5BC430033019F /* ChatConversationTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChatConversationTableView.h; sourceTree = ""; }; - D32B6E2815A5BC430033019F /* ChatConversationTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ChatConversationTableView.m; sourceTree = ""; }; - D32B6E2E15A5C0AC0033019F /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; }; - D32B9DFA15A2F131000B6DEC /* FastAddressBook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FastAddressBook.h; path = Utils/FastAddressBook.h; sourceTree = ""; }; - D32B9DFB15A2F131000B6DEC /* FastAddressBook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FastAddressBook.m; path = Utils/FastAddressBook.m; sourceTree = ""; }; - D33A6E8F86694EA7ADD47ED4 /* Pods-CallUITests.distributionadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CallUITests.distributionadhoc.xcconfig"; path = "Target Support Files/Pods-CallUITests/Pods-CallUITests.distributionadhoc.xcconfig"; sourceTree = ""; }; - D34F6F9D1594D3FB0095705B /* InAppSettings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = InAppSettings.bundle; sourceTree = ""; }; - D350F20B15A43BB100149E54 /* AssistantView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AssistantView.h; sourceTree = ""; }; - D350F20C15A43BB100149E54 /* AssistantView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AssistantView.m; sourceTree = ""; }; - D35497FB15875372000081D8 /* ContactsListView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContactsListView.h; sourceTree = ""; }; - D35497FC15875372000081D8 /* ContactsListView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = ContactsListView.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - D3549814158761CF000081D8 /* ContactsListTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContactsListTableView.h; sourceTree = ""; }; - D3549815158761D0000081D8 /* ContactsListTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = ContactsListTableView.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - D354981E1587716B000081D8 /* StatusBarView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StatusBarView.h; path = LinphoneUI/StatusBarView.h; sourceTree = ""; }; - D354981F1587716B000081D8 /* StatusBarView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = StatusBarView.m; path = LinphoneUI/StatusBarView.m; sourceTree = ""; }; - D35860D515B549B500513429 /* Utils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Utils.m; path = Utils/Utils.m; sourceTree = ""; }; - D35E7594159460560066B1C1 /* ChatsListView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChatsListView.h; sourceTree = ""; }; - D35E7595159460560066B1C1 /* ChatsListView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ChatsListView.m; sourceTree = ""; }; - D35E759C159460B50066B1C1 /* SettingsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsView.h; sourceTree = ""; }; - D35E759D159460B50066B1C1 /* SettingsView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingsView.m; sourceTree = ""; }; - D378AB2815DCDB480098505D /* ImagePickerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImagePickerView.h; sourceTree = ""; }; - D378AB2915DCDB490098505D /* ImagePickerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ImagePickerView.m; sourceTree = ""; }; - D37C639915AADEF4009D0BAC /* ContactDetailsTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContactDetailsTableView.h; sourceTree = ""; }; - D37C639A15AADEF5009D0BAC /* ContactDetailsTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ContactDetailsTableView.m; sourceTree = ""; }; - D37DC6BF1594AE1800B2A5EB /* LinphoneCoreSettingsStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LinphoneCoreSettingsStore.h; sourceTree = ""; }; - D37DC6C01594AE1800B2A5EB /* LinphoneCoreSettingsStore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LinphoneCoreSettingsStore.m; sourceTree = ""; }; - D37DC7171594AF3400B2A5EB /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; }; - D37E3ECB1619C27A0087659A /* CAAnimation+Blocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CAAnimation+Blocks.h"; sourceTree = ""; }; - D37E3ECC1619C27A0087659A /* CAAnimation+Blocks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CAAnimation+Blocks.m"; sourceTree = ""; }; - D37EE160160377D7003608A6 /* DTActionSheet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DTActionSheet.h; sourceTree = ""; }; - D37EE161160377D7003608A6 /* DTActionSheet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DTActionSheet.m; sourceTree = ""; }; - D3807FB715C28940005BE9BC /* DCRoundSwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DCRoundSwitch.h; sourceTree = ""; }; - D3807FB815C28940005BE9BC /* DCRoundSwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DCRoundSwitch.m; sourceTree = ""; }; - D3807FB915C28940005BE9BC /* DCRoundSwitchKnobLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DCRoundSwitchKnobLayer.h; sourceTree = ""; }; - D3807FBA15C28940005BE9BC /* DCRoundSwitchKnobLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DCRoundSwitchKnobLayer.m; sourceTree = ""; }; - D3807FBB15C28940005BE9BC /* DCRoundSwitchOutlineLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DCRoundSwitchOutlineLayer.h; sourceTree = ""; }; - D3807FBC15C28940005BE9BC /* DCRoundSwitchOutlineLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DCRoundSwitchOutlineLayer.m; sourceTree = ""; }; - D3807FBD15C28940005BE9BC /* DCRoundSwitchToggleLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DCRoundSwitchToggleLayer.h; sourceTree = ""; }; - D3807FBE15C28940005BE9BC /* DCRoundSwitchToggleLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DCRoundSwitchToggleLayer.m; sourceTree = ""; }; - D3807FC915C2894A005BE9BC /* IASKAppSettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKAppSettingsViewController.h; sourceTree = ""; }; - D3807FCA15C2894A005BE9BC /* IASKAppSettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKAppSettingsViewController.m; sourceTree = ""; }; - D3807FCD15C2894A005BE9BC /* IASKSpecifierValuesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSpecifierValuesViewController.h; sourceTree = ""; }; - D3807FCE15C2894A005BE9BC /* IASKSpecifierValuesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSpecifierValuesViewController.m; sourceTree = ""; }; - D3807FCF15C2894A005BE9BC /* IASKViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKViewController.h; sourceTree = ""; }; - D3807FD115C2894A005BE9BC /* IASKSettingsReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsReader.h; sourceTree = ""; }; - D3807FD215C2894A005BE9BC /* IASKSettingsReader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsReader.m; sourceTree = ""; }; - D3807FD315C2894A005BE9BC /* IASKSettingsStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsStore.h; sourceTree = ""; }; - D3807FD415C2894A005BE9BC /* IASKSettingsStore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsStore.m; sourceTree = ""; }; - D3807FD515C2894A005BE9BC /* IASKSettingsStoreFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsStoreFile.h; sourceTree = ""; }; - D3807FD615C2894A005BE9BC /* IASKSettingsStoreFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsStoreFile.m; sourceTree = ""; }; - D3807FD715C2894A005BE9BC /* IASKSettingsStoreUserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsStoreUserDefaults.h; sourceTree = ""; }; - D3807FD815C2894A005BE9BC /* IASKSettingsStoreUserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsStoreUserDefaults.m; sourceTree = ""; }; - D3807FD915C2894A005BE9BC /* IASKSpecifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSpecifier.h; sourceTree = ""; }; - D3807FDA15C2894A005BE9BC /* IASKSpecifier.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSpecifier.m; sourceTree = ""; }; - D3807FDC15C2894A005BE9BC /* IASKPSSliderSpecifierViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKPSSliderSpecifierViewCell.h; sourceTree = ""; }; - D3807FDD15C2894A005BE9BC /* IASKPSSliderSpecifierViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKPSSliderSpecifierViewCell.m; sourceTree = ""; }; - D3807FDE15C2894A005BE9BC /* IASKPSTextFieldSpecifierViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKPSTextFieldSpecifierViewCell.h; sourceTree = ""; }; - D3807FDF15C2894A005BE9BC /* IASKPSTextFieldSpecifierViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKPSTextFieldSpecifierViewCell.m; sourceTree = ""; }; - D3807FE015C2894A005BE9BC /* IASKPSTitleValueSpecifierViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKPSTitleValueSpecifierViewCell.h; sourceTree = ""; }; - D3807FE115C2894A005BE9BC /* IASKPSTitleValueSpecifierViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKPSTitleValueSpecifierViewCell.m; sourceTree = ""; }; - D3807FE215C2894A005BE9BC /* IASKSlider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSlider.h; sourceTree = ""; }; - D3807FE315C2894A005BE9BC /* IASKSlider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSlider.m; sourceTree = ""; }; - D3807FE415C2894A005BE9BC /* IASKSwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSwitch.h; sourceTree = ""; }; - D3807FE515C2894A005BE9BC /* IASKSwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSwitch.m; sourceTree = ""; }; - D3807FE615C2894A005BE9BC /* IASKTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKTextField.h; sourceTree = ""; }; - D3807FE715C2894A005BE9BC /* IASKTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKTextField.m; sourceTree = ""; }; - D380801115C29984005BE9BC /* ColorSpaceUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ColorSpaceUtilities.h; path = Utils/ColorSpaceUtilities.h; sourceTree = ""; }; - D380801215C299D0005BE9BC /* ColorSpaceUtilites.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ColorSpaceUtilites.m; path = Utils/ColorSpaceUtilites.m; sourceTree = ""; }; - D3A55FBA15877E5E003FD403 /* UIContactCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIContactCell.h; sourceTree = ""; }; - D3A55FBB15877E5E003FD403 /* UIContactCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIContactCell.m; sourceTree = ""; }; - D3A8BB6E15A6C7D500F96BE5 /* UIChatBubbleTextCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIChatBubbleTextCell.h; sourceTree = ""; }; - D3A8BB6F15A6C7D500F96BE5 /* UIChatBubbleTextCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIChatBubbleTextCell.m; sourceTree = ""; }; - D3C6526515AC1A8F0092A874 /* UIContactDetailsCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIContactDetailsCell.h; sourceTree = ""; }; - D3C6526615AC1A8F0092A874 /* UIContactDetailsCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIContactDetailsCell.m; sourceTree = ""; }; - D3EA53FB159850E80037DC6B /* LinphoneManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LinphoneManager.h; sourceTree = ""; }; - D3EA53FC159850E80037DC6B /* LinphoneManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LinphoneManager.m; sourceTree = ""; }; - D3EA540B1598528B0037DC6B /* ChatsListTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChatsListTableView.h; sourceTree = ""; }; - D3EA540C1598528B0037DC6B /* ChatsListTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ChatsListTableView.m; sourceTree = ""; }; - D3EA540F159853750037DC6B /* UIChatCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIChatCell.h; sourceTree = ""; }; - D3EA5410159853750037DC6B /* UIChatCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIChatCell.m; sourceTree = ""; }; - D3ED3E841586291B006C0DE4 /* TabBarView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TabBarView.h; path = LinphoneUI/TabBarView.h; sourceTree = ""; }; - D3ED3E851586291B006C0DE4 /* TabBarView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TabBarView.m; path = LinphoneUI/TabBarView.m; sourceTree = ""; }; - D3ED3EA41587334B006C0DE4 /* HistoryListTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HistoryListTableView.h; sourceTree = ""; }; - D3ED3EA51587334C006C0DE4 /* HistoryListTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = HistoryListTableView.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - D3ED3EB515873928006C0DE4 /* HistoryListView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HistoryListView.h; sourceTree = ""; }; - D3ED3EB615873929006C0DE4 /* HistoryListView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = HistoryListView.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - D3F795D315A582800077328B /* ChatConversationView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChatConversationView.h; sourceTree = ""; }; - D3F795D415A582800077328B /* ChatConversationView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ChatConversationView.m; sourceTree = ""; }; - D3F7997F15BD32370018C273 /* TPMultiLayoutViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TPMultiLayoutViewController.h; path = Utils/TPMultiLayoutViewController/TPMultiLayoutViewController.h; sourceTree = ""; }; - D3F7998015BD32370018C273 /* TPMultiLayoutViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TPMultiLayoutViewController.m; path = Utils/TPMultiLayoutViewController/TPMultiLayoutViewController.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 = ""; }; -<<<<<<< HEAD - DC2F21ADD3E0ABFC644BF401 /* Pods-ConferenceUITests.distribution.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ConferenceUITests.distribution.xcconfig"; path = "Target Support Files/Pods-ConferenceUITests/Pods-ConferenceUITests.distribution.xcconfig"; sourceTree = ""; }; - DD200DBE06C872CC97CA1695 /* Pods_ConferenceUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ConferenceUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; -======= - D7EC2D3C18D2264B85F21385 /* Pods_AutoConnectLinphoneAccount.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AutoConnectLinphoneAccount.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - DBEE6C9BCFA78E5739836EB4 /* Pods-AutoConnectLinphoneAccount.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AutoConnectLinphoneAccount.release.xcconfig"; path = "Target Support Files/Pods-AutoConnectLinphoneAccount/Pods-AutoConnectLinphoneAccount.release.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 = ""; }; ->>>>>>> 8e16f1fad (new test plans) - 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 = ""; }; - EA8CB827239F96CA00C330CC /* msgNotificationContent.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = msgNotificationContent.appex; sourceTree = BUILT_PRODUCTS_DIR; }; - EA8CB82B239F96CA00C330CC /* NotificationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationViewController.swift; sourceTree = ""; }; - EA8CB82E239F96CA00C330CC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; - EA8CB830239F96CA00C330CC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 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; }; - 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; }; - F03CA84118C72F1A0008889D /* UITextViewNoDefine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UITextViewNoDefine.h; sourceTree = ""; }; - F03CA84218C72F1A0008889D /* UITextViewNoDefine.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UITextViewNoDefine.m; sourceTree = ""; }; - F05BAA611A5D594E00411815 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; - F0642EF019DAC891009DB336 /* MainStoryboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = MainStoryboard.storyboard; sourceTree = ""; }; - F0642EF719DAF32E009DB336 /* DTWeakSupport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DTWeakSupport.h; sourceTree = ""; }; - F088488C19FF8C41007FFCF3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UIContactCell.xib; sourceTree = ""; }; - F0938158188E629800A55DFA /* iTunesArtwork */ = {isa = PBXFileReference; lastKnownFileType = file; path = iTunesArtwork; sourceTree = ""; }; - F09548181883F15300E8A69B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ChatConversationView.xib; sourceTree = ""; }; - F09548191883F15300E8A69B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ChatsListView.xib; sourceTree = ""; }; - F095481B1883F15300E8A69B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ContactDetailsView.xib; sourceTree = ""; }; - F095481C1883F15300E8A69B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ContactsListView.xib; sourceTree = ""; }; - F095481D1883F15300E8A69B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/DialerView.xib; sourceTree = ""; }; - F09548201883F15400E8A69B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/HistoryDetailsView.xib; sourceTree = ""; }; - F09548211883F15400E8A69B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/HistoryListView.xib; sourceTree = ""; }; - F09548221883F15400E8A69B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ImageView.xib; sourceTree = ""; }; - F095482C1883F15400E8A69B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/TabBarView.xib; sourceTree = ""; }; - F095482E1883F15500E8A69B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/AssistantView.xib; sourceTree = ""; }; - F09548301883F15500E8A69B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/AssistantViewScreens.xib; sourceTree = ""; }; - F09548321883F20A00E8A69B /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/ChatConversationView.strings; sourceTree = ""; }; - F09548341883F25F00E8A69B /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/ChatsListView.strings; sourceTree = ""; }; - F09548381883F29C00E8A69B /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/ContactDetailsView.strings; sourceTree = ""; }; - F095483A1883F2CA00E8A69B /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/ContactsListView.strings; sourceTree = ""; }; - F095483C1883F2E300E8A69B /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/DialerView.strings; sourceTree = ""; }; - F09548421883F51B00E8A69B /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/HistoryListView.strings; sourceTree = ""; }; - F09548441883F52900E8A69B /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/ImageView.strings; sourceTree = ""; }; - F09548561883F61600E8A69B /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/TabBarView.strings; sourceTree = ""; }; - F095485A1883F67B00E8A69B /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/AssistantView.strings; sourceTree = ""; }; - F095485E1883F6EA00E8A69B /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/AssistantViewScreens.strings; sourceTree = ""; }; - F0AF06F11A24BA760086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/ChatConversationView.strings; sourceTree = ""; }; - F0AF06F21A24BA760086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/ChatsListView.strings; sourceTree = ""; }; - F0AF06F41A24BA760086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/ContactDetailsView.strings; sourceTree = ""; }; - F0AF06F51A24BA760086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/ContactsListView.strings; sourceTree = ""; }; - F0AF06F61A24BA760086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/DialerView.strings; sourceTree = ""; }; - F0AF06F91A24BA760086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/HistoryDetailsView.strings; sourceTree = ""; }; - F0AF06FA1A24BA770086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/HistoryListView.strings; sourceTree = ""; }; - F0AF06FB1A24BA770086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/ImageView.strings; sourceTree = ""; }; - F0AF07021A24BA770086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/UIChatCell.strings; sourceTree = ""; }; - F0AF07041A24BA770086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/UICompositeView.strings; sourceTree = ""; }; - F0AF07061A24BA770086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/UIContactCell.strings; sourceTree = ""; }; - F0AF07091A24BA770086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/UIHistoryCell.strings; sourceTree = ""; }; - F0AF070A1A24BA770086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/TabBarView.strings; sourceTree = ""; }; - F0AF070C1A24BA770086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/StatusBarView.strings; sourceTree = ""; }; - F0AF070E1A24BA770086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/SettingsView.strings; sourceTree = ""; }; - F0AF070F1A24BA770086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/AssistantView.strings; sourceTree = ""; }; - F0AF07111A24BA770086C9C1 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/AssistantViewScreens.strings; sourceTree = ""; }; - F0B026F21AA710AF00FF49F7 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; }; - F0B89C2118DC89E30050B60E /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; - 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; }; -<<<<<<< HEAD -======= - F0E0078E5C72D700C9E62509 /* Pods-AutoConnectLinphoneAccount.distributionadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AutoConnectLinphoneAccount.distributionadhoc.xcconfig"; path = "Target Support Files/Pods-AutoConnectLinphoneAccount/Pods-AutoConnectLinphoneAccount.distributionadhoc.xcconfig"; sourceTree = ""; }; - 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 = ""; }; ->>>>>>> 8e16f1fad (new test plans) - 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 = ""; }; - FDB59567FECF2E083DBDC142 /* 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 = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 143EFEE2501CB14E6BB244EF /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - EA88F3AC241BD05200E66528 /* UserNotificationsUI.framework in Frameworks */, - EA88F3AB241BD05200E66528 /* UserNotifications.framework in Frameworks */, - AC76CCEFDCD59EB01C2DE3F8 /* Pods_msgNotificationContent.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 61DD7E1F2372E88F001BDD01 /* CoreLocation.framework in Frameworks */, - 6180D6FE21EE41A800AD9CB6 /* QuickLook.framework in Frameworks */, - D37DC7181594AF3400B2A5EB /* MessageUI.framework in Frameworks */, - 61F1997520C6B1D5006B069A /* AVKit.framework in Frameworks */, - 249660951FD6A35F001D55AA /* Photos.framework in Frameworks */, - 24E1C7C01F9A235600D3F981 /* Contacts.framework in Frameworks */, - 8C2595DF1DEDCC8E007A6424 /* CallKit.framework in Frameworks */, - 8C73477C1D9BA3A00022EE8C /* UserNotifications.framework in Frameworks */, - 8CA2004C1D8158440095F859 /* PushKit.framework in Frameworks */, - 340751971506459A00B89C47 /* CoreTelephony.framework in Frameworks */, - 63177FBF1C86E68C00ADE58D /* CoreVideo.framework in Frameworks */, - 63CE58401C85EBF400304800 /* VideoToolbox.framework in Frameworks */, - 6334DDFA1BBAC97C00631900 /* libsqlite3.dylib in Frameworks */, - 152F22361B15E889008C0621 /* libxml2.dylib in Frameworks */, - 570742671D5A63DB004B9C84 /* StoreKit.framework in Frameworks */, - 22405EEE1600B4E400B92522 /* AssetsLibrary.framework in Frameworks */, - 2274402F106F335E006EC466 /* AudioToolbox.framework in Frameworks */, - 224567C2107B968500F10948 /* AVFoundation.framework in Frameworks */, - 228697C411AC29B800E9E0CA /* CFNetwork.framework in Frameworks */, - 2274401A106F31BD006EC466 /* CoreAudio.framework in Frameworks */, - 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */, - 22276E8913C73DC000210156 /* CoreMedia.framework in Frameworks */, - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, - F0B89C2218DC89E30050B60E /* MediaPlayer.framework in Frameworks */, - 226EF06C15FA256B005865C7 /* MobileCoreServices.framework in Frameworks */, - 70E542F313E147E3002BA2C0 /* OpenGLES.framework in Frameworks */, - 70E542F513E147EB002BA2C0 /* QuartzCore.framework in Frameworks */, - 2264B6D211200342002C2C53 /* SystemConfiguration.framework in Frameworks */, - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, - F0B026F31AA710AF00FF49F7 /* libiconv.dylib in Frameworks */, - F05BAA621A5D594E00411815 /* libz.dylib in Frameworks */, - 344ABDF114850AE9007420B6 /* libc++.1.dylib in Frameworks */, - 22D1B68112A3E0BE001AE361 /* libresolv.dylib in Frameworks */, - E4440DC2FC040E5FE40BA5AF /* Pods_linphone.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 203E6292C3E84CD13778F720 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 36C8883CF9CD21240125CC74 /* Pods_msgNotificationService.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 61AE364820C00B370089D9D3 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6637AF8A288593AF00965733 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - D35C5F1B660753F3FF79848A /* Pods_CallUITests.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 66495CF8288FF346002780DE /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - FDC67FA1FCA8461F10C4F5DA /* Pods_AutoConnectLinphoneAccount.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 080E96DDFE201D6D7F000001 /* Classes */ = { - isa = PBXGroup; - children = ( - 614C087623D1A35E00217F80 /* linphone-Bridging-Header.h */, - C63F7196285A24B10066163B /* Swift */, - 22E0A81D111C44E100B04932 /* AboutView.h */, - 22E0A81C111C44E100B04932 /* AboutView.m */, - 636316D31A1DEBCB0009B839 /* AboutView.xib */, - 633E417F1D74258F00320475 /* AssistantLinkView.h */, - 633E41801D74258F00320475 /* AssistantLinkView.m */, - 63EC8D3B1D7438660066547B /* AssistantLinkView.xib */, - D350F20B15A43BB100149E54 /* AssistantView.h */, - D350F20C15A43BB100149E54 /* AssistantView.m */, - D38187E015FE348A00C3EDCA /* AssistantView.xib */, - D3D5126A160B3A8E00946DF8 /* AssistantViewScreens.xib */, - 8C9C5E0B1F83B2EF006987FA /* ChatConversationCreateCollectionViewController.h */, - 8C9C5E0C1F83B2EF006987FA /* ChatConversationCreateCollectionViewController.m */, - 6341807A1BBC103100F71761 /* ChatConversationCreateTableView.h */, - 6341807B1BBC103100F71761 /* ChatConversationCreateTableView.m */, - 6336715E1BCBAAD200BFCBDE /* ChatConversationCreateView.h */, - 6336715F1BCBAAD200BFCBDE /* ChatConversationCreateView.m */, - 63B8D68E1BCBE65600C12B09 /* ChatConversationCreateView.xib */, - 8CD99A3D2090BA24008A7CDA /* ChatConversationImdnView.h */, - 8CD99A3B2090B9FA008A7CDA /* ChatConversationImdnView.m */, - 8CBD7BA520B6B80D00E5DCC0 /* ChatConversationImdnView.xib */, - 8CA70ACF1F9E0ABA00A3D2EB /* ChatConversationInfoView.h */, - 8CA70AD01F9E0AE100A3D2EB /* ChatConversationInfoView.m */, - 8CBD7BA220B6B7FD00E5DCC0 /* ChatConversationInfoView.xib */, - D32B6E2715A5BC430033019F /* ChatConversationTableView.h */, - D32B6E2815A5BC430033019F /* ChatConversationTableView.m */, - D3F795D315A582800077328B /* ChatConversationView.h */, - D3F795D415A582800077328B /* ChatConversationView.m */, - D38187B015FE340100C3EDCA /* ChatConversationView.xib */, - D3EA540B1598528B0037DC6B /* ChatsListTableView.h */, - D3EA540C1598528B0037DC6B /* ChatsListTableView.m */, - D35E7594159460560066B1C1 /* ChatsListView.h */, - D35E7595159460560066B1C1 /* ChatsListView.m */, - D38187B415FE340500C3EDCA /* ChatsListView.xib */, - D37C639915AADEF4009D0BAC /* ContactDetailsTableView.h */, - D37C639A15AADEF5009D0BAC /* ContactDetailsTableView.m */, - D3128FDE15AABC7E00A2147A /* ContactDetailsView.h */, - D3128FDF15AABC7E00A2147A /* ContactDetailsView.m */, - D38187BC15FE342200C3EDCA /* ContactDetailsView.xib */, - D3549814158761CF000081D8 /* ContactsListTableView.h */, - D3549815158761D0000081D8 /* ContactsListTableView.m */, - D35497FB15875372000081D8 /* ContactsListView.h */, - D35497FC15875372000081D8 /* ContactsListView.m */, - 662553B327EDFB35007F67D8 /* MagicSearch.swift */, - D38187C015FE342800C3EDCA /* ContactsListView.xib */, - 631098471D4660580041F2B3 /* CountryListView.h */, - 631098481D4660580041F2B3 /* CountryListView.m */, - 631098501D4660630041F2B3 /* CountryListView.xib */, - C64A854C2667B66900252AD2 /* EphemeralSettingsView.h */, - C64A854D2667B67200252AD2 /* EphemeralSettingsView.m */, - C64A854F2667B67A00252AD2 /* EphemeralSettingsView.xib */, - 61AEBEB5219198EF00F35E7F /* DevicesListView.h */, - 61AEBEBC2191990A00F35E7F /* DevicesListView.m */, - 61AEBEBE2191991F00F35E7F /* DevicesListView.xib */, - 22F2508B107141E100AC9B3F /* DialerView.h */, - 22F2508C107141E100AC9B3F /* DialerView.m */, - D38187C415FE345B00C3EDCA /* DialerView.xib */, - 638F1A601C2021B2004B8E02 /* DialerView~ipad.xib */, - 6306440B1BECB08500134C72 /* FirstLoginView.h */, - 6306440C1BECB08500134C72 /* FirstLoginView.m */, - 639E9C951C0DB7BE00019A75 /* FirstLoginView.xib */, - 635775231B6673EC00C8B704 /* HistoryDetailsTableView.h */, - 635775241B6673EC00C8B704 /* HistoryDetailsTableView.m */, - C90FAA7615AF54E6002091CB /* HistoryDetailsView.h */, - C90FAA7715AF54E6002091CB /* HistoryDetailsView.m */, - D38187D015FE346700C3EDCA /* HistoryDetailsView.xib */, - D3ED3EA41587334B006C0DE4 /* HistoryListTableView.h */, - D3ED3EA51587334C006C0DE4 /* HistoryListTableView.m */, - D3ED3EB515873928006C0DE4 /* HistoryListView.h */, - D3ED3EB615873929006C0DE4 /* HistoryListView.m */, - D38187D415FE346B00C3EDCA /* HistoryListView.xib */, - D378AB2815DCDB480098505D /* ImagePickerView.h */, - D378AB2915DCDB490098505D /* ImagePickerView.m */, - 22405EFD1601C19000B92522 /* ImageView.h */, - 22405EFE1601C19100B92522 /* ImageView.m */, - D37EE11016035793003608A6 /* ImageView.xib */, - 63E59A3D1ADE6ECB00646FB3 /* InAppProductsManager.h */, - 63E59A3E1ADE70D900646FB3 /* InAppProductsManager.m */, - 6130C85B22BBB493009CC79C /* LaunchScreen.h */, - 63E27A311C4FECD000D332AE /* LaunchScreen.xib */, - 1D3623240D0F684500981E51 /* LinphoneAppDelegate.h */, - 1D3623250D0F684500981E51 /* LinphoneAppDelegate.m */, - D37DC6BF1594AE1800B2A5EB /* LinphoneCoreSettingsStore.h */, - D37DC6C01594AE1800B2A5EB /* LinphoneCoreSettingsStore.m */, - D3EA53FB159850E80037DC6B /* LinphoneManager.h */, - D3EA53FC159850E80037DC6B /* LinphoneManager.m */, - 2214EB7012F84668002A5394 /* LinphoneUI */, - F0642EF019DAC891009DB336 /* MainStoryboard.storyboard */, - D3F83F8C158229C500336684 /* PhoneMainView.h */, - D3F83F8D15822ABD00336684 /* PhoneMainView.m */, - 639E9CB31C0DB88200019A75 /* PhoneMainView.xib */, - CF7602DF21086EB100749F76 /* RecordingsListTableView.h */, - CF7602E021086EB200749F76 /* RecordingsListTableView.m */, - CF7602D4210867E800749F76 /* RecordingsListView.h */, - CF7602D5210867E800749F76 /* RecordingsListView.m */, - 617B4A62260A2B7800A87337 /* RecordingsListView.xib */, - D35E759C159460B50066B1C1 /* SettingsView.h */, - D35E759D159460B50066B1C1 /* SettingsView.m */, - 636316D61A1DEC650009B839 /* SettingsView.xib */, - 63BE7A761D75BDF6000990EF /* ShopTableView.h */, - 63BE7A771D75BDF6000990EF /* ShopTableView.m */, - 570742601D5A09B8004B9C84 /* ShopView.h */, - 5707425F1D5A09B8004B9C84 /* ShopView.m */, - 570742561D5A0691004B9C84 /* ShopView.xib */, - 633756371B67BAF400E21BAD /* SideMenuTableView.h */, - 633756381B67BAF400E21BAD /* SideMenuTableView.m */, - 633756421B67D2B100E21BAD /* SideMenuView.h */, - 633756431B67D2B100E21BAD /* SideMenuView.m */, - 639E9CB21C0DB83000019A75 /* SideMenuView.xib */, - 63130FB01C1ED06900371918 /* SideMenuView~ipad.xib */, - D354981E1587716B000081D8 /* StatusBarView.h */, - D354981F1587716B000081D8 /* StatusBarView.m */, - 639CEAFF1A1DF4D9004DE38F /* StatusBarView.xib */, - D3ED3E841586291B006C0DE4 /* TabBarView.h */, - D3ED3E851586291B006C0DE4 /* TabBarView.m */, - D38187FB15FE355D00C3EDCA /* TabBarView.xib */, - D326483415887D4400930C67 /* Utils */, - 669B140B27A29D140012220A /* FloatingScrollDownButton.swift */, - ); - path = Classes; - sourceTree = ""; - }; - 19C28FACFE9D520D11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - 1D6058910D05DD3D006BFB54 /* linphone.app */, - 61AE364B20C00B370089D9D3 /* linphoneExtension.appex */, - EA5F25D9232BD3E200475F2E /* msgNotificationService.appex */, - EA8CB827239F96CA00C330CC /* msgNotificationContent.appex */, - 6637AF8D288593AF00965733 /* CallUITests.xctest */, - 66495CFB288FF346002780DE /* AutoConnectLinphoneAccount.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 2214EB7012F84668002A5394 /* LinphoneUI */ = { - isa = PBXGroup; - children = ( - C6A1BB3B26E882D000540D50 /* UIChatReplyBubbleView.h */, - C6A1BB3C26E882D000540D50 /* UIChatReplyBubbleView.m */, - C66B03BD26E8EB1A009B5EDC /* UIChatReplyBubbleView.xib */, - 63F1DF421BCE618E00EDED90 /* UIAddressTextField.h */, - 63F1DF431BCE618E00EDED90 /* UIAddressTextField.m */, - 63C441C11BBC23ED0053DC5E /* UIAssistantTextField.h */, - 63C441C21BBC23ED0053DC5E /* UIAssistantTextField.m */, - 633FEF561D3CD5E00014B822 /* UIAvatarPresence.h */, - 633FEF571D3CD5E00014B822 /* UIAvatarPresence.m */, - 6377AC7E1BDE4068007F7625 /* UIBackToCallButton.h */, - 6377AC7F1BDE4069007F7625 /* UIBackToCallButton.m */, - 6381DA7B1C1AD5EA00DF3BBD /* UIBouncingView.h */, - 6381DA7C1C1AD5EA00DF3BBD /* UIBouncingView.m */, - 2214EB7812F846B1002A5394 /* UICallButton.h */, - 2214EB7912F846B1002A5394 /* UICallButton.m */, - 22AA8AFF13D83F6300B30535 /* UICamSwitch.h */, - 22AA8B0013D83F6300B30535 /* UICamSwitch.m */, - 635173F71BA082A40095EB0A /* UIChatBubblePhotoCell.h */, - 635173F81BA082A40095EB0A /* UIChatBubblePhotoCell.m */, - 639E9CA21C0DB7E500019A75 /* UIChatBubblePhotoCell.xib */, - D3A8BB6E15A6C7D500F96BE5 /* UIChatBubbleTextCell.h */, - D3A8BB6F15A6C7D500F96BE5 /* UIChatBubbleTextCell.m */, - 639E9CA51C0DB7EA00019A75 /* UIChatBubbleTextCell.xib */, - 617C2428263022430042FB4A /* UIChatContentView.h */, - 617C2429263022690042FB4A /* UIChatContentView.m */, - D3EA540F159853750037DC6B /* UIChatCell.h */, - D3EA5410159853750037DC6B /* UIChatCell.m */, - 639CEB0B1A1DF4FA004DE38F /* UIChatCell.xib */, - 8CD99A402090CE25008A7CDA /* UIChatConversationImdnTableViewCell.h */, - 8CD99A412090CE6F008A7CDA /* UIChatConversationImdnTableViewCell.m */, - 8CBD7BAB20B6B82A00E5DCC0 /* UIChatConversationImdnTableViewCell.xib */, - 8CA70AE11F9E39E400A3D2EB /* UIChatConversationInfoTableViewCell.h */, - 8CA70AE21F9E39E400A3D2EB /* UIChatConversationInfoTableViewCell.m */, - 8CBD7BA820B6B82400E5DCC0 /* UIChatConversationInfoTableViewCell.xib */, - 63B8D69F1BCBF43100C12B09 /* UIChatCreateCell.h */, - 63B8D6A01BCBF43100C12B09 /* UIChatCreateCell.m */, - 639E9CA81C0DB7F200019A75 /* UIChatCreateCell.xib */, - 8C9C5E0E1F83BD97006987FA /* UIChatCreateCollectionViewCell.h */, - 8C9C5E0F1F83BD97006987FA /* UIChatCreateCollectionViewCell.m */, - 8CBD7BAE20B6B82F00E5DCC0 /* UIChatCreateCollectionViewCell.xib */, - 8C92ABF11FA773C20006FB5D /* UIChatNotifiedEventCell.h */, - 8C92ABF21FA773E50006FB5D /* UIChatNotifiedEventCell.m */, - 8C92ABE71FA773190006FB5D /* UIChatNotifiedEventCell.xib */, - 639E9C7E1C0DB13D00019A75 /* UICheckBoxTableView.h */, - 639E9C7F1C0DB13D00019A75 /* UICheckBoxTableView.m */, - D31B4B1E159876C0002E6C72 /* UICompositeView.h */, - D31B4B1F159876C0002E6C72 /* UICompositeView.m */, - 639CEB051A1DF4EB004DE38F /* UICompositeView.xib */, - 638F1A8F1C21993D004B8E02 /* UICompositeView~ipad.xib */, - 63701DDD1BA32039006A9AE3 /* UIConfirmationDialog.h */, - 63701DDE1BA32039006A9AE3 /* UIConfirmationDialog.m */, - 639E9CAB1C0DB7FB00019A75 /* UIConfirmationDialog.xib */, - D3A55FBA15877E5E003FD403 /* UIContactCell.h */, - D3A55FBB15877E5E003FD403 /* UIContactCell.m */, - F088488D19FF8C41007FFCF3 /* UIContactCell.xib */, - D3C6526515AC1A8F0092A874 /* UIContactDetailsCell.h */, - D3C6526615AC1A8F0092A874 /* UIContactDetailsCell.m */, - 639E9CAE1C0DB80300019A75 /* UIContactDetailsCell.xib */, - 2248E90C12F7E4CF00220D9C /* UIDigitButton.h */, - 2248E90D12F7E4CF00220D9C /* UIDigitButton.m */, - 61CCC3D721933B380060EDEA /* UIDeviceCell.h */, - 61CCC3DE21933B580060EDEA /* UIDeviceCell.m */, - 61CCC3E021933B660060EDEA /* UIDeviceCell.xib */, - D31C9C96158A1CDE00756B45 /* UIHistoryCell.h */, - D31C9C97158A1CDE00756B45 /* UIHistoryCell.m */, - 639CEB021A1DF4E4004DE38F /* UIHistoryCell.xib */, - 636BC9951B5F921B00C754CE /* UIIconButton.h */, - 636BC9961B5F921B00C754CE /* UIIconButton.m */, - CF15F21B20E4F9A3008B1DE6 /* UIImageViewDeletable.h */, - CF15F21C20E4F9A3008B1DE6 /* UIImageViewDeletable.m */, - CF15F21D20E4F9A3008B1DE6 /* UIImageViewDeletable.xib */, - 6135761A240E81AC005304D4 /* UIInterfaceStyleButton.h */, - 6135761B240E81BA005304D4 /* UIInterfaceStyleButton.m */, - 6135761D240E81C7005304D4 /* UIInterfaceStyleToggleButton.h */, - 6135761E240E81D0005304D4 /* UIInterfaceStyleToggleButton.m */, - 634610041B61330300548952 /* UILabel+Boldify.h */, - 634610051B61330300548952 /* UILabel+Boldify.m */, - CF1DE92C210A0F5C00A0A97E /* UILinphoneAudioPlayer.h */, - CF1DE924210A0F5A00A0A97E /* UILinphoneAudioPlayer.m */, - CF1DE92B210A0F5B00A0A97E /* UILinphoneAudioPlayer.xib */, - D306459C1611EC2900BB571E /* UILoadingImageView.h */, - D306459D1611EC2900BB571E /* UILoadingImageView.m */, - CF7602E42108759A00749F76 /* UIRecordingCell.h */, - CF7602E52108759A00749F76 /* UIRecordingCell.m */, - CF7602E62108759A00749F76 /* UIRecordingCell.xib */, - 6313482E1B6F7B6600C6BDCB /* UIRoundBorderedButton.h */, - 6313482F1B6F7B6600C6BDCB /* UIRoundBorderedButton.m */, - 63FB30331A680E73008CA393 /* UIRoundedImageView.h */, - 63FB30341A680E73008CA393 /* UIRoundedImageView.m */, - 8C5D1B991D9BC48100DC6539 /* UIShopTableCell.h */, - 8C5D1B9B1D9BC48100DC6539 /* UIShopTableCell.xib */, - 24A345A71D95799900881A5C /* UIShopTableCell.h */, - 630CF5551AF7CE1500539F7A /* UITextField+DoneButton.h */, - 630CF5561AF7CE1500539F7A /* UITextField+DoneButton.m */, - F03CA84118C72F1A0008889D /* UITextViewNoDefine.h */, - F03CA84218C72F1A0008889D /* UITextViewNoDefine.m */, - D32648421588F6FA00930C67 /* UIToggleButton.h */, - D32648431588F6FB00930C67 /* UIToggleButton.m */, - 24A345A51D95798A00881A5C /* UIShopTableCell.m */, - 24A3459D1D95797700881A5C /* UIShopTableCell.xib */, - ); - path = LinphoneUI; - sourceTree = ""; - }; - 29B97314FDCFA39411CA2CEA = { - isa = PBXGroup; - children = ( - 663FC9F3288942B500481124 /* CallUITests-Runner.app */, - 8C23BCB71D82AAC3005F19BB /* linphone.entitlements */, - 614D09CD21E74D5400C43EDF /* GoogleService-Info.plist */, - 080E96DDFE201D6D7F000001 /* Classes */, - 61AE364C20C00B370089D9D3 /* linphoneExtension */, - EA5F25DA232BD3E200475F2E /* msgNotificationService */, - 662F5971288AEFAA00C9CAF7 /* UITests */, - EA8CB82A239F96CA00C330CC /* msgNotificationContent */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - F0938158188E629800A55DFA /* iTunesArtwork */, - 29B97315FDCFA39411CA2CEA /* Other Sources */, - 19C28FACFE9D520D11CA2CBB /* Products */, - 633E388219FFB0F400936D1C /* README.md */, - 63AADBC31B6A0FF200AA16FD /* Resources */, - D398D3031594B0FB00FD553C /* Settings */, - 75AA7090378DBBA5417E4370 /* Pods */, - ); - name = CustomTemplate; - sourceTree = ""; - }; - 29B97315FDCFA39411CA2CEA /* Other Sources */ = { - isa = PBXGroup; - children = ( - 32CA4F630368D1EE00C91783 /* linphone_Prefix.pch */, - 29B97316FDCFA39411CA2CEA /* main.m */, - ); - name = "Other Sources"; - sourceTree = ""; - }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { - isa = PBXGroup; - children = ( - 61DD7E1E2372E88F001BDD01 /* CoreLocation.framework */, - 6180D6FD21EE41A800AD9CB6 /* QuickLook.framework */, - 22B5F03410CE6B2F00777D97 /* AddressBook.framework */, - 22B5EFA210CE50BD00777D97 /* AddressBookUI.framework */, - 22405EED1600B4E400B92522 /* AssetsLibrary.framework */, - 2274402E106F335E006EC466 /* AudioToolbox.framework */, - F0BB8C311936246600974404 /* AudioUnit.framework */, - 224567C1107B968500F10948 /* AVFoundation.framework */, - 61F1996E20C6B1D5006B069A /* AVKit.framework */, - 8C5BCEC61EB3859200A9AAEF /* bctoolbox-tester.framework */, - 8C2595DE1DEDCC8E007A6424 /* CallKit.framework */, - 228697C311AC29B800E9E0CA /* CFNetwork.framework */, - 24E1C7B91F9A235500D3F981 /* Contacts.framework */, - 22744019106F31BD006EC466 /* CoreAudio.framework */, - 22744056106F9BC9006EC466 /* CoreFoundation.framework */, - 288765FC0DF74451002DB57D /* CoreGraphics.framework */, - 22276E8813C73DC000210156 /* CoreMedia.framework */, - 340751961506459A00B89C47 /* CoreTelephony.framework */, - 22276E8613C73D8A00210156 /* CoreVideo.framework */, - 1D30AB110D05D00D00671497 /* Foundation.framework */, - F0BB8C4A193631B300974404 /* ImageIO.framework */, - F0FF66AA1ACAEEB0008A4486 /* IOKit.framework */, - 344ABDEF14850AE9007420B6 /* libc++.1.dylib */, - F03A9B9718C0DB6F00C4D7FE /* libc++.dylib */, - F0B026F21AA710AF00FF49F7 /* libiconv.dylib */, - 63EEE40D1BBA9B250087D3AF /* libiconv.tbd */, - F0BB8C34193624C800974404 /* libresolv.9.dylib */, - 22D1B68012A3E0BE001AE361 /* libresolv.dylib */, - 8CD0B3BE1FA22CBA008FEB16 /* libsoci_core.a */, - 8C1A1F7C1FA331D40064BE00 /* libsoci_sqlite3.a */, - D32B6E2E15A5C0AC0033019F /* libsqlite3.dylib */, - 63EEE40B1BBA9B1B0087D3AF /* libsqlite3.tbd */, - 344ABDF014850AE9007420B6 /* libstdc++.6.dylib */, - F03A9B9418C0DAE100C4D7FE /* libstdc++.dylib */, - 152F22351B15E889008C0621 /* libxml2.dylib */, - 63EEE4091BBA9B110087D3AF /* libxml2.tbd */, - F05BAA611A5D594E00411815 /* libz.dylib */, - 8C3EAA191EB8D9C300B732B6 /* linphonetester.framework */, - F0B89C2118DC89E30050B60E /* MediaPlayer.framework */, - D37DC7171594AF3400B2A5EB /* MessageUI.framework */, - 226EF06B15FA256B005865C7 /* MobileCoreServices.framework */, - 5EF0C33820C806A5005081B0 /* NotificationCenter.framework */, - 70E542F213E147E3002BA2C0 /* OpenGLES.framework */, - 249660941FD6A359001D55AA /* Photos.framework */, - 8CA2004B1D8158440095F859 /* PushKit.framework */, - 70E542F413E147EB002BA2C0 /* QuartzCore.framework */, - 22744043106F33FC006EC466 /* Security.framework */, - F0181B6B18BF7B1200A9A357 /* SenTestingKit.framework */, - 570742661D5A63DB004B9C84 /* StoreKit.framework */, - 2264B6D111200342002C2C53 /* SystemConfiguration.framework */, - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, - 8C73477B1D9BA3A00022EE8C /* UserNotifications.framework */, - 5E58962520DCE5700030868C /* UserNotificationsUI.framework */, - 63CE583F1C85EBF400304800 /* VideoToolbox.framework */, -<<<<<<< HEAD - 49381ABF67DC815C5F299A43 /* Pods_CallUITests.framework */, - DD200DBE06C872CC97CA1695 /* Pods_ConferenceUITests.framework */, - A6FD9930E5B1F4149D45BB1C /* Pods_linphone.framework */, - 1DA35546364BBF65F0DF5E8F /* Pods_msgNotificationContent.framework */, - 943C756D8C523B63A9BA4022 /* Pods_msgNotificationService.framework */, -======= - CFCC14A580A05DEC78090273 /* Pods_linphone.framework */, - 2AB0AB106BE1526DC105F515 /* Pods_msgNotificationContent.framework */, - FC98FB0E59C552BC311C0FCA /* Pods_msgNotificationService.framework */, - 68A574DB9BF62E84DA258A0A /* Pods_CallUITests.framework */, - D7EC2D3C18D2264B85F21385 /* Pods_AutoConnectLinphoneAccount.framework */, ->>>>>>> 8e16f1fad (new test plans) - ); - name = Frameworks; - sourceTree = ""; - }; - 61AE364C20C00B370089D9D3 /* linphoneExtension */ = { - isa = PBXGroup; - children = ( - 61AE366320C00C810089D9D3 /* linphoneExtension.entitlements */, - 61AE364D20C00B370089D9D3 /* ShareViewController.h */, - 61AE364E20C00B370089D9D3 /* ShareViewController.m */, - 61AE365020C00B370089D9D3 /* MainInterface.storyboard */, - 61AE365320C00B370089D9D3 /* Info.plist */, - ); - path = linphoneExtension; - sourceTree = ""; - }; - 633888401BFB2C49001D5E7B /* HPGrowingTextView */ = { - isa = PBXGroup; - children = ( - 633888411BFB2C49001D5E7B /* HPGrowingTextView.h */, - 633888421BFB2C49001D5E7B /* HPGrowingTextView.m */, - 633888431BFB2C49001D5E7B /* HPTextViewInternal.h */, - 633888441BFB2C49001D5E7B /* HPTextViewInternal.m */, - ); - name = HPGrowingTextView; - path = Utils/HPGrowingTextView; - sourceTree = ""; - }; - 633FEBE11D3CD5570014B822 /* images */ = { - isa = PBXGroup; - children = ( - C6F55646287CCFB60056E213 /* menu_voip_meeting_schedule.png */, - C6F55644287CC69F0056E213 /* voip_meeting_schedule.png */, - C63F72A4285A2F1B0066163B /* conference_schedule_calendar_default.png */, - C63F72AD285A2F1C0066163B /* conference_schedule_participants_default.png */, - C63F72A8285A2F1C0066163B /* conference_schedule_time_default.png */, - C63F7280285A2F160066163B /* voip_audio_routes.png */, - C63F729B285A2F1A0066163B /* voip_bluetooth.png */, - C63F728A285A2F180066163B /* voip_call_add.png */, - C63F72A5285A2F1B0066163B /* voip_call_chat.png */, - C63F7282285A2F170066163B /* voip_call_forward.png */, - C63F729A285A2F1A0066163B /* voip_call_header_active.png */, - C63F7279285A2F150066163B /* voip_call_header_incoming.png */, - C63F72B4285A2F1D0066163B /* voip_call_header_outgoing.png */, - C63F727B285A2F160066163B /* voip_call_header_paused.png */, - C63F72A0285A2F1B0066163B /* voip_call_list_menu.png */, - C63F7287285A2F170066163B /* voip_call_more.png */, - C63F7276285A2F150066163B /* voip_call_numpad.png */, - C63F72A3285A2F1B0066163B /* voip_call_participants.png */, - C63F7281285A2F160066163B /* voip_call_record.png */, - C63F7288285A2F170066163B /* voip_call_stats.png */, - C63F729F285A2F1B0066163B /* voip_call.png */, - C63F727A285A2F150066163B /* voip_calls_list.png */, - C63F72AA285A2F1C0066163B /* voip_camera_off.png */, - C63F729D285A2F1A0066163B /* voip_camera_on.png */, - C63F72B3285A2F1D0066163B /* voip_cancel.png */, - C63F7283285A2F170066163B /* voip_change_camera.png */, - C63F7277285A2F150066163B /* voip_chat_rooms_list.png */, - C63F7284285A2F170066163B /* voip_checkbox_checked.png */, - C63F72A6285A2F1B0066163B /* voip_checkbox_unchecked.png */, - C63F72A1285A2F1B0066163B /* voip_conference_active_speaker.png */, - C63F7297285A2F190066163B /* voip_conference_audio_only.png */, - C63F72AE285A2F1D0066163B /* voip_conference_mosaic.png */, - C63F72B0285A2F1D0066163B /* voip_conference_new_selected.png */, - C63F7299285A2F1A0066163B /* voip_conference_new.png */, - C63F728C285A2F180066163B /* voip_conference_paused_big.png */, - C63F729E285A2F1A0066163B /* voip_conference_play_big.png */, - C63F728B285A2F180066163B /* voip_copy.png */, - C63F72B2285A2F1D0066163B /* voip_delete.png */, - C63F7271285A2F140066163B /* voip_dropdown.png */, - C63F7295285A2F190066163B /* voip_earpiece.png */, - C63F72A7285A2F1C0066163B /* voip_edit.png */, - C63F7275285A2F150066163B /* voip_export.png */, - C63F7291285A2F190066163B /* voip_hangup.png */, - C63F7285285A2F170066163B /* voip_info.png */, - C63F7294285A2F190066163B /* voip_mandatory.png */, - C63F7298285A2F1A0066163B /* voip_menu_more.png */, - C63F72A9285A2F1C0066163B /* voip_merge_calls.png */, - C63F729C285A2F1A0066163B /* voip_micro_off.png */, - C63F72AB285A2F1C0066163B /* voip_micro_on.png */, - C63F728F285A2F180066163B /* voip_multiple_contacts_avatar.png */, - C63F727C285A2F160066163B /* voip_numpad_0.png */, - C63F7293285A2F190066163B /* voip_numpad_1.png */, - C63F7296285A2F190066163B /* voip_numpad_2.png */, - C63F727D285A2F160066163B /* voip_numpad_3.png */, - C63F7278285A2F150066163B /* voip_numpad_4.png */, - C63F72AF285A2F1D0066163B /* voip_numpad_5.png */, - C63F72A2285A2F1B0066163B /* voip_numpad_6.png */, - C63F7273285A2F140066163B /* voip_numpad_7.png */, - C63F7289285A2F180066163B /* voip_numpad_8.png */, - C63F727E285A2F160066163B /* voip_numpad_9.png */, - C63F728E285A2F180066163B /* voip_numpad_hash.png */, - C63F728D285A2F180066163B /* voip_numpad_star.png */, - C63F7292285A2F190066163B /* voip_pause.png */, - C63F7274285A2F150066163B /* voip_radio_off.png */, - C63F72AC285A2F1C0066163B /* voip_radio_on.png */, - C63F7290285A2F180066163B /* voip_remote_recording.png */, - C63F72B1285A2F1D0066163B /* voip_single_contact_avatar.png */, - C63F7286285A2F170066163B /* voip_speaker_off.png */, - C63F727F285A2F160066163B /* voip_speaker_on.png */, - C63F7272285A2F140066163B /* voip_spinner.png */, - C66B040D26F095CE009B5EDC /* cancel_forward.png */, - C66B040926EFDA54009B5EDC /* reply_cancel.png */, - C6A1BB4426E890BD00540D50 /* file_voice_default.png */, - C6A1BB4226E88F7C00540D50 /* menu_resend_default.png */, - C6A1BB4026E889AD00540D50 /* forward_message_default.png */, - C6A1BB3926E881E100540D50 /* menu_delete.png */, - C6A1BB3326E8815400540D50 /* menu_copy_text_default.png */, - C6A1BB3226E8815400540D50 /* menu_forward_default.png */, - C6A1BB3126E8815300540D50 /* menu_info.png */, - C6A1BB3426E8815400540D50 /* menu_reply_default.png */, - C6B4444026AAD0970076C517 /* file_audio_default.png */, - C6B4443E26AAD0970076C517 /* file_default.png */, - C6B4444126AAD0970076C517 /* file_pdf_default.png */, - C6B4443F26AAD0970076C517 /* file_picture_default.png */, - C6B4443D26AAD0970076C517 /* file_video_default.png */, - C622E3EC26A8128F004F5434 /* vr_off.png */, - C622E3EB26A8128F004F5434 /* vr_on.png */, - C622E3ED26A8128F004F5434 /* vr_pause.png */, - C622E3EE26A81290004F5434 /* vr_play.png */, - C622E3E926A8128F004F5434 /* vr_stop.png */, - C622E3EA26A8128F004F5434 /* vr_wave.png */, - C61B1BF62667EC6B001A4E4A /* ephemeral_messages_color_A.png */, - C61B1BF32667D202001A4E4A /* more_menu_default.png */, - C61B1BF12667D075001A4E4A /* menu_security_default.png */, - C64A85512667B74100252AD2 /* ephemeral_messages_default.png */, - 633FEBE21D3CD5570014B822 /* add_field_default.png */, - 633FEBE31D3CD5570014B822 /* add_field_default@2x.png */, - 633FEBE41D3CD5570014B822 /* add_field_over.png */, - 633FEBE51D3CD5570014B822 /* add_field_over@2x.png */, - 633FEBE61D3CD5570014B822 /* avatar.png */, - 633FEBE71D3CD5570014B822 /* avatar@2x.png */, - 633FEBE81D3CD5570014B822 /* avatar~ipad.png */, - 633FEBE91D3CD5570014B822 /* avatar~ipad@2x.png */, - 633FEBEA1D3CD5570014B822 /* back_default.png */, - 633FEBEB1D3CD5570014B822 /* back_default@2x.png */, - 633FEBEC1D3CD5570014B822 /* back_disabled.png */, - 633FEBED1D3CD5570014B822 /* back_disabled@2x.png */, - 633FEBEE1D3CD5570014B822 /* backspace_default.png */, - 633FEBEF1D3CD5570014B822 /* backspace_default@2x.png */, - 633FEBF01D3CD5570014B822 /* backspace_disabled.png */, - 633FEBF11D3CD5570014B822 /* backspace_disabled@2x.png */, - 633FEBF21D3CD5570014B822 /* backspace_over.png */, - 633FEBF31D3CD5570014B822 /* backspace_over@2x.png */, - 633FEBF41D3CD5570014B822 /* call_add_default.png */, - 633FEBF51D3CD5570014B822 /* call_add_default@2x.png */, - 633FEBF61D3CD5570014B822 /* call_add_disabled.png */, - 633FEBF71D3CD5570014B822 /* call_add_disabled@2x.png */, - 633FEBF81D3CD5570014B822 /* call_alt_back_default.png */, - 633FEBF91D3CD5570014B822 /* call_alt_back_default@2x.png */, - 633FEBFA1D3CD5570014B822 /* call_alt_back_disabled.png */, - 633FEBFB1D3CD5570014B822 /* call_alt_back_disabled@2x.png */, - 633FEBFC1D3CD5570014B822 /* call_alt_start_default.png */, - 633FEBFD1D3CD5570014B822 /* call_alt_start_default@2x.png */, - 633FEBFE1D3CD5570014B822 /* call_alt_start_disabled.png */, - 633FEBFF1D3CD5570014B822 /* call_alt_start_disabled@2x.png */, - 633FEC001D3CD5570014B822 /* call_audio_start_default.png */, - 633FEC011D3CD5570014B822 /* call_audio_start_default@2x.png */, - 633FEC021D3CD5570014B822 /* call_audio_start_disabled.png */, - 633FEC031D3CD5570014B822 /* call_audio_start_disabled@2x.png */, - 633FEC041D3CD5570014B822 /* call_back_default.png */, - 633FEC051D3CD5570014B822 /* call_back_default@2x.png */, - 633FEC061D3CD5570014B822 /* call_back_disabled.png */, - 633FEC071D3CD5570014B822 /* call_back_disabled@2x.png */, - 633FEC081D3CD5570014B822 /* call_hangup_default.png */, - 633FEC091D3CD5570014B822 /* call_hangup_default@2x.png */, - 633FEC0A1D3CD5570014B822 /* call_hangup_disabled.png */, - 633FEC0B1D3CD5570014B822 /* call_hangup_disabled@2x.png */, - 633FEC0C1D3CD5570014B822 /* call_incoming.png */, - 633FEC0D1D3CD5570014B822 /* call_incoming@2x.png */, - 633FEC0E1D3CD5570014B822 /* call_missed.png */, - 633FEC0F1D3CD5570014B822 /* call_missed@2x.png */, - 633FEC101D3CD5570014B822 /* call_outgoing.png */, - 633FEC111D3CD5570014B822 /* call_outgoing@2x.png */, - 633FEC121D3CD5570014B822 /* call_quality_indicator_0.png */, - 633FEC131D3CD5570014B822 /* call_quality_indicator_0@2x.png */, - 633FEC141D3CD5570014B822 /* call_quality_indicator_1.png */, - 633FEC151D3CD5570014B822 /* call_quality_indicator_1@2x.png */, - 633FEC161D3CD5570014B822 /* call_quality_indicator_2.png */, - 633FEC171D3CD5570014B822 /* call_quality_indicator_2@2x.png */, - 633FEC181D3CD5570014B822 /* call_quality_indicator_3.png */, - 633FEC191D3CD5570014B822 /* call_quality_indicator_3@2x.png */, - 633FEC1A1D3CD5570014B822 /* call_quality_indicator_4.png */, - 633FEC1B1D3CD5570014B822 /* call_quality_indicator_4@2x.png */, - 633FEC1C1D3CD5570014B822 /* call_start_body_default.png */, - 633FEC1D1D3CD5570014B822 /* call_start_body_default@2x.png */, - 633FEC1E1D3CD5570014B822 /* call_start_body_default~ipad.png */, - 633FEC1F1D3CD5570014B822 /* call_start_body_default~ipad@2x.png */, - 633FEC201D3CD5570014B822 /* call_start_body_disabled.png */, - 633FEC211D3CD5570014B822 /* call_start_body_disabled@2x.png */, - 633FEC221D3CD5570014B822 /* call_start_body_disabled~ipad.png */, - 633FEC231D3CD5570014B822 /* call_start_body_disabled~ipad@2x.png */, - 633FEC241D3CD5570014B822 /* call_start_body_over.png */, - 633FEC251D3CD5570014B822 /* call_start_body_over@2x.png */, - 633FEC261D3CD5570014B822 /* call_start_body_over~ipad.png */, - 633FEC271D3CD5570014B822 /* call_start_body_over~ipad@2x.png */, - 633FEC281D3CD5570014B822 /* call_status_incoming.png */, - 633FEC291D3CD5570014B822 /* call_status_incoming@2x.png */, - 633FEC2A1D3CD5570014B822 /* call_status_incoming~ipad.png */, - 633FEC2B1D3CD5570014B822 /* call_status_incoming~ipad@2x.png */, - 633FEC2C1D3CD5570014B822 /* call_status_missed.png */, - 633FEC2D1D3CD5570014B822 /* call_status_missed@2x.png */, - 633FEC2E1D3CD5570014B822 /* call_status_missed~ipad.png */, - 633FEC2F1D3CD5570014B822 /* call_status_missed~ipad@2x.png */, - 633FEC301D3CD5570014B822 /* call_status_outgoing.png */, - 633FEC311D3CD5570014B822 /* call_status_outgoing@2x.png */, - 633FEC321D3CD5570014B822 /* call_status_outgoing~ipad.png */, - 633FEC331D3CD5570014B822 /* call_status_outgoing~ipad@2x.png */, - 633FEC341D3CD5570014B822 /* call_transfer_default.png */, - 633FEC351D3CD5570014B822 /* call_transfer_default@2x.png */, - 633FEC361D3CD5570014B822 /* call_transfer_disabled.png */, - 633FEC371D3CD5570014B822 /* call_transfer_disabled@2x.png */, - 633FEC381D3CD5570014B822 /* call_video_start_default.png */, - 633FEC391D3CD5570014B822 /* call_video_start_default@2x.png */, - 633FEC3A1D3CD5570014B822 /* call_video_start_disabled.png */, - 633FEC3B1D3CD5570014B822 /* call_video_start_disabled@2x.png */, - 24BFAA9B209B062F004F47A7 /* callkit_logo.png */, - 8CD99A1B20908C27008A7CDA /* callkit_logo@2x.png */, - 633FEC3C1D3CD5570014B822 /* camera_default.png */, - 633FEC3D1D3CD5570014B822 /* camera_default@2x.png */, - 633FEC3E1D3CD5570014B822 /* camera_disabled.png */, - 633FEC3F1D3CD5570014B822 /* camera_disabled@2x.png */, - 633FEC401D3CD5570014B822 /* camera_selected.png */, - 633FEC411D3CD5570014B822 /* camera_selected@2x.png */, - 633FEC421D3CD5570014B822 /* camera_switch_default.png */, - 633FEC431D3CD5570014B822 /* camera_switch_default@2x.png */, - 633FEC441D3CD5570014B822 /* camera_switch_disabled.png */, - 633FEC451D3CD5570014B822 /* camera_switch_disabled@2x.png */, - 633FEC461D3CD5570014B822 /* camera_switch_over.png */, - 633FEC471D3CD5570014B822 /* camera_switch_over@2x.png */, - 633FEC481D3CD5570014B822 /* cancel_edit_default.png */, - 633FEC491D3CD5570014B822 /* cancel_edit_default@2x.png */, - 633FEC4A1D3CD5570014B822 /* cancel_edit_disabled.png */, - 633FEC4B1D3CD5570014B822 /* cancel_edit_disabled@2x.png */, - 633FEC4C1D3CD5570014B822 /* chat_add_default.png */, - 633FEC4D1D3CD5570014B822 /* chat_add_default@2x.png */, - 633FEC4E1D3CD5570014B822 /* chat_add_disabled.png */, - 633FEC4F1D3CD5570014B822 /* chat_add_disabled@2x.png */, - 615A2808217F1FD40060F920 /* chat_add_group.png */, - 615A2810217F1FDE0060F920 /* chat_add_group@2x.png */, - 633FEC501D3CD5570014B822 /* chat_attachment_default.png */, - 633FEC511D3CD5570014B822 /* chat_attachment_default@2x.png */, - 633FEC521D3CD5570014B822 /* chat_attachment_disabled.png */, - 633FEC531D3CD5570014B822 /* chat_attachment_disabled@2x.png */, - 633FEC541D3CD5570014B822 /* chat_attachment_over.png */, - 633FEC551D3CD5570014B822 /* chat_attachment_over@2x.png */, - 244523AC1E8266CC0037A187 /* chat_delivered.png */, - 244523AD1E8266CC0037A187 /* chat_error.png */, - 8CA70AD31F9E285B00A3D2EB /* chat_group_add.png */, - 8CA70AD21F9E285B00A3D2EB /* chat_group_add@2x.png */, - 8C2A81941F87B8000012A66B /* chat_group_avatar.png */, - 8C2A81931F87B7FF0012A66B /* chat_group_avatar@2x.png */, - 8CF25D9B1F9F76BC00BEA0C1 /* chat_group_informations.png */, - 8CF25D9C1F9F76BD00BEA0C1 /* chat_group_informations@2x.png */, - 615A2816217F280C0060F920 /* chat_list_indicator.png */, - 615A2818217F28160060F920 /* chat_list_indicator@2x.png */, - 633FEC561D3CD5570014B822 /* chat_list_indicator~ipad.png */, - 633FEC571D3CD5570014B822 /* chat_list_indicator~ipad@2x.png */, - 633FEC581D3CD5570014B822 /* chat_message_not_delivered.png */, - 633FEC591D3CD5570014B822 /* chat_message_not_delivered@2x.png */, - 244523AE1E8266CC0037A187 /* chat_read.png */, - 8CB2B8F61F86229B0015CEE2 /* chat_secure.png */, - 633FEC5A1D3CD5570014B822 /* chat_send_default.png */, - 633FEC5B1D3CD5570014B822 /* chat_send_default@2x.png */, - 633FEC5C1D3CD5570014B822 /* chat_send_disabled.png */, - 633FEC5D1D3CD5570014B822 /* chat_send_disabled@2x.png */, - 633FEC5E1D3CD5570014B822 /* chat_send_over.png */, - 633FEC5F1D3CD5570014B822 /* chat_send_over@2x.png */, - 633FEC601D3CD5570014B822 /* chat_start_body_default.png */, - 633FEC611D3CD5570014B822 /* chat_start_body_default@2x.png */, - 633FEC621D3CD5570014B822 /* chat_start_body_default~ipad.png */, - 633FEC631D3CD5570014B822 /* chat_start_body_default~ipad@2x.png */, - 633FEC641D3CD5570014B822 /* chat_start_body_disabled.png */, - 633FEC651D3CD5570014B822 /* chat_start_body_disabled@2x.png */, - 633FEC661D3CD5570014B822 /* chat_start_body_disabled~ipad.png */, - 633FEC671D3CD5570014B822 /* chat_start_body_disabled~ipad@2x.png */, - 633FEC681D3CD5570014B822 /* chat_start_body_over.png */, - 633FEC691D3CD5570014B822 /* chat_start_body_over@2x.png */, - 633FEC6A1D3CD5570014B822 /* chat_start_body_over~ipad.png */, - 633FEC6B1D3CD5570014B822 /* chat_start_body_over~ipad@2x.png */, - 244523BC1E8D3A6C0037A187 /* chat_unsecure.png */, - 8CDC618C1F84D89B0087CF7F /* check_selected.png */, - 8CDC61961F84D9270087CF7F /* check_selected@2x.png */, - 8CF25D941F9F336100BEA0C1 /* check_unselected.png */, - 8CF25D8B1F9F336000BEA0C1 /* check_unselected@2x.png */, - 633FEC6C1D3CD5570014B822 /* checkbox_checked.png */, - 633FEC6D1D3CD5570014B822 /* checkbox_checked@2x.png */, - 633FEC6E1D3CD5570014B822 /* checkbox_unchecked.png */, - 633FEC6F1D3CD5570014B822 /* checkbox_unchecked@2x.png */, - 61AEBEC52191E47500F35E7F /* chevron_list_close.png */, - 61AEBEC72191E48400F35E7F /* chevron_list_close@2x.png */, - 61AEBEC92191E49200F35E7F /* chevron_list_open.png */, - 61AEBECB2191E4A300F35E7F /* chevron_list_open@2x.png */, - 633FEC701D3CD5570014B822 /* color_A.png */, - 633FEC711D3CD5570014B822 /* color_C.png */, - 633FEC721D3CD5570014B822 /* color_D.png */, - 633FEC731D3CD5570014B822 /* color_E.png */, - 633FEC741D3CD5570014B822 /* color_F.png */, - 633FEC751D3CD5570014B822 /* color_G.png */, - 633FEC761D3CD5570014B822 /* color_H.png */, - 633FEC771D3CD5570014B822 /* color_I.png */, - 633FEC781D3CD5570014B822 /* color_L.png */, - 633FEC791D3CD5570014B822 /* color_M.png */, - 8CE24F551F8268840077AC0A /* conference_delete.png */, - 8CE24F561F8268840077AC0A /* conference_delete@2x.png */, - 633FEC7A1D3CD5570014B822 /* conference_exit_default.png */, - 633FEC7B1D3CD5570014B822 /* conference_exit_default@2x.png */, - 633FEC7C1D3CD5570014B822 /* conference_exit_over.png */, - 633FEC7D1D3CD5570014B822 /* conference_exit_over@2x.png */, - 633FEC7E1D3CD5570014B822 /* contact_add_default.png */, - 633FEC7F1D3CD5570014B822 /* contact_add_default@2x.png */, - 633FEC801D3CD5570014B822 /* contact_add_disabled.png */, - 633FEC811D3CD5570014B822 /* contact_add_disabled@2x.png */, - 633FEC821D3CD5570014B822 /* contacts_all_default.png */, - 633FEC831D3CD5570014B822 /* contacts_all_default@2x.png */, - 633FEC841D3CD5570014B822 /* contacts_all_disabled.png */, - 633FEC851D3CD5570014B822 /* contacts_all_disabled@2x.png */, - 633FEC861D3CD5570014B822 /* contacts_all_selected.png */, - 633FEC871D3CD5570014B822 /* contacts_all_selected@2x.png */, - 24BFAA99209B062E004F47A7 /* contacts_sip_default.png */, - 24BFAA94209B062C004F47A7 /* contacts_sip_default@2x.png */, - 24BFAA97209B062E004F47A7 /* contacts_sip_selected.png */, - 24BFAA9C209B062F004F47A7 /* contacts_sip_selected@2x.png */, - 633FEC8E1D3CD5570014B822 /* delete_default.png */, - 633FEC8F1D3CD5570014B822 /* delete_default@2x.png */, - 633FEC901D3CD5570014B822 /* delete_disabled.png */, - 633FEC911D3CD5570014B822 /* delete_disabled@2x.png */, - 633FEC921D3CD5570014B822 /* delete_field_default.png */, - 633FEC931D3CD5570014B822 /* delete_field_default@2x.png */, - 633FEC941D3CD5570014B822 /* delete_field_over.png */, - 633FEC951D3CD5570014B822 /* delete_field_over@2x.png */, - CFBD7A2320E504AD007C5286 /* delete_img.png */, - 633FEC961D3CD5570014B822 /* deselect_all.png */, - 633FEC971D3CD5570014B822 /* deselect_all@2x.png */, - 633FEC981D3CD5570014B822 /* dialer_alt_back.png */, - 633FEC991D3CD5570014B822 /* dialer_alt_back@2x.png */, - 633FEC9A1D3CD5570014B822 /* dialer_back_default.png */, - 633FEC9B1D3CD5570014B822 /* dialer_back_default@2x.png */, - 633FEC9C1D3CD5570014B822 /* dialer_back_disabled.png */, - 633FEC9D1D3CD5570014B822 /* dialer_back_disabled@2x.png */, - 24BFAA8C209B062B004F47A7 /* dialer_background.png */, - 633FECA01D3CD5570014B822 /* edit_default.png */, - 633FECA11D3CD5570014B822 /* edit_default@2x.png */, - 633FECA21D3CD5570014B822 /* edit_disabled.png */, - 633FECA31D3CD5570014B822 /* edit_disabled@2x.png */, - 633FECA41D3CD5570014B822 /* edit_list_default.png */, - 633FECA51D3CD5570014B822 /* edit_list_default@2x.png */, - 633FECA61D3CD5570014B822 /* edit_list_disabled.png */, - 633FECA71D3CD5570014B822 /* edit_list_disabled@2x.png */, - 633FECA81D3CD5570014B822 /* footer_chat_default.png */, - 633FECA91D3CD5570014B822 /* footer_chat_default@2x.png */, - 633FECAA1D3CD5570014B822 /* footer_chat_disabled.png */, - 633FECAB1D3CD5570014B822 /* footer_chat_disabled@2x.png */, - 633FECAC1D3CD5570014B822 /* footer_contacts_default.png */, - 633FECAD1D3CD5570014B822 /* footer_contacts_default@2x.png */, - 633FECAE1D3CD5570014B822 /* footer_contacts_disabled.png */, - 633FECAF1D3CD5570014B822 /* footer_contacts_disabled@2x.png */, - 633FECB01D3CD5570014B822 /* footer_dialer_default.png */, - 633FECB11D3CD5570014B822 /* footer_dialer_default@2x.png */, - 633FECB21D3CD5570014B822 /* footer_dialer_disabled.png */, - 633FECB31D3CD5570014B822 /* footer_dialer_disabled@2x.png */, - 633FECB41D3CD5570014B822 /* footer_history_default.png */, - 633FECB51D3CD5570014B822 /* footer_history_default@2x.png */, - 633FECB61D3CD5570014B822 /* footer_history_disabled.png */, - 633FECB71D3CD5570014B822 /* footer_history_disabled@2x.png */, - 633FECB81D3CD5570014B822 /* history_all_default.png */, - 633FECB91D3CD5570014B822 /* history_all_default@2x.png */, - 633FECBA1D3CD5570014B822 /* history_all_disabled.png */, - 633FECBB1D3CD5570014B822 /* history_all_disabled@2x.png */, - 633FECBC1D3CD5570014B822 /* history_all_selected.png */, - 633FECBD1D3CD5570014B822 /* history_all_selected@2x.png */, - 633FECBE1D3CD5570014B822 /* history_chat_indicator.png */, - 633FECBF1D3CD5570014B822 /* history_chat_indicator@2x.png */, - 633FECC01D3CD5570014B822 /* history_missed_default.png */, - 633FECC11D3CD5570014B822 /* history_missed_default@2x.png */, - 633FECC21D3CD5570014B822 /* history_missed_disabled.png */, - 633FECC31D3CD5570014B822 /* history_missed_disabled@2x.png */, - 633FECC41D3CD5570014B822 /* history_missed_selected.png */, - 633FECC51D3CD5570014B822 /* history_missed_selected@2x.png */, - 615A283D2180A2550060F920 /* invite_linphone.png */, - 615A283F2180A2620060F920 /* invite_linphone@2x.png */, - 633FECC61D3CD5570014B822 /* led_connected.png */, - 633FECC71D3CD5570014B822 /* led_connected@2x.png */, - 633FECC81D3CD5570014B822 /* led_disconnected.png */, - 633FECC91D3CD5570014B822 /* led_disconnected@2x.png */, - 633FECCA1D3CD5570014B822 /* led_error.png */, - 633FECCB1D3CD5570014B822 /* led_error@2x.png */, - 633FECCC1D3CD5570014B822 /* led_inprogress.png */, - 633FECCD1D3CD5570014B822 /* led_inprogress@2x.png */, - 8C300D981E40E0CC00728EF3 /* lime_ko.png */, - 8C300D991E40E0CC00728EF3 /* lime_ko@2x.png */, - 24BFAA98209B062E004F47A7 /* linphone_logo.png */, - 24BFAA9D209B0630004F47A7 /* linphone_logo@2x.png */, - 24BFAA93209B062C004F47A7 /* linphone_user.png */, - 24BFAA95209B062D004F47A7 /* linphone_user@2x.png */, - 24BFAA9A209B062F004F47A7 /* linphone_user~ipad.png */, - 24BFAA96209B062D004F47A7 /* linphone_user~ipad@2x.png */, - 633FECD41D3CD5580014B822 /* list_details_default.png */, - 633FECD51D3CD5580014B822 /* list_details_default@2x.png */, - 633FECD61D3CD5580014B822 /* list_details_over.png */, - 633FECD71D3CD5580014B822 /* list_details_over@2x.png */, - 633FECD81D3CD5580014B822 /* menu.png */, - 633FECD91D3CD5580014B822 /* menu@2x.png */, - 61586B7A217A16EE0038AC45 /* menu_about.png */, - 61586B82217A16FD0038AC45 /* menu_about@2x.png */, - 61586B84217A17070038AC45 /* menu_assistant.png */, - 61586B86217A17150038AC45 /* menu_assistant@2x.png */, - 61586B88217A17220038AC45 /* menu_link_account.png */, - 61586B8A217A17320038AC45 /* menu_link_account@2x.png */, - 66E399F52857869200E73456 /* menu_notifications_off.png */, - 66E399F62857869200E73456 /* menu_notifications_on.png */, - 61586B8C217A173F0038AC45 /* menu_options.png */, - 61586B8E217A174F0038AC45 /* menu_options@2x.png */, - 61586B90217A175C0038AC45 /* menu_recordings.png */, - 61586B92217A176F0038AC45 /* menu_recordings@2x.png */, - 633FECDA1D3CD5580014B822 /* micro_default.png */, - 633FECDB1D3CD5580014B822 /* micro_default@2x.png */, - 633FECDC1D3CD5580014B822 /* micro_disabled.png */, - 633FECDD1D3CD5580014B822 /* micro_disabled@2x.png */, - 633FECDE1D3CD5580014B822 /* micro_selected.png */, - 633FECDF1D3CD5580014B822 /* micro_selected@2x.png */, - 8CE24F491F8234A20077AC0A /* next_default.png */, - 8CE24F4A1F8234A30077AC0A /* next_default@2x.png */, - 8CB2B8F71F86229C0015CEE2 /* next_disabled.png */, - 8CB2B8F81F86229D0015CEE2 /* next_disabled@2x.png */, - 633FECE01D3CD5580014B822 /* nowebcamCIF.jpg */, - 633FECE11D3CD5580014B822 /* numpad_0_default.png */, - 633FECE21D3CD5580014B822 /* numpad_0_default@2x.png */, - 633FECE31D3CD5580014B822 /* numpad_0_over.png */, - 633FECE41D3CD5580014B822 /* numpad_0_over@2x.png */, - 633FECE51D3CD5580014B822 /* numpad_0_over~ipad.png */, - 633FECE61D3CD5580014B822 /* numpad_0_over~ipad@2x.png */, - 633FECE71D3CD5580014B822 /* numpad_0~ipad.png */, - 633FECE81D3CD5580014B822 /* numpad_0~ipad@2x.png */, - 633FECE91D3CD5580014B822 /* numpad_1_default.png */, - 633FECEA1D3CD5580014B822 /* numpad_1_default@2x.png */, - 633FECEB1D3CD5580014B822 /* numpad_1_over.png */, - 633FECEC1D3CD5580014B822 /* numpad_1_over@2x.png */, - 633FECED1D3CD5580014B822 /* numpad_1_over~ipad.png */, - 633FECEE1D3CD5580014B822 /* numpad_1_over~ipad@2x.png */, - 633FECEF1D3CD5580014B822 /* numpad_1~ipad.png */, - 633FECF01D3CD5580014B822 /* numpad_1~ipad@2x.png */, - 633FECF11D3CD5580014B822 /* numpad_2_default.png */, - 633FECF21D3CD5580014B822 /* numpad_2_default@2x.png */, - 633FECF31D3CD5580014B822 /* numpad_2_over.png */, - 633FECF41D3CD5580014B822 /* numpad_2_over@2x.png */, - 633FECF51D3CD5580014B822 /* numpad_2_over~ipad.png */, - 633FECF61D3CD5580014B822 /* numpad_2_over~ipad@2x.png */, - 633FECF71D3CD5580014B822 /* numpad_2~ipad.png */, - 633FECF81D3CD5580014B822 /* numpad_2~ipad@2x.png */, - 633FECF91D3CD5580014B822 /* numpad_3_default.png */, - 633FECFA1D3CD5580014B822 /* numpad_3_default@2x.png */, - 633FECFB1D3CD5580014B822 /* numpad_3_over.png */, - 633FECFC1D3CD5580014B822 /* numpad_3_over@2x.png */, - 633FECFD1D3CD5580014B822 /* numpad_3_over~ipad.png */, - 633FECFE1D3CD5580014B822 /* numpad_3_over~ipad@2x.png */, - 633FECFF1D3CD5580014B822 /* numpad_3~ipad.png */, - 633FED001D3CD5580014B822 /* numpad_3~ipad@2x.png */, - 633FED011D3CD5580014B822 /* numpad_4_default.png */, - 633FED021D3CD5580014B822 /* numpad_4_default@2x.png */, - 633FED031D3CD5580014B822 /* numpad_4_over.png */, - 633FED041D3CD5580014B822 /* numpad_4_over@2x.png */, - 633FED051D3CD5580014B822 /* numpad_4_over~ipad.png */, - 633FED061D3CD5580014B822 /* numpad_4_over~ipad@2x.png */, - 633FED071D3CD5580014B822 /* numpad_4~ipad.png */, - 633FED081D3CD5580014B822 /* numpad_4~ipad@2x.png */, - 633FED091D3CD5580014B822 /* numpad_5_default.png */, - 633FED0A1D3CD5580014B822 /* numpad_5_default@2x.png */, - 633FED0B1D3CD5580014B822 /* numpad_5_over.png */, - 633FED0C1D3CD5580014B822 /* numpad_5_over@2x.png */, - 633FED0D1D3CD5580014B822 /* numpad_5_over~ipad.png */, - 633FED0E1D3CD5580014B822 /* numpad_5_over~ipad@2x.png */, - 633FED0F1D3CD5580014B822 /* numpad_5~ipad.png */, - 633FED101D3CD5580014B822 /* numpad_5~ipad@2x.png */, - 633FED111D3CD5580014B822 /* numpad_6_default.png */, - 633FED121D3CD5580014B822 /* numpad_6_default@2x.png */, - 633FED131D3CD5580014B822 /* numpad_6_over.png */, - 633FED141D3CD5580014B822 /* numpad_6_over@2x.png */, - 633FED151D3CD5580014B822 /* numpad_6_over~ipad.png */, - 633FED161D3CD5580014B822 /* numpad_6_over~ipad@2x.png */, - 633FED171D3CD5580014B822 /* numpad_6~ipad.png */, - 633FED181D3CD5580014B822 /* numpad_6~ipad@2x.png */, - 633FED191D3CD5580014B822 /* numpad_7_default.png */, - 633FED1A1D3CD5580014B822 /* numpad_7_default@2x.png */, - 633FED1B1D3CD5580014B822 /* numpad_7_over.png */, - 633FED1C1D3CD5580014B822 /* numpad_7_over@2x.png */, - 633FED1D1D3CD5580014B822 /* numpad_7_over~ipad.png */, - 633FED1E1D3CD5580014B822 /* numpad_7_over~ipad@2x.png */, - 633FED1F1D3CD5580014B822 /* numpad_7~ipad.png */, - 633FED201D3CD5580014B822 /* numpad_7~ipad@2x.png */, - 633FED211D3CD5580014B822 /* numpad_8_default.png */, - 633FED221D3CD5580014B822 /* numpad_8_default@2x.png */, - 633FED231D3CD5580014B822 /* numpad_8_over.png */, - 633FED241D3CD5580014B822 /* numpad_8_over@2x.png */, - 633FED251D3CD5580014B822 /* numpad_8_over~ipad.png */, - 633FED261D3CD5580014B822 /* numpad_8_over~ipad@2x.png */, - 633FED271D3CD5580014B822 /* numpad_8~ipad.png */, - 633FED281D3CD5580014B822 /* numpad_8~ipad@2x.png */, - 633FED291D3CD5580014B822 /* numpad_9_default.png */, - 633FED2A1D3CD5580014B822 /* numpad_9_default@2x.png */, - 633FED2B1D3CD5580014B822 /* numpad_9_over.png */, - 633FED2C1D3CD5580014B822 /* numpad_9_over@2x.png */, - 633FED2D1D3CD5580014B822 /* numpad_9_over~ipad.png */, - 633FED2E1D3CD5580014B822 /* numpad_9_over~ipad@2x.png */, - 633FED2F1D3CD5580014B822 /* numpad_9~ipad.png */, - 633FED301D3CD5580014B822 /* numpad_9~ipad@2x.png */, - 633FED311D3CD5580014B822 /* numpad_hash_default.png */, - 633FED321D3CD5580014B822 /* numpad_hash_default@2x.png */, - 633FED331D3CD5580014B822 /* numpad_hash_over.png */, - 633FED341D3CD5580014B822 /* numpad_hash_over@2x.png */, - 633FED351D3CD5580014B822 /* numpad_hash_over~ipad.png */, - 633FED361D3CD5580014B822 /* numpad_hash_over~ipad@2x.png */, - 633FED371D3CD5580014B822 /* numpad_hash~ipad.png */, - 633FED381D3CD5580014B822 /* numpad_hash~ipad@2x.png */, - 633FED391D3CD5580014B822 /* numpad_over_background.png */, - 633FED3A1D3CD5580014B822 /* numpad_star_default.png */, - 633FED3B1D3CD5580014B822 /* numpad_star_default@2x.png */, - 633FED3C1D3CD5580014B822 /* numpad_star_over.png */, - 633FED3D1D3CD5580014B822 /* numpad_star_over@2x.png */, - 633FED3E1D3CD5580014B822 /* numpad_star_over~ipad.png */, - 633FED3F1D3CD5580014B822 /* numpad_star_over~ipad@2x.png */, - 633FED401D3CD5580014B822 /* numpad_star~ipad.png */, - 633FED411D3CD5580014B822 /* numpad_star~ipad@2x.png */, - 633FED421D3CD5580014B822 /* options_add_call_default.png */, - 633FED431D3CD5580014B822 /* options_add_call_default@2x.png */, - 633FED441D3CD5580014B822 /* options_add_call_disabled.png */, - 633FED451D3CD5580014B822 /* options_add_call_disabled@2x.png */, - 633FED461D3CD5580014B822 /* options_default.png */, - 633FED471D3CD5580014B822 /* options_default@2x.png */, - 633FED481D3CD5580014B822 /* options_disabled.png */, - 633FED491D3CD5580014B822 /* options_disabled@2x.png */, - 633FED4A1D3CD5580014B822 /* options_selected.png */, - 633FED4B1D3CD5580014B822 /* options_selected@2x.png */, - 633FED4C1D3CD5580014B822 /* options_start_conference_default.png */, - 633FED4D1D3CD5580014B822 /* options_start_conference_default@2x.png */, - 633FED4E1D3CD5580014B822 /* options_start_conference_disabled.png */, - 633FED4F1D3CD5580014B822 /* options_start_conference_disabled@2x.png */, - 633FED501D3CD5580014B822 /* options_transfer_call_default.png */, - 633FED511D3CD5580014B822 /* options_transfer_call_default@2x.png */, - 633FED521D3CD5580014B822 /* options_transfer_call_disabled.png */, - 633FED531D3CD5580014B822 /* options_transfer_call_disabled@2x.png */, - 633FED541D3CD5580014B822 /* pause_big_default.png */, - 633FED551D3CD5580014B822 /* pause_big_default@2x.png */, - 633FED561D3CD5580014B822 /* pause_big_disabled.png */, - 633FED571D3CD5580014B822 /* pause_big_disabled@2x.png */, - 633FED581D3CD5580014B822 /* pause_big_over_selected.png */, - 633FED591D3CD5580014B822 /* pause_big_over_selected@2x.png */, - 633FED5A1D3CD5580014B822 /* pause_small_default.png */, - 633FED5B1D3CD5590014B822 /* pause_small_default@2x.png */, - 633FED5C1D3CD5590014B822 /* pause_small_disabled.png */, - 633FED5D1D3CD5590014B822 /* pause_small_disabled@2x.png */, - 633FED5E1D3CD5590014B822 /* pause_small_over_selected.png */, - 633FED5F1D3CD5590014B822 /* pause_small_over_selected@2x.png */, - 633FED601D3CD5590014B822 /* presence_away.png */, - 633FED611D3CD5590014B822 /* presence_away@2x.png */, - 633FED621D3CD5590014B822 /* presence_offline.png */, - 633FED631D3CD5590014B822 /* presence_offline@2x.png */, - 633FED641D3CD5590014B822 /* presence_online.png */, - 633FED651D3CD5590014B822 /* presence_online@2x.png */, - 633FED661D3CD5590014B822 /* presence_unregistered.png */, - 633FED671D3CD5590014B822 /* presence_unregistered@2x.png */, - CF7602F3210898C600749F76 /* rec_off_default.png */, - CF7602EB210898C100749F76 /* rec_off_default@2x.png */, - CF7602F4210898C800749F76 /* rec_on_default.png */, - CF7602F2210898C400749F76 /* rec_on_default@2x.png */, - 615A28412180C0820060F920 /* recording.png */, - 615A28432180C08F0060F920 /* recording@2x.png */, - 633FED681D3CD5590014B822 /* route_bluetooth_default.png */, - 633FED691D3CD5590014B822 /* route_bluetooth_default@2x.png */, - 633FED6A1D3CD5590014B822 /* route_bluetooth_disabled.png */, - 633FED6B1D3CD5590014B822 /* route_bluetooth_disabled@2x.png */, - 633FED6C1D3CD5590014B822 /* route_bluetooth_selected.png */, - 633FED6D1D3CD5590014B822 /* route_bluetooth_selected@2x.png */, - 633FED6E1D3CD5590014B822 /* route_earpiece_default.png */, - 633FED6F1D3CD5590014B822 /* route_earpiece_default@2x.png */, - 633FED701D3CD5590014B822 /* route_earpiece_disabled.png */, - 633FED711D3CD5590014B822 /* route_earpiece_disabled@2x.png */, - 633FED721D3CD5590014B822 /* route_earpiece_selected.png */, - 633FED731D3CD5590014B822 /* route_earpiece_selected@2x.png */, - 633FED741D3CD5590014B822 /* route_speaker_default.png */, - 633FED751D3CD5590014B822 /* route_speaker_default@2x.png */, - 633FED761D3CD5590014B822 /* route_speaker_disabled.png */, - 633FED771D3CD5590014B822 /* route_speaker_disabled@2x.png */, - 633FED781D3CD5590014B822 /* route_speaker_selected.png */, - 633FED791D3CD5590014B822 /* route_speaker_selected@2x.png */, - 633FED7A1D3CD5590014B822 /* routes_default.png */, - 633FED7B1D3CD5590014B822 /* routes_default@2x.png */, - 633FED7C1D3CD5590014B822 /* routes_disabled.png */, - 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 */, - 615A281C217F6FA80060F920 /* security_2_indicator@2x.png */, - 615A281E217F6FB30060F920 /* security_alert_indicator.png */, - 615A2820217F6FBF0060F920 /* security_alert_indicator@2x.png */, - 633FED801D3CD5590014B822 /* security_ko.png */, - 633FED811D3CD5590014B822 /* security_ko@2x.png */, - 633FED821D3CD5590014B822 /* security_ok.png */, - 633FED831D3CD5590014B822 /* security_ok@2x.png */, - 633FED841D3CD5590014B822 /* security_pending.png */, - 633FED851D3CD5590014B822 /* security_pending@2x.png */, - 615A282F218071E80060F920 /* security_toogle_background_green.png */, - 615A2831218071F30060F920 /* security_toogle_background_green@2x.png */, - 615A2833218071FF0060F920 /* security_toogle_background_grey.png */, - 615A28352180720D0060F920 /* security_toogle_background_grey@2x.png */, - 615A28392180788E0060F920 /* security_toogle_button.png */, - 615A283B2180789C0060F920 /* security_toogle_button@2x.png */, - 615A282321805B250060F920 /* security_toogle_icon_green.png */, - 615A282521805B320060F920 /* security_toogle_icon_green@2x.png */, - 615A282721805B400060F920 /* security_toogle_icon_grey.png */, - 615A282921805B4C0060F920 /* security_toogle_icon_grey@2x.png */, - 633FED861D3CD5590014B822 /* select_all_default.png */, - 633FED871D3CD5590014B822 /* select_all_default@2x.png */, - 633FED881D3CD5590014B822 /* select_all_disabled.png */, - 633FED891D3CD5590014B822 /* select_all_disabled@2x.png */, - 633FED8A1D3CD5590014B822 /* speaker_default.png */, - 633FED8B1D3CD5590014B822 /* speaker_default@2x.png */, - 633FED8C1D3CD5590014B822 /* speaker_disabled.png */, - 633FED8D1D3CD5590014B822 /* speaker_disabled@2x.png */, - 633FED8E1D3CD5590014B822 /* speaker_selected.png */, - 633FED8F1D3CD5590014B822 /* speaker_selected@2x.png */, - 8CD99A362090A824008A7CDA /* splashscreen.png */, - 8CD99A352090A823008A7CDA /* splashscreen@2x.png */, - 633FED941D3CD5590014B822 /* valid_default.png */, - 633FED951D3CD5590014B822 /* valid_default@2x.png */, - 633FED961D3CD5590014B822 /* valid_disabled.png */, - 633FED971D3CD5590014B822 /* valid_disabled@2x.png */, - 633FED981D3CD5590014B822 /* voicemail.png */, - 633FED991D3CD5590014B822 /* voicemail@2x.png */, - 633FED9A1D3CD5590014B822 /* waiting_time.png */, - 633FED9B1D3CD5590014B822 /* waiting_time@2x.png */, - ); - path = images; - sourceTree = ""; - }; - 63AADBC31B6A0FF200AA16FD /* Resources */ = { - isa = PBXGroup; - children = ( - C63F72F9285A31DA0066163B /* fonts */, - 63AADBE31B6A0FF200AA16FD /* assistant_external_sip.rc */, - 63AADBE41B6A0FF200AA16FD /* assistant_linphone_create.rc */, - 63AADBE51B6A0FF200AA16FD /* assistant_linphone_existing.rc */, - 63AADBE61B6A0FF200AA16FD /* assistant_remote.rc */, - 63AADBCA1B6A0FF200AA16FD /* Images.xcassets */, - 633FEBE11D3CD5570014B822 /* images */, - 63AADBD71B6A0FF200AA16FD /* linphonerc */, - 63AADBD81B6A0FF200AA16FD /* linphonerc-factory */, - 63AADBDA1B6A0FF200AA16FD /* linphonerc~ipad */, - 63AADBC41B6A0FF200AA16FD /* Localizable.strings */, - 63CDC4511C3BDE370085F529 /* sounds */, - ); - path = Resources; - sourceTree = ""; - }; - 63B81A021B57DA33009604A6 /* TPKeyboardAvoiding */ = { - isa = PBXGroup; - children = ( - 63B81A031B57DA33009604A6 /* LICENSE.txt */, - 63B81A041B57DA33009604A6 /* TPKeyboardAvoidingCollectionView.h */, - 63B81A051B57DA33009604A6 /* TPKeyboardAvoidingCollectionView.m */, - 63B81A061B57DA33009604A6 /* TPKeyboardAvoidingScrollView.h */, - 63B81A071B57DA33009604A6 /* TPKeyboardAvoidingScrollView.m */, - 63B81A081B57DA33009604A6 /* TPKeyboardAvoidingTableView.h */, - 63B81A091B57DA33009604A6 /* TPKeyboardAvoidingTableView.m */, - 63B81A0A1B57DA33009604A6 /* UIScrollView+TPKeyboardAvoidingAdditions.h */, - 63B81A0B1B57DA33009604A6 /* UIScrollView+TPKeyboardAvoidingAdditions.m */, - ); - name = TPKeyboardAvoiding; - path = Utils/TPKeyboardAvoiding; - sourceTree = ""; - }; - 63CDC4511C3BDE370085F529 /* sounds */ = { - isa = PBXGroup; - children = ( - 63DFE0401C40161700DA5E87 /* ringtones */, - 63CDC4531C3BDE370085F529 /* msg.caf */, - 63E27A511C50EB2700D332AE /* hold.mkv */, - 63CDC4541C3BDE370085F529 /* ringback.wav */, - 63CDC45C1C3BDE370085F529 /* shortring.caf */, - ); - path = sounds; - sourceTree = ""; - }; - 63DFE0401C40161700DA5E87 /* ringtones */ = { - isa = PBXGroup; - children = ( - 63DFE0451C40161700DA5E87 /* notes_of_the_optimistic.caf */, - ); - path = ringtones; - sourceTree = ""; - }; - 662F5971288AEFAA00C9CAF7 /* UITests */ = { - isa = PBXGroup; - children = ( - 66495CFD288FF346002780DE /* AutoConnectLinphoneAccount.swift */, - 6637AF8E288593AF00965733 /* CallUITests */, - 6643AD3F287EEE2500701703 /* Methods */, - 66495D09289013B7002780DE /* TestPlans */, - ); - path = UITests; - sourceTree = ""; - }; - 6637AF8E288593AF00965733 /* CallUITests */ = { - isa = PBXGroup; - children = ( - 663B06652886F0DB00E41889 /* ExtraMenuUITests.swift */, - 663B065F2886E38100E41889 /* ActiveCallUITests.swift */, - 663B06592886B54F00E41889 /* OutgoingCallUITests.swift */, - 6637AF8F288593AF00965733 /* IncomingCallUITests.swift */, - ); - path = CallUITests; - sourceTree = ""; - }; - 6643AD3F287EEE2500701703 /* Methods */ = { - isa = PBXGroup; - children = ( - 6643AD51287EF56200701703 /* UITestsCoreManager.swift */, - 6643AD54287F25A500701703 /* IncomingOutgoingCallViewUITestsMethods.swift */, - 663B065B2886DA8500E41889 /* ActiveCallViewUITestsMethods.swift */, - 663B06672886F16300E41889 /* ExtraMenuActiveCallActionsUITestsMethods.swift */, - 662F13B52887E8A10084C28C /* UITestsUtils.swift */, - 66689D3F28A2443A0054E633 /* UITestsScreenshots.swift */, - ); - path = Methods; - sourceTree = ""; - }; - 66495D09289013B7002780DE /* TestPlans */ = { - isa = PBXGroup; - children = ( -<<<<<<< HEAD - 664F8220289A66ED00D8C470 /* Debug.xctestplan */, -======= - 66495D0A289013F6002780DE /* Init.xctestplan */, ->>>>>>> 8e16f1fad (new test plans) - 66495D0B28901429002780DE /* Default.xctestplan */, - 66495D0C289014E2002780DE /* PauseMode_extended.xctestplan */, - ); - path = TestPlans; - sourceTree = ""; - }; - 75AA7090378DBBA5417E4370 /* Pods */ = { - isa = PBXGroup; - children = ( -<<<<<<< HEAD - 95AD7F004071737738D4BCF2 /* Pods-CallUITests.debug.xcconfig */, - 8751F1E7083FF5EDF43CEEF1 /* Pods-CallUITests.release.xcconfig */, - 1CAD1CF40E820DA7F1752DD2 /* Pods-CallUITests.distribution.xcconfig */, - 9B3B6B861461E656FAF443CC /* Pods-CallUITests.distributionadhoc.xcconfig */, - 9B7FA931ED086404EBA1A1DF /* Pods-ConferenceUITests.debug.xcconfig */, - 3E068193AC70B1F268F7A3AC /* Pods-ConferenceUITests.release.xcconfig */, - DC2F21ADD3E0ABFC644BF401 /* Pods-ConferenceUITests.distribution.xcconfig */, - 799B9EAE0655DBE81E9B29FF /* Pods-ConferenceUITests.distributionadhoc.xcconfig */, - 1A10E1CD088B6550326F433E /* Pods-linphone.debug.xcconfig */, - FDB59567FECF2E083DBDC142 /* Pods-linphone.release.xcconfig */, - 71361846551F180407CA4B43 /* Pods-linphone.distribution.xcconfig */, - 6872242062F852BE19E78D5A /* Pods-linphone.distributionadhoc.xcconfig */, - B0D404E542E5871F7437A060 /* Pods-msgNotificationContent.debug.xcconfig */, - 842B7EC5D5497903DF48A6A1 /* Pods-msgNotificationContent.release.xcconfig */, - 5BF3D86E8AD8910810048241 /* Pods-msgNotificationContent.distribution.xcconfig */, - 595A41ABC48A62CE11868F9E /* Pods-msgNotificationContent.distributionadhoc.xcconfig */, - AD31E0BAAE2E50305E05B683 /* Pods-msgNotificationService.debug.xcconfig */, - 49BCAA5D96F3C5BE44D20A5C /* Pods-msgNotificationService.release.xcconfig */, - 3EDEA8FA8B616DA71EDE51E5 /* Pods-msgNotificationService.distribution.xcconfig */, - A52DBCC32989FB3510AF3B1E /* Pods-msgNotificationService.distributionadhoc.xcconfig */, -======= - 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 */, - 46E204586EADEB152EB6BAE5 /* Pods-CallUITests.debug.xcconfig */, - 6A6A835733F8DCF0F0E64FE3 /* Pods-CallUITests.release.xcconfig */, - 5F0358460E4E618A3DC6E2E8 /* Pods-CallUITests.distribution.xcconfig */, - D33A6E8F86694EA7ADD47ED4 /* Pods-CallUITests.distributionadhoc.xcconfig */, - 712CE82EEF35C1881B8E98E7 /* Pods-AutoConnectLinphoneAccount.debug.xcconfig */, - DBEE6C9BCFA78E5739836EB4 /* Pods-AutoConnectLinphoneAccount.release.xcconfig */, - B4847F48A899455D4B85F8BF /* Pods-AutoConnectLinphoneAccount.distribution.xcconfig */, - F0E0078E5C72D700C9E62509 /* Pods-AutoConnectLinphoneAccount.distributionadhoc.xcconfig */, ->>>>>>> 8e16f1fad (new test plans) - ); - path = Pods; - sourceTree = ""; - }; - C63F7196285A24B10066163B /* Swift */ = { - isa = PBXGroup; - children = ( - C6B4444726AADA530076C517 /* SwiftUtil.swift */, - C63F7197285A24B10066163B /* ConfigManager.swift */, - C63F7198285A24B10066163B /* CallManager.swift */, - C63F720B285A24B10066163B /* ProviderDelegate.swift */, - C63F720C285A24B10066163B /* VFSUtil.swift */, - C63F71B1285A24B10066163B /* AppManager.swift */, - C63F7199285A24B10066163B /* Conference */, - C63F71AA285A24B10066163B /* Util */, - C63F71B2285A24B10066163B /* Extensions */, - C63F71C7285A24B10066163B /* Voip */, - ); - path = Swift; - sourceTree = ""; - }; - C63F7199285A24B10066163B /* Conference */ = { - isa = PBXGroup; - children = ( - C63F719A285A24B10066163B /* ViewModels */, - C63F719E285A24B10066163B /* Data */, - C63F71A2285A24B10066163B /* Views */, - ); - path = Conference; - sourceTree = ""; - }; - C63F719A285A24B10066163B /* ViewModels */ = { - isa = PBXGroup; - children = ( - C63F719B285A24B10066163B /* ConferenceWaitingRoomViewModel.swift */, - C63F719C285A24B10066163B /* ConferenceSchedulingViewModel.swift */, - C63F719D285A24B10066163B /* ScheduledConferencesViewModel.swift */, - ); - path = ViewModels; - sourceTree = ""; - }; - C63F719E285A24B10066163B /* Data */ = { - isa = PBXGroup; - children = ( - C63F719F285A24B10066163B /* ScheduledConferenceData.swift */, - C63F71A0285A24B10066163B /* TimeZoneData.swift */, - C63F71A1285A24B10066163B /* Duration.swift */, - ); - path = Data; - sourceTree = ""; - }; - C63F71A2285A24B10066163B /* Views */ = { - isa = PBXGroup; - children = ( - C63F71A3285A24B10066163B /* ConferenceWaitingRoomFragment.swift */, - C63F71A4285A24B10066163B /* ScheduledConferencesView.swift */, - C63F71A6285A24B10066163B /* ScheduledConferencesCell.swift */, - C63F71A5285A24B10066163B /* ICSBubbleView.swift */, - C63F71A7285A24B10066163B /* ConferenceHistoryDetailsView.swift */, - C63F71A8285A24B10066163B /* ConferenceSchedulingView.swift */, - C63F71A9285A24B10066163B /* ConferenceSchedulingSummaryView.swift */, - ); - path = Views; - sourceTree = ""; - }; - C63F71AA285A24B10066163B /* Util */ = { - isa = PBXGroup; - children = ( - C63F71AB285A24B10066163B /* ViewModel */, - C63F71AD285A24B10066163B /* MutableLiveData.swift */, - C63F71AE285A24B10066163B /* Pair.swift */, - C63F71AF285A24B10066163B /* BackNextNavigationView.swift */, - C63F71B0285A24B10066163B /* TimestampUtils.swift */, - ); - path = Util; - sourceTree = ""; - }; - C63F71AB285A24B10066163B /* ViewModel */ = { - isa = PBXGroup; - children = ( - C63F71AC285A24B10066163B /* MediatorLiveData.swift */, - ); - path = ViewModel; - sourceTree = ""; - }; - C63F71B2285A24B10066163B /* Extensions */ = { - isa = PBXGroup; - children = ( - C63F71B3285A24B10066163B /* IOS */, - C63F71BF285A24B10066163B /* LinphoneCore */, - ); - path = Extensions; - sourceTree = ""; - }; - C63F71B3285A24B10066163B /* IOS */ = { - isa = PBXGroup; - children = ( - C63F71B4285A24B10066163B /* UIApplication+Extension.swift */, - C63F71B6285A24B10066163B /* UIVIewControllerExtensions.swift */, - C63F71B7285A24B10066163B /* UIImageExtensions.swift */, - C63F71B8285A24B10066163B /* UIVIewExtensions.swift */, - C63F71B9285A24B10066163B /* UILabelExtensions.swift */, - C63F71BA285A24B10066163B /* OptionalExtensions.swift */, - C63F71BB285A24B10066163B /* UIButtonExtensions.swift */, - C63F71BC285A24B10066163B /* UIImageViewExtensions.swift */, - C63F71BD285A24B10066163B /* UIDeviceExtensions.swift */, - C63F71BE285A24B10066163B /* UIColorExtensions.swift */, - ); - path = IOS; - sourceTree = ""; - }; - C63F71BF285A24B10066163B /* LinphoneCore */ = { - isa = PBXGroup; - children = ( - C63F71C0285A24B10066163B /* CoreExtensions.swift */, - C63F71C1285A24B10066163B /* IceState.swift */, - C63F71C2285A24B10066163B /* AddressExtensions.swift */, - C63F71C3285A24B10066163B /* ParticipantExtensions.swift */, - C63F71C4285A24B10066163B /* PayloadType.swift */, - C63F71C5285A24B10066163B /* CallExtensions.swift */, - C63F71C6285A24B10066163B /* ConferenceExtensions.swift */, - ); - path = LinphoneCore; - sourceTree = ""; - }; - C63F71C7285A24B10066163B /* Voip */ = { - isa = PBXGroup; - children = ( - C63F71C8285A24B10066163B /* ViewModels */, - C63F71D0285A24B10066163B /* AudioRouteUtils.swift */, - C63F71D1285A24B10066163B /* Theme */, - C63F71D7285A24B10066163B /* Views */, - C63F71FB285A24B10066163B /* VoipDialog.swift */, - C63F71FC285A24B10066163B /* Widgets */, - ); - path = Voip; - sourceTree = ""; - }; - C63F71C8285A24B10066163B /* ViewModels */ = { - isa = PBXGroup; - children = ( - C63F71C9285A24B10066163B /* ConferenceViewModel.swift */, - C63F71CA285A24B10066163B /* CallsViewModel.swift */, - C63F71CB285A24B10066163B /* ControlsViewModel.swift */, - C63F71CC285A24B10066163B /* CallStatisticsData.swift */, - C63F71CD285A24B10066163B /* ConferenceParticipantData.swift */, - C63F71CE285A24B10066163B /* ConferenceParticipantDeviceData.swift */, - C63F71CF285A24B10066163B /* CallData.swift */, - ); - path = ViewModels; - sourceTree = ""; - }; - C63F71D1285A24B10066163B /* Theme */ = { - isa = PBXGroup; - children = ( - C63F71D2285A24B10066163B /* LightDarkColor.swift */, - C63F71D3285A24B10066163B /* TextStyle.swift */, - C63F71D4285A24B10066163B /* VoipTexts.swift */, - C63F71D5285A24B10066163B /* ButtonTheme.swift */, - C63F71D6285A24B10066163B /* VoipTheme.swift */, - ); - path = Theme; - sourceTree = ""; - }; - C63F71D7285A24B10066163B /* Views */ = { - isa = PBXGroup; - children = ( - C63F71D8285A24B10066163B /* Fragments */, - C63F71F6285A24B10066163B /* CompositeViewControllers */, - C63F71FA285A24B10066163B /* SharedLayoutConstants.swift */, - ); - path = Views; - sourceTree = ""; - }; - C63F71D8285A24B10066163B /* Fragments */ = { - isa = PBXGroup; - children = ( - C63F71D9285A24B10066163B /* ParticipantsList */, - C63F71DC285A24B10066163B /* AudioRoutesView.swift */, - C63F71DD285A24B10066163B /* Conference */, - C63F71E6285A24B10066163B /* ActiveCall */, - C63F71E8285A24B10066163B /* IncomingOuntgoingCommonView.swift */, - C63F71E9285A24B10066163B /* PausedCallOrConferenceView.swift */, - C63F71EA285A24B10066163B /* LocalVideoView.swift */, - C63F71EB285A24B10066163B /* CallStatsView.swift */, - C63F71EC285A24B10066163B /* NumpadView.swift */, - C63F71ED285A24B10066163B /* VoipExtraButtonsView.swift */, - C63F71EE285A24B10066163B /* CallsList */, - C63F71F2285A24B10066163B /* DismissableView.swift */, - C63F71F3285A24B10066163B /* ConferenceLayoutPickerView.swift */, - C63F71F4285A24B10066163B /* ControlsView.swift */, - C63F71F5285A24B10066163B /* RemotelyRecording.swift */, - ); - path = Fragments; - sourceTree = ""; - }; - C63F71D9285A24B10066163B /* ParticipantsList */ = { - isa = PBXGroup; - children = ( - C63F71DA285A24B10066163B /* ParticipantsListView.swift */, - C63F71DB285A24B10066163B /* VoipParticipantCell.swift */, - ); - path = ParticipantsList; - sourceTree = ""; - }; - C63F71DD285A24B10066163B /* Conference */ = { - isa = PBXGroup; - children = ( - C63F71DE285A24B10066163B /* VoipActiveSpeakerParticipantCell.swift */, - C63F71DF285A24B10066163B /* VoipConferenceAudioOnlyView.swift */, - C63F71E0285A24B10066163B /* VoipGridParticipantCell.swift */, - C63F71E1285A24B10066163B /* VoipAudioOnlyParticipantCell.swift */, - C63F71E2285A24B10066163B /* MicMuted.swift */, - C63F71E3285A24B10066163B /* VoipConferenceGridView.swift */, - C63F71E4285A24B10066163B /* VoipConferenceActiveSpeakerView.swift */, - C63F71E5285A24B10066163B /* VoipConferenceDisplayModeSelectionView.swift */, - ); - path = Conference; - sourceTree = ""; - }; - C63F71E6285A24B10066163B /* ActiveCall */ = { - isa = PBXGroup; - children = ( - C63F71E7285A24B10066163B /* ActiveCallView.swift */, - ); - path = ActiveCall; - sourceTree = ""; - }; - C63F71EE285A24B10066163B /* CallsList */ = { - isa = PBXGroup; - children = ( - C63F71EF285A24B10066163B /* VoipCallContextMenu.swift */, - C63F71F0285A24B10066163B /* CallsListView.swift */, - C63F71F1285A24B10066163B /* VoipCallCell.swift */, - ); - path = CallsList; - sourceTree = ""; - }; - C63F71F6285A24B10066163B /* CompositeViewControllers */ = { - isa = PBXGroup; - children = ( - C63F71F7285A24B10066163B /* OutgoingCallView.swift */, - C63F71F8285A24B10066163B /* ActiveCallOrConferenceView.swift */, - C63F71F9285A24B10066163B /* IncomingCallView.swift */, - ); - path = CompositeViewControllers; - sourceTree = ""; - }; - C63F71FC285A24B10066163B /* Widgets */ = { - isa = PBXGroup; - children = ( - C63F71FD285A24B10066163B /* StyledValuePicker.swift */, - C63F71FE285A24B10066163B /* StyledSwitch.swift */, - C63F71FF285A24B10066163B /* CallControlButton.swift */, - C63F7200285A24B10066163B /* RotatingSpinner.swift */, - C63F7201285A24B10066163B /* FormButton.swift */, - C63F7202285A24B10066163B /* BouncingCounter.swift */, - C63F7203285A24B10066163B /* VoipExtraButton.swift */, - C63F7204285A24B10066163B /* UICallTimer.swift */, - C63F7205285A24B10066163B /* StyledCheckBox.swift */, - C63F7206285A24B10066163B /* Avatar.swift */, - C63F7207285A24B10066163B /* StyledLabel.swift */, - C63F7208285A24B10066163B /* StyledDatePicker.swift */, - C63F7209285A24B10066163B /* ButtonWithStateBackgrounds.swift */, - C63F720A285A24B10066163B /* StyledTextView.swift */, - ); - path = Widgets; - sourceTree = ""; - }; - C63F72F9285A31DA0066163B /* fonts */ = { - isa = PBXGroup; - children = ( - C63F72FA285A31DA0066163B /* Roboto-Regular.ttf */, - C63F72FB285A31DA0066163B /* Roboto-Italic.ttf */, - C63F72FC285A31DA0066163B /* Roboto-Bold.ttf */, - ); - path = fonts; - sourceTree = ""; - }; - D326483415887D4400930C67 /* Utils */ = { - isa = PBXGroup; - children = ( - D37E3ECA1619C27A0087659A /* CAAnimationBlocks */, - D380801215C299D0005BE9BC /* ColorSpaceUtilites.m */, - D380801115C29984005BE9BC /* ColorSpaceUtilities.h */, - D3807FB615C28940005BE9BC /* DCRoundSwitch */, - D37EE15F160377D7003608A6 /* DTFoundation */, - D32B9DFA15A2F131000B6DEC /* FastAddressBook.h */, - D32B9DFB15A2F131000B6DEC /* FastAddressBook.m */, - 6371579F1B283FE200C91677 /* FileTransferDelegate.h */, - 637157A01B283FE200C91677 /* FileTransferDelegate.m */, - 633888401BFB2C49001D5E7B /* HPGrowingTextView */, - D3807FC715C2894A005BE9BC /* InAppSettingsKit */, - D326483615887D5200930C67 /* OrderedDictionary.h */, - D326483715887D5200930C67 /* OrderedDictionary.m */, - 63B81A021B57DA33009604A6 /* TPKeyboardAvoiding */, - D3F7997E15BD31EC0018C273 /* TPMultiLayoutViewController */, - 6308F9C31BF0DD6600D1234B /* XMLRPCHelper.h */, - 6308F9C41BF0DD6600D1234B /* XMLRPCHelper.m */, - C9B3A6FD15B485DB006F52EE /* Utils.h */, - D35860D515B549B500513429 /* Utils.m */, - 63D11C521C3D501200E8FCEE /* Log.m */, - 63D11C541C3D503A00E8FCEE /* Log.h */, - 63423C081C4501D000D9A050 /* Contact.h */, - 63423C091C4501D000D9A050 /* Contact.m */, - ); - name = Utils; - sourceTree = ""; - }; - D37E3ECA1619C27A0087659A /* CAAnimationBlocks */ = { - isa = PBXGroup; - children = ( - D37E3ECB1619C27A0087659A /* CAAnimation+Blocks.h */, - D37E3ECC1619C27A0087659A /* CAAnimation+Blocks.m */, - ); - name = CAAnimationBlocks; - path = Utils/CAAnimationBlocks; - sourceTree = ""; - }; - D37EE15F160377D7003608A6 /* DTFoundation */ = { - isa = PBXGroup; - children = ( - D37EE160160377D7003608A6 /* DTActionSheet.h */, - 63CD4B4D1A5AAC8C00B84282 /* DTAlertView.h */, - 63CD4B4E1A5AAC8C00B84282 /* DTAlertView.m */, - D37EE161160377D7003608A6 /* DTActionSheet.m */, - F0642EF719DAF32E009DB336 /* DTWeakSupport.h */, - ); - name = DTFoundation; - path = Utils/DTFoundation; - sourceTree = ""; - }; - D3807FB615C28940005BE9BC /* DCRoundSwitch */ = { - isa = PBXGroup; - children = ( - D3807FB715C28940005BE9BC /* DCRoundSwitch.h */, - D3807FB815C28940005BE9BC /* DCRoundSwitch.m */, - D3807FB915C28940005BE9BC /* DCRoundSwitchKnobLayer.h */, - D3807FBA15C28940005BE9BC /* DCRoundSwitchKnobLayer.m */, - D3807FBB15C28940005BE9BC /* DCRoundSwitchOutlineLayer.h */, - D3807FBC15C28940005BE9BC /* DCRoundSwitchOutlineLayer.m */, - D3807FBD15C28940005BE9BC /* DCRoundSwitchToggleLayer.h */, - D3807FBE15C28940005BE9BC /* DCRoundSwitchToggleLayer.m */, - ); - name = DCRoundSwitch; - path = Utils/DCRoundSwitch; - sourceTree = ""; - }; - D3807FC715C2894A005BE9BC /* InAppSettingsKit */ = { - isa = PBXGroup; - children = ( - D3807FC815C2894A005BE9BC /* Controllers */, - D3807FD015C2894A005BE9BC /* Models */, - D3807FDB15C2894A005BE9BC /* Views */, - ); - name = InAppSettingsKit; - path = Utils/InAppSettingsKit; - sourceTree = ""; - }; - D3807FC815C2894A005BE9BC /* Controllers */ = { - isa = PBXGroup; - children = ( - D3807FC915C2894A005BE9BC /* IASKAppSettingsViewController.h */, - D3807FCA15C2894A005BE9BC /* IASKAppSettingsViewController.m */, - D3807FCD15C2894A005BE9BC /* IASKSpecifierValuesViewController.h */, - D3807FCE15C2894A005BE9BC /* IASKSpecifierValuesViewController.m */, - D3807FCF15C2894A005BE9BC /* IASKViewController.h */, - ); - path = Controllers; - sourceTree = ""; - }; - D3807FD015C2894A005BE9BC /* Models */ = { - isa = PBXGroup; - children = ( - D3807FD115C2894A005BE9BC /* IASKSettingsReader.h */, - D3807FD215C2894A005BE9BC /* IASKSettingsReader.m */, - D3807FD315C2894A005BE9BC /* IASKSettingsStore.h */, - D3807FD415C2894A005BE9BC /* IASKSettingsStore.m */, - D3807FD515C2894A005BE9BC /* IASKSettingsStoreFile.h */, - D3807FD615C2894A005BE9BC /* IASKSettingsStoreFile.m */, - D3807FD715C2894A005BE9BC /* IASKSettingsStoreUserDefaults.h */, - D3807FD815C2894A005BE9BC /* IASKSettingsStoreUserDefaults.m */, - D3807FD915C2894A005BE9BC /* IASKSpecifier.h */, - D3807FDA15C2894A005BE9BC /* IASKSpecifier.m */, - ); - path = Models; - sourceTree = ""; - }; - D3807FDB15C2894A005BE9BC /* Views */ = { - isa = PBXGroup; - children = ( - D3807FDC15C2894A005BE9BC /* IASKPSSliderSpecifierViewCell.h */, - D3807FDD15C2894A005BE9BC /* IASKPSSliderSpecifierViewCell.m */, - D3807FDE15C2894A005BE9BC /* IASKPSTextFieldSpecifierViewCell.h */, - D3807FDF15C2894A005BE9BC /* IASKPSTextFieldSpecifierViewCell.m */, - D3807FE015C2894A005BE9BC /* IASKPSTitleValueSpecifierViewCell.h */, - D3807FE115C2894A005BE9BC /* IASKPSTitleValueSpecifierViewCell.m */, - D3807FE215C2894A005BE9BC /* IASKSlider.h */, - D3807FE315C2894A005BE9BC /* IASKSlider.m */, - D3807FE415C2894A005BE9BC /* IASKSwitch.h */, - D3807FE515C2894A005BE9BC /* IASKSwitch.m */, - D3807FE615C2894A005BE9BC /* IASKTextField.h */, - D3807FE715C2894A005BE9BC /* IASKTextField.m */, - ); - path = Views; - sourceTree = ""; - }; - D398D3031594B0FB00FD553C /* Settings */ = { - isa = PBXGroup; - children = ( - D34F6F9D1594D3FB0095705B /* InAppSettings.bundle */, - ); - path = Settings; - sourceTree = ""; - }; - D3F7997E15BD31EC0018C273 /* TPMultiLayoutViewController */ = { - isa = PBXGroup; - children = ( - D3F7997F15BD32370018C273 /* TPMultiLayoutViewController.h */, - D3F7998015BD32370018C273 /* TPMultiLayoutViewController.m */, - ); - name = TPMultiLayoutViewController; - sourceTree = ""; - }; - EA5F25DA232BD3E200475F2E /* msgNotificationService */ = { - isa = PBXGroup; - children = ( - EAB783CF232F8E4D0076B1A0 /* msgNotificationService.entitlements */, - EAE6C88323FABF690076A018 /* Utils.swift */, - EA5F25DB232BD3E200475F2E /* NotificationService.swift */, - 6112A01D243B5FD500DBD5F5 /* GoogleService-Info.plist */, - EA5F25DD232BD3E200475F2E /* Info.plist */, - ); - path = msgNotificationService; - sourceTree = ""; - }; - EA8CB82A239F96CA00C330CC /* msgNotificationContent */ = { - isa = PBXGroup; - children = ( - 6112A01B243B31A600DBD5F5 /* GoogleService-Info.plist */, - EA8CB83F239FD41400C330CC /* msgNotificationContent.entitlements */, - EA8CB82B239F96CA00C330CC /* NotificationViewController.swift */, - EA8CB82D239F96CA00C330CC /* MainInterface.storyboard */, - EA8CB830239F96CA00C330CC /* Info.plist */, - ); - path = msgNotificationContent; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 1D6058900D05DD3D006BFB54 /* linphone */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "linphone" */; - buildPhases = ( - 75EA65B333185E8C417354AA /* [CP] Check Pods Manifest.lock */, - 1D60588D0D05DD3D006BFB54 /* Resources */, - 63DCC71D1A07B08E00916627 /* Run Script */, - 1D60588E0D05DD3D006BFB54 /* Sources */, - 1D60588F0D05DD3D006BFB54 /* Frameworks */, - 8CDC89061EAF89A8006B5652 /* Embed Frameworks */, - 5EF0C35020C806A5005081B0 /* Embed App Extensions */, - 614D0A1821E77F5300C43EDF /* ShellScript */, - EB63CF57E1CDAC8DC31C1CBE /* [CP] Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - EA8CB83A239F9A3000C330CC /* PBXTargetDependency */, - EA8CB83C239F9A3000C330CC /* PBXTargetDependency */, - 61AE365520C00B370089D9D3 /* PBXTargetDependency */, - ); - name = linphone; - productName = linphone; - productReference = 1D6058910D05DD3D006BFB54 /* linphone.app */; - productType = "com.apple.product-type.application"; - }; - 61AE364A20C00B370089D9D3 /* linphoneExtension */ = { - isa = PBXNativeTarget; - buildConfigurationList = 61AE366120C00B370089D9D3 /* Build configuration list for PBXNativeTarget "linphoneExtension" */; - buildPhases = ( - 61AE364720C00B370089D9D3 /* Sources */, - 61AE364820C00B370089D9D3 /* Frameworks */, - 61AE364920C00B370089D9D3 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = linphoneExtension; - productName = linphoneExtension; - productReference = 61AE364B20C00B370089D9D3 /* linphoneExtension.appex */; - productType = "com.apple.product-type.app-extension"; - }; - 6637AF8C288593AF00965733 /* CallUITests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 6637AF99288593AF00965733 /* Build configuration list for PBXNativeTarget "CallUITests" */; - buildPhases = ( - 5053FDC66A7F809319B46BF3 /* [CP] Check Pods Manifest.lock */, - 6637AF89288593AF00965733 /* Sources */, - 6637AF8A288593AF00965733 /* Frameworks */, - 6637AF8B288593AF00965733 /* Resources */, -<<<<<<< HEAD - 5D7EB00FFF68B940A86FC3A7 /* [CP] Embed Pods Frameworks */, - 66495D0D2890269C002780DE /* Run Script */, -======= - A6E560FA2700D9B96AE0FE5C /* [CP] Embed Pods Frameworks */, - 66495D0D2890269C002780DE /* ShellScript */, ->>>>>>> 8e16f1fad (new test plans) - ); - buildRules = ( - ); - dependencies = ( - 6637AF94288593AF00965733 /* PBXTargetDependency */, - ); - name = CallUITests; - productName = IncommingCallUITests; - productReference = 6637AF8D288593AF00965733 /* CallUITests.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; - }; - 66495CFA288FF346002780DE /* AutoConnectLinphoneAccount */ = { - isa = PBXNativeTarget; - buildConfigurationList = 66495D01288FF346002780DE /* Build configuration list for PBXNativeTarget "AutoConnectLinphoneAccount" */; - buildPhases = ( - 1D4D7BF9440527C13D50B347 /* [CP] Check Pods Manifest.lock */, - 66495CF7288FF346002780DE /* Sources */, - 66495CF8288FF346002780DE /* Frameworks */, - 66495CF9288FF346002780DE /* Resources */, - 00029ED4EA06DBB8D333C3FD /* [CP] Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 66495D00288FF346002780DE /* PBXTargetDependency */, - ); - name = AutoConnectLinphoneAccount; - productName = AutoConnectLinphoneAccount; - productReference = 66495CFB288FF346002780DE /* AutoConnectLinphoneAccount.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - EA5F25D8232BD3E200475F2E /* msgNotificationService */ = { - isa = PBXNativeTarget; - buildConfigurationList = EA5F25E1232BD3E300475F2E /* Build configuration list for PBXNativeTarget "msgNotificationService" */; - buildPhases = ( - 3007955DA8B4F1E14F2B7518 /* [CP] Check Pods Manifest.lock */, - EA5F25D5232BD3E200475F2E /* Sources */, - 203E6292C3E84CD13778F720 /* Frameworks */, - EA88A406242A6224007FEC61 /* Resources */, - 6112A01A243B2CCF00DBD5F5 /* Run Script */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = msgNotificationService; - productName = messagesNotification; - productReference = EA5F25D9232BD3E200475F2E /* msgNotificationService.appex */; - productType = "com.apple.product-type.app-extension"; - }; - EA8CB826239F96CA00C330CC /* msgNotificationContent */ = { - isa = PBXNativeTarget; - buildConfigurationList = EA8CB834239F96CA00C330CC /* Build configuration list for PBXNativeTarget "msgNotificationContent" */; - buildPhases = ( - 897DE6709DE23EF9C66BE1B0 /* [CP] Check Pods Manifest.lock */, - EA8CB823239F96CA00C330CC /* Sources */, - 143EFEE2501CB14E6BB244EF /* Frameworks */, - EA88F3AE241BD1ED00E66528 /* Resources */, - 6112A019243B2C8400DBD5F5 /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = msgNotificationContent; - productName = msgNotificationContent; - productReference = EA8CB827239F96CA00C330CC /* msgNotificationContent.appex */; - productType = "com.apple.product-type.app-extension"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 1340; - LastUpgradeCheck = 1130; - TargetAttributes = { - 1D6058900D05DD3D006BFB54 = { - DevelopmentTeam = Z2V957B3D6; - LastSwiftMigration = 1030; - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.ApplicationGroups.iOS = { - enabled = 1; - }; - com.apple.BackgroundModes = { - enabled = 1; - }; - com.apple.InAppPurchase = { - enabled = 1; - }; - com.apple.Push = { - enabled = 1; - }; - com.apple.iCloud = { - enabled = 1; - }; - }; - }; - 61AE364A20C00B370089D9D3 = { - CreatedOnToolsVersion = 9.2; - DevelopmentTeam = Z2V957B3D6; - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.ApplicationGroups.iOS = { - enabled = 1; - }; - }; - }; - 6637AF8C288593AF00965733 = { - CreatedOnToolsVersion = 13.4.1; - DevelopmentTeam = Z2V957B3D6; - ProvisioningStyle = Automatic; - TestTargetID = 1D6058900D05DD3D006BFB54; - }; - 66495CFA288FF346002780DE = { - CreatedOnToolsVersion = 13.4.1; - DevelopmentTeam = Z2V957B3D6; - ProvisioningStyle = Automatic; - TestTargetID = 1D6058900D05DD3D006BFB54; - }; - EA5F25D8232BD3E200475F2E = { - CreatedOnToolsVersion = 11.0; - DevelopmentTeam = Z2V957B3D6; - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.ApplicationGroups.iOS = { - enabled = 1; - }; - }; - }; - EA8CB826239F96CA00C330CC = { - CreatedOnToolsVersion = 10.3; - DevelopmentTeam = Z2V957B3D6; - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.ApplicationGroups.iOS = { - enabled = 1; - }; - }; - }; - }; - }; - buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "linphone" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - en, - ru, - Base, - ar, - de, - ja, - nl, - zh_TW, - pl, - sv, - tr, - zh_CN, - fr, - hu, - ); - mainGroup = 29B97314FDCFA39411CA2CEA; - productRefGroup = 19C28FACFE9D520D11CA2CBB /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 1D6058900D05DD3D006BFB54 /* linphone */, - 61AE364A20C00B370089D9D3 /* linphoneExtension */, - EA5F25D8232BD3E200475F2E /* msgNotificationService */, - EA8CB826239F96CA00C330CC /* msgNotificationContent */, - 6637AF8C288593AF00965733 /* CallUITests */, - 66495CFA288FF346002780DE /* AutoConnectLinphoneAccount */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1D60588D0D05DD3D006BFB54 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 633FEF3F1D3CD55A0014B822 /* security_pending@2x.png in Resources */, - 24BFAAA4209B0630004F47A7 /* linphone_logo.png in Resources */, - 633FEDC41D3CD5590014B822 /* call_hangup_disabled.png in Resources */, - C66B03BB26E8EB1A009B5EDC /* UIChatReplyBubbleView.xib in Resources */, - 633FEDA81D3CD5590014B822 /* backspace_default.png in Resources */, - C63F72C0285A2F1D0066163B /* voip_numpad_0.png in Resources */, - 636316D11A1DEBCB0009B839 /* AboutView.xib in Resources */, - 8CBD7BA620B6B82400E5DCC0 /* UIChatConversationInfoTableViewCell.xib in Resources */, - 244523AF1E8266CC0037A187 /* chat_delivered.png in Resources */, - CF7602F8210898CC00749F76 /* rec_on_default.png in Resources */, - 633FEF481D3CD55A0014B822 /* speaker_selected.png in Resources */, - 633FEED91D3CD55A0014B822 /* numpad_7~ipad.png in Resources */, - 633FEE2B1D3CD5590014B822 /* color_C.png in Resources */, - 633FEE871D3CD5590014B822 /* led_inprogress@2x.png in Resources */, - 633FEEC61D3CD55A0014B822 /* numpad_5_over@2x.png in Resources */, - 633FEF021D3CD55A0014B822 /* options_disabled.png in Resources */, - 633FEDC81D3CD5590014B822 /* call_missed.png in Resources */, - 8CB2B8FA1F86229E0015CEE2 /* next_disabled.png in Resources */, - 8CF25D961F9F336100BEA0C1 /* check_unselected.png in Resources */, - 8C300D9A1E40E0CC00728EF3 /* lime_ko.png in Resources */, - 633FEE311D3CD5590014B822 /* color_I.png in Resources */, - 633FEF1F1D3CD55A0014B822 /* presence_online@2x.png in Resources */, - 633FEE641D3CD5590014B822 /* footer_chat_disabled.png in Resources */, - 633FEE9C1D3CD55A0014B822 /* numpad_0_default@2x.png in Resources */, - 633FEE3C1D3CD5590014B822 /* contacts_all_default.png in Resources */, - 633FEE171D3CD5590014B822 /* chat_send_disabled@2x.png in Resources */, - C61B1BF22667D075001A4E4A /* menu_security_default.png in Resources */, - 633FEE6E1D3CD5590014B822 /* footer_history_default.png in Resources */, - 633FEEB21D3CD55A0014B822 /* numpad_2~ipad@2x.png in Resources */, - 633FEDC61D3CD5590014B822 /* call_incoming.png in Resources */, - 633FEF2D1D3CD55A0014B822 /* route_earpiece_selected@2x.png in Resources */, - 638F1A621C2021B2004B8E02 /* DialerView~ipad.xib in Resources */, - 615A2817217F280C0060F920 /* chat_list_indicator.png in Resources */, - 633FEEFF1D3CD55A0014B822 /* options_add_call_disabled@2x.png in Resources */, - C63F72FD285A31DA0066163B /* Roboto-Regular.ttf in Resources */, - 633FEF091D3CD55A0014B822 /* options_start_conference_disabled@2x.png in Resources */, - C622E3F326A81290004F5434 /* vr_pause.png in Resources */, - 633FEE051D3CD5590014B822 /* cancel_edit_disabled@2x.png in Resources */, - 633FEE5F1D3CD5590014B822 /* edit_list_default@2x.png in Resources */, - C63F72F6285A2F1E0066163B /* voip_delete.png in Resources */, - C63F72F0285A2F1E0066163B /* voip_radio_on.png in Resources */, - C63F72EB285A2F1E0066163B /* voip_edit.png in Resources */, - 633FEEB61D3CD55A0014B822 /* numpad_3_over@2x.png in Resources */, - 633FEF371D3CD55A0014B822 /* routes_disabled@2x.png in Resources */, - C63F72D1285A2F1E0066163B /* voip_numpad_star.png in Resources */, - 633FEE0F1D3CD5590014B822 /* chat_attachment_over@2x.png in Resources */, - 633FEF381D3CD55A0014B822 /* routes_selected.png in Resources */, - 633FEE0B1D3CD5590014B822 /* chat_attachment_default@2x.png in Resources */, - 633FEED41D3CD55A0014B822 /* numpad_7_default@2x.png in Resources */, - 633FEEE01D3CD55A0014B822 /* numpad_8_over~ipad@2x.png in Resources */, - 633FEDDC1D3CD5590014B822 /* call_start_body_disabled~ipad.png in Resources */, - C63F72FF285A31DA0066163B /* Roboto-Bold.ttf in Resources */, - 63E802DB1C625AEF000D5509 /* BuildFile in Resources */, - 633FEE2E1D3CD5590014B822 /* color_F.png in Resources */, - 633FEDC51D3CD5590014B822 /* call_hangup_disabled@2x.png in Resources */, - 633FEEDF1D3CD55A0014B822 /* numpad_8_over~ipad.png in Resources */, - C63F72C3285A2F1D0066163B /* voip_speaker_on.png in Resources */, - 8CD99A372090A824008A7CDA /* splashscreen@2x.png in Resources */, - 24BFAAA9209B0630004F47A7 /* linphone_logo@2x.png in Resources */, - 633FEE071D3CD5590014B822 /* chat_add_default@2x.png in Resources */, - 633FEF551D3CD55A0014B822 /* waiting_time@2x.png in Resources */, - 633FEEAC1D3CD55A0014B822 /* numpad_2_default@2x.png in Resources */, - 633FEE541D3CD5590014B822 /* dialer_back_default.png in Resources */, - C63F72DE285A2F1E0066163B /* voip_call_header_active.png in Resources */, - 633FEF0B1D3CD55A0014B822 /* options_transfer_call_default@2x.png in Resources */, - 633FEDE81D3CD5590014B822 /* call_status_missed~ipad.png in Resources */, - 63AADBFF1B6A0FF200AA16FD /* assistant_external_sip.rc in Resources */, - 61CCC3E121933B660060EDEA /* UIDeviceCell.xib in Resources */, - C63F72F8285A2F1E0066163B /* voip_call_header_outgoing.png in Resources */, - 633FEE9E1D3CD55A0014B822 /* numpad_0_over@2x.png in Resources */, - 8CE24F581F8268850077AC0A /* conference_delete@2x.png in Resources */, - 633FEDC21D3CD5590014B822 /* call_hangup_default.png in Resources */, - 633FEEB41D3CD55A0014B822 /* numpad_3_default@2x.png in Resources */, - 633FEEE51D3CD55A0014B822 /* numpad_9_over.png in Resources */, - 633FEECA1D3CD55A0014B822 /* numpad_5~ipad@2x.png in Resources */, - 633FEE101D3CD5590014B822 /* chat_list_indicator~ipad.png in Resources */, - 633FEF331D3CD55A0014B822 /* route_speaker_selected@2x.png in Resources */, - 633FEE6C1D3CD5590014B822 /* footer_dialer_disabled.png in Resources */, - 633FEF231D3CD55A0014B822 /* route_bluetooth_default@2x.png in Resources */, - C6A1BB4526E890BD00540D50 /* file_voice_default.png in Resources */, - 633FED9C1D3CD5590014B822 /* add_field_default.png in Resources */, - 633FEE411D3CD5590014B822 /* contacts_all_selected@2x.png in Resources */, - D38187F815FE355D00C3EDCA /* TabBarView.xib in Resources */, - C63F72D2285A2F1E0066163B /* voip_numpad_hash.png in Resources */, - C63F72F4285A2F1E0066163B /* voip_conference_new_selected.png in Resources */, - 633FEE2F1D3CD5590014B822 /* color_G.png in Resources */, - 633FEECE1D3CD55A0014B822 /* numpad_6_over@2x.png in Resources */, - 8C92ABE81FA773190006FB5D /* UIChatNotifiedEventCell.xib in Resources */, - C63F72C7285A2F1E0066163B /* voip_change_camera.png in Resources */, - 633FEDAB1D3CD5590014B822 /* backspace_disabled@2x.png in Resources */, - 633FEDD91D3CD5590014B822 /* call_start_body_default~ipad@2x.png in Resources */, - 633FEE401D3CD5590014B822 /* contacts_all_selected.png in Resources */, - 633FEE0C1D3CD5590014B822 /* chat_attachment_disabled.png in Resources */, - C622E3EF26A81290004F5434 /* vr_stop.png in Resources */, - 633FEF001D3CD55A0014B822 /* options_default.png in Resources */, - CF15F21F20E4F9A3008B1DE6 /* UIImageViewDeletable.xib in Resources */, - 633FEE951D3CD55A0014B822 /* micro_default@2x.png in Resources */, - 633FEE6A1D3CD5590014B822 /* footer_dialer_default.png in Resources */, - 633FEEC91D3CD55A0014B822 /* numpad_5~ipad.png in Resources */, - 633FEDFA1D3CD5590014B822 /* camera_selected.png in Resources */, - 633FEF451D3CD55A0014B822 /* speaker_default@2x.png in Resources */, - 633FEDD41D3CD5590014B822 /* call_quality_indicator_4.png in Resources */, - 633FEF241D3CD55A0014B822 /* route_bluetooth_disabled.png in Resources */, - 633FEECD1D3CD55A0014B822 /* numpad_6_over.png in Resources */, - D38187D115FE346B00C3EDCA /* HistoryListView.xib in Resources */, - D38187BD15FE342800C3EDCA /* ContactsListView.xib in Resources */, - 633FEF0E1D3CD55A0014B822 /* pause_big_default.png in Resources */, - 633FEF191D3CD55A0014B822 /* pause_small_over_selected@2x.png in Resources */, - 633FEDA71D3CD5590014B822 /* back_disabled@2x.png in Resources */, - 633FEDBD1D3CD5590014B822 /* call_audio_start_disabled@2x.png in Resources */, - 615A2815217F24E00060F920 /* security_1_indicator@2x.png in Resources */, - 633FEE981D3CD55A0014B822 /* micro_selected.png in Resources */, - 633FEEB51D3CD55A0014B822 /* numpad_3_over.png in Resources */, - 633FEE041D3CD5590014B822 /* cancel_edit_disabled.png in Resources */, - 633FEDE61D3CD5590014B822 /* call_status_missed.png in Resources */, - 8CDC61971F84D9270087CF7F /* check_selected@2x.png in Resources */, - 633FEE7A1D3CD5590014B822 /* history_missed_default.png in Resources */, - 633FEF121D3CD55A0014B822 /* pause_big_over_selected.png in Resources */, - 633FED9D1D3CD5590014B822 /* add_field_default@2x.png in Resources */, - C622E3F426A81290004F5434 /* vr_play.png in Resources */, - 639E9CB01C0DB83000019A75 /* SideMenuView.xib in Resources */, - 633FEDBB1D3CD5590014B822 /* call_audio_start_default@2x.png in Resources */, - 633FEF1A1D3CD55A0014B822 /* presence_away.png in Resources */, - 639E9CB51C0DB88200019A75 /* PhoneMainView.xib in Resources */, - 633FEDB61D3CD5590014B822 /* call_alt_start_default.png in Resources */, - 633FEF0D1D3CD55A0014B822 /* options_transfer_call_disabled@2x.png in Resources */, - 633FEDEF1D3CD5590014B822 /* call_transfer_default@2x.png in Resources */, - 633FEF391D3CD55A0014B822 /* routes_selected@2x.png in Resources */, - 633FEE491D3CD5590014B822 /* delete_default@2x.png in Resources */, - 633FEF291D3CD55A0014B822 /* route_earpiece_default@2x.png in Resources */, - C63F72EA285A2F1E0066163B /* voip_checkbox_unchecked.png in Resources */, - 633FEE271D3CD5590014B822 /* checkbox_checked@2x.png in Resources */, - 61586B85217A17070038AC45 /* menu_assistant.png in Resources */, - 633FEDCC1D3CD5590014B822 /* call_quality_indicator_0.png in Resources */, - 633FEDEB1D3CD5590014B822 /* call_status_outgoing@2x.png in Resources */, - 633FEDEE1D3CD5590014B822 /* call_transfer_default.png in Resources */, - 63DFE04B1C40161700DA5E87 /* notes_of_the_optimistic.caf in Resources */, - 639E9C931C0DB7BE00019A75 /* FirstLoginView.xib in Resources */, - 633FEEF61D3CD55A0014B822 /* numpad_star_over.png in Resources */, - 633FEEE81D3CD55A0014B822 /* numpad_9_over~ipad@2x.png in Resources */, - 633FEEDE1D3CD55A0014B822 /* numpad_8_over@2x.png in Resources */, - 633FEEB11D3CD55A0014B822 /* numpad_2~ipad.png in Resources */, - 633FEE521D3CD5590014B822 /* dialer_alt_back.png in Resources */, - 633FEE341D3CD5590014B822 /* conference_exit_default.png in Resources */, - 615A283E2180A2560060F920 /* invite_linphone.png in Resources */, - 633FEF281D3CD55A0014B822 /* route_earpiece_default.png in Resources */, - 633FEE4F1D3CD5590014B822 /* delete_field_over@2x.png in Resources */, - C622E3F226A81290004F5434 /* vr_off.png in Resources */, - 633FEE531D3CD5590014B822 /* dialer_alt_back@2x.png in Resources */, - 633FEE3E1D3CD5590014B822 /* contacts_all_disabled.png in Resources */, - 633FEEF31D3CD55A0014B822 /* numpad_over_background.png in Resources */, - 633FEDAD1D3CD5590014B822 /* backspace_over@2x.png in Resources */, - 633FEEEF1D3CD55A0014B822 /* numpad_hash_over~ipad.png in Resources */, - 633FEEE21D3CD55A0014B822 /* numpad_8~ipad@2x.png in Resources */, - 633FEEED1D3CD55A0014B822 /* numpad_hash_over.png in Resources */, - 633FEE1F1D3CD5590014B822 /* chat_start_body_disabled@2x.png in Resources */, - 633FEEF81D3CD55A0014B822 /* numpad_star_over~ipad.png in Resources */, - C6A1BB3826E8815400540D50 /* menu_reply_default.png in Resources */, - 633FEF301D3CD55A0014B822 /* route_speaker_disabled.png in Resources */, - 639CEAFD1A1DF4D9004DE38F /* StatusBarView.xib in Resources */, - 633FEDE91D3CD5590014B822 /* call_status_missed~ipad@2x.png in Resources */, - C63F72C9285A2F1E0066163B /* voip_info.png in Resources */, - 8CE24F4C1F8234A30077AC0A /* next_default@2x.png in Resources */, - 244523B11E8266CC0037A187 /* chat_read.png in Resources */, - 61AEBEC62191E47500F35E7F /* chevron_list_close.png in Resources */, - 617B4A60260A2B7800A87337 /* RecordingsListView.xib in Resources */, - 639E9CAC1C0DB80300019A75 /* UIContactDetailsCell.xib in Resources */, - 633FEE511D3CD5590014B822 /* deselect_all@2x.png in Resources */, - C63F72D4285A2F1E0066163B /* voip_remote_recording.png in Resources */, - 8CF25D951F9F336100BEA0C1 /* check_unselected@2x.png in Resources */, - F088488A19FF8C41007FFCF3 /* UIContactCell.xib in Resources */, - 633FEE381D3CD5590014B822 /* contact_add_default.png in Resources */, - 633FEE6F1D3CD5590014B822 /* footer_history_default@2x.png in Resources */, - 633FEF201D3CD55A0014B822 /* presence_unregistered.png in Resources */, - 61586B8D217A173F0038AC45 /* menu_options.png in Resources */, - 61AEBEC82191E48400F35E7F /* chevron_list_close@2x.png in Resources */, - 633FEF341D3CD55A0014B822 /* routes_default.png in Resources */, - C63F72ED285A2F1E0066163B /* voip_merge_calls.png in Resources */, - 633FEE061D3CD5590014B822 /* chat_add_default.png in Resources */, - 633FEDF21D3CD5590014B822 /* call_video_start_default.png in Resources */, - 633FEF491D3CD55A0014B822 /* speaker_selected@2x.png in Resources */, - 633FEF541D3CD55A0014B822 /* waiting_time.png in Resources */, - 633FEE861D3CD5590014B822 /* led_inprogress.png in Resources */, - 633FEDFC1D3CD5590014B822 /* camera_switch_default.png in Resources */, - 24BFAA9F209B0630004F47A7 /* linphone_user.png in Resources */, - 633FEE4B1D3CD5590014B822 /* delete_disabled@2x.png in Resources */, - 633FEE181D3CD5590014B822 /* chat_send_over.png in Resources */, - 633FEDED1D3CD5590014B822 /* call_status_outgoing~ipad@2x.png in Resources */, - 633FEE2D1D3CD5590014B822 /* color_E.png in Resources */, - 633FEED01D3CD55A0014B822 /* numpad_6_over~ipad@2x.png in Resources */, - C64A85502667B67A00252AD2 /* EphemeralSettingsView.xib in Resources */, - 633FEEC81D3CD55A0014B822 /* numpad_5_over~ipad@2x.png in Resources */, - 61586B91217A175D0038AC45 /* menu_recordings.png in Resources */, - C63F72DA285A2F1E0066163B /* voip_numpad_2.png in Resources */, - 633FEF1B1D3CD55A0014B822 /* presence_away@2x.png in Resources */, - C6A1BB3A26E881E100540D50 /* menu_delete.png in Resources */, - 633FEE281D3CD5590014B822 /* checkbox_unchecked.png in Resources */, - 633FEE9D1D3CD55A0014B822 /* numpad_0_over.png in Resources */, - 633FEEC21D3CD55A0014B822 /* numpad_4~ipad@2x.png in Resources */, - 633FEDFE1D3CD5590014B822 /* camera_switch_disabled.png in Resources */, - 633FEE7F1D3CD5590014B822 /* history_missed_selected@2x.png in Resources */, - 633FEDC01D3CD5590014B822 /* call_back_disabled.png in Resources */, - 633FEED31D3CD55A0014B822 /* numpad_7_default.png in Resources */, - 63130FB21C1ED06900371918 /* SideMenuView~ipad.xib in Resources */, - 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 */, - 61586B8B217A17320038AC45 /* menu_link_account@2x.png in Resources */, - 63CDC4661C3BDE370085F529 /* shortring.caf in Resources */, - C6A1BB4126E889AD00540D50 /* forward_message_default.png in Resources */, - 633FEDD51D3CD5590014B822 /* call_quality_indicator_4@2x.png in Resources */, - C63F72CA285A2F1E0066163B /* voip_speaker_off.png in Resources */, - 633FEDE71D3CD5590014B822 /* call_status_missed@2x.png in Resources */, - 615A2821217F6FBF0060F920 /* security_alert_indicator@2x.png in Resources */, - 633FEE1E1D3CD5590014B822 /* chat_start_body_disabled.png in Resources */, - 639CEB001A1DF4E4004DE38F /* UIHistoryCell.xib in Resources */, - 633FEE841D3CD5590014B822 /* led_error.png in Resources */, - 633FEDEA1D3CD5590014B822 /* call_status_outgoing.png in Resources */, - 633FEF511D3CD55A0014B822 /* valid_disabled@2x.png in Resources */, - C63F72C5285A2F1E0066163B /* voip_call_record.png in Resources */, - 633FEEBB1D3CD55A0014B822 /* numpad_4_default.png in Resources */, - 633FEF2B1D3CD55A0014B822 /* route_earpiece_disabled@2x.png in Resources */, - 639E9CA31C0DB7EA00019A75 /* UIChatBubbleTextCell.xib in Resources */, - 633FEDD21D3CD5590014B822 /* call_quality_indicator_3.png in Resources */, - 633FEDAF1D3CD5590014B822 /* call_add_default@2x.png in Resources */, - 633FEE931D3CD55A0014B822 /* menu@2x.png in Resources */, - 633FEF3D1D3CD55A0014B822 /* security_ok@2x.png in Resources */, - 633FEF161D3CD55A0014B822 /* pause_small_disabled.png in Resources */, - 633FEF521D3CD55A0014B822 /* voicemail.png in Resources */, - 633FEE711D3CD5590014B822 /* footer_history_disabled@2x.png in Resources */, - C63F72E5285A2F1E0066163B /* voip_conference_active_speaker.png in Resources */, - 633FEF141D3CD55A0014B822 /* pause_small_default.png in Resources */, - D38187B115FE340500C3EDCA /* ChatsListView.xib in Resources */, - 633FEDA41D3CD5590014B822 /* back_default.png in Resources */, - C63F72BE285A2F1D0066163B /* voip_calls_list.png in Resources */, - C63F72DF285A2F1E0066163B /* voip_bluetooth.png in Resources */, - 633FEE2C1D3CD5590014B822 /* color_D.png in Resources */, - 615A280F217F1FD50060F920 /* chat_add_group.png in Resources */, - 633FEEC41D3CD55A0014B822 /* numpad_5_default@2x.png in Resources */, - 633FEDAC1D3CD5590014B822 /* backspace_over.png in Resources */, - 633FEE1B1D3CD5590014B822 /* chat_start_body_default@2x.png in Resources */, - 633FEE021D3CD5590014B822 /* cancel_edit_default.png in Resources */, - C63F72D7285A2F1E0066163B /* voip_numpad_1.png in Resources */, - 633FEEE31D3CD55A0014B822 /* numpad_9_default.png in Resources */, - 633FEE651D3CD5590014B822 /* footer_chat_disabled@2x.png in Resources */, - 633FEEDD1D3CD55A0014B822 /* numpad_8_over.png in Resources */, - 633FEE8E1D3CD55A0014B822 /* list_details_default.png in Resources */, - 633FEED71D3CD55A0014B822 /* numpad_7_over~ipad.png in Resources */, - C63F72D3285A2F1E0066163B /* voip_multiple_contacts_avatar.png in Resources */, - 633FEF2A1D3CD55A0014B822 /* route_earpiece_disabled.png in Resources */, - 633FEDDB1D3CD5590014B822 /* call_start_body_disabled@2x.png in Resources */, - CFBD7A2A20E504AE007C5286 /* delete_img.png in Resources */, - C63F72C8285A2F1E0066163B /* voip_checkbox_checked.png in Resources */, - 633FEDFD1D3CD5590014B822 /* camera_switch_default@2x.png in Resources */, - 633FEEC51D3CD55A0014B822 /* numpad_5_over.png in Resources */, - 633FEE721D3CD5590014B822 /* history_all_default.png in Resources */, - C6B4444326AAD0980076C517 /* file_default.png in Resources */, - 615A283C2180789C0060F920 /* security_toogle_button@2x.png in Resources */, - 633FEF0A1D3CD55A0014B822 /* options_transfer_call_default.png in Resources */, - 633FEDA51D3CD5590014B822 /* back_default@2x.png in Resources */, - 633FEF311D3CD55A0014B822 /* route_speaker_disabled@2x.png in Resources */, - 61586B81217A16EE0038AC45 /* menu_about.png in Resources */, - C63F72D0285A2F1E0066163B /* voip_conference_paused_big.png in Resources */, - 633FEEE41D3CD55A0014B822 /* numpad_9_default@2x.png in Resources */, - C63F72CD285A2F1E0066163B /* voip_numpad_8.png in Resources */, - 8C2A81961F87B8000012A66B /* chat_group_avatar.png in Resources */, - 633FEDA31D3CD5590014B822 /* avatar~ipad@2x.png in Resources */, - 633FEF461D3CD55A0014B822 /* speaker_disabled.png in Resources */, - 638F1A911C21993D004B8E02 /* UICompositeView~ipad.xib in Resources */, - 633FEE211D3CD5590014B822 /* chat_start_body_disabled~ipad@2x.png in Resources */, - 63AADC011B6A0FF200AA16FD /* assistant_linphone_existing.rc in Resources */, - 633FEE5A1D3CD5590014B822 /* edit_default.png in Resources */, - 244523B01E8266CC0037A187 /* chat_error.png in Resources */, - 8CBD7BA320B6B80D00E5DCC0 /* ChatConversationImdnView.xib in Resources */, - 633FEDD11D3CD5590014B822 /* call_quality_indicator_2@2x.png in Resources */, - 633FEDBC1D3CD5590014B822 /* call_audio_start_disabled.png in Resources */, - 24BFAA9E209B0630004F47A7 /* dialer_background.png in Resources */, - 633FEE481D3CD5590014B822 /* delete_default.png in Resources */, - 633FEEB01D3CD55A0014B822 /* numpad_2_over~ipad@2x.png in Resources */, - 633FEE2A1D3CD5590014B822 /* color_A.png in Resources */, - 633FEEA41D3CD55A0014B822 /* numpad_1_default@2x.png in Resources */, - 63E27A321C4FECD000D332AE /* LaunchScreen.xib in Resources */, - 633FEED11D3CD55A0014B822 /* numpad_6~ipad.png in Resources */, - CF7602E82108759A00749F76 /* UIRecordingCell.xib in Resources */, - C6B4444626AAD0980076C517 /* file_pdf_default.png in Resources */, - 633FEED21D3CD55A0014B822 /* numpad_6~ipad@2x.png in Resources */, - C63F72E0285A2F1E0066163B /* voip_micro_off.png in Resources */, - 633FEDCD1D3CD5590014B822 /* call_quality_indicator_0@2x.png in Resources */, - 636316D41A1DEC650009B839 /* SettingsView.xib in Resources */, - 24BFAAA6209B0630004F47A7 /* linphone_user~ipad.png in Resources */, - 633FEEBF1D3CD55A0014B822 /* numpad_4_over~ipad.png in Resources */, - 633FEEAD1D3CD55A0014B822 /* numpad_2_over.png in Resources */, - 633FEE801D3CD5590014B822 /* led_connected.png in Resources */, - 633FEEF41D3CD55A0014B822 /* numpad_star_default.png in Resources */, - 61586B93217A17700038AC45 /* menu_recordings@2x.png in Resources */, - 615A2834218071FF0060F920 /* security_toogle_background_grey.png in Resources */, - 633FEDDE1D3CD5590014B822 /* call_start_body_over.png in Resources */, - 24BFAAA0209B0630004F47A7 /* contacts_sip_default@2x.png in Resources */, - 8CF25D9D1F9F76BD00BEA0C1 /* chat_group_informations.png in Resources */, - 633FEDFB1D3CD5590014B822 /* camera_selected@2x.png in Resources */, - 633FEF051D3CD55A0014B822 /* options_selected@2x.png in Resources */, - 633FEDD61D3CD5590014B822 /* call_start_body_default.png in Resources */, - 633FEEEC1D3CD55A0014B822 /* numpad_hash_default@2x.png in Resources */, - C63F72D8285A2F1E0066163B /* voip_mandatory.png in Resources */, - 633FEE831D3CD5590014B822 /* led_disconnected@2x.png in Resources */, - 244523BE1E8D3A6C0037A187 /* chat_unsecure.png in Resources */, - C63F72DC285A2F1E0066163B /* voip_menu_more.png in Resources */, - C63F72D5285A2F1E0066163B /* voip_hangup.png in Resources */, - 633FEE031D3CD5590014B822 /* cancel_edit_default@2x.png in Resources */, - 633FEDE01D3CD5590014B822 /* call_start_body_over~ipad.png in Resources */, - 8CBD7BA920B6B82A00E5DCC0 /* UIChatConversationImdnTableViewCell.xib in Resources */, - 615A28442180C0900060F920 /* recording@2x.png in Resources */, - 615A2813217F24D40060F920 /* security_1_indicator.png in Resources */, - 24BFAAA7209B0630004F47A7 /* callkit_logo.png in Resources */, - 615A2811217F1FDE0060F920 /* chat_add_group@2x.png in Resources */, - D34F6F9E1594D3FB0095705B /* InAppSettings.bundle in Resources */, - 633FEE4D1D3CD5590014B822 /* delete_field_default@2x.png in Resources */, - C63F72D9285A2F1E0066163B /* voip_earpiece.png in Resources */, - 615A28362180720D0060F920 /* security_toogle_background_grey@2x.png in Resources */, - 639CEB091A1DF4FA004DE38F /* UIChatCell.xib in Resources */, - C6F55645287CC69F0056E213 /* voip_meeting_schedule.png in Resources */, - 633FEE961D3CD55A0014B822 /* micro_disabled.png in Resources */, - 63AADBF61B6A0FF200AA16FD /* linphonerc-factory in Resources */, - C63F72C6285A2F1E0066163B /* voip_call_forward.png in Resources */, - 633FEE671D3CD5590014B822 /* footer_contacts_default@2x.png in Resources */, - 615A2830218071E80060F920 /* security_toogle_background_green.png in Resources */, - 63B8D68C1BCBE65600C12B09 /* ChatConversationCreateView.xib in Resources */, - 63CDC45F1C3BDE370085F529 /* ringback.wav in Resources */, - 8CD99A1C20908C27008A7CDA /* callkit_logo@2x.png in Resources */, - 633FEE251D3CD5590014B822 /* chat_start_body_over~ipad@2x.png in Resources */, - 633FEDF91D3CD5590014B822 /* camera_disabled@2x.png in Resources */, - 633FEE161D3CD5590014B822 /* chat_send_disabled.png in Resources */, - 615A282421805B260060F920 /* security_toogle_icon_green.png in Resources */, - 633FEE1A1D3CD5590014B822 /* chat_start_body_default.png in Resources */, - 633FEF041D3CD55A0014B822 /* options_selected.png in Resources */, - 633FEEE61D3CD55A0014B822 /* numpad_9_over@2x.png in Resources */, - 63E27A521C50EDB000D332AE /* hold.mkv in Resources */, - 633FEEDC1D3CD55A0014B822 /* numpad_8_default@2x.png in Resources */, - 633FEDAE1D3CD5590014B822 /* call_add_default.png in Resources */, - 633FEE1D1D3CD5590014B822 /* chat_start_body_default~ipad@2x.png in Resources */, - 633FEEEB1D3CD55A0014B822 /* numpad_hash_default.png in Resources */, - 633FEF221D3CD55A0014B822 /* route_bluetooth_default.png in Resources */, - 633FEE701D3CD5590014B822 /* footer_history_disabled.png in Resources */, - 633FEDC91D3CD5590014B822 /* call_missed@2x.png in Resources */, - C63F72E8285A2F1E0066163B /* conference_schedule_calendar_default.png in Resources */, - 633FEEAE1D3CD55A0014B822 /* numpad_2_over@2x.png in Resources */, - 633FEDB51D3CD5590014B822 /* call_alt_back_disabled@2x.png in Resources */, - 631098521D4660630041F2B3 /* CountryListView.xib in Resources */, - 633FEF271D3CD55A0014B822 /* route_bluetooth_selected@2x.png in Resources */, - 633FEE111D3CD5590014B822 /* chat_list_indicator~ipad@2x.png in Resources */, - 633FEEFC1D3CD55A0014B822 /* options_add_call_default.png in Resources */, - 615A2819217F28160060F920 /* chat_list_indicator@2x.png in Resources */, - 61AEBECC2191E4A300F35E7F /* chevron_list_open@2x.png in Resources */, - 24BFAAA5209B0630004F47A7 /* contacts_sip_default.png in Resources */, - 633FEF441D3CD55A0014B822 /* speaker_default.png in Resources */, - 639CEB031A1DF4EB004DE38F /* UICompositeView.xib in Resources */, - C6A1BB4326E88F7C00540D50 /* menu_resend_default.png in Resources */, - 633FEF3A1D3CD55A0014B822 /* security_ko.png in Resources */, - 615A283A2180788E0060F920 /* security_toogle_button.png in Resources */, - 633FEDA01D3CD5590014B822 /* avatar.png in Resources */, - 633FEEBC1D3CD55A0014B822 /* numpad_4_default@2x.png in Resources */, - 633FEEA91D3CD55A0014B822 /* numpad_1~ipad.png in Resources */, - 615A28402180A2620060F920 /* invite_linphone@2x.png in Resources */, - C61B1BF42667D202001A4E4A /* more_menu_default.png in Resources */, - 633FEDF71D3CD5590014B822 /* camera_default@2x.png in Resources */, - C64A85522667B74100252AD2 /* ephemeral_messages_default.png in Resources */, - 633FEDB31D3CD5590014B822 /* call_alt_back_default@2x.png in Resources */, - C63F72F2285A2F1E0066163B /* voip_conference_mosaic.png in Resources */, - 633FEDCF1D3CD5590014B822 /* call_quality_indicator_1@2x.png in Resources */, - 633FEF131D3CD55A0014B822 /* pause_big_over_selected@2x.png in Resources */, - 8CDC61951F84D89B0087CF7F /* check_selected.png in Resources */, - 633FEEF01D3CD55A0014B822 /* numpad_hash_over~ipad@2x.png in Resources */, - 63AADBF81B6A0FF200AA16FD /* linphonerc~ipad in Resources */, - 633FEE8F1D3CD55A0014B822 /* list_details_default@2x.png in Resources */, - 633FEE5E1D3CD5590014B822 /* edit_list_default.png in Resources */, - C63F72F7285A2F1E0066163B /* voip_cancel.png in Resources */, - 615A282621805B320060F920 /* security_toogle_icon_green@2x.png in Resources */, - 633FEDB11D3CD5590014B822 /* call_add_disabled@2x.png in Resources */, - CF7602F7210898CC00749F76 /* rec_off_default.png in Resources */, - 633FEDB21D3CD5590014B822 /* call_alt_back_default.png in Resources */, - 633FEE3D1D3CD5590014B822 /* contacts_all_default@2x.png in Resources */, - 633FEF251D3CD55A0014B822 /* route_bluetooth_disabled@2x.png in Resources */, - 633FEDD81D3CD5590014B822 /* call_start_body_default~ipad.png in Resources */, - 61586B83217A16FD0038AC45 /* menu_about@2x.png in Resources */, - C63F72E6285A2F1E0066163B /* voip_numpad_6.png in Resources */, - 633FEED81D3CD55A0014B822 /* numpad_7_over~ipad@2x.png in Resources */, - 633FEDD71D3CD5590014B822 /* call_start_body_default@2x.png in Resources */, - C63F72D6285A2F1E0066163B /* voip_pause.png in Resources */, - 633FEE571D3CD5590014B822 /* dialer_back_disabled@2x.png in Resources */, - 63CDC45E1C3BDE370085F529 /* msg.caf in Resources */, - 633FEE6D1D3CD5590014B822 /* footer_dialer_disabled@2x.png in Resources */, - 633FEF171D3CD55A0014B822 /* pause_small_disabled@2x.png in Resources */, - C6A1BB3626E8815400540D50 /* menu_forward_default.png in Resources */, - D38187DD15FE348A00C3EDCA /* AssistantView.xib in Resources */, - 633FEDA61D3CD5590014B822 /* back_disabled.png in Resources */, - 633FEED61D3CD55A0014B822 /* numpad_7_over@2x.png in Resources */, - 633FEDA11D3CD5590014B822 /* avatar@2x.png in Resources */, - 633FED9E1D3CD5590014B822 /* add_field_over.png in Resources */, - 633FEE0A1D3CD5590014B822 /* chat_attachment_default.png in Resources */, - 633FEE201D3CD5590014B822 /* chat_start_body_disabled~ipad.png in Resources */, - 633FEE5B1D3CD5590014B822 /* edit_default@2x.png in Resources */, - 633FEDE11D3CD5590014B822 /* call_start_body_over~ipad@2x.png in Resources */, - 633FEF4F1D3CD55A0014B822 /* valid_default@2x.png in Resources */, - 8CD99A382090A824008A7CDA /* splashscreen.png in Resources */, - C63F72B7285A2F1D0066163B /* voip_numpad_7.png in Resources */, - 633FEE241D3CD5590014B822 /* chat_start_body_over~ipad.png in Resources */, - 8C2A81951F87B8000012A66B /* chat_group_avatar@2x.png in Resources */, - C63F72C4285A2F1D0066163B /* voip_audio_routes.png in Resources */, - C63F72E1285A2F1E0066163B /* voip_camera_on.png in Resources */, - 633FEE091D3CD5590014B822 /* chat_add_disabled@2x.png in Resources */, - 633FEE191D3CD5590014B822 /* chat_send_over@2x.png in Resources */, - 633FEF181D3CD55A0014B822 /* pause_small_over_selected.png in Resources */, - 633FEE001D3CD5590014B822 /* camera_switch_over.png in Resources */, - C622E3F126A81290004F5434 /* vr_on.png in Resources */, - 633FEF401D3CD55A0014B822 /* select_all_default.png in Resources */, - C6B4444426AAD0980076C517 /* file_picture_default.png in Resources */, - 633FEDF01D3CD5590014B822 /* call_transfer_disabled.png in Resources */, - 633FEE351D3CD5590014B822 /* conference_exit_default@2x.png in Resources */, - 633FEECF1D3CD55A0014B822 /* numpad_6_over~ipad.png in Resources */, - 61586B87217A17160038AC45 /* menu_assistant@2x.png in Resources */, - 633FEE9A1D3CD55A0014B822 /* nowebcamCIF.jpg in Resources */, - 61586B89217A17220038AC45 /* menu_link_account.png in Resources */, - 633FEF351D3CD55A0014B822 /* routes_default@2x.png in Resources */, - 633FEEDB1D3CD55A0014B822 /* numpad_8_default.png in Resources */, - 633FEE5C1D3CD5590014B822 /* edit_disabled.png in Resources */, - C63F72BD285A2F1D0066163B /* voip_call_header_incoming.png in Resources */, - 8CF25D9E1F9F76BD00BEA0C1 /* chat_group_informations@2x.png in Resources */, - 633FEDCA1D3CD5590014B822 /* call_outgoing.png in Resources */, - 633FEDF81D3CD5590014B822 /* camera_disabled.png in Resources */, - 8CB2B8FB1F86229E0015CEE2 /* next_disabled@2x.png in Resources */, - 633FEEE91D3CD55A0014B822 /* numpad_9~ipad.png in Resources */, - 633FEE331D3CD5590014B822 /* color_M.png in Resources */, - 633FEE811D3CD5590014B822 /* led_connected@2x.png in Resources */, - 8CA70AD51F9E285C00A3D2EB /* chat_group_add.png in Resources */, - 633FEE9B1D3CD55A0014B822 /* numpad_0_default.png in Resources */, - 633FEF411D3CD55A0014B822 /* select_all_default@2x.png in Resources */, - 633FEEFD1D3CD55A0014B822 /* options_add_call_default@2x.png in Resources */, - 633FEEA81D3CD55A0014B822 /* numpad_1_over~ipad@2x.png in Resources */, - C63F72B9285A2F1D0066163B /* voip_export.png in Resources */, - D38187AD15FE340100C3EDCA /* ChatConversationView.xib in Resources */, - 633FEE7C1D3CD5590014B822 /* history_missed_disabled.png in Resources */, - CF1DE92E210A0F5D00A0A97E /* UILinphoneAudioPlayer.xib in Resources */, - 633FEDF11D3CD5590014B822 /* call_transfer_disabled@2x.png in Resources */, - 615A282821805B400060F920 /* security_toogle_icon_grey.png in Resources */, - 633FEDFF1D3CD5590014B822 /* camera_switch_disabled@2x.png in Resources */, - 633FEDDF1D3CD5590014B822 /* call_start_body_over@2x.png in Resources */, - 633FEEFA1D3CD55A0014B822 /* numpad_star~ipad.png in Resources */, - D38187B915FE342200C3EDCA /* ContactDetailsView.xib in Resources */, - 633FEE921D3CD55A0014B822 /* menu.png in Resources */, - C622E3F026A81290004F5434 /* vr_wave.png in Resources */, - C63F72E3285A2F1E0066163B /* voip_call.png in Resources */, - 633FEDE41D3CD5590014B822 /* call_status_incoming~ipad.png in Resources */, - 633FEE4C1D3CD5590014B822 /* delete_field_default.png in Resources */, - 633FEE391D3CD5590014B822 /* contact_add_default@2x.png in Resources */, - 633FEE741D3CD5590014B822 /* history_all_disabled.png in Resources */, - 633FEE081D3CD5590014B822 /* chat_add_disabled.png in Resources */, - 615A28422180C0870060F920 /* recording.png in Resources */, - C63F72EC285A2F1E0066163B /* conference_schedule_time_default.png in Resources */, - 633FEF1D1D3CD55A0014B822 /* presence_offline@2x.png in Resources */, - 24A3459E1D95797700881A5C /* UIShopTableCell.xib in Resources */, - 633FEE231D3CD5590014B822 /* chat_start_body_over@2x.png in Resources */, - 633FEEBE1D3CD55A0014B822 /* numpad_4_over@2x.png in Resources */, - 633FEF471D3CD55A0014B822 /* speaker_disabled@2x.png in Resources */, - 633FEEFE1D3CD55A0014B822 /* options_add_call_disabled.png in Resources */, - 633FEE291D3CD5590014B822 /* checkbox_unchecked@2x.png in Resources */, - 63AADC001B6A0FF200AA16FD /* assistant_linphone_create.rc in Resources */, - 633FEF1C1D3CD55A0014B822 /* presence_offline.png in Resources */, - 633FEE901D3CD55A0014B822 /* list_details_over.png in Resources */, - 633FEDE31D3CD5590014B822 /* call_status_incoming@2x.png in Resources */, - 633FEE821D3CD5590014B822 /* led_disconnected.png in Resources */, - C63F72BC285A2F1D0066163B /* voip_numpad_4.png in Resources */, - 633FEDB01D3CD5590014B822 /* call_add_disabled.png in Resources */, - 63EC8D391D7438660066547B /* AssistantLinkView.xib in Resources */, - 633FEE971D3CD55A0014B822 /* micro_disabled@2x.png in Resources */, - D38187CD15FE346700C3EDCA /* HistoryDetailsView.xib in Resources */, - 633FEEA21D3CD55A0014B822 /* numpad_0~ipad@2x.png in Resources */, - 633FEE991D3CD55A0014B822 /* micro_selected@2x.png in Resources */, - 633FEE621D3CD5590014B822 /* footer_chat_default.png in Resources */, - 24BFAAA3209B0630004F47A7 /* contacts_sip_selected.png in Resources */, - 633FEE0D1D3CD5590014B822 /* chat_attachment_disabled@2x.png in Resources */, - 639E9CA61C0DB7F200019A75 /* UIChatCreateCell.xib in Resources */, - 8CBD7BAC20B6B82F00E5DCC0 /* UIChatCreateCollectionViewCell.xib in Resources */, - 633FEEA31D3CD55A0014B822 /* numpad_1_default.png in Resources */, - 633FEEA51D3CD55A0014B822 /* numpad_1_over.png in Resources */, - 633FEF2E1D3CD55A0014B822 /* route_speaker_default.png in Resources */, - 633FEDA91D3CD5590014B822 /* backspace_default@2x.png in Resources */, - 633FEDF61D3CD5590014B822 /* camera_default.png in Resources */, - C63F72E2285A2F1E0066163B /* voip_conference_play_big.png in Resources */, - F0642EF119DAC891009DB336 /* MainStoryboard.storyboard in Resources */, - 633FEECC1D3CD55A0014B822 /* numpad_6_default@2x.png in Resources */, - 633FEEB91D3CD55A0014B822 /* numpad_3~ipad.png in Resources */, - C63F72F5285A2F1E0066163B /* voip_single_contact_avatar.png in Resources */, - C63F72EF285A2F1E0066163B /* voip_micro_on.png in Resources */, - 633FEE731D3CD5590014B822 /* history_all_default@2x.png in Resources */, - 633FEDE21D3CD5590014B822 /* call_status_incoming.png in Resources */, - 633FEDDA1D3CD5590014B822 /* call_start_body_disabled.png in Resources */, - 633FEDB91D3CD5590014B822 /* call_alt_start_disabled@2x.png in Resources */, - 633FEE691D3CD5590014B822 /* footer_contacts_disabled@2x.png in Resources */, - 8CBD7BA020B6B7FD00E5DCC0 /* ChatConversationInfoView.xib in Resources */, - 633FEF071D3CD55A0014B822 /* options_start_conference_default@2x.png in Resources */, - 633FEE151D3CD5590014B822 /* chat_send_default@2x.png in Resources */, - 633FEDC31D3CD5590014B822 /* call_hangup_default@2x.png in Resources */, - 633FEF061D3CD55A0014B822 /* options_start_conference_default.png in Resources */, - 63AADC021B6A0FF200AA16FD /* assistant_remote.rc in Resources */, - 633FEF1E1D3CD55A0014B822 /* presence_online.png in Resources */, - 8CE24F571F8268850077AC0A /* conference_delete.png in Resources */, - 633FEDF41D3CD5590014B822 /* call_video_start_disabled.png in Resources */, - 633FEDD31D3CD5590014B822 /* call_quality_indicator_3@2x.png in Resources */, - 633FEE3A1D3CD5590014B822 /* contact_add_disabled.png in Resources */, - 633FEEA11D3CD55A0014B822 /* numpad_0~ipad.png in Resources */, - 8CE24F4B1F8234A30077AC0A /* next_default.png in Resources */, - 633FEE751D3CD5590014B822 /* history_all_disabled@2x.png in Resources */, - 633FEEF71D3CD55A0014B822 /* numpad_star_over@2x.png in Resources */, - 633FEEAB1D3CD55A0014B822 /* numpad_2_default.png in Resources */, - 633FEE851D3CD5590014B822 /* led_error@2x.png in Resources */, - C6B4444226AAD0980076C517 /* file_video_default.png in Resources */, - 633FEDBE1D3CD5590014B822 /* call_back_default.png in Resources */, - 633FEF0F1D3CD55A0014B822 /* pause_big_default@2x.png in Resources */, - C66B040E26F095D1009B5EDC /* cancel_forward.png in Resources */, - CF7602F6210898CC00749F76 /* rec_on_default@2x.png in Resources */, - 633FEF081D3CD55A0014B822 /* options_start_conference_disabled.png in Resources */, - 633FEE301D3CD5590014B822 /* color_H.png in Resources */, - 633FEE7D1D3CD5590014B822 /* history_missed_disabled@2x.png in Resources */, - 633FEE941D3CD55A0014B822 /* micro_default.png in Resources */, - 633FEE611D3CD5590014B822 /* edit_list_disabled@2x.png in Resources */, - C63F72EE285A2F1E0066163B /* voip_camera_off.png in Resources */, - 633FEE761D3CD5590014B822 /* history_all_selected.png in Resources */, - C63F72E7285A2F1E0066163B /* voip_call_participants.png in Resources */, - 8C300D9B1E40E0CC00728EF3 /* lime_ko@2x.png in Resources */, - 633FEF321D3CD55A0014B822 /* route_speaker_selected.png in Resources */, - 61AEBEBF2191991F00F35E7F /* DevicesListView.xib in Resources */, - C63F72BA285A2F1D0066163B /* voip_call_numpad.png in Resources */, - 633FEDF51D3CD5590014B822 /* call_video_start_disabled@2x.png in Resources */, - 63B81A0C1B57DA33009604A6 /* LICENSE.txt in Resources */, - 633FEEDA1D3CD55A0014B822 /* numpad_7~ipad@2x.png in Resources */, - 633FEE5D1D3CD5590014B822 /* edit_disabled@2x.png in Resources */, - 615A2832218071F30060F920 /* security_toogle_background_green@2x.png in Resources */, - 633FEEC11D3CD55A0014B822 /* numpad_4~ipad.png in Resources */, - 633FEE6B1D3CD5590014B822 /* footer_dialer_default@2x.png in Resources */, - 633FEE0E1D3CD5590014B822 /* chat_attachment_over.png in Resources */, - 633FEE7B1D3CD5590014B822 /* history_missed_default@2x.png in Resources */, - 633FEEC71D3CD55A0014B822 /* numpad_5_over~ipad.png in Resources */, - C6F55647287CCFB70056E213 /* menu_voip_meeting_schedule.png in Resources */, - C63F72BF285A2F1D0066163B /* voip_call_header_paused.png in Resources */, - 633FEEAA1D3CD55A0014B822 /* numpad_1~ipad@2x.png in Resources */, - 633FEDEC1D3CD5590014B822 /* call_status_outgoing~ipad.png in Resources */, - 633FEDE51D3CD5590014B822 /* call_status_incoming~ipad@2x.png in Resources */, - 633FEEE11D3CD55A0014B822 /* numpad_8~ipad.png in Resources */, - 633FEF101D3CD55A0014B822 /* pause_big_disabled.png in Resources */, - 633FEE221D3CD5590014B822 /* chat_start_body_over.png in Resources */, - 633FEE601D3CD5590014B822 /* edit_list_disabled.png in Resources */, - D38187C115FE345B00C3EDCA /* DialerView.xib in Resources */, - C6A1BB3726E8815400540D50 /* menu_copy_text_default.png in Resources */, - D37EE10D16035793003608A6 /* ImageView.xib in Resources */, - C63F72B8285A2F1D0066163B /* voip_radio_off.png in Resources */, - 633FEE9F1D3CD55A0014B822 /* numpad_0_over~ipad.png in Resources */, - 633FEED51D3CD55A0014B822 /* numpad_7_over.png in Resources */, - 633FEE561D3CD5590014B822 /* dialer_back_disabled.png in Resources */, - 633FEDBF1D3CD5590014B822 /* call_back_default@2x.png in Resources */, - 24BFAAA8209B0630004F47A7 /* contacts_sip_selected@2x.png in Resources */, - 633FEE141D3CD5590014B822 /* chat_send_default.png in Resources */, - 633FEF421D3CD55A0014B822 /* select_all_disabled.png in Resources */, - 63AADBE81B6A0FF200AA16FD /* Localizable.strings in Resources */, - C63F72CF285A2F1E0066163B /* voip_copy.png in Resources */, - 633FEEF21D3CD55A0014B822 /* numpad_hash~ipad@2x.png in Resources */, - 633FEE3F1D3CD5590014B822 /* contacts_all_disabled@2x.png in Resources */, - 633FEF3B1D3CD55A0014B822 /* security_ko@2x.png in Resources */, - C63F72F1285A2F1E0066163B /* conference_schedule_participants_default.png in Resources */, - 633FEE4A1D3CD5590014B822 /* delete_disabled.png in Resources */, - 614D09CE21E74D5400C43EDF /* GoogleService-Info.plist in Resources */, - C6B4444526AAD0980076C517 /* file_audio_default.png in Resources */, - C6A1BB3526E8815400540D50 /* menu_info.png in Resources */, - C61B1BF72667EC6B001A4E4A /* ephemeral_messages_color_A.png in Resources */, - 633FEF151D3CD55A0014B822 /* pause_small_default@2x.png in Resources */, - 633FEEF91D3CD55A0014B822 /* numpad_star_over~ipad@2x.png in Resources */, - 633FEDCB1D3CD5590014B822 /* call_outgoing@2x.png in Resources */, - 633FEF501D3CD55A0014B822 /* valid_disabled.png in Resources */, - 633FEEB31D3CD55A0014B822 /* numpad_3_default.png in Resources */, - 61AEBECA2191E49300F35E7F /* chevron_list_open.png in Resources */, - 633FEE1C1D3CD5590014B822 /* chat_start_body_default~ipad.png in Resources */, - 633FEE011D3CD5590014B822 /* camera_switch_over@2x.png in Resources */, - 633FEEA01D3CD55A0014B822 /* numpad_0_over~ipad@2x.png in Resources */, - 66E399F72857869300E73456 /* menu_notifications_off.png in Resources */, - 633FEF3E1D3CD55A0014B822 /* security_pending.png in Resources */, - 633FEE7E1D3CD5590014B822 /* history_missed_selected.png in Resources */, - 633FEE261D3CD5590014B822 /* checkbox_checked.png in Resources */, - C63F72B6285A2F1D0066163B /* voip_spinner.png in Resources */, - 633FEF531D3CD55A0014B822 /* voicemail@2x.png in Resources */, - 633FEF2C1D3CD55A0014B822 /* route_earpiece_selected.png in Resources */, - 633FEE681D3CD5590014B822 /* footer_contacts_disabled.png in Resources */, - C63F72B5285A2F1D0066163B /* voip_dropdown.png in Resources */, - C63F72CC285A2F1E0066163B /* voip_call_stats.png in Resources */, - 633FEDB71D3CD5590014B822 /* call_alt_start_default@2x.png in Resources */, - D3D5126C160B3A8E00946DF8 /* AssistantViewScreens.xib in Resources */, - 63AADBEA1B6A0FF200AA16FD /* Images.xcassets in Resources */, - 633FEECB1D3CD55A0014B822 /* numpad_6_default.png in Resources */, - C63F72DD285A2F1E0066163B /* voip_conference_new.png in Resources */, - 633FEDC71D3CD5590014B822 /* call_incoming@2x.png in Resources */, - 633FEDB81D3CD5590014B822 /* call_alt_start_disabled.png in Resources */, - 615A281D217F6FA80060F920 /* security_2_indicator@2x.png in Resources */, - C63F72E9285A2F1E0066163B /* voip_call_chat.png in Resources */, - 633FEF3C1D3CD55A0014B822 /* security_ok.png in Resources */, - 633FEEAF1D3CD55A0014B822 /* numpad_2_over~ipad.png in Resources */, - 633FEEB81D3CD55A0014B822 /* numpad_3_over~ipad@2x.png in Resources */, - 633FEEFB1D3CD55A0014B822 /* numpad_star~ipad@2x.png in Resources */, - 633FED9F1D3CD5590014B822 /* add_field_over@2x.png in Resources */, - 633FEEB71D3CD55A0014B822 /* numpad_3_over~ipad.png in Resources */, - C63F72F3285A2F1E0066163B /* voip_numpad_5.png in Resources */, - 633FEEF51D3CD55A0014B822 /* numpad_star_default@2x.png in Resources */, - 639E9CA91C0DB7FB00019A75 /* UIConfirmationDialog.xib in Resources */, - C63F72CB285A2F1E0066163B /* voip_call_more.png in Resources */, - 633FEF111D3CD55A0014B822 /* pause_big_disabled@2x.png in Resources */, - C63F72FE285A31DA0066163B /* Roboto-Italic.ttf in Resources */, - C63F72C1285A2F1D0066163B /* voip_numpad_3.png in Resources */, - 633FEE321D3CD5590014B822 /* color_L.png in Resources */, - 615A281F217F6FB40060F920 /* security_alert_indicator.png in Resources */, - CF7602F5210898CC00749F76 /* rec_off_default@2x.png in Resources */, - 633FEDB41D3CD5590014B822 /* call_alt_back_disabled.png in Resources */, - 633FEE631D3CD5590014B822 /* footer_chat_default@2x.png in Resources */, - 615A281B217F6F9C0060F920 /* security_2_indicator.png in Resources */, - 633FEE661D3CD5590014B822 /* footer_contacts_default.png in Resources */, - 633FEDC11D3CD5590014B822 /* call_back_disabled@2x.png in Resources */, - 633FEEEE1D3CD55A0014B822 /* numpad_hash_over@2x.png in Resources */, - 633FEDD01D3CD5590014B822 /* call_quality_indicator_2.png in Resources */, - C63F72BB285A2F1D0066163B /* voip_chat_rooms_list.png in Resources */, - 633FEE551D3CD5590014B822 /* dialer_back_default@2x.png in Resources */, - 633FEF361D3CD55A0014B822 /* routes_disabled.png in Resources */, - 633FEF261D3CD55A0014B822 /* route_bluetooth_selected.png in Resources */, - 633FEDF31D3CD5590014B822 /* call_video_start_default@2x.png in Resources */, - 24BFAAA2209B0630004F47A7 /* linphone_user~ipad@2x.png in Resources */, - 633FEDBA1D3CD5590014B822 /* call_audio_start_default.png in Resources */, - 61586B8F217A174F0038AC45 /* menu_options@2x.png in Resources */, - 633FEE131D3CD5590014B822 /* chat_message_not_delivered@2x.png in Resources */, - 615A282A21805B4C0060F920 /* security_toogle_icon_grey@2x.png in Resources */, - C63F72CE285A2F1E0066163B /* voip_call_add.png in Resources */, - 63AADBF51B6A0FF200AA16FD /* linphonerc in Resources */, - 633FEF0C1D3CD55A0014B822 /* options_transfer_call_disabled.png in Resources */, - 633FEE911D3CD55A0014B822 /* list_details_over@2x.png in Resources */, - 633FEE121D3CD5590014B822 /* chat_message_not_delivered.png in Resources */, - 633FEDCE1D3CD5590014B822 /* call_quality_indicator_1.png in Resources */, - 66E399F82857869300E73456 /* menu_notifications_on.png in Resources */, - 8CB2B8F91F86229E0015CEE2 /* chat_secure.png in Resources */, - C63F72DB285A2F1E0066163B /* voip_conference_audio_only.png in Resources */, - 633FEF4E1D3CD55A0014B822 /* valid_default.png in Resources */, - 570742581D5A0691004B9C84 /* ShopView.xib in Resources */, - 633FEE361D3CD5590014B822 /* conference_exit_over.png in Resources */, - 633FEDAA1D3CD5590014B822 /* backspace_disabled.png in Resources */, - F0938159188E629800A55DFA /* iTunesArtwork in Resources */, - 633FEE791D3CD5590014B822 /* history_chat_indicator@2x.png in Resources */, - 633FEEBA1D3CD55A0014B822 /* numpad_3~ipad@2x.png in Resources */, - 633FEEA61D3CD55A0014B822 /* numpad_1_over@2x.png in Resources */, - 633FEE371D3CD5590014B822 /* conference_exit_over@2x.png in Resources */, - 639E9CA01C0DB7E500019A75 /* UIChatBubblePhotoCell.xib in Resources */, - 633FEE4E1D3CD5590014B822 /* delete_field_over.png in Resources */, - 633FEE501D3CD5590014B822 /* deselect_all.png in Resources */, - 633FEF2F1D3CD55A0014B822 /* route_speaker_default@2x.png in Resources */, - 633FEDDD1D3CD5590014B822 /* call_start_body_disabled~ipad@2x.png in Resources */, - 633FEEBD1D3CD55A0014B822 /* numpad_4_over.png in Resources */, - 8CA70AD41F9E285C00A3D2EB /* chat_group_add@2x.png in Resources */, - C66B040A26EFDA55009B5EDC /* reply_cancel.png in Resources */, - 633FEEF11D3CD55A0014B822 /* numpad_hash~ipad.png in Resources */, - 633FEE781D3CD5590014B822 /* history_chat_indicator.png in Resources */, - 633FEF431D3CD55A0014B822 /* select_all_disabled@2x.png in Resources */, - 633FEE771D3CD5590014B822 /* history_all_selected@2x.png in Resources */, - 633FEF031D3CD55A0014B822 /* options_disabled@2x.png in Resources */, - 633FEDA21D3CD5590014B822 /* avatar~ipad.png in Resources */, - 24BFAAA1209B0630004F47A7 /* linphone_user@2x.png in Resources */, - 633FEF211D3CD55A0014B822 /* presence_unregistered@2x.png in Resources */, - C63F72C2285A2F1D0066163B /* voip_numpad_9.png in Resources */, - C63F72E4285A2F1E0066163B /* voip_call_list_menu.png in Resources */, - 633FEEA71D3CD55A0014B822 /* numpad_1_over~ipad.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 61AE364920C00B370089D9D3 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 61AE365220C00B370089D9D3 /* MainInterface.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6637AF8B288593AF00965733 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 66495CF9288FF346002780DE /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EA88A406242A6224007FEC61 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - EA88A407242A6235007FEC61 /* Localizable.strings in Resources */, - 6112A01E243B5FD500DBD5F5 /* GoogleService-Info.plist in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EA88F3AE241BD1ED00E66528 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - EA88F3AF241BD1F700E66528 /* MainInterface.storyboard in Resources */, - EA88A405242A6216007FEC61 /* Localizable.strings in Resources */, - 6112A01C243B31A700DBD5F5 /* GoogleService-Info.plist in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ -<<<<<<< HEAD - 3007955DA8B4F1E14F2B7518 /* [CP] Check Pods Manifest.lock */ = { -======= - 00029ED4EA06DBB8D333C3FD /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-AutoConnectLinphoneAccount/Pods-AutoConnectLinphoneAccount-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/linphone-sdk/linphonesw.framework", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/bctoolbox-ios.framework/bctoolbox-ios", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/bctoolbox-tester.framework/bctoolbox-tester", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/bctoolbox.framework/bctoolbox", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/belcard.framework/belcard", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/belle-sip.framework/belle-sip", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/belr.framework/belr", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/lime.framework/lime", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/limetester.framework/limetester", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/linphone.framework/linphone", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/linphonetester.framework/linphonetester", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/mediastreamer2.framework/mediastreamer2", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/msamr.framework/msamr", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/mscodec2.framework/mscodec2", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/msopenh264.framework/msopenh264", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/mssilk.framework/mssilk", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/mswebrtc.framework/mswebrtc", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/msx264.framework/msx264", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/ortp.framework/ortp", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/bctoolbox-ios.framework/bctoolbox-ios", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/bctoolbox-tester.framework/bctoolbox-tester", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/bctoolbox.framework/bctoolbox", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/belcard.framework/belcard", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/belle-sip.framework/belle-sip", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/belr.framework/belr", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/lime.framework/lime", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/limetester.framework/limetester", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/linphone.framework/linphone", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/linphonetester.framework/linphonetester", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/mediastreamer2.framework/mediastreamer2", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/msamr.framework/msamr", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/mscodec2.framework/mscodec2", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/msopenh264.framework/msopenh264", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/mssilk.framework/mssilk", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/mswebrtc.framework/mswebrtc", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/msx264.framework/msx264", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/ortp.framework/ortp", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/bctoolbox.framework/bctoolbox", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/belcard.framework/belcard", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/belle-sip.framework/belle-sip", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/belr.framework/belr", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/lime.framework/lime", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/linphone.framework/linphone", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/mediastreamer2.framework/mediastreamer2", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/msamr.framework/msamr", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/mscodec2.framework/mscodec2", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/msopenh264.framework/msopenh264", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/mssilk.framework/mssilk", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/mswebrtc.framework/mswebrtc", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/msx264.framework/msx264", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/ortp.framework/ortp", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/basic-frameworks/bctoolbox-ios.framework/bctoolbox-ios", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/linphonesw.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", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AutoConnectLinphoneAccount/Pods-AutoConnectLinphoneAccount-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 1441C27785DAFEAF337DFFF0 /* [CP] Check Pods Manifest.lock */ = { ->>>>>>> 8e16f1fad (new test plans) - 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-msgNotificationService-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; - }; -<<<<<<< HEAD - 5053FDC66A7F809319B46BF3 /* [CP] Check Pods Manifest.lock */ = { -======= - 1D4D7BF9440527C13D50B347 /* [CP] Check Pods Manifest.lock */ = { ->>>>>>> 8e16f1fad (new test plans) - 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 = ( -<<<<<<< HEAD - "$(DERIVED_FILE_DIR)/Pods-CallUITests-checkManifestLockResult.txt", -======= - "$(DERIVED_FILE_DIR)/Pods-AutoConnectLinphoneAccount-checkManifestLockResult.txt", ->>>>>>> 8e16f1fad (new test plans) - ); - 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; - }; -<<<<<<< HEAD - 5D7EB00FFF68B940A86FC3A7 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-CallUITests/Pods-CallUITests-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/linphone-sdk/linphonesw.framework", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/bctoolbox-ios.framework/bctoolbox-ios", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/bctoolbox-tester.framework/bctoolbox-tester", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/bctoolbox.framework/bctoolbox", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/belcard.framework/belcard", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/belle-sip.framework/belle-sip", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/belr.framework/belr", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/lime.framework/lime", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/limetester.framework/limetester", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/linphone.framework/linphone", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/linphonetester.framework/linphonetester", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/mediastreamer2.framework/mediastreamer2", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/msamr.framework/msamr", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/mscodec2.framework/mscodec2", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/msopenh264.framework/msopenh264", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/mssilk.framework/mssilk", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/mswebrtc.framework/mswebrtc", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/msx264.framework/msx264", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/ortp.framework/ortp", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/ZXing.framework/ZXing", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/bctoolbox-ios.framework/bctoolbox-ios", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/bctoolbox-tester.framework/bctoolbox-tester", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/bctoolbox.framework/bctoolbox", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/belcard.framework/belcard", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/belle-sip.framework/belle-sip", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/belr.framework/belr", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/lime.framework/lime", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/limetester.framework/limetester", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/linphone.framework/linphone", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/linphonetester.framework/linphonetester", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/mediastreamer2.framework/mediastreamer2", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/msamr.framework/msamr", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/mscodec2.framework/mscodec2", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/msopenh264.framework/msopenh264", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/mssilk.framework/mssilk", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/mswebrtc.framework/mswebrtc", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/msx264.framework/msx264", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/ortp.framework/ortp", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/ZXing.framework/ZXing", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/bctoolbox.framework/bctoolbox", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/belcard.framework/belcard", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/belle-sip.framework/belle-sip", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/belr.framework/belr", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/lime.framework/lime", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/linphone.framework/linphone", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/mediastreamer2.framework/mediastreamer2", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/msamr.framework/msamr", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/mscodec2.framework/mscodec2", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/msopenh264.framework/msopenh264", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/mssilk.framework/mssilk", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/mswebrtc.framework/mswebrtc", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/msx264.framework/msx264", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/ortp.framework/ortp", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/basic-frameworks/bctoolbox-ios.framework/bctoolbox-ios", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/linphonesw.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}/ZXing.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-CallUITests/Pods-CallUITests-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; -======= ->>>>>>> 8e16f1fad (new test plans) - 6112A019243B2C8400DBD5F5 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "$(SRCROOT)/msgNotificationContent/linphone-Info.plist", - "$(SRCROOT)/linphone.xcarchive/dSYMs/msgNotificationContent.appex.dSYM/Contents/Resources/DWARF/msgNotificationContent", - ); - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "val=`expr \"$GCC_PREPROCESSOR_DEFINITIONS\" : \".*USE_CRASHLYTICS=\\([0-9]*\\)\"`\nif [ $val = 1 ]; then\n ${PODS_ROOT}/FirebaseCrashlytics/run\nfi\n"; - }; - 6112A01A243B2CCF00DBD5F5 /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "$(SRCROOT)/msgNotificationService/linphone-Info.plist", - "$(SRCROOT)/linphone.xcarchive/dSYMs/msgNotificationService.appex.dSYM/Contents/Resources/DWARF/msgNotificationService", - ); - name = "Run Script"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "val=`expr \"$GCC_PREPROCESSOR_DEFINITIONS\" : \".*USE_CRASHLYTICS=\\([0-9]*\\)\"`\nif [ $val = 1 ]; then\n ${PODS_ROOT}/FirebaseCrashlytics/run\nfi\n"; - }; - 614D0A1821E77F5300C43EDF /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "$(SRCROOT)/linphone.xcarchive/dSYMs/linphone.app.dSYM/Contents/Resources/DWARF/linphone", - "$(SRCROOT)/linphone-Info.plist", - ); - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "val=`expr \"$GCC_PREPROCESSOR_DEFINITIONS\" : \".*USE_CRASHLYTICS=\\([0-9]*\\)\"`\nif [ $val = 1 ]; then\n ${PODS_ROOT}/FirebaseCrashlytics/run\nfi\n\n\n"; - }; - 63DCC71D1A07B08E00916627 /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "$SRCROOT/Tools/git_version.sh\n"; - }; -<<<<<<< HEAD - 66495D0D2890269C002780DE /* Run Script */ = { -======= - 66495D0D2890269C002780DE /* ShellScript */ = { ->>>>>>> 8e16f1fad (new test plans) - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "cp -R ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}* ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/../../../Frameworks\n"; - }; - 75EA65B333185E8C417354AA /* [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; - }; - 897DE6709DE23EF9C66BE1B0 /* [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-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; - }; - EB63CF57E1CDAC8DC31C1CBE /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-linphone/Pods-linphone-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/DropDown/DropDown.framework", - "${BUILT_PRODUCTS_DIR}/IQKeyboardManager/IQKeyboardManager.framework", - "${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework", - "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework", - "${BUILT_PRODUCTS_DIR}/linphone-sdk/linphonesw.framework", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/bctoolbox-ios.framework/bctoolbox-ios", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/bctoolbox-tester.framework/bctoolbox-tester", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/bctoolbox.framework/bctoolbox", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/belcard.framework/belcard", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/belle-sip.framework/belle-sip", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/belr.framework/belr", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/lime.framework/lime", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/limetester.framework/limetester", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/linphone.framework/linphone", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/linphonetester.framework/linphonetester", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/mediastreamer2.framework/mediastreamer2", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/msamr.framework/msamr", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/mscodec2.framework/mscodec2", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/msopenh264.framework/msopenh264", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/mssilk.framework/mssilk", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/mswebrtc.framework/mswebrtc", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/msx264.framework/msx264", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/ortp.framework/ortp", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/ZXing.framework/ZXing", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/bctoolbox-ios.framework/bctoolbox-ios", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/bctoolbox-tester.framework/bctoolbox-tester", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/bctoolbox.framework/bctoolbox", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/belcard.framework/belcard", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/belle-sip.framework/belle-sip", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/belr.framework/belr", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/lime.framework/lime", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/limetester.framework/limetester", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/linphone.framework/linphone", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/linphonetester.framework/linphonetester", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/mediastreamer2.framework/mediastreamer2", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/msamr.framework/msamr", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/mscodec2.framework/mscodec2", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/msopenh264.framework/msopenh264", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/mssilk.framework/mssilk", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/mswebrtc.framework/mswebrtc", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/msx264.framework/msx264", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/ortp.framework/ortp", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks/ZXing.framework/ZXing", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/bctoolbox.framework/bctoolbox", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/belcard.framework/belcard", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/belle-sip.framework/belle-sip", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/belr.framework/belr", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/lime.framework/lime", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/linphone.framework/linphone", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/mediastreamer2.framework/mediastreamer2", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/msamr.framework/msamr", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/mscodec2.framework/mscodec2", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/msopenh264.framework/msopenh264", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/mssilk.framework/mssilk", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/mswebrtc.framework/mswebrtc", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/msx264.framework/msx264", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension/ortp.framework/ortp", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/basic-frameworks/bctoolbox-ios.framework/bctoolbox-ios", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DropDown.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardManager.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SVProgressHUD.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/linphonesw.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}/ZXing.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-linphone/Pods-linphone-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1D60588E0D05DD3D006BFB54 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 63B81A0F1B57DA33009604A6 /* TPKeyboardAvoidingTableView.m in Sources */, - CF1DE92D210A0F5D00A0A97E /* UILinphoneAudioPlayer.m in Sources */, - 1D60589B0D05DD56006BFB54 /* main.m in Sources */, - C63F725C285A24B10066163B /* IncomingCallView.swift in Sources */, - C63F726B285A24B10066163B /* ButtonWithStateBackgrounds.swift in Sources */, - C63F7218285A24B10066163B /* ScheduledConferencesCell.swift in Sources */, - C63F722E285A24B10066163B /* IceState.swift in Sources */, - 6135761C240E81BB005304D4 /* UIInterfaceStyleButton.m in Sources */, - C63F721C285A24B10066163B /* MediatorLiveData.swift in Sources */, - 8CD99A3C2090B9FA008A7CDA /* ChatConversationImdnView.m in Sources */, - 1D3623260D0F684500981E51 /* LinphoneAppDelegate.m in Sources */, - C63F7264285A24B10066163B /* BouncingCounter.swift in Sources */, - C6B4444826AADA530076C517 /* SwiftUtil.swift in Sources */, - C63F7257285A24B10066163B /* ConferenceLayoutPickerView.swift in Sources */, - CF15F21E20E4F9A3008B1DE6 /* UIImageViewDeletable.m in Sources */, - 22F2508E107141E100AC9B3F /* DialerView.m in Sources */, - C63F724F285A24B10066163B /* LocalVideoView.swift in Sources */, - 633756451B67D2B200E21BAD /* SideMenuView.m in Sources */, - 8CD99A422090CE6F008A7CDA /* UIChatConversationImdnTableViewCell.m in Sources */, - 22E0A822111C44E100B04932 /* AboutView.m in Sources */, - 633671611BCBAAD200BFCBDE /* ChatConversationCreateView.m in Sources */, - 634610061B61330300548952 /* UILabel+Boldify.m in Sources */, - 2248E90E12F7E4CF00220D9C /* UIDigitButton.m in Sources */, - 633756391B67BAF400E21BAD /* SideMenuTableView.m in Sources */, - C63F7245285A24B10066163B /* VoipConferenceAudioOnlyView.swift in Sources */, - 2214EB7A12F846B1002A5394 /* UICallButton.m in Sources */, - C63F7258285A24B10066163B /* ControlsView.swift in Sources */, - 630CF5571AF7CE1500539F7A /* UITextField+DoneButton.m in Sources */, - C63F720D285A24B10066163B /* ConfigManager.swift in Sources */, - 8C9C5E111F83BD97006987FA /* UIChatCreateCollectionViewCell.m in Sources */, - C63F7231285A24B10066163B /* PayloadType.swift in Sources */, - 63701DDF1BA32039006A9AE3 /* UIConfirmationDialog.m in Sources */, - 22AA8B0113D83F6300B30535 /* UICamSwitch.m in Sources */, - 63B8D6A21BCBF43100C12B09 /* UIChatCreateCell.m in Sources */, - 636BC9971B5F921B00C754CE /* UIIconButton.m in Sources */, - C63F7263285A24B10066163B /* FormButton.swift in Sources */, - C63F725B285A24B10066163B /* ActiveCallOrConferenceView.swift in Sources */, - C63F7215285A24B10066163B /* ConferenceWaitingRoomFragment.swift in Sources */, - 63423C0A1C4501D000D9A050 /* Contact.m in Sources */, - C63F7262285A24B10066163B /* RotatingSpinner.swift in Sources */, - C63F723A285A24B10066163B /* CallData.swift in Sources */, - CF7602D7210867E800749F76 /* RecordingsListView.m in Sources */, - C63F7226285A24B10066163B /* UIVIewExtensions.swift in Sources */, - C63F7259285A24B10066163B /* RemotelyRecording.swift in Sources */, - C63F7236285A24B10066163B /* ControlsViewModel.swift in Sources */, - C63F7214285A24B10066163B /* Duration.swift in Sources */, - C63F723B285A24B10066163B /* AudioRouteUtils.swift in Sources */, - C63F7269285A24B10066163B /* StyledLabel.swift in Sources */, - C63F722C285A24B10066163B /* UIColorExtensions.swift in Sources */, - D3F83F8E15822ABE00336684 /* PhoneMainView.m in Sources */, - C63F7251285A24B10066163B /* NumpadView.swift in Sources */, - C63F723F285A24B10066163B /* ButtonTheme.swift in Sources */, - C63F7213285A24B10066163B /* TimeZoneData.swift in Sources */, - C6A1BB3E26E882D000540D50 /* UIChatReplyBubbleView.m in Sources */, - 6377AC801BDE4069007F7625 /* UIBackToCallButton.m in Sources */, - 6308F9C51BF0DD6600D1234B /* XMLRPCHelper.m in Sources */, - C63F7235285A24B10066163B /* CallsViewModel.swift in Sources */, - C63F722D285A24B10066163B /* CoreExtensions.swift in Sources */, - C63F722F285A24B10066163B /* AddressExtensions.swift in Sources */, - D3ED3E871586291E006C0DE4 /* TabBarView.m in Sources */, - 617C242A263022690042FB4A /* UIChatContentView.m in Sources */, - C63F7261285A24B10066163B /* CallControlButton.swift in Sources */, - D3ED3EA71587334E006C0DE4 /* HistoryListTableView.m in Sources */, - C63F7220285A24B10066163B /* TimestampUtils.swift in Sources */, - 61AEBEBD2191990A00F35E7F /* DevicesListView.m in Sources */, - D3ED3EB81587392C006C0DE4 /* HistoryListView.m in Sources */, - 24A345A61D95798A00881A5C /* UIShopTableCell.m in Sources */, - C63F7268285A24B10066163B /* Avatar.swift in Sources */, - C63F7247285A24B10066163B /* VoipAudioOnlyParticipantCell.swift in Sources */, - D35497FE15875372000081D8 /* ContactsListView.m in Sources */, - 635173F91BA082A40095EB0A /* UIChatBubblePhotoCell.m in Sources */, - C63F723E285A24B10066163B /* VoipTexts.swift in Sources */, - C63F722A285A24B10066163B /* UIImageViewExtensions.swift in Sources */, - D3549816158761D0000081D8 /* ContactsListTableView.m in Sources */, - 633888461BFB2C49001D5E7B /* HPTextViewInternal.m in Sources */, - C63F7242285A24B10066163B /* VoipParticipantCell.swift in Sources */, - D35498211587716B000081D8 /* StatusBarView.m in Sources */, - D3A55FBC15877E5E003FD403 /* UIContactCell.m in Sources */, - 6341807C1BBC103100F71761 /* ChatConversationCreateTableView.m in Sources */, - C63F7254285A24B10066163B /* CallsListView.swift in Sources */, - 63BE7A781D75BDF6000990EF /* ShopTableView.m in Sources */, - D326483815887D5200930C67 /* OrderedDictionary.m in Sources */, - D32648441588F6FC00930C67 /* UIToggleButton.m in Sources */, - D31C9C98158A1CDF00756B45 /* UIHistoryCell.m in Sources */, - D35E7597159460580066B1C1 /* ChatsListView.m in Sources */, - D35E759F159460B70066B1C1 /* SettingsView.m in Sources */, - C63F7216285A24B10066163B /* ScheduledConferencesView.swift in Sources */, - C63F7255285A24B10066163B /* VoipCallCell.swift in Sources */, - 63B81A101B57DA33009604A6 /* UIScrollView+TPKeyboardAvoidingAdditions.m in Sources */, - C63F7211285A24B10066163B /* ScheduledConferencesViewModel.swift in Sources */, - F03CA84318C72F1A0008889D /* UITextViewNoDefine.m in Sources */, - C63F7212285A24B10066163B /* ScheduledConferenceData.swift in Sources */, - C63F7239285A24B10066163B /* ConferenceParticipantDeviceData.swift in Sources */, - C63F7238285A24B10066163B /* ConferenceParticipantData.swift in Sources */, - 63B81A0D1B57DA33009604A6 /* TPKeyboardAvoidingCollectionView.m in Sources */, - C63F726D285A24B10066163B /* ProviderDelegate.swift in Sources */, - C63F7266285A24B10066163B /* UICallTimer.swift in Sources */, - C63F726C285A24B10066163B /* StyledTextView.swift in Sources */, - 570742611D5A09B8004B9C84 /* ShopView.m in Sources */, - D37DC6C11594AE1800B2A5EB /* LinphoneCoreSettingsStore.m in Sources */, - 63CD4B4F1A5AAC8C00B84282 /* DTAlertView.m in Sources */, - D3EA53FD159850E80037DC6B /* LinphoneManager.m in Sources */, - 63B81A0E1B57DA33009604A6 /* TPKeyboardAvoidingScrollView.m in Sources */, - 633888451BFB2C49001D5E7B /* HPGrowingTextView.m in Sources */, - 63F1DF441BCE618E00EDED90 /* UIAddressTextField.m in Sources */, - D3EA540D1598528B0037DC6B /* ChatsListTableView.m in Sources */, - C63F725E285A24B10066163B /* VoipDialog.swift in Sources */, - C63F724E285A24B10066163B /* PausedCallOrConferenceView.swift in Sources */, - D3EA5411159853750037DC6B /* UIChatCell.m in Sources */, - D31B4B21159876C0002E6C72 /* UICompositeView.m in Sources */, - C63F7267285A24B10066163B /* StyledCheckBox.swift in Sources */, - 8C9C5E0D1F83B2EF006987FA /* ChatConversationCreateCollectionViewController.m in Sources */, - 631098491D4660580041F2B3 /* CountryListView.m in Sources */, - D32B9DFC15A2F131000B6DEC /* FastAddressBook.m in Sources */, - C63F7228285A24B10066163B /* OptionalExtensions.swift in Sources */, - C63F7241285A24B10066163B /* ParticipantsListView.swift in Sources */, - D350F20E15A43BB100149E54 /* AssistantView.m in Sources */, - D3F795D615A582810077328B /* ChatConversationView.m in Sources */, - C63F723C285A24B10066163B /* LightDarkColor.swift in Sources */, - D32B6E2915A5BC440033019F /* ChatConversationTableView.m in Sources */, - C63F7233285A24B10066163B /* ConferenceExtensions.swift in Sources */, - C63F7260285A24B10066163B /* StyledSwitch.swift in Sources */, - C63F7252285A24B10066163B /* VoipExtraButtonsView.swift in Sources */, - 669B140C27A29D140012220A /* FloatingScrollDownButton.swift in Sources */, - C63F7219285A24B10066163B /* ConferenceHistoryDetailsView.swift in Sources */, - D3A8BB7015A6C7D500F96BE5 /* UIChatBubbleTextCell.m in Sources */, - 63D11C531C3D501200E8FCEE /* Log.m in Sources */, - D3128FE115AABC7E00A2147A /* ContactDetailsView.m in Sources */, - 6135761F240E81D0005304D4 /* UIInterfaceStyleToggleButton.m in Sources */, - C63F7221285A24B10066163B /* AppManager.swift in Sources */, - D37C639B15AADEF6009D0BAC /* ContactDetailsTableView.m in Sources */, - 63E59A3F1ADE70D900646FB3 /* InAppProductsManager.m in Sources */, - D3C6526715AC1A8F0092A874 /* UIContactDetailsCell.m in Sources */, - C63F7227285A24B10066163B /* UILabelExtensions.swift in Sources */, - 631348301B6F7B6600C6BDCB /* UIRoundBorderedButton.m in Sources */, - C90FAA7915AF54E6002091CB /* HistoryDetailsView.m in Sources */, - C63F7253285A24B10066163B /* VoipCallContextMenu.swift in Sources */, - C63F725A285A24B10066163B /* OutgoingCallView.swift in Sources */, - 63FB30351A680E73008CA393 /* UIRoundedImageView.m in Sources */, - 635775251B6673EC00C8B704 /* HistoryDetailsTableView.m in Sources */, - C63F720E285A24B10066163B /* CallManager.swift in Sources */, - 63C441C31BBC23ED0053DC5E /* UIAssistantTextField.m in Sources */, - D35860D615B549B500513429 /* Utils.m in Sources */, - D3F7998115BD32370018C273 /* TPMultiLayoutViewController.m in Sources */, - C63F721A285A24B10066163B /* ConferenceSchedulingView.swift in Sources */, - C63F7232285A24B10066163B /* CallExtensions.swift in Sources */, - D3807FBF15C28940005BE9BC /* DCRoundSwitch.m in Sources */, - D3807FC115C28940005BE9BC /* DCRoundSwitchKnobLayer.m in Sources */, - 61CCC3DF21933B580060EDEA /* UIDeviceCell.m in Sources */, - C63F725D285A24B10066163B /* SharedLayoutConstants.swift in Sources */, - C63F7250285A24B10066163B /* CallStatsView.swift in Sources */, - 6306440E1BECB08500134C72 /* FirstLoginView.m in Sources */, - C63F721F285A24B10066163B /* BackNextNavigationView.swift in Sources */, - D3807FC315C28940005BE9BC /* DCRoundSwitchOutlineLayer.m in Sources */, - C63F723D285A24B10066163B /* TextStyle.swift in Sources */, - C63F7229285A24B10066163B /* UIButtonExtensions.swift in Sources */, - C63F722B285A24B10066163B /* UIDeviceExtensions.swift in Sources */, - C63F724B285A24B10066163B /* VoipConferenceDisplayModeSelectionView.swift in Sources */, - CF7602E221086EB200749F76 /* RecordingsListTableView.m in Sources */, - C63F721E285A24B10066163B /* Pair.swift in Sources */, - D3807FC515C28940005BE9BC /* DCRoundSwitchToggleLayer.m in Sources */, - 633E41821D74259000320475 /* AssistantLinkView.m in Sources */, - C63F724A285A24B10066163B /* VoipConferenceActiveSpeakerView.swift in Sources */, - C63F7210285A24B10066163B /* ConferenceSchedulingViewModel.swift in Sources */, - D3807FE815C2894A005BE9BC /* IASKAppSettingsViewController.m in Sources */, - D3807FEC15C2894A005BE9BC /* IASKSpecifierValuesViewController.m in Sources */, - 8CA70AE41F9E39E400A3D2EB /* UIChatConversationInfoTableViewCell.m in Sources */, - D3807FEE15C2894A005BE9BC /* IASKSettingsReader.m in Sources */, - D3807FF015C2894A005BE9BC /* IASKSettingsStore.m in Sources */, - C63F7234285A24B10066163B /* ConferenceViewModel.swift in Sources */, - 8CA70AD11F9E0AE100A3D2EB /* ChatConversationInfoView.m in Sources */, - D3807FF215C2894A005BE9BC /* IASKSettingsStoreFile.m in Sources */, - C63F720F285A24B10066163B /* ConferenceWaitingRoomViewModel.swift in Sources */, - C63F7248285A24B10066163B /* MicMuted.swift in Sources */, - C63F7243285A24B10066163B /* AudioRoutesView.swift in Sources */, - D3807FF415C2894A005BE9BC /* IASKSettingsStoreUserDefaults.m in Sources */, - C63F7240285A24B10066163B /* VoipTheme.swift in Sources */, - C63F7265285A24B10066163B /* VoipExtraButton.swift in Sources */, - 639E9C801C0DB13D00019A75 /* UICheckBoxTableView.m in Sources */, - CF7602E72108759A00749F76 /* UIRecordingCell.m in Sources */, - D3807FF615C2894A005BE9BC /* IASKSpecifier.m in Sources */, - D3807FF815C2894A005BE9BC /* IASKPSSliderSpecifierViewCell.m in Sources */, - C63F726A285A24B10066163B /* StyledDatePicker.swift in Sources */, - C63F7237285A24B10066163B /* CallStatisticsData.swift in Sources */, - D3807FFA15C2894A005BE9BC /* IASKPSTextFieldSpecifierViewCell.m in Sources */, - D3807FFC15C2894A005BE9BC /* IASKPSTitleValueSpecifierViewCell.m in Sources */, - C63F721B285A24B10066163B /* ConferenceSchedulingSummaryView.swift in Sources */, - D3807FFE15C2894A005BE9BC /* IASKSlider.m in Sources */, - D380800015C2894A005BE9BC /* IASKSwitch.m in Sources */, - 662553B427EDFB35007F67D8 /* MagicSearch.swift in Sources */, - C63F725F285A24B10066163B /* StyledValuePicker.swift in Sources */, - C63F7224285A24B10066163B /* UIVIewControllerExtensions.swift in Sources */, - D380800215C2894A005BE9BC /* IASKTextField.m in Sources */, - D380801315C299D0005BE9BC /* ColorSpaceUtilites.m in Sources */, - C63F721D285A24B10066163B /* MutableLiveData.swift in Sources */, - C63F7256285A24B10066163B /* DismissableView.swift in Sources */, - C63F724C285A24B10066163B /* ActiveCallView.swift in Sources */, - C63F7225285A24B10066163B /* UIImageExtensions.swift in Sources */, - C64A854E2667B67200252AD2 /* EphemeralSettingsView.m in Sources */, - 8C92ABF31FA773E50006FB5D /* UIChatNotifiedEventCell.m in Sources */, - C63F726E285A24B10066163B /* VFSUtil.swift in Sources */, - 633FEF581D3CD5E00014B822 /* UIAvatarPresence.m in Sources */, - C63F7230285A24B10066163B /* ParticipantExtensions.swift in Sources */, - 637157A11B283FE200C91677 /* FileTransferDelegate.m in Sources */, - D378AB2A15DCDB4A0098505D /* ImagePickerView.m in Sources */, - 22405F001601C19200B92522 /* ImageView.m in Sources */, - C63F724D285A24B10066163B /* IncomingOuntgoingCommonView.swift in Sources */, - D37EE162160377D7003608A6 /* DTActionSheet.m in Sources */, - D306459E1611EC2A00BB571E /* UILoadingImageView.m in Sources */, - C63F7246285A24B10066163B /* VoipGridParticipantCell.swift in Sources */, - C63F7244285A24B10066163B /* VoipActiveSpeakerParticipantCell.swift in Sources */, - 6381DA7D1C1AD5EA00DF3BBD /* UIBouncingView.m in Sources */, - C63F7217285A24B10066163B /* ICSBubbleView.swift in Sources */, - C63F7222285A24B10066163B /* UIApplication+Extension.swift in Sources */, - C63F7249285A24B10066163B /* VoipConferenceGridView.swift in Sources */, - D37E3ECD1619C27A0087659A /* CAAnimation+Blocks.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 61AE364720C00B370089D9D3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 61AE364F20C00B370089D9D3 /* ShareViewController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6637AF89288593AF00965733 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 6643501C28D1CD3300AEA777 /* UIColorExtensions.swift in Sources */, - 662F570028C0AA0800E851BF /* UITestsCoreManager.swift in Sources */, - 6693A1D428D0FCE900489A39 /* ActiveCallViewUITestsMethods.swift in Sources */, - 66631CE828D37AA300115E36 /* ExtraMenuActiveCallActionsUITestsMethods.swift in Sources */, - 6637AF90288593AF00965733 /* IncomingCallUITests.swift in Sources */, -<<<<<<< HEAD - 66305A5B28B9105D00838792 /* UITestsScreenshots.swift in Sources */, - 662F570228C2506600E851BF /* OutgoingCallUITests.swift in Sources */, - 662F56FE28C00DF300E851BF /* UITestsUtils.swift in Sources */, - 66631CE728D37A2400115E36 /* ExtraMenuUITests.swift in Sources */, - 662F56FF28C0A9FE00E851BF /* IncomingOutgoingCallViewUITestsMethods.swift in Sources */, - 6693A1D328D0FCE400489A39 /* ActiveCallUITests.swift in Sources */, -======= - 6637AF9B2885995A00965733 /* IncomingOutgoingCallViewUITestsMethods.swift in Sources */, - 663B06602886E38100E41889 /* ActiveCallUITests.swift in Sources */, ->>>>>>> 8e16f1fad (new test plans) - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 66495CF7288FF346002780DE /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 66495CFE288FF346002780DE /* AutoConnectLinphoneAccount.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EA5F25D5232BD3E200475F2E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - C63F726F285A24E90066163B /* VFSUtil.swift in Sources */, - EA3650DB2330D2E30001148A /* NotificationService.swift in Sources */, - EAE6C88423FABF690076A018 /* Utils.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EA8CB823239F96CA00C330CC /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - C63F7270285A24E90066163B /* VFSUtil.swift in Sources */, - EA8CB82C239F96CA00C330CC /* NotificationViewController.swift in Sources */, - EAE6C88523FABF690076A018 /* Utils.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 61AE365520C00B370089D9D3 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 61AE364A20C00B370089D9D3 /* linphoneExtension */; - targetProxy = 61AE365420C00B370089D9D3 /* PBXContainerItemProxy */; - }; -<<<<<<< HEAD - 6637AF94288593AF00965733 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1D6058900D05DD3D006BFB54 /* linphone */; - targetProxy = 6637AF93288593AF00965733 /* PBXContainerItemProxy */; - }; -======= ->>>>>>> 8e16f1fad (new test plans) - 6637AF94288593AF00965733 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1D6058900D05DD3D006BFB54 /* linphone */; - targetProxy = 6637AF93288593AF00965733 /* PBXContainerItemProxy */; - }; - 66495D00288FF346002780DE /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1D6058900D05DD3D006BFB54 /* linphone */; - targetProxy = 66495CFF288FF346002780DE /* PBXContainerItemProxy */; - }; - EA8CB83A239F9A3000C330CC /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = EA5F25D8232BD3E200475F2E /* msgNotificationService */; - targetProxy = EA88F393241BC1F400E66528 /* PBXContainerItemProxy */; - }; - EA8CB83C239F9A3000C330CC /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = EA8CB826239F96CA00C330CC /* msgNotificationContent */; - targetProxy = EA88F394241BC1F400E66528 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 570742561D5A0691004B9C84 /* ShopView.xib */ = { - isa = PBXVariantGroup; - children = ( - 570742571D5A0691004B9C84 /* Base */, - 61E8E46B23C5EA2E00434E71 /* fr */, - 6187B1DC24B3272500D580FB /* hu */, - ); - name = ShopView.xib; - sourceTree = ""; - }; - 617B4A62260A2B7800A87337 /* RecordingsListView.xib */ = { - isa = PBXVariantGroup; - children = ( - 617B4A61260A2B7800A87337 /* Base */, - 617B4A64260A2B8500A87337 /* fr */, - 617B4A75260A3F5500A87337 /* en */, - ); - name = RecordingsListView.xib; - sourceTree = ""; - }; - 61AE365020C00B370089D9D3 /* MainInterface.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 61AE365120C00B370089D9D3 /* Base */, - ); - name = MainInterface.storyboard; - sourceTree = ""; - }; - 631098501D4660630041F2B3 /* CountryListView.xib */ = { - isa = PBXVariantGroup; - children = ( - 631098511D4660630041F2B3 /* Base */, - 8CBD7BBE20B6B87400E5DCC0 /* fr */, - 6187B1C424B3271B00D580FB /* hu */, - ); - name = CountryListView.xib; - sourceTree = ""; - }; - 63130FB01C1ED06900371918 /* SideMenuView~ipad.xib */ = { - isa = PBXVariantGroup; - children = ( - 63130FB11C1ED06900371918 /* Base */, - 8CBD7BD820B6B88F00E5DCC0 /* fr */, - 6187B1DE24B3272600D580FB /* hu */, - ); - name = "SideMenuView~ipad.xib"; - sourceTree = ""; - }; - 636316D31A1DEBCB0009B839 /* AboutView.xib */ = { - isa = PBXVariantGroup; - children = ( - 636316D21A1DEBCB0009B839 /* Base */, - 61E8E46323C5E8EC00434E71 /* ar */, - 61E8E46523C5E8F000434E71 /* fr */, - 6187B1B524B3271500D580FB /* hu */, - ); - name = AboutView.xib; - sourceTree = ""; - }; - 636316D61A1DEC650009B839 /* SettingsView.xib */ = { - isa = PBXVariantGroup; - children = ( - 636316D51A1DEC650009B839 /* Base */, - F0AF070E1A24BA770086C9C1 /* ar */, - 8CBD7BD520B6B88C00E5DCC0 /* fr */, - 6187B1DB24B3272400D580FB /* hu */, - ); - name = SettingsView.xib; - sourceTree = ""; - }; - 638F1A601C2021B2004B8E02 /* DialerView~ipad.xib */ = { - isa = PBXVariantGroup; - children = ( - 638F1A611C2021B2004B8E02 /* Base */, - 8CBD7BC020B6B87500E5DCC0 /* fr */, - 6187B1C624B3271C00D580FB /* hu */, - ); - name = "DialerView~ipad.xib"; - sourceTree = ""; - }; - 638F1A8F1C21993D004B8E02 /* UICompositeView~ipad.xib */ = { - isa = PBXVariantGroup; - children = ( - 638F1A901C21993D004B8E02 /* Base */, - 8CBD7BCF20B6B88200E5DCC0 /* fr */, - 6187B1D524B3272200D580FB /* hu */, - ); - name = "UICompositeView~ipad.xib"; - sourceTree = ""; - }; - 639CEAFF1A1DF4D9004DE38F /* StatusBarView.xib */ = { - isa = PBXVariantGroup; - children = ( - 639CEAFE1A1DF4D9004DE38F /* Base */, - F0AF070C1A24BA770086C9C1 /* ar */, - 8CBD7BD920B6B89000E5DCC0 /* fr */, - 6187B1DF24B3272600D580FB /* hu */, - ); - name = StatusBarView.xib; - path = LinphoneUI; - sourceTree = ""; - }; - 639CEB021A1DF4E4004DE38F /* UIHistoryCell.xib */ = { - isa = PBXVariantGroup; - children = ( - 639CEB011A1DF4E4004DE38F /* Base */, - F0AF07091A24BA770086C9C1 /* ar */, - 8CBD7BD320B6B88900E5DCC0 /* fr */, - 6187B1D924B3272400D580FB /* hu */, - ); - name = UIHistoryCell.xib; - sourceTree = ""; - }; - 639CEB051A1DF4EB004DE38F /* UICompositeView.xib */ = { - isa = PBXVariantGroup; - children = ( - 639CEB041A1DF4EB004DE38F /* Base */, - F0AF07041A24BA770086C9C1 /* ar */, - 8CBD7BCE20B6B88100E5DCC0 /* fr */, - 6187B1D424B3272100D580FB /* hu */, - ); - name = UICompositeView.xib; - sourceTree = ""; - }; - 639CEB0B1A1DF4FA004DE38F /* UIChatCell.xib */ = { - isa = PBXVariantGroup; - children = ( - 639CEB0A1A1DF4FA004DE38F /* Base */, - F0AF07021A24BA770086C9C1 /* ar */, - 8CBD7BC920B6B87B00E5DCC0 /* fr */, - 6187B1CF24B3271F00D580FB /* hu */, - ); - name = UIChatCell.xib; - sourceTree = ""; - }; - 639E9C951C0DB7BE00019A75 /* FirstLoginView.xib */ = { - isa = PBXVariantGroup; - children = ( - 639E9C941C0DB7BE00019A75 /* Base */, - 8CBD7BC120B6B87600E5DCC0 /* fr */, - 6187B1C724B3271C00D580FB /* hu */, - ); - name = FirstLoginView.xib; - sourceTree = ""; - }; - 639E9CA21C0DB7E500019A75 /* UIChatBubblePhotoCell.xib */ = { - isa = PBXVariantGroup; - children = ( - 639E9CA11C0DB7E500019A75 /* Base */, - 8CBD7BC720B6B87A00E5DCC0 /* fr */, - 6187B1CD24B3271F00D580FB /* hu */, - ); - name = UIChatBubblePhotoCell.xib; - sourceTree = ""; - }; - 639E9CA51C0DB7EA00019A75 /* UIChatBubbleTextCell.xib */ = { - isa = PBXVariantGroup; - children = ( - 639E9CA41C0DB7EA00019A75 /* Base */, - 8CBD7BC820B6B87B00E5DCC0 /* fr */, - 6187B1CE24B3271F00D580FB /* hu */, - ); - name = UIChatBubbleTextCell.xib; - sourceTree = ""; - }; - 639E9CA81C0DB7F200019A75 /* UIChatCreateCell.xib */ = { - isa = PBXVariantGroup; - children = ( - 639E9CA71C0DB7F200019A75 /* Base */, - 8CBD7BCD20B6B88000E5DCC0 /* fr */, - 6187B1D224B3272100D580FB /* hu */, - ); - name = UIChatCreateCell.xib; - sourceTree = ""; - }; - 639E9CAB1C0DB7FB00019A75 /* UIConfirmationDialog.xib */ = { - isa = PBXVariantGroup; - children = ( - 639E9CAA1C0DB7FB00019A75 /* Base */, - 8CBD7BD020B6B88400E5DCC0 /* fr */, - 6187B1D624B3272200D580FB /* hu */, - ); - name = UIConfirmationDialog.xib; - sourceTree = ""; - }; - 639E9CAE1C0DB80300019A75 /* UIContactDetailsCell.xib */ = { - isa = PBXVariantGroup; - children = ( - 639E9CAD1C0DB80300019A75 /* Base */, - 8CBD7BD220B6B88700E5DCC0 /* fr */, - 6187B1D824B3272300D580FB /* hu */, - ); - name = UIContactDetailsCell.xib; - sourceTree = ""; - }; - 639E9CB21C0DB83000019A75 /* SideMenuView.xib */ = { - isa = PBXVariantGroup; - children = ( - 639E9CB11C0DB83000019A75 /* Base */, - 8CBD7BD720B6B88E00E5DCC0 /* fr */, - 6187B1DD24B3272500D580FB /* hu */, - ); - name = SideMenuView.xib; - sourceTree = ""; - }; - 639E9CB31C0DB88200019A75 /* PhoneMainView.xib */ = { - isa = PBXVariantGroup; - children = ( - 639E9CB41C0DB88200019A75 /* Base */, - 8CBD7BD420B6B88A00E5DCC0 /* fr */, - 6187B1DA24B3272400D580FB /* hu */, - ); - name = PhoneMainView.xib; - sourceTree = ""; - }; - 63AADBC41B6A0FF200AA16FD /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 63AADBC51B6A0FF200AA16FD /* ar */, - 63AADBC61B6A0FF200AA16FD /* de */, - 63AADBC71B6A0FF200AA16FD /* en */, - 63AADBCB1B6A0FF200AA16FD /* ja */, - 63AADBDD1B6A0FF200AA16FD /* nl */, - 63AADBE11B6A0FF200AA16FD /* ru */, - 666D795C283E67E300B07215 /* fr */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 63B8D68E1BCBE65600C12B09 /* ChatConversationCreateView.xib */ = { - isa = PBXVariantGroup; - children = ( - 63B8D68D1BCBE65600C12B09 /* Base */, - 8CBD7BB920B6B87000E5DCC0 /* fr */, - 6187B1BD24B3271800D580FB /* hu */, - ); - name = ChatConversationCreateView.xib; - sourceTree = ""; - }; - 63EC8D3B1D7438660066547B /* AssistantLinkView.xib */ = { - isa = PBXVariantGroup; - children = ( - 63EC8D3A1D7438660066547B /* Base */, - 61E8E46723C5E9B400434E71 /* fr */, - 6187B1B624B3271500D580FB /* hu */, - ); - name = AssistantLinkView.xib; - sourceTree = ""; - }; - 8CBD7BA220B6B7FD00E5DCC0 /* ChatConversationInfoView.xib */ = { - isa = PBXVariantGroup; - children = ( - 8CBD7BA120B6B7FD00E5DCC0 /* Base */, - 8CBD7BB720B6B86E00E5DCC0 /* fr */, - 6187B1BF24B3271900D580FB /* hu */, - ); - name = ChatConversationInfoView.xib; - sourceTree = ""; - }; - 8CBD7BA520B6B80D00E5DCC0 /* ChatConversationImdnView.xib */ = { - isa = PBXVariantGroup; - children = ( - 8CBD7BA420B6B80D00E5DCC0 /* Base */, - 8CBD7BB820B6B86F00E5DCC0 /* fr */, - 6187B1BE24B3271900D580FB /* hu */, - ); - name = ChatConversationImdnView.xib; - sourceTree = ""; - }; - 8CBD7BA820B6B82400E5DCC0 /* UIChatConversationInfoTableViewCell.xib */ = { - isa = PBXVariantGroup; - children = ( - 8CBD7BA720B6B82400E5DCC0 /* Base */, - 8CBD7BCA20B6B87D00E5DCC0 /* fr */, - 6187B1D124B3272000D580FB /* hu */, - ); - name = UIChatConversationInfoTableViewCell.xib; - sourceTree = ""; - }; - 8CBD7BAB20B6B82A00E5DCC0 /* UIChatConversationImdnTableViewCell.xib */ = { - isa = PBXVariantGroup; - children = ( - 8CBD7BAA20B6B82A00E5DCC0 /* Base */, - 8CBD7BCB20B6B87E00E5DCC0 /* fr */, - 6187B1D024B3272000D580FB /* hu */, - ); - name = UIChatConversationImdnTableViewCell.xib; - sourceTree = ""; - }; - 8CBD7BAE20B6B82F00E5DCC0 /* UIChatCreateCollectionViewCell.xib */ = { - isa = PBXVariantGroup; - children = ( - 8CBD7BAD20B6B82F00E5DCC0 /* Base */, - 8CBD7BCC20B6B87E00E5DCC0 /* fr */, - 6187B1D324B3272100D580FB /* hu */, - ); - name = UIChatCreateCollectionViewCell.xib; - sourceTree = ""; - }; - C66B03BD26E8EB1A009B5EDC /* UIChatReplyBubbleView.xib */ = { - isa = PBXVariantGroup; - children = ( - C66B03BC26E8EB1A009B5EDC /* Base */, - C66B03C126E8EB82009B5EDC /* en */, - C66B03C326E8EB87009B5EDC /* fr */, - ); - name = UIChatReplyBubbleView.xib; - sourceTree = ""; - }; - D37EE11016035793003608A6 /* ImageView.xib */ = { - isa = PBXVariantGroup; - children = ( - F09548221883F15400E8A69B /* Base */, - F09548441883F52900E8A69B /* ru */, - F0AF06FB1A24BA770086C9C1 /* ar */, - 8CBD7BC420B6B87800E5DCC0 /* fr */, - 6187B1CA24B3271E00D580FB /* hu */, - ); - name = ImageView.xib; - sourceTree = ""; - }; - D38187B015FE340100C3EDCA /* ChatConversationView.xib */ = { - isa = PBXVariantGroup; - children = ( - F09548181883F15300E8A69B /* Base */, - F09548321883F20A00E8A69B /* ru */, - F0AF06F11A24BA760086C9C1 /* ar */, - 8CBD7BBA20B6B87000E5DCC0 /* fr */, - 6187B1C024B3271A00D580FB /* hu */, - ); - name = ChatConversationView.xib; - sourceTree = ""; - }; - D38187B415FE340500C3EDCA /* ChatsListView.xib */ = { - isa = PBXVariantGroup; - children = ( - F09548191883F15300E8A69B /* Base */, - F09548341883F25F00E8A69B /* ru */, - F0AF06F21A24BA760086C9C1 /* ar */, - 8CBD7BBB20B6B87100E5DCC0 /* fr */, - 6187B1C124B3271A00D580FB /* hu */, - ); - name = ChatsListView.xib; - sourceTree = ""; - }; - D38187BC15FE342200C3EDCA /* ContactDetailsView.xib */ = { - isa = PBXVariantGroup; - children = ( - F095481B1883F15300E8A69B /* Base */, - F09548381883F29C00E8A69B /* ru */, - F0AF06F41A24BA760086C9C1 /* ar */, - 8CBD7BBC20B6B87200E5DCC0 /* fr */, - 6187B1C224B3271A00D580FB /* hu */, - ); - name = ContactDetailsView.xib; - sourceTree = ""; - }; - D38187C015FE342800C3EDCA /* ContactsListView.xib */ = { - isa = PBXVariantGroup; - children = ( - F095481C1883F15300E8A69B /* Base */, - F095483A1883F2CA00E8A69B /* ru */, - F0AF06F51A24BA760086C9C1 /* ar */, - 8CBD7BBD20B6B87300E5DCC0 /* fr */, - 6187B1C324B3271B00D580FB /* hu */, - ); - name = ContactsListView.xib; - sourceTree = ""; - }; - D38187C415FE345B00C3EDCA /* DialerView.xib */ = { - isa = PBXVariantGroup; - children = ( - F095481D1883F15300E8A69B /* Base */, - F095483C1883F2E300E8A69B /* ru */, - F0AF06F61A24BA760086C9C1 /* ar */, - 8CBD7BBF20B6B87400E5DCC0 /* fr */, - 6187B1C524B3271B00D580FB /* hu */, - ); - name = DialerView.xib; - sourceTree = ""; - }; - D38187D015FE346700C3EDCA /* HistoryDetailsView.xib */ = { - isa = PBXVariantGroup; - children = ( - F09548201883F15400E8A69B /* Base */, - 636316DB1A1DEDD80009B839 /* ru */, - F0AF06F91A24BA760086C9C1 /* ar */, - 8CBD7BC220B6B87600E5DCC0 /* fr */, - 6187B1C824B3271D00D580FB /* hu */, - ); - name = HistoryDetailsView.xib; - sourceTree = ""; - }; - D38187D415FE346B00C3EDCA /* HistoryListView.xib */ = { - isa = PBXVariantGroup; - children = ( - F09548211883F15400E8A69B /* Base */, - F09548421883F51B00E8A69B /* ru */, - F0AF06FA1A24BA770086C9C1 /* ar */, - 8CBD7BC320B6B87700E5DCC0 /* fr */, - 6187B1C924B3271D00D580FB /* hu */, - ); - name = HistoryListView.xib; - sourceTree = ""; - }; - D38187E015FE348A00C3EDCA /* AssistantView.xib */ = { - isa = PBXVariantGroup; - children = ( - F095482E1883F15500E8A69B /* Base */, - F095485A1883F67B00E8A69B /* ru */, - F0AF070F1A24BA770086C9C1 /* ar */, - 8CBD7BB120B6B86900E5DCC0 /* fr */, - 6187B1B724B3271600D580FB /* hu */, - ); - name = AssistantView.xib; - sourceTree = ""; - }; - D38187FB15FE355D00C3EDCA /* TabBarView.xib */ = { - isa = PBXVariantGroup; - children = ( - F095482C1883F15400E8A69B /* Base */, - F09548561883F61600E8A69B /* ru */, - F0AF070A1A24BA770086C9C1 /* ar */, - 8CBD7BDA20B6B89000E5DCC0 /* fr */, - 6187B1E024B3272700D580FB /* hu */, - ); - name = TabBarView.xib; - path = LinphoneUI; - sourceTree = ""; - }; - D3D5126A160B3A8E00946DF8 /* AssistantViewScreens.xib */ = { - isa = PBXVariantGroup; - children = ( - F09548301883F15500E8A69B /* Base */, - F095485E1883F6EA00E8A69B /* ru */, - F0AF07111A24BA770086C9C1 /* ar */, - 8CBD7BB220B6B86A00E5DCC0 /* fr */, - 6187B1B824B3271600D580FB /* hu */, - ); - name = AssistantViewScreens.xib; - sourceTree = ""; - }; - EA8CB82D239F96CA00C330CC /* MainInterface.storyboard */ = { - isa = PBXVariantGroup; - children = ( - EA8CB82E239F96CA00C330CC /* Base */, - ); - name = MainInterface.storyboard; - sourceTree = ""; - }; - F088488D19FF8C41007FFCF3 /* UIContactCell.xib */ = { - isa = PBXVariantGroup; - children = ( - F088488C19FF8C41007FFCF3 /* Base */, - F0AF07061A24BA770086C9C1 /* ar */, - 8CBD7BD120B6B88500E5DCC0 /* fr */, - 6187B1D724B3272300D580FB /* hu */, - ); - name = UIContactCell.xib; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 1D6058940D05DD3E006BFB54 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 1A10E1CD088B6550326F433E /* Pods-linphone.debug.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO; - CLANG_WARN_UNREACHABLE_CODE = NO; - CODE_SIGN_ENTITLEMENTS = linphone.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COMPRESS_PNG_FILES = NO; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 4; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = linphone_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - "DEBUG=1", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; - GCC_TREAT_WARNINGS_AS_ERRORS = NO; - GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO; - HEADER_SEARCH_PATHS = ( - "$(SRCROOT)/Classes/Utils/XMLRPC/", - "$(SRCROOT)/Classes/Utils/NinePatch/", - "$(inherited)", - ); - IBC_MODULE = linphoneapp; - IBSC_MODULE = linphoneapp; - INFOPLIST_FILE = "linphone-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(BUILT_PRODUCTS_DIR)", - "$(inherited)", - ); - LINK_WITH_STANDARD_LIBRARIES = YES; - MARKETING_VERSION = 4.7.0; - OTHER_CFLAGS = ( - "-DBCTBX_LOG_DOMAIN=\\\"ios\\\"", - "-DCHECK_VERSION_UPDATE=FALSE", - "-DENABLE_QRCODE=TRUE", - "-DENABLE_SMS_INVITE=TRUE", - "$(inherited)", - "-DLINPHONE_SDK_VERSION=\\\"5.2.0-alpha.319+f1bc379e\\\"", - ); - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone; - PRODUCT_MODULE_NAME = "$(PRODUCT_NAME:c99extidentifier)app"; - PRODUCT_NAME = linphone; - PROVISIONING_PROFILE = ""; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = NO; - STRIP_SWIFT_SYMBOLS = NO; - SWIFT_OBJC_BRIDGING_HEADER = "Classes/linphone-Bridging-Header.h"; - SWIFT_OBJC_INTERFACE_HEADER_NAME = "linphoneapp-Swift.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - WARNING_CFLAGS = ( - "-Werror=objc-method-access", - "-Werror=incomplete-implementation", - "-Wno-error-deprecated", - ); - }; - name = Debug; - }; - 228B19A61302902F00F154D3 /* DistributionAdhoc */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LIBRARY = "compiler-default"; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = NO; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ""; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LIBRARY_SEARCH_PATHS = ""; - ONLY_ACTIVE_ARCH = NO; - OTHER_CFLAGS = "-DBCTBX_LOG_DOMAIN=\\\"ios\\\""; - OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)"; - PROVISIONING_PROFILE = ""; - "PROVISIONING_PROFILE[arch=*]" = ""; - SDKROOT = iphoneos; - STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; - TARGETED_DEVICE_FAMILY = "1,2"; - VALID_ARCHS = "arm64 armv7 i386 x86_64"; - }; - name = DistributionAdhoc; - }; - 228B19A71302902F00F154D3 /* DistributionAdhoc */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 6872242062F852BE19E78D5A /* Pods-linphone.distributionadhoc.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO; - CLANG_WARN_UNREACHABLE_CODE = NO; - CODE_SIGN_ENTITLEMENTS = linphone.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COMPRESS_PNG_FILES = NO; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 4; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = s; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = linphone_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; - GCC_TREAT_WARNINGS_AS_ERRORS = NO; - GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO; - HEADER_SEARCH_PATHS = ( - "$(SRCROOT)/Classes/Utils/XMLRPC/", - "$(SRCROOT)/Classes/Utils/NinePatch/", - "$(inherited)", - ); - IBC_MODULE = linphoneapp; - IBSC_MODULE = linphoneapp; - INFOPLIST_FILE = "linphone-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(BUILT_PRODUCTS_DIR)", - "$(inherited)", - ); - LINK_WITH_STANDARD_LIBRARIES = YES; - MARKETING_VERSION = 4.7.0; - OTHER_CFLAGS = ( - "-DBCTBX_LOG_DOMAIN=\\\"ios\\\"", - "-DCHECK_VERSION_UPDATE=FALSE", - "-DENABLE_QRCODE=TRUE", - "-DENABLE_SMS_INVITE=TRUE", - "$(inherited)", - "-DLINPHONE_SDK_VERSION=\\\"5.2.0-alpha.319+f1bc379e\\\"", - ); - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone; - PRODUCT_MODULE_NAME = "$(PRODUCT_NAME:c99extidentifier)app"; - PRODUCT_NAME = linphone; - PROVISIONING_PROFILE = ""; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = NO; - STRIP_SWIFT_SYMBOLS = NO; - SWIFT_OBJC_BRIDGING_HEADER = "Classes/linphone-Bridging-Header.h"; - SWIFT_OBJC_INTERFACE_HEADER_NAME = "linphoneapp-Swift.h"; - SWIFT_VERSION = 5.0; - WARNING_CFLAGS = ( - "-Werror=objc-method-access", - "-Werror=incomplete-implementation", - "-Wno-error-deprecated", - ); - }; - name = DistributionAdhoc; - }; - 22F3D55513CC3C9100A0DA02 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LIBRARY = "compiler-default"; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = NO; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ""; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LIBRARY_SEARCH_PATHS = ""; - ONLY_ACTIVE_ARCH = NO; - OTHER_CFLAGS = "-DBCTBX_LOG_DOMAIN=\\\"ios\\\""; - OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)"; - PROVISIONING_PROFILE = ""; - SDKROOT = iphoneos; - STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; - SWIFT_COMPILATION_MODE = wholemodule; - TARGETED_DEVICE_FAMILY = "1,2"; - VALID_ARCHS = "arm64 armv7 i386 x86_64"; - }; - name = Release; - }; - 22F3D55613CC3C9100A0DA02 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FDB59567FECF2E083DBDC142 /* Pods-linphone.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO; - CLANG_WARN_UNREACHABLE_CODE = NO; - CODE_SIGN_ENTITLEMENTS = linphone.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COMPRESS_PNG_FILES = NO; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 4; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = s; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = linphone_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; - GCC_TREAT_WARNINGS_AS_ERRORS = NO; - GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO; - HEADER_SEARCH_PATHS = ( - "$(SRCROOT)/Classes/Utils/XMLRPC/", - "$(SRCROOT)/Classes/Utils/NinePatch/", - "$(inherited)", - ); - IBC_MODULE = linphoneapp; - IBSC_MODULE = linphoneapp; - INFOPLIST_FILE = "linphone-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(BUILT_PRODUCTS_DIR)", - "$(inherited)", - ); - LINK_WITH_STANDARD_LIBRARIES = YES; - MARKETING_VERSION = 4.7.0; - OTHER_CFLAGS = ( - "-DBCTBX_LOG_DOMAIN=\\\"ios\\\"", - "-DCHECK_VERSION_UPDATE=FALSE", - "-DENABLE_QRCODE=TRUE", - "-DENABLE_SMS_INVITE=TRUE", - "$(inherited)", - "-DLINPHONE_SDK_VERSION=\\\"5.2.0-alpha.319+f1bc379e\\\"", - ); - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone; - PRODUCT_MODULE_NAME = "$(PRODUCT_NAME:c99extidentifier)app"; - PRODUCT_NAME = linphone; - PROVISIONING_PROFILE = ""; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = NO; - STRIP_SWIFT_SYMBOLS = NO; - SWIFT_OBJC_BRIDGING_HEADER = "Classes/linphone-Bridging-Header.h"; - SWIFT_OBJC_INTERFACE_HEADER_NAME = "linphoneapp-Swift.h"; - SWIFT_VERSION = 5.0; - WARNING_CFLAGS = ( - "-Werror=objc-method-access", - "-Werror=incomplete-implementation", - "-Wno-error-deprecated", - ); - }; - name = Release; - }; - 22F51EE7107FA53D00F98953 /* Distribution */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LIBRARY = "compiler-default"; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = NO; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ""; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LIBRARY_SEARCH_PATHS = ""; - ONLY_ACTIVE_ARCH = NO; - OTHER_CFLAGS = "-DBCTBX_LOG_DOMAIN=\\\"ios\\\""; - OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)"; - PROVISIONING_PROFILE = ""; - SDKROOT = iphoneos; - STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; - TARGETED_DEVICE_FAMILY = "1,2"; - VALID_ARCHS = "arm64 armv7 i386 x86_64"; - }; - name = Distribution; - }; - 22F51EE8107FA53D00F98953 /* Distribution */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 71361846551F180407CA4B43 /* Pods-linphone.distribution.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO; - CLANG_WARN_UNREACHABLE_CODE = NO; - CODE_SIGN_ENTITLEMENTS = linphone.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COMPRESS_PNG_FILES = NO; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 4; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = s; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = linphone_Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; - GCC_TREAT_WARNINGS_AS_ERRORS = NO; - GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO; - HEADER_SEARCH_PATHS = ( - "$(SRCROOT)/Classes/Utils/XMLRPC/", - "$(SRCROOT)/Classes/Utils/NinePatch/", - "$(inherited)", - ); - IBC_MODULE = linphoneapp; - IBSC_MODULE = linphoneapp; - INFOPLIST_FILE = "linphone-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(BUILT_PRODUCTS_DIR)", - "$(inherited)", - ); - LINK_WITH_STANDARD_LIBRARIES = YES; - MARKETING_VERSION = 4.7.0; - OTHER_CFLAGS = ( - "-DBCTBX_LOG_DOMAIN=\\\"ios\\\"", - "-DCHECK_VERSION_UPDATE=FALSE", - "-DENABLE_QRCODE=TRUE", - "-DENABLE_SMS_INVITE=TRUE", - "$(inherited)", - "-DLINPHONE_SDK_VERSION=\\\"5.2.0-alpha.319+f1bc379e\\\"", - ); - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone; - PRODUCT_MODULE_NAME = "$(PRODUCT_NAME:c99extidentifier)app"; - PRODUCT_NAME = linphone; - PROVISIONING_PROFILE = ""; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = NO; - STRIP_SWIFT_SYMBOLS = NO; - SWIFT_OBJC_BRIDGING_HEADER = "Classes/linphone-Bridging-Header.h"; - SWIFT_OBJC_INTERFACE_HEADER_NAME = "linphoneapp-Swift.h"; - SWIFT_VERSION = 5.0; - WARNING_CFLAGS = ( - "-Werror=objc-method-access", - "-Werror=incomplete-implementation", - "-Wno-error-deprecated", - ); - }; - name = Distribution; - }; - 61AE365720C00B370089D9D3 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = linphoneExtension/linphoneExtension.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 4; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = linphoneExtension/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.2; - MARKETING_VERSION = 4.7.0; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.linphoneExtension; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; - SKIP_INSTALL = YES; - STRIP_SWIFT_SYMBOLS = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 61AE365820C00B370089D9D3 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = linphoneExtension/linphoneExtension.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 4; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = linphoneExtension/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.2; - MARKETING_VERSION = 4.7.0; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.linphoneExtension; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - STRIP_SWIFT_SYMBOLS = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 61AE365920C00B370089D9D3 /* Distribution */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = linphoneExtension/linphoneExtension.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 4; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = linphoneExtension/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.2; - MARKETING_VERSION = 4.7.0; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.linphoneExtension; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; - SKIP_INSTALL = YES; - STRIP_SWIFT_SYMBOLS = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Distribution; - }; - 61AE365A20C00B370089D9D3 /* DistributionAdhoc */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = linphoneExtension/linphoneExtension.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 4; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = linphoneExtension/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.2; - MARKETING_VERSION = 4.7.0; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.linphoneExtension; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; - SKIP_INSTALL = YES; - STRIP_SWIFT_SYMBOLS = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = DistributionAdhoc; - }; -<<<<<<< HEAD - 6637AF95288593AF00965733 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 95AD7F004071737738D4BCF2 /* Pods-CallUITests.debug.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = Z2V957B3D6; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"${PODS_CONFIGURATION_BUILD_DIR}/linphone-sdk\"", - "\"${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/XCFrameworks\"", - "\"${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk\"", - "\"${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks\"", - "\"${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension\"", - "\"${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/basic-frameworks\"", - ); - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - "DEBUG=1", - ); - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "CallUITests-Info.plist"; - INFOPLIST_KEY_UIRequiredDeviceCapabilities = "wifi microphone"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; - MARKETING_VERSION = 1.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.IncommingCallUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - REEXPORTED_FRAMEWORK_NAMES = ""; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_OBJC_BRIDGING_HEADER = ""; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = linphone; - }; - name = Debug; - }; - 6637AF96288593AF00965733 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8751F1E7083FF5EDF43CEEF1 /* Pods-CallUITests.release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "CallUITests-Info.plist"; - INFOPLIST_KEY_UIRequiredDeviceCapabilities = "wifi microphone"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; - MARKETING_VERSION = 1.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.IncommingCallUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_OBJC_BRIDGING_HEADER = ""; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = linphone; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 6637AF97288593AF00965733 /* Distribution */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 1CAD1CF40E820DA7F1752DD2 /* Pods-CallUITests.distribution.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "CallUITests-Info.plist"; - INFOPLIST_KEY_UIRequiredDeviceCapabilities = "wifi microphone"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; - MARKETING_VERSION = 1.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.IncommingCallUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_OBJC_BRIDGING_HEADER = ""; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = linphone; - VALIDATE_PRODUCT = YES; - }; - name = Distribution; - }; - 6637AF98288593AF00965733 /* DistributionAdhoc */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9B3B6B861461E656FAF443CC /* Pods-CallUITests.distributionadhoc.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "CallUITests-Info.plist"; - INFOPLIST_KEY_UIRequiredDeviceCapabilities = "wifi microphone"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; - MARKETING_VERSION = 1.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.IncommingCallUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_OBJC_BRIDGING_HEADER = ""; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = linphone; - VALIDATE_PRODUCT = YES; - }; - name = DistributionAdhoc; - }; -======= ->>>>>>> 8e16f1fad (new test plans) - 6637AF95288593AF00965733 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 46E204586EADEB152EB6BAE5 /* Pods-CallUITests.debug.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = Z2V957B3D6; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"${PODS_CONFIGURATION_BUILD_DIR}/linphone-sdk\"", - "\"${PODS_ROOT}/linphone-sdk/linphone-sdk/apple-darwin/XCFrameworks\"", - "\"${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk\"", - "\"${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/all-frameworks\"", - "\"${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/app-extension\"", - "\"${PODS_XCFRAMEWORKS_BUILD_DIR}/linphone-sdk/basic-frameworks\"", - ); - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - "DEBUG=1", - ); - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = ""; - INFOPLIST_KEY_NSBluetoothPeripheralUsageDescription = "Use your BT headset"; - INFOPLIST_KEY_UIRequiredDeviceCapabilities = "wifi microphone"; - IPHONEOS_DEPLOYMENT_TARGET = 15.5; - LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; - MARKETING_VERSION = 1.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.IncommingCallUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - REEXPORTED_FRAMEWORK_NAMES = ""; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = linphone; - }; - name = Debug; - }; - 6637AF96288593AF00965733 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 6A6A835733F8DCF0F0E64FE3 /* Pods-CallUITests.release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = ""; - INFOPLIST_KEY_NSBluetoothPeripheralUsageDescription = "Use your BT headset"; - INFOPLIST_KEY_UIRequiredDeviceCapabilities = "wifi microphone"; - IPHONEOS_DEPLOYMENT_TARGET = 15.5; - LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; - MARKETING_VERSION = 1.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.IncommingCallUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = linphone; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 6637AF97288593AF00965733 /* Distribution */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 5F0358460E4E618A3DC6E2E8 /* Pods-CallUITests.distribution.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = ""; - INFOPLIST_KEY_NSBluetoothPeripheralUsageDescription = "Use your BT headset"; - INFOPLIST_KEY_UIRequiredDeviceCapabilities = "wifi microphone"; - IPHONEOS_DEPLOYMENT_TARGET = 15.5; - LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; - MARKETING_VERSION = 1.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.IncommingCallUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = linphone; - VALIDATE_PRODUCT = YES; - }; - name = Distribution; - }; - 6637AF98288593AF00965733 /* DistributionAdhoc */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = D33A6E8F86694EA7ADD47ED4 /* Pods-CallUITests.distributionadhoc.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = ""; - INFOPLIST_KEY_NSBluetoothPeripheralUsageDescription = "Use your BT headset"; - INFOPLIST_KEY_UIRequiredDeviceCapabilities = "wifi microphone"; - IPHONEOS_DEPLOYMENT_TARGET = 15.5; - LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; - MARKETING_VERSION = 1.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.IncommingCallUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = linphone; - VALIDATE_PRODUCT = YES; - }; - name = DistributionAdhoc; - }; - 66495D02288FF346002780DE /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 712CE82EEF35C1881B8E98E7 /* Pods-AutoConnectLinphoneAccount.debug.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = Z2V957B3D6; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.5; - MARKETING_VERSION = 1.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.AutoConnectLinphoneAccount; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/linphone.app/linphone"; - }; - name = Debug; - }; - 66495D03288FF346002780DE /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = DBEE6C9BCFA78E5739836EB4 /* Pods-AutoConnectLinphoneAccount.release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.5; - MARKETING_VERSION = 1.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.AutoConnectLinphoneAccount; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/linphone.app/linphone"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 66495D04288FF346002780DE /* Distribution */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = B4847F48A899455D4B85F8BF /* Pods-AutoConnectLinphoneAccount.distribution.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.5; - MARKETING_VERSION = 1.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.AutoConnectLinphoneAccount; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/linphone.app/linphone"; - VALIDATE_PRODUCT = YES; - }; - name = Distribution; - }; - 66495D05288FF346002780DE /* DistributionAdhoc */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F0E0078E5C72D700C9E62509 /* Pods-AutoConnectLinphoneAccount.distributionadhoc.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.5; - MARKETING_VERSION = 1.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.AutoConnectLinphoneAccount; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/linphone.app/linphone"; - VALIDATE_PRODUCT = YES; - }; - name = DistributionAdhoc; - }; - C01FCF4F08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LIBRARY = "compiler-default"; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_THUMB_SUPPORT = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = NO; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ""; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LIBRARY_SEARCH_PATHS = ""; - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = "-DBCTBX_LOG_DOMAIN=\\\"ios\\\""; - OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)"; - SDKROOT = iphoneos; - STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; - TARGETED_DEVICE_FAMILY = "1,2"; - VALID_ARCHS = "arm64 armv7 i386 x86_64"; - }; - name = Debug; - }; - EA5F25E2232BD3E300475F2E /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = AD31E0BAAE2E50305E05B683 /* Pods-msgNotificationService.debug.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = msgNotificationService/msgNotificationService.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 4; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - "DEBUG=1", - ); - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "$(SRCROOT)/msgNotificationService/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 11.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.7.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.msgNotificationService; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - EA5F25E3232BD3E300475F2E /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 49BCAA5D96F3C5BE44D20A5C /* Pods-msgNotificationService.release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = msgNotificationService/msgNotificationService.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 4; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "$(SRCROOT)/msgNotificationService/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 11.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.7.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.msgNotificationService; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - EA5F25E4232BD3E300475F2E /* Distribution */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3EDEA8FA8B616DA71EDE51E5 /* Pods-msgNotificationService.distribution.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = msgNotificationService/msgNotificationService.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 4; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "$(SRCROOT)/msgNotificationService/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 11.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.7.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.msgNotificationService; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Distribution; - }; - EA5F25E5232BD3E300475F2E /* DistributionAdhoc */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A52DBCC32989FB3510AF3B1E /* Pods-msgNotificationService.distributionadhoc.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = msgNotificationService/msgNotificationService.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 4; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = "$(SRCROOT)/msgNotificationService/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 11.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.7.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.msgNotificationService; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = DistributionAdhoc; - }; - EA8CB835239F96CA00C330CC /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = B0D404E542E5871F7437A060 /* Pods-msgNotificationContent.debug.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = msgNotificationContent/msgNotificationContent.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 4; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - "DEBUG=1", - ); - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = msgNotificationContent/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.7.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.msgNotificationContent; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - EA8CB836239F96CA00C330CC /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 842B7EC5D5497903DF48A6A1 /* Pods-msgNotificationContent.release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = msgNotificationContent/msgNotificationContent.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 4; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = msgNotificationContent/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.7.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.msgNotificationContent; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - EA8CB837239F96CA00C330CC /* Distribution */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 5BF3D86E8AD8910810048241 /* Pods-msgNotificationContent.distribution.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = msgNotificationContent/msgNotificationContent.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 4; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = msgNotificationContent/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.7.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.msgNotificationContent; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Distribution; - }; - EA8CB838239F96CA00C330CC /* DistributionAdhoc */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 595A41ABC48A62CE11868F9E /* Pods-msgNotificationContent.distributionadhoc.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = msgNotificationContent/msgNotificationContent.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 4; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = Z2V957B3D6; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - INFOPLIST_FILE = msgNotificationContent/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.7.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = org.linphone.phone.msgNotificationContent; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = DistributionAdhoc; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "linphone" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1D6058940D05DD3E006BFB54 /* Debug */, - 22F3D55613CC3C9100A0DA02 /* Release */, - 22F51EE8107FA53D00F98953 /* Distribution */, - 228B19A71302902F00F154D3 /* DistributionAdhoc */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; - 61AE366120C00B370089D9D3 /* Build configuration list for PBXNativeTarget "linphoneExtension" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 61AE365720C00B370089D9D3 /* Debug */, - 61AE365820C00B370089D9D3 /* Release */, - 61AE365920C00B370089D9D3 /* Distribution */, - 61AE365A20C00B370089D9D3 /* DistributionAdhoc */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; - 6637AF99288593AF00965733 /* Build configuration list for PBXNativeTarget "CallUITests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 6637AF95288593AF00965733 /* Debug */, - 6637AF96288593AF00965733 /* Release */, - 6637AF97288593AF00965733 /* Distribution */, - 6637AF98288593AF00965733 /* DistributionAdhoc */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; - 66495D01288FF346002780DE /* Build configuration list for PBXNativeTarget "AutoConnectLinphoneAccount" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 66495D02288FF346002780DE /* Debug */, - 66495D03288FF346002780DE /* Release */, - 66495D04288FF346002780DE /* Distribution */, - 66495D05288FF346002780DE /* DistributionAdhoc */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; - C01FCF4E08A954540054247B /* Build configuration list for PBXProject "linphone" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF4F08A954540054247B /* Debug */, - 22F3D55513CC3C9100A0DA02 /* Release */, - 22F51EE7107FA53D00F98953 /* Distribution */, - 228B19A61302902F00F154D3 /* DistributionAdhoc */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; - EA5F25E1232BD3E300475F2E /* Build configuration list for PBXNativeTarget "msgNotificationService" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - EA5F25E2232BD3E300475F2E /* Debug */, - EA5F25E3232BD3E300475F2E /* Release */, - EA5F25E4232BD3E300475F2E /* Distribution */, - EA5F25E5232BD3E300475F2E /* DistributionAdhoc */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; - EA8CB834239F96CA00C330CC /* Build configuration list for PBXNativeTarget "msgNotificationContent" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - EA8CB835239F96CA00C330CC /* Debug */, - EA8CB836239F96CA00C330CC /* Release */, - EA8CB837239F96CA00C330CC /* Distribution */, - EA8CB838239F96CA00C330CC /* DistributionAdhoc */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; -/* End XCConfigurationList section */ - }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; -} diff --git a/linphone.xcodeproj/xcshareddata/xcschemes/linphone.xcscheme b/linphone.xcodeproj/xcshareddata/xcschemes/linphone.xcscheme deleted file mode 100644 index 724eef3ca..000000000 --- a/linphone.xcodeproj/xcshareddata/xcschemes/linphone.xcscheme +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/linphone.xcodeproj/xcshareddata/xcschemes/linphone.xcscheme.orig b/linphone.xcodeproj/xcshareddata/xcschemes/linphone.xcscheme.orig deleted file mode 100644 index bd9e38ae8..000000000 --- a/linphone.xcodeproj/xcshareddata/xcschemes/linphone.xcscheme.orig +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - - - - - - - >>>>>> 8e16f1fad (new test plans) - reference = "container:UITests/TestPlans/Default.xctestplan" - default = "YES"> - - - - - - - - - - - - - - - - - - - - - - - - - - >>>>>> 8e16f1fad (new test plans) - skipped = "NO" - testExecutionOrdering = "random"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/linphone.xcworkspace/contents.xcworkspacedata b/linphone.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index ea0a8d734..000000000 --- a/linphone.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/linphone.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/linphone.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003..000000000 --- a/linphone.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/linphoneExtension/Base.lproj/MainInterface.storyboard b/linphoneExtension/Base.lproj/MainInterface.storyboard deleted file mode 100644 index a14188503..000000000 --- a/linphoneExtension/Base.lproj/MainInterface.storyboard +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/linphoneExtension/Info.plist b/linphoneExtension/Info.plist deleted file mode 100644 index b1d0000b0..000000000 --- a/linphoneExtension/Info.plist +++ /dev/null @@ -1,51 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - linphone - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - XPC! - CFBundleShortVersionString - $(MARKETING_VERSION) - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - NSExtension - - NSExtensionAttributes - - NSExtensionActivationRule - - NSExtensionActivationSupportsAttachmentsWithMaxCount - 1 - NSExtensionActivationSupportsFileWithMaxCount - 1 - NSExtensionActivationSupportsImageWithMaxCount - 1 - NSExtensionActivationSupportsMovieWithMaxCount - 1 - NSExtensionActivationSupportsText - - NSExtensionActivationSupportsWebPageWithMaxCount - 1 - NSExtensionActivationSupportsWebURLWithMaxCount - 1 - - - NSExtensionMainStoryboard - MainInterface - NSExtensionPointIdentifier - com.apple.share-services - - - diff --git a/linphoneExtension/ShareViewController.h b/linphoneExtension/ShareViewController.h deleted file mode 100644 index 795288fd3..000000000 --- a/linphoneExtension/ShareViewController.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import - - -#define SUPPORTED_EXTENTIONS @[@"public.jpeg",@"com.compuserve.gif",@"public.url",@"public.movie",@"com.apple.mapkit.map-item",@"com.adobe.pdf",@"public.png",@"public.image", @"public.data", @"public.text"] - -@interface ShareViewController : SLComposeServiceViewController - -@end diff --git a/linphoneExtension/ShareViewController.m b/linphoneExtension/ShareViewController.m deleted file mode 100644 index 30bf03f1e..000000000 --- a/linphoneExtension/ShareViewController.m +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import "ShareViewController.h" - -@interface ShareViewController () - -@end - -@implementation ShareViewController - -- (BOOL)isContentValid { - // Do validation of contentText and/or NSExtensionContext attachments here - return YES; -} - - -- (void)didSelectPost { - NSString* groupName = [NSString stringWithFormat:@"group.%@",[[NSBundle mainBundle] bundleIdentifier]]; - NSLog(@"[SHARE EXTENSTION] using group name inside EXTENSION %@",groupName); - // This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments. - BOOL support = TRUE; - // Inform the host that we're done, so it un-blocks its UI. Note: Alternatively you could call super's -didSelectPost, which will similarly complete the extension context. - for (NSExtensionItem *item in self.extensionContext.inputItems) { - for (NSItemProvider *provider in item.attachments) { - NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:groupName]; - // TODO: Use [provider registeredTypeIdentifiersWithFileOptions:0]; to get all type identifiers of the provider instead of this if/else if structure - support = TRUE; - bool found = false; - for (NSString *ti in SUPPORTED_EXTENTIONS) { - if ([provider hasItemConformingToTypeIdentifier:ti]) { - found=true; - [self loadItem:provider typeIdentifier:ti defaults:defaults]; - // Send only one item - return; - } - } - if (!found){ - NSLog(@"Unkown itemprovider = %@", provider); - support = false; - } - } - } - if (!support) - [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 @[]; -} - -- (NSString *)cacheDirectory { - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); - NSString *cachePath = [paths objectAtIndex:0]; - BOOL isDir = NO; - NSError *error; - if (![[NSFileManager defaultManager] fileExistsAtPath:cachePath isDirectory:&isDir] && isDir == NO) { - [[NSFileManager defaultManager] createDirectoryAtPath:cachePath - withIntermediateDirectories:NO - attributes:nil - error:&error]; - } - return cachePath; -} - --(void) nsDataWrite:(NSData *)data { - NSString* groupName = [NSString stringWithFormat:@"group.%@",[[NSBundle mainBundle] bundleIdentifier]]; - NSError *error = nil; - NSString *path =[[[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:groupName] path]; - NSString *fullCacheFilePathPath = [NSString stringWithFormat:@"%@/%@",path,@"nsData"]; - [[NSFileManager defaultManager] removeItemAtURL:[NSURL fileURLWithPath:fullCacheFilePathPath] error:&error]; - if (![data writeToFile:fullCacheFilePathPath atomically:YES]) { - NSLog(@"nsDataWrite error"); - } -} - -- (void)loadItem:(NSItemProvider *)provider typeIdentifier:(NSString *)typeIdentifier defaults:(NSUserDefaults *)defaults { - [provider loadItemForTypeIdentifier:typeIdentifier options:nil completionHandler:^(id _Nullable item, NSError * _Null_unspecified error) { - if([(NSObject*)item isKindOfClass:[NSURL class]]) { - NSURL *url = (NSURL *)item; - NSData *nsData = [NSData dataWithContentsOfURL:url]; - - if (nsData) { - NSString *imgPath = url.path; - NSString *filename = [imgPath lastPathComponent]; - if([imgPath containsString:@"var/mobile/Media/PhotoData"]) { - // We get the corresponding PHAsset identifier so we can display the image in the app without having to duplicate it. - NSDictionary *dict = @{@"url" : filename, - @"message" : self.contentText}; - [self nsDataWrite:nsData]; - [defaults setObject:dict forKey:@"photoData"]; - } else if ([imgPath containsString:@"var/mobile/Library/Mobile Documents/com~apple~CloudDocs"] || [[url scheme] isEqualToString:@"file"]) { - // shared files from icloud drive - NSDictionary *dict = @{@"url" : filename, - @"message" : self.contentText}; - [self nsDataWrite:nsData]; - [defaults setObject:dict forKey:@"icloudData"]; - } else { - NSDictionary *dict = @{@"url" : [url absoluteString], - @"message" : self.contentText}; - [defaults setObject:dict forKey:@"url"]; - } - } else { - //Others - NSDictionary *dict = @{@"url" : [url absoluteString], - @"message" : self.contentText}; - [defaults setObject:dict forKey:@"url"]; - } - - [self respondUrl:defaults]; - } else if ([(NSObject*)item isKindOfClass:[UIImage class]]) { - UIImage *image = (UIImage*)item; - NSDictionary *dict = @{@"url" : [NSString stringWithFormat:@"IMAGE_%f.PNG", [[NSDate date] timeIntervalSince1970]], - @"message" : self.contentText}; - [self nsDataWrite:UIImagePNGRepresentation(image)]; - [defaults setObject:dict forKey:@"photoData"]; - - [self respondUrl:defaults]; - } else { - //share text - NSLog(@"Unsupported provider = %@", provider); - [self.extensionContext completeRequestReturningItems:@[] completionHandler:nil]; - } - }]; -} - -- (void)respondUrl:(NSUserDefaults *)defaults { - UIResponder *responder = self; - while (responder != nil) { - if ([responder respondsToSelector:@selector(openURL:)]) { - [responder performSelector:@selector(openURL:) - withObject:[NSURL URLWithString:@"message-linphone://" ]]; - [self.extensionContext completeRequestReturningItems:@[] completionHandler:nil]; - break; - } - responder = [responder nextResponder]; - } - [defaults synchronize]; -} - -@end diff --git a/linphoneExtension/linphoneExtension.entitlements b/linphoneExtension/linphoneExtension.entitlements deleted file mode 100644 index 36778db04..000000000 --- a/linphoneExtension/linphoneExtension.entitlements +++ /dev/null @@ -1,10 +0,0 @@ - - - - - com.apple.security.application-groups - - group.org.linphone.phone.linphoneExtension - - - diff --git a/linphone_Prefix.pch b/linphone_Prefix.pch deleted file mode 100644 index 60e104960..000000000 --- a/linphone_Prefix.pch +++ /dev/null @@ -1,16 +0,0 @@ -// -// Prefix header for all source files of the 'linphone' target in the 'linphone' project -// - -#ifdef __OBJC__ - #import - #import -#endif - -#import "Log.h" -#import "Utils.h" -#import "Contact.h" - -#import "UIToggleButton.h" - -#import "UIChatBubbleTextCell.h" diff --git a/main.m b/main.m deleted file mode 100644 index 2a64d0d9a..000000000 --- a/main.m +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-iphone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#import -#import "LinphoneAppDelegate.h" - -#ifdef DEBUG - -// Dump exception -void uncaughtExceptionHandler(NSException *exception) { - NSLog(@"Crash: %@", exception); - NSLog(@"Stack Trace: %@", [exception callStackSymbols]); - // Internal error reporting -}; - -#endif - -int main(int argc, char *argv[]) { -#ifdef DEBUG - NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); -#endif - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([LinphoneAppDelegate class])); - } -} diff --git a/msgNotification/Utils.swift b/msgNotification/Utils.swift deleted file mode 100644 index 72468a525..000000000 --- a/msgNotification/Utils.swift +++ /dev/null @@ -1,116 +0,0 @@ -/* -* Copyright (c) 2010-2020 Belledonne Communications SARL. -* -* This file is part of linphone-iphone -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*/ - -import linphonesw -import os -#if USE_CRASHLYTICS -import Firebase -#endif - -enum LinphoneError: Error { - case timeout - case loggingServiceUninitialized -} - -class LinphoneLoggingServiceManager: LoggingServiceDelegate { - init(config: Config, log: LoggingService?, domain: String) throws { - if let log = log { - 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.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) - log.addDelegate(delegate: self) - } else { - throw LinphoneError.loggingServiceUninitialized - } - } - - let levelToOSleLogLevel :[Int: OSLogType] = - [LogLevel.Debug.rawValue:.debug, - LogLevel.Trace.rawValue:.info, - LogLevel.Message.rawValue:.info, - LogLevel.Warning.rawValue:.error, - LogLevel.Error.rawValue:.error, - LogLevel.Fatal.rawValue:.fault]; - - func onLogMessageWritten(logService: LoggingService, domain: String, level: LogLevel, message: String) { - let levelStr: String - - switch level { - case .Debug: - levelStr = "Debug" - case .Trace: - levelStr = "Trace" - case .Message: - levelStr = "Message" - case .Warning: - levelStr = "Warning" - case .Error: - levelStr = "Error" - case .Fatal: - levelStr = "Fatal" - default: - levelStr = "unknown" - } - -#if USE_CRASHLYTICS - Crashlytics.crashlytics().log("\(levelStr) [\(domain)] \(message)\n") -#endif - if #available(iOS 10.0, *) { - os_log("%{public}@", type: levelToOSleLogLevel[level.rawValue] ?? .info,message) - } else { - NSLog("\(levelStr) [\(domain)] \(message)\n") - } - } -} - -extension String { - func getDisplayNameFromSipAddress(lc:Core, logger:LoggingService, groupId:String) -> String? { - logger.message(message: "looking for display name for \(self)") - - - let defaults = UserDefaults.init(suiteName: groupId) - let addressBook = defaults?.dictionary(forKey: "addressBook") - - if (addressBook == nil) { - logger.message(message: "address book not found in userDefaults") - return nil - } - - var usePrefix = true; - if let account = lc.defaultAccount, let params = account.params { - usePrefix = params.useInternationalPrefixForCallsAndChats - } - - if let simpleAddr = lc.interpretUrl(url: self, applyInternationalPrefix: usePrefix) { - simpleAddr.clean() - let nomalSipaddr = simpleAddr.asString() - if let displayName = addressBook?[nomalSipaddr] as? String { - logger.message(message: "display name for \(self): \(displayName)") - return displayName - } - } - - logger.message(message: "display name for \(self) not found in userDefaults") - return nil - } -} diff --git a/msgNotificationContent/Base.lproj/MainInterface.storyboard b/msgNotificationContent/Base.lproj/MainInterface.storyboard deleted file mode 100644 index 5d49f3ef0..000000000 --- a/msgNotificationContent/Base.lproj/MainInterface.storyboard +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/msgNotificationContent/GoogleService-Info.plist b/msgNotificationContent/GoogleService-Info.plist deleted file mode 100644 index 7d4266485..000000000 --- a/msgNotificationContent/GoogleService-Info.plist +++ /dev/null @@ -1,36 +0,0 @@ - - - - - CLIENT_ID - - REVERSED_CLIENT_ID - - API_KEY - - GCM_SENDER_ID - - PLIST_VERSION - 1 - BUNDLE_ID - org.linphone.phone.msgNotificationContent - PROJECT_ID - linphone-iphone - STORAGE_BUCKET - linphone-iphone.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - - DATABASE_URL - - - diff --git a/msgNotificationContent/Info.plist b/msgNotificationContent/Info.plist deleted file mode 100644 index 9886453ec..000000000 --- a/msgNotificationContent/Info.plist +++ /dev/null @@ -1,42 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - msgNotificationContent - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - XPC! - CFBundleShortVersionString - $(MARKETING_VERSION) - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - NSExtension - - NSExtensionAttributes - - UNNotificationExtensionCategory - msg_cat - UNNotificationExtensionDefaultContentHidden - - UNNotificationExtensionInitialContentSizeRatio - 0.01 - UNNotificationExtensionOverridesDefaultTitle - - - NSExtensionMainStoryboard - MainInterface - NSExtensionPointIdentifier - com.apple.usernotifications.content-extension - - - diff --git a/msgNotificationContent/NotificationViewController.swift b/msgNotificationContent/NotificationViewController.swift deleted file mode 100644 index 38aa98d14..000000000 --- a/msgNotificationContent/NotificationViewController.swift +++ /dev/null @@ -1,183 +0,0 @@ -/* -* Copyright (c) 2010-2020 Belledonne Communications SARL. -* -* This file is part of linphone-iphone -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*/ - -import UIKit -import UserNotifications -import UserNotificationsUI -import linphonesw -import os -#if USE_CRASHLYTICS -import Firebase -#endif - -var APP_GROUP_ID = "group.org.linphone.phone.msgNotification" -var isReplySent: Bool = false -var needToStop: Bool = false -var coreStopped: Bool = false -var log: LoggingService! - -class NotificationViewController: UIViewController, UNNotificationContentExtension, ChatMessageDelegate, CoreDelegate { - - var lc: Core? - var config: Config! - var logDelegate: LinphoneLoggingServiceManager! - - override func viewDidLoad() { - super.viewDidLoad() - // Do any required interface initialization here. -#if USE_CRASHLYTICS - FirebaseApp.configure() -#endif - NSLog("[msgNotificationContent] start msgNotificationContent extension") - - - let replyAction = UNTextInputNotificationAction(identifier: "Reply", - title: NSLocalizedString("Reply", comment: ""), - options: [], - textInputButtonTitle: NSLocalizedString("Send", comment: ""), - textInputPlaceholder: "") - - let seenAction = UNNotificationAction(identifier: "Seen", title: NSLocalizedString("Mark as seen", comment: ""), options: []) - let category = UNNotificationCategory(identifier: "msg_cat", actions: [replyAction, seenAction], intentIdentifiers: [], options: [.customDismissAction]) - UNUserNotificationCenter.current().setNotificationCategories([category]) - - needToStop = false - isReplySent = false - coreStopped = false - } - - func didReceive(_ notification: UNNotification) { - VFSUtil.log("Notification received \(notification.request.content.userInfo) category \(notification.request.content.categoryIdentifier)",.info) - } - - func didReceive(_ response: UNNotificationResponse, - completionHandler completion: @escaping (UNNotificationContentExtensionResponseOption) -> Void) { - do { - let userInfo = response.notification.request.content.userInfo - switch response.actionIdentifier { - case "Reply": - if let replyText = response as? UNTextInputNotificationResponse { - try replyAction(userInfo, text: replyText.userText) - } - break - case "Seen": - try markAsSeenAction(userInfo) - break - default: - break - } - - if (needToStop) { - log.error(message: "core stopped by app") - throw LinphoneError.timeout - } else { - completion(.dismiss) - stopCore() - } - - } catch { - log.error(message: "error: \(error)") - completion(.dismissAndForwardAction) - } - } - - func markAsSeenAction(_ userInfo: [AnyHashable : Any]) throws { - NSLog("[msgNotificationContent] markAsSeenAction") - try startCore() - - let peerAddress = userInfo["peer_addr"] as! String - let localAddress = userInfo["local_addr"] as! String - let peer = try lc!.createAddress(address: peerAddress) - let local = try lc!.createAddress(address: localAddress) - let room = lc!.findChatRoom(peerAddr: peer, localAddr: local) - if let room = room { - room.markAsRead() - } - lc!.iterate() - } - - func replyAction(_ userInfo: [AnyHashable : Any], text replyText: String) throws { - NSLog("[msgNotificationContent] replyAction") - try startCore() - - let peerAddress = userInfo["peer_addr"] as! String - let localAddress = userInfo["local_addr"] as! String - let peer = try lc!.createAddress(address: peerAddress) - let local = try lc!.createAddress(address: localAddress) - let room = lc!.findChatRoom(peerAddr: peer, localAddr: local) - if let room = room { - let chatMsg = try room.createMessage(message: replyText) - chatMsg.addDelegate(delegate: self) - chatMsg.send() - room.markAsRead() - } - - for i in 0...50 where !isReplySent && !needToStop { - log.debug(message: "reply \(i)") - lc!.iterate() - usleep(10000) - } - } - - func startCore() throws { - if (VFSUtil.vfsEnabled(groupName: APP_GROUP_ID) && !VFSUtil.activateVFS()) { - VFSUtil.log("[VFS] Error unable to activate.", .error) - } - config = Config.newForSharedCore(appGroupId: APP_GROUP_ID, configFilename: "linphonerc", factoryConfigFilename: "") - log = LoggingService.Instance /*enable liblinphone logs.*/ - logDelegate = try! LinphoneLoggingServiceManager(config: config, log: log, domain: "msgNotificationContent") - lc = try! Factory.Instance.createSharedCoreWithConfig(config: config, systemContext: nil, appGroupId: APP_GROUP_ID, mainCore: false) - - lc!.addDelegate(delegate: self) - - try lc!.start() - log.message(message: "core started") - - if (needToStop) { - log.error(message: "core stopped by app") - throw LinphoneError.timeout - } - } - - func stopCore() { - lc!.stopAsync() - log.message(message: "stop core") - for i in 0...100 where !coreStopped { - log.debug(message: "stop \(i)") - lc!.iterate() - usleep(50000) - } - } - - func onGlobalStateChanged(core: Core, state gstate: GlobalState, message: String) { - log.message(message: "global state changed: \(gstate) : \(message) \n") - if (gstate == .Shutdown) { - needToStop = true - } else if (gstate == .Off) { - coreStopped = true - } - } - - func onMsgStateChanged(message: ChatMessage, state: ChatMessage.State) { - log.message(message: "msg state changed: \(state)\n") - if (state == .Delivered) { - isReplySent = true - } - } -} diff --git a/msgNotificationContent/msgNotificationContent.entitlements b/msgNotificationContent/msgNotificationContent.entitlements deleted file mode 100644 index b63a67474..000000000 --- a/msgNotificationContent/msgNotificationContent.entitlements +++ /dev/null @@ -1,14 +0,0 @@ - - - - - com.apple.security.application-groups - - group.org.linphone.phone.msgNotification - - keychain-access-groups - - $(AppIdentifierPrefix)org.linphone.phone - - - diff --git a/msgNotificationService/GoogleService-Info.plist b/msgNotificationService/GoogleService-Info.plist deleted file mode 100644 index 98867592f..000000000 --- a/msgNotificationService/GoogleService-Info.plist +++ /dev/null @@ -1,36 +0,0 @@ - - - - - CLIENT_ID - - REVERSED_CLIENT_ID - - API_KEY - - GCM_SENDER_ID - - PLIST_VERSION - 1 - BUNDLE_ID - org.linphone.phone.msgNotificationService - PROJECT_ID - linphone-iphone - STORAGE_BUCKET - linphone-iphone.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - - DATABASE_URL - - - diff --git a/msgNotificationService/Info.plist b/msgNotificationService/Info.plist deleted file mode 100644 index 59a92df5e..000000000 --- a/msgNotificationService/Info.plist +++ /dev/null @@ -1,31 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - msgNotificationService - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - $(MARKETING_VERSION) - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - NSExtension - - NSExtensionPointIdentifier - com.apple.usernotifications.service - NSExtensionPrincipalClass - $(PRODUCT_MODULE_NAME).NotificationService - - - diff --git a/msgNotificationService/NotificationService.swift b/msgNotificationService/NotificationService.swift deleted file mode 100644 index 0cda96771..000000000 --- a/msgNotificationService/NotificationService.swift +++ /dev/null @@ -1,255 +0,0 @@ -/* -* Copyright (c) 2010-2020 Belledonne Communications SARL. -* -* This file is part of linphone-iphone -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*/ - -import UserNotifications -import linphonesw -#if USE_CRASHLYTICS -import Firebase -#endif - -var APP_GROUP_ID = "group.org.linphone.phone.msgNotification" -var LINPHONE_DUMMY_SUBJECT = "dummy subject" - -struct MsgData: Codable { - var from: String? - var body: String? - var subtitle: String? - var callId: String? - var localAddr: String? - var peerAddr: String? -} - -class NotificationService: UNNotificationServiceExtension { - - var contentHandler: ((UNNotificationContent) -> Void)? - var bestAttemptContent: UNMutableNotificationContent? - - var lc: Core? - static var logDelegate: LinphoneLoggingServiceManager! - static var log: LoggingService! - - override init() { - super.init() -#if USE_CRASHLYTICS - FirebaseApp.configure() -#endif - } - - override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { - self.contentHandler = contentHandler - bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) - NSLog("[msgNotificationService] start msgNotificationService extension") - - if (VFSUtil.vfsEnabled(groupName: APP_GROUP_ID) && !VFSUtil.activateVFS()) { - VFSUtil.log("[VFS] Error unable to activate.", .error) - } - - if let bestAttemptContent = bestAttemptContent { - createCore() - - if (!(lc!.config?.getBool(section: "app", key: "disable_chat_feature", defaultValue: true))!){ - NotificationService.log.message(message: "received push payload : \(bestAttemptContent.userInfo.debugDescription)") - - - let defaults = UserDefaults.init(suiteName: APP_GROUP_ID) - if let chatroomsPushStatus = defaults?.dictionary(forKey: "chatroomsPushStatus") { - let aps = bestAttemptContent.userInfo["aps"] as? NSDictionary - let alert = aps?["alert"] as? NSDictionary - let fromAddresses = alert?["loc-args"] as? [String] - - if let from = fromAddresses?.first { - if ((chatroomsPushStatus[from] as? String) == "disabled") { - NotificationService.log.message(message: "message comes from a muted chatroom, ignore it") - contentHandler(UNNotificationContent()) - } - } - } - - if let chatRoomInviteAddr = bestAttemptContent.userInfo["chat-room-addr"] as? String, !chatRoomInviteAddr.isEmpty { - NotificationService.log.message(message: "fetch chat room for invite, addr: \(chatRoomInviteAddr)") - let chatRoom = lc!.getNewChatRoomFromConfAddr(chatRoomAddr: chatRoomInviteAddr) - - if let chatRoom = chatRoom { - stopCore() - NotificationService.log.message(message: "chat room invite received") - bestAttemptContent.title = NSLocalizedString("GC_MSG", comment: "") - if (chatRoom.hasCapability(mask:ChatRoom.Capabilities.OneToOne.rawValue)) { - if (chatRoom.peerAddress?.displayName?.isEmpty != true) { - bestAttemptContent.body = chatRoom.peerAddress!.displayName! - } else { - bestAttemptContent.body = chatRoom.peerAddress!.username! - } - } else { - bestAttemptContent.body = chatRoom.subject! - } - - bestAttemptContent.sound = UNNotificationSound(named: UNNotificationSoundName("msg.caf")) // TODO : temporary fix, to be removed after flexisip release - contentHandler(bestAttemptContent) - return - } - } else if let callId = bestAttemptContent.userInfo["call-id"] as? String { - NotificationService.log.message(message: "fetch msg for callid ["+callId+"]") - let message = lc!.getNewMessageFromCallid(callId: callId) - - if let message = message { - let msgData = parseMessage(message: message) - - // Extension only upates app's badge when main shared core is Off = extension's core is On. - // Otherwise, the app will update the badge. - if lc?.globalState == GlobalState.On, let badge = updateBadge() as NSNumber? { - bestAttemptContent.badge = badge - } - - stopCore() - - bestAttemptContent.sound = UNNotificationSound(named: UNNotificationSoundName(rawValue: "msg.caf")) - bestAttemptContent.title = NSLocalizedString("Message received", comment: "") - if let subtitle = msgData?.subtitle { - bestAttemptContent.subtitle = subtitle - } - if let body = msgData?.body { - bestAttemptContent.body = body - } - - bestAttemptContent.categoryIdentifier = "msg_cat" - - bestAttemptContent.userInfo.updateValue(msgData?.callId as Any, forKey: "CallId") - bestAttemptContent.userInfo.updateValue(msgData?.from as Any, forKey: "from") - bestAttemptContent.userInfo.updateValue(msgData?.peerAddr as Any, forKey: "peer_addr") - bestAttemptContent.userInfo.updateValue(msgData?.localAddr as Any, forKey: "local_addr") - - if message.reactionContent != " " { - contentHandler(bestAttemptContent) - }else { - contentHandler(UNNotificationContent()) - } - - return - } else { - NotificationService.log.message(message: "Message not found for callid ["+callId+"]") - } - } - } - serviceExtensionTimeWillExpire() - } - } - - override func serviceExtensionTimeWillExpire() { - // Called just before the extension will be terminated by the system. - // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. - NotificationService.log.warning(message: "serviceExtensionTimeWillExpire") - stopCore() - if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent { - NSLog("[msgNotificationService] serviceExtensionTimeWillExpire") - bestAttemptContent.categoryIdentifier = "app_active" - - if let chatRoomInviteAddr = bestAttemptContent.userInfo["chat-room-addr"] as? String, !chatRoomInviteAddr.isEmpty { - bestAttemptContent.title = NSLocalizedString("GC_MSG", comment: "") - bestAttemptContent.body = "" - bestAttemptContent.sound = UNNotificationSound(named: UNNotificationSoundName("msg.caf")) // TODO : temporary fix, to be removed after flexisip release - } else { - bestAttemptContent.title = NSLocalizedString("Message received", comment: "") - bestAttemptContent.body = NSLocalizedString("IM_MSG", comment: "") - } - contentHandler(bestAttemptContent) - } - } - - func parseMessage(message: PushNotificationMessage) -> MsgData? { - - var content = "" - if (message.isConferenceInvitationNew) { - content = NSLocalizedString("📅 You are invited to a meeting", comment: "") - } else if (message.isConferenceInvitationUpdate) { - content = NSLocalizedString("📅 Meeting has been modified", comment: "") - } else if (message.isConferenceInvitationCancellation) { - content = NSLocalizedString("📅 Meeting has been cancelled", comment: "") - } else { - content = message.isText ? message.textContent! : "🗻" - } - - let fromAddr = message.fromAddr?.username - let callId = message.callId - let localUri = message.localAddr?.asStringUriOnly() - let peerUri = message.peerAddr?.asStringUriOnly() - let reactionContent = message.reactionContent - let from: String - if let fromDisplayName = message.fromAddr?.asStringUriOnly().getDisplayNameFromSipAddress(lc: lc!, logger: NotificationService.log, groupId: APP_GROUP_ID) { - from = fromDisplayName - } else { - from = fromAddr! - } - - - var msgData = MsgData(from: fromAddr, body: "", subtitle: "", callId:callId, localAddr: localUri, peerAddr:peerUri) - - if let showMsg = lc!.config?.getBool(section: "app", key: "show_msg_in_notif", defaultValue: true), showMsg == true { - if let subject = message.subject as String?, subject != "" { - msgData.subtitle = subject - if reactionContent == nil { - msgData.body = from + " : " + content - } else { - msgData.body = from + NSLocalizedString(" has reacted by ", comment: "") + reactionContent! + NSLocalizedString(" to: ", comment: "") + content - } - } else { - msgData.subtitle = from - msgData.body = content - } - } else { - if let subject = message.subject as String?, subject != "" { - msgData.body = subject + " : " + from - } else { - msgData.body = from - } - } - - NotificationService.log.message(message: "received msg size : \(content.count) \n") - return msgData; - } - - func createCore() { - NSLog("[msgNotificationService] create core") - - let config = Config.newForSharedCore(appGroupId: APP_GROUP_ID, configFilename: "linphonerc", factoryConfigFilename: "") - - if (NotificationService.log == nil) { - NotificationService.log = LoggingService.Instance /*enable liblinphone logs.*/ - NotificationService.logDelegate = try! LinphoneLoggingServiceManager(config: config!, log: NotificationService.log, domain: "msgNotificationService") - } - lc = try! Factory.Instance.createSharedCoreWithConfig(config: config!, systemContext: nil, appGroupId: APP_GROUP_ID, mainCore: false) - } - - func stopCore() { - NotificationService.log.message(message: "stop core") - if let lc = lc { - lc.stop() - } - } - - func updateBadge() -> Int { - var count = 0 - count += lc!.unreadChatMessageCount - count += lc!.missedCallsCount - count += lc!.callsNb - NotificationService.log.message(message: "badge: \(count)\n") - - return count - } - -} diff --git a/msgNotificationService/msgNotificationService.entitlements b/msgNotificationService/msgNotificationService.entitlements deleted file mode 100644 index 31f88ecaf..000000000 --- a/msgNotificationService/msgNotificationService.entitlements +++ /dev/null @@ -1,16 +0,0 @@ - - - - - com.apple.developer.usernotifications.filtering - - com.apple.security.application-groups - - group.org.linphone.phone.msgNotification - - keychain-access-groups - - $(AppIdentifierPrefix)org.linphone.phone - - - diff --git a/prepare.conf b/prepare.conf deleted file mode 100644 index bc4c93b42..000000000 --- a/prepare.conf +++ /dev/null @@ -1,5 +0,0 @@ --DENABLE_LIME_X3DH=yes --DENABLE_LIME=no --DENABLE_SOCI=yes --DENABLE_QRCODE=yes - diff --git a/prepare.py b/prepare.py deleted file mode 100755 index e5f3373b9..000000000 --- a/prepare.py +++ /dev/null @@ -1,369 +0,0 @@ -#!/usr/bin/env python - -# -# Copyright (c) 2010-2019 Belledonne Communications SARL. -# -# This file is part of linphone-iphone -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - -import os -import re -import shutil -import sys -from distutils.spawn import find_executable -from logging import error, warning, info -from subprocess import Popen, PIPE -sys.dont_write_bytecode = True -sys.path.insert(0, 'submodules/cmake-builder') -try: - import prepare -except Exception as e: - error( - "Could not find prepare module: {}, probably missing submodules/cmake-builder? Try running:\n" - "git submodule sync && git submodule update --init --recursive".format(e)) - exit(1) - - - -class IOSTarget(prepare.Target): - - def __init__(self, arch): - prepare.Target.__init__(self, 'ios-' + arch) - current_path = os.path.dirname(os.path.realpath(__file__)) - self.config_file = 'configs/config-ios-' + arch + '.cmake' - self.toolchain_file = 'toolchains/toolchain-ios-' + arch + '.cmake' - self.output = 'liblinphone-sdk/' + arch + '-apple-darwin.ios' - self.external_source_path = os.path.join(current_path, 'submodules') - external_builders_path = os.path.join(current_path, 'cmake_builder') - self.additional_args = [ - "-DLINPHONE_BUILDER_EXTERNAL_BUILDERS_PATH=" + external_builders_path - ] - - -class IOSi386Target(IOSTarget): - - def __init__(self): - IOSTarget.__init__(self, 'i386') - - -class IOSx8664Target(IOSTarget): - - def __init__(self): - IOSTarget.__init__(self, 'x86_64') - - -class IOSarmv7Target(IOSTarget): - - def __init__(self): - IOSTarget.__init__(self, 'armv7') - - -class IOSarm64Target(IOSTarget): - - def __init__(self): - IOSTarget.__init__(self, 'arm64') - - - -ios_targets = { - 'i386': IOSi386Target(), - 'x86_64': IOSx8664Target(), - 'armv7': IOSarmv7Target(), - 'arm64': IOSarm64Target() -} - -ios_virtual_targets = { - 'devices': ['armv7', 'arm64'], - 'simulators': ['i386', 'x86_64'], - 'all': ['i386', 'x86_64', 'armv7', 'arm64'] -} - -class IOSPreparator(prepare.Preparator): - - def __init__(self, targets=ios_targets, virtual_targets=ios_virtual_targets): - prepare.Preparator.__init__(self, targets, default_targets=['armv7', 'arm64', 'x86_64'], virtual_targets=virtual_targets) - self.veryclean = True - self.show_gpl_disclaimer = True - self.argparser.add_argument('-ac', '--all-codecs', help="Enable all codecs, including the non-free ones. Final application must comply with their respective license (see README.md).", action='store_true') - - def parse_args(self): - prepare.Preparator.parse_args(self) - - self.additional_args += ["-DLINPHONE_IOS_DEPLOYMENT_TARGET=" + self.extract_deployment_target()] - self.additional_args += ["-DLINPHONE_BUILDER_DUMMY_LIBRARIES=" + ' '.join(self.extract_libs_list())] - if self.args.all_codecs: - self.additional_args += ["-DENABLE_GPL_THIRD_PARTIES=ON"] - self.additional_args += ["-DENABLE_NON_FREE_CODECS=ON"] - self.additional_args += ["-DENABLE_AMRNB=ON"] - self.additional_args += ["-DENABLE_AMRWB=ON"] - self.additional_args += ["-DENABLE_BV16=ON"] - self.additional_args += ["-DENABLE_G729=ON"] - self.additional_args += ["-DENABLE_GSM=ON"] - self.additional_args += ["-DENABLE_ILBC=ON"] - self.additional_args += ["-DENABLE_ISAC=ON"] - self.additional_args += ["-DENABLE_OPUS=ON"] - self.additional_args += ["-DENABLE_SILK=ON"] - self.additional_args += ["-DENABLE_SPEEX=ON"] - self.additional_args += ["-DENABLE_FFMPEG=ON"] - self.additional_args += ["-DENABLE_H263=ON"] - self.additional_args += ["-DENABLE_H263P=ON"] - self.additional_args += ["-DENABLE_MPEG4=ON"] - self.additional_args += ["-DENABLE_OPENH264=ON"] - self.additional_args += ["-DENABLE_VPX=ON"] - self.additional_args += ["-DENABLE_X264=ON"] - self.additional_args += ["-DENABLE_CODEC2=ON"] - - def clean(self): - prepare.Preparator.clean(self) - if os.path.isfile('Makefile'): - os.remove('Makefile') - if os.path.isdir('WORK') and not os.listdir('WORK'): - os.rmdir('WORK') - if os.path.isdir('liblinphone-sdk'): - l = os.listdir('liblinphone-sdk') - if len(l) == 1 and l[0] == 'apple-darwin': - shutil.rmtree('liblinphone-sdk', ignore_errors=False) - - def extract_from_xcode_project_with_regex(self, regex): - l = [] - f = open('linphone.xcodeproj/project.pbxproj', 'r') - lines = f.readlines() - f.close() - for line in lines: - m = regex.search(line) - if m is not None: - l += [m.group(1)] - return list(set(l)) - - def extract_deployment_target(self): - regex = re.compile("IPHONEOS_DEPLOYMENT_TARGET = (.*);") - return self.extract_from_xcode_project_with_regex(regex)[0] - - def extract_libs_list(self): - regex = re.compile("name = ([A-Za-z0-9\-_]+)\.framework; path = \"liblinphone-sdk/apple-darwin/Frameworks/") - return self.extract_from_xcode_project_with_regex(regex) - - def detect_package_manager(self): - if find_executable("brew"): - return "brew" - elif find_executable("port"): - return "sudo port" - else: - error("No package manager found. Please README or install brew using:\n\truby -e \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)\"") - return "brew" - - def check_environment(self): - reterr = 0 - reterr |= prepare.Preparator.check_environment(self) - package_manager_info = {"brew-pkg-config": "pkg-config", - "sudo port-pkg-config": "pkgconfig", - "brew-binary-path": "/usr/local/bin/", - "sudo port-binary-path": "/opt/local/bin/" - } - - for prog in ["autoconf", "automake", "doxygen", "java", "nasm", "cmake", "wget", "yasm", "optipng"]: - reterr |= not self.check_is_installed(prog, prog) - - reterr |= not self.check_is_installed("pkg-config", package_manager_info[self.detect_package_manager() + "-pkg-config"]) - reterr |= not self.check_is_installed("ginstall", "coreutils") - reterr |= not self.check_is_installed("intltoolize", "intltool") - reterr |= not self.check_is_installed("convert", "imagemagick") - - if find_executable("nasm"): - nasm_output = Popen("nasm -f elf32".split(" "), stderr=PIPE, stdout=PIPE).stderr.read() - if "fatal: unrecognised output format" in nasm_output: - error("Invalid version of nasm detected. Please make sure that you are NOT using Apple's binary here") - self.missing_dependencies["nasm"] = "nasm" - reterr = 1 - - if self.check_is_installed("libtoolize", "libtoolize", warn=False): - if not self.check_is_installed("glibtoolize", "libtool"): - reterr = 1 - glibtoolize_path = find_executable("glibtoolize") - if glibtoolize_path is not None: - msg = "Please do a symbolic link from glibtoolize to libtoolize:\n\tln -s {} ${}" - error(msg.format(glibtoolize_path, glibtoolize_path.replace("glibtoolize", "libtoolize"))) - - devnull = open(os.devnull, 'wb') - # just ensure that JDK is installed - if not, it will automatically display a popup to user - p = Popen("java -version".split(" "), stderr=devnull, stdout=devnull) - p.wait() - if p.returncode != 0: - error("Please install Java JDK (not just JRE).") - reterr = 1 - - p = Popen("xcrun --sdk iphoneos --show-sdk-path".split(" "), stdout=devnull, stderr=devnull) - p.wait() - if p.returncode != 0: - error("iOS SDK not found, please install Xcode from AppStore or equivalent.") - reterr = 1 - else: - xcode_version = int( - Popen("xcodebuild -version".split(" "), stdout=PIPE).stdout.read().split("\n")[0].split(" ")[1].split(".")[0]) - if xcode_version < 7: - if not find_executable("strings"): - sdk_strings_path = Popen("xcrun --find strings".split(" "), stdout=PIPE).stdout.read().split("\n")[0] - error("strings binary missing, please run:\n\tsudo ln -s {} {}".format(sdk_strings_path, package_manager_info[detect_package_manager() + "-binary-path"])) - reterr = 1 - return reterr - - def show_missing_dependencies(self): - if self.missing_dependencies: - error("The following binaries are missing: {}. Please install them using:\n\t{} install {}".format( - " ".join(self.missing_dependencies.keys()), - self.detect_package_manager(), - " ".join(self.missing_dependencies.values()))) - - def install_git_hook(self): - git_hook_path = ".git{sep}hooks{sep}pre-commit".format(sep=os.sep) - if os.path.isdir(".git{sep}hooks".format(sep=os.sep)) and not os.path.isfile(git_hook_path): - info("Installing Git pre-commit hook") - shutil.copyfile(".git-pre-commit", git_hook_path) - os.chmod(git_hook_path, 0755) - - def generate_makefile(self, generator, project_file=''): - platforms = self.args.target - arch_targets = "" - for arch in platforms: - arch_targets += """ -{arch}: {arch}-build - -{arch}-build: -\t{generator} WORK/ios-{arch}/cmake/{project_file} -\t@echo "Done" -""".format(arch=arch, generator=generator, project_file=project_file) - multiarch = "" - for arch in platforms[1:]: - multiarch += """ \\ -\t\t\tif test -f "$${arch}_path/$$framework_name"; then \\ -\t\t\t\tall_paths=`echo $$all_paths $${arch}_path/$$framework_name`; \\ -\t\t\t\tall_archs="$$all_archs,{arch}" ; \\ -\t\t\telse \\ -\t\t\t\techo "WARNING: archive `basename $$archive` exists in {first_arch} tree but does not exists in {arch} tree: $${arch}_path."; \\ -\t\t\tfi; \\ -""".format(first_arch=platforms[0], arch=arch) - makefile = """ -archs={archs} -LINPHONE_IPHONE_VERSION=$(shell git describe --always) - -.PHONY: all -.SILENT: sdk -all: build - -sdk: -\tarchives=`find liblinphone-sdk/{first_arch}-apple-darwin.ios -name '*.framework'` && \\ -\trm -rf liblinphone-sdk/apple-darwin && \\ -\tmkdir -p liblinphone-sdk/apple-darwin && \\ -\tcp -rf liblinphone-sdk/{first_arch}-apple-darwin.ios/share liblinphone-sdk/apple-darwin/. && \\ -\tcp -rf liblinphone-sdk/{first_arch}-apple-darwin.ios/lib liblinphone-sdk/apple-darwin/. && \\ -\tcp -rf liblinphone-sdk/{first_arch}-apple-darwin.ios/include liblinphone-sdk/apple-darwin/. && \\ -\tcp -rf liblinphone-sdk/{first_arch}-apple-darwin.ios/Frameworks liblinphone-sdk/apple-darwin/. && \\ -\tfor archive in $$archives ; do \\ -\t\tarmv7_path=`echo $$archive | sed -e "s/{first_arch}/armv7/"`; \\ -\t\tarm64_path=`echo $$archive | sed -e "s/{first_arch}/arm64/"`; \\ -\t\ti386_path=`echo $$archive | sed -e "s/{first_arch}/i386/"`; \\ -\t\tx86_64_path=`echo $$archive | sed -e "s/{first_arch}/x86_64/"`; \\ -\t\tdestpath=`echo $$archive | sed -e "s/-debug//" | sed -e "s/{first_arch}-//" | sed -e "s/\.ios//"`; \\ -\t\tall_paths=`echo $$archive`; \\ -\t\tall_archs="{first_arch}"; \\ -\t\tarchive_name=`basename $$archive`; \\ -\t\tframework_name=`echo $$archive_name | cut -d '.' -f 1`; \\ -\t\tall_paths=`echo $$all_paths/$$framework_name`; \\ -\t\tmkdir -p `dirname $$destpath`; \\ -{multiarch} \\ -\t\techo "[{archs}] Mixing `basename $$archive` in $$destpath"; \\ -\t\tlipo -create -output $$destpath/$$framework_name $$all_paths; \\ -\tdone; \\ -\tif test -s WORK/ios-{first_arch}/Build/dummy_libraries/dummy_libraries.txt; then \\ -\t\techo 'NOTE: the following libraries were STUBBED:'; \\ -\t\tcat WORK/ios-{first_arch}/Build/dummy_libraries/dummy_libraries.txt; \\ -\tfi; \\ - -build: $(addsuffix -build, $(archs)) -\t$(MAKE) sdk - -ipa: build -\txcodebuild -configuration Release && \\ -\txcodebuild -sdk iphoneos -project linphone.xcodeproj -scheme linphone -configuration Release build \\ -\t-archivePath linphone-iphone-'$(LINPHONE_IPHONE_VERSION)'.xcarchive archive && \\ -\txcodebuild -exportArchive -archivePath linphone-iphone-'$(LINPHONE_IPHONE_VERSION)'.xcarchive \\ -\t-exportPath linphone-iphone-'$(LINPHONE_IPHONE_VERSION)'.ipa -exportOptionsPlist Tools/exportOptions.plist - -zipsdk: sdk -\trm -rf liblinphone-sdk/apple-darwin/Tools &&\\ -\tmkdir -p liblinphone-sdk/apple-darwin/Tools &&\\ -\tcp -f Tools/deploy.sh liblinphone-sdk/apple-darwin/Tools/.; \\ -\techo "Generating SDK zip file for version $(LINPHONE_IPHONE_VERSION)" -\tzip -r liblinphone-iphone-sdk-$(LINPHONE_IPHONE_VERSION).zip \\ -\tliblinphone-sdk/apple-darwin \\ -\tliblinphone-tutorials \\ -\t-x liblinphone-tutorials/hello-world/build\* \\ -\t-x liblinphone-tutorials/hello-world/hello-world.xcodeproj/*.pbxuser \\ -\t-x liblinphone-tutorials/hello-world/hello-world.xcodeproj/*.mode1v3 - -podspec: zipsdk -\tsed "s/FRAMEWORK_VERSION/$(LINPHONE_IPHONE_VERSION)/g" Tools/liblinphone.podspec > liblinphone.podspec - -pull-transifex: -\ttx pull -af - -push-transifex: -\t./Tools/i18n_generate_strings_files.sh && \\ -\ttx push -s -f --no-interactive - -zipres: -\t@tar -czf ios_assets.tar.gz Resources iTunesArtwork - -{arch_targets} - -help-prepare-options: -\t@echo "prepare.py was previously executed with the following options:" -\t@echo " {options}" - -help: help-prepare-options -\t@echo "" -\t@echo "(please read the README.md file first)" -\t@echo "" -\t@echo "Available architectures: {archs}" -\t@echo "" -\t@echo "Available targets:" -\t@echo "" -\t@echo " * all or build: builds all architectures and creates the liblinphone SDK" -\t@echo " * sdk: creates the liblinphone SDK. Use this only after a full build" -\t@echo " * zipsdk: generates a ZIP archive of liblinphone-sdk/apple-darwin containing the SDK. Use this only after SDK is built." -\t@echo " * zipres: creates a tar.gz file with all the resources (images)" -\t@echo "" -""".format(archs=' '.join(platforms), arch_opts='|'.join(platforms), - first_arch=platforms[0], options=' '.join(sys.argv), - arch_targets=arch_targets, - multiarch=multiarch, generator=generator) - f = open('Makefile', 'w') - f.write(makefile) - f.close() - - - -def main(): - preparator = IOSPreparator() - preparator.parse_args() - if preparator.check_environment() != 0: - preparator.show_environment_errors() - return 1 - return preparator.run() - -if __name__ == "__main__": - sys.exit(main()) - diff --git a/scripts/android_import.sh b/scripts/android_import.sh deleted file mode 100755 index 236371cd3..000000000 --- a/scripts/android_import.sh +++ /dev/null @@ -1,30 +0,0 @@ -# to be run from this location -# after running : Pick the first section (in swift) outputed by this script and copy it in VoipTexts.swift replacing the section marked as From Android -# look for strings with appName and append at the end .replacingOccurrences(of: "&appName;", with: appName) (just in the swift file) -# then pick the other relevant traduction and put them as is in Localizable.strings (replacing the previously generated ones) - - -cat ../Classes/Swift/Voip/Theme/VoipTexts.swift | grep static | sed s/@objc//g | awk '{print $3}' > keys -export sub="\\\'" -echo ">>>>> Master to be placed in VoipTexts.swift replacing Android section" -while read key; do grep "name=\"$key\"" ../../linphone-android/app/src/main/res/values/strings.xml ; done < keys | sed s/''/' = NSLocalizedString("'/g | sed s/'<\/string>'/'",comment:"")'/g| sed s/'" tools:ignore="PluralsCandidate'//g |sed s/$sub/\'/g -find ../../linphone-android/app/src/main/res/values-*/strings.xml > stringsandroid -export sub="\\\'" -while read lc; do - echo - echo - echo "Treating android: $lc" - echo - while read key; do - export frvalue=`grep "name=\"$key\"" $lc | cut -d">" -f2- | sed s/'<\/string>'//g| sed s/'" tools:ignore="PluralsCandidate'//g|sed s/$sub/\'/g` - export envalue=`grep "name=\"$key\"" ../../linphone-android/app/src/main/res/values/strings.xml | cut -d">" -f2- | sed s/'<\/string>'//g| sed s/'" tools:ignore="PluralsCandidate'//g|sed s/$sub/\'/g` - if [ -n "$frvalue" ]; then - if [ -n "$envalue" ]; then - echo \"$envalue\"=\"$frvalue\"\; - fi - fi - done < keys -done