From cefb35d792021bff606e4bbfef6d4ab2310848ff Mon Sep 17 00:00:00 2001 From: Benjamin Verdier Date: Mon, 23 Jul 2018 17:06:26 +0200 Subject: [PATCH 001/229] Add button and sms sending code. --- .../Base.lproj/UIContactDetailsCell.xib | 11 +++- Classes/LinphoneUI/UIContactDetailsCell.h | 3 + Classes/LinphoneUI/UIContactDetailsCell.m | 17 +++++- Classes/PhoneMainView.h | 4 +- Classes/PhoneMainView.m | 6 ++ linphone.xcodeproj/project.pbxproj | 56 +++++++++---------- 6 files changed, 65 insertions(+), 32 deletions(-) diff --git a/Classes/LinphoneUI/Base.lproj/UIContactDetailsCell.xib b/Classes/LinphoneUI/Base.lproj/UIContactDetailsCell.xib index 40cdff521..6781f1e63 100644 --- a/Classes/LinphoneUI/Base.lproj/UIContactDetailsCell.xib +++ b/Classes/LinphoneUI/Base.lproj/UIContactDetailsCell.xib @@ -1,5 +1,5 @@ - + @@ -18,6 +18,7 @@ + @@ -95,6 +96,14 @@ + diff --git a/Classes/LinphoneUI/UIContactDetailsCell.h b/Classes/LinphoneUI/UIContactDetailsCell.h index 4832d5d77..5d340efcf 100644 --- a/Classes/LinphoneUI/UIContactDetailsCell.h +++ b/Classes/LinphoneUI/UIContactDetailsCell.h @@ -18,6 +18,7 @@ */ #import +#import #import "UIIconButton.h" @@ -36,6 +37,7 @@ @property(weak, nonatomic) IBOutlet UIIconButton *chatButton; @property (weak, nonatomic) IBOutlet UIImageView *linphoneImage; @property (weak, nonatomic) UIView *waitView; +@property (strong, nonatomic) IBOutlet UIButton *inviteButton; - (id)initWithIdentifier:(NSString *)identifier; - (void)setAddress:(NSString *)address; @@ -45,4 +47,5 @@ - (IBAction)onCallClick:(id)sender; - (IBAction)onChatClick:(id)sender; - (IBAction)onDeleteClick:(id)sender; +- (IBAction)onSMSInviteClick:(id)sender; @end diff --git a/Classes/LinphoneUI/UIContactDetailsCell.m b/Classes/LinphoneUI/UIContactDetailsCell.m index 90c79066e..b03fb9d15 100644 --- a/Classes/LinphoneUI/UIContactDetailsCell.m +++ b/Classes/LinphoneUI/UIContactDetailsCell.m @@ -61,13 +61,13 @@ _linphoneImage.hidden = TRUE; if (contact) { - self.linphoneImage.hidden = + self.inviteButton.hidden = !(self.linphoneImage.hidden = !((contact.friend && linphone_presence_model_get_basic_status(linphone_friend_get_presence_model_for_uri_or_tel( contact.friend, _addressLabel.text.UTF8String)) == LinphonePresenceBasicStatusOpen) || (!linphone_proxy_config_is_phone_number(linphone_core_get_default_proxy_config(LC), _addressLabel.text.UTF8String) && - [FastAddressBook isSipURIValid:_addressLabel.text])); + [FastAddressBook isSipURIValid:_addressLabel.text]))); } if (addr) { @@ -147,4 +147,17 @@ 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 at: http://www.linphone.org/technical-corner/linphone/downloads",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/PhoneMainView.h b/Classes/PhoneMainView.h index 710aaa97b..7b603563c 100644 --- a/Classes/PhoneMainView.h +++ b/Classes/PhoneMainView.h @@ -18,6 +18,7 @@ */ #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" @@ -74,7 +75,7 @@ @end -@interface PhoneMainView : UIViewController { +@interface PhoneMainView : UIViewController { @private NSMutableArray *inhibitedEvents; } @@ -104,6 +105,7 @@ - (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; diff --git a/Classes/PhoneMainView.m b/Classes/PhoneMainView.m index 1f35fae2a..83e7164b9 100644 --- a/Classes/PhoneMainView.m +++ b/Classes/PhoneMainView.m @@ -977,4 +977,10 @@ void main_view_chat_room_state_changed(LinphoneChatRoom *cr, LinphoneChatRoomSta } } +#pragma mark - SMS invite callback + +- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result { + [controller dismissModalViewControllerAnimated:YES]; +} + @end diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index aa32a22ff..bbf8c373e 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -2036,6 +2036,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D37DC7181594AF3400B2A5EB /* MessageUI.framework in Frameworks */, 61F1997520C6B1D5006B069A /* AVKit.framework in Frameworks */, 249660951FD6A35F001D55AA /* Photos.framework in Frameworks */, 24E1C7C01F9A235600D3F981 /* Contacts.framework in Frameworks */, @@ -2066,7 +2067,6 @@ 22276E8913C73DC000210156 /* CoreMedia.framework in Frameworks */, 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, F0B89C2218DC89E30050B60E /* MediaPlayer.framework in Frameworks */, - D37DC7181594AF3400B2A5EB /* MessageUI.framework in Frameworks */, 226EF06C15FA256B005865C7 /* MobileCoreServices.framework in Frameworks */, 8C3EA9F01EB8A78C00B732B6 /* msx264.framework in Frameworks */, 70E542F313E147E3002BA2C0 /* OpenGLES.framework in Frameworks */, @@ -2464,39 +2464,20 @@ 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( - 61F1996E20C6B1D5006B069A /* AVKit.framework */, - 8C435FA520BC34DA004CCA25 /* belr.framework */, - 8C435F8B20BBF862004CCA25 /* belcard.framework */, - 8C601FD220B462B0004FF95C /* mediastreamer2.framework */, - 8C1A1F7C1FA331D40064BE00 /* libsoci_sqlite3.a */, - 8CD0B3BE1FA22CBA008FEB16 /* libsoci_core.a */, - 249660941FD6A359001D55AA /* Photos.framework */, - 24E1C7B91F9A235500D3F981 /* Contacts.framework */, - 8C3EAA191EB8D9C300B732B6 /* linphonetester.framework */, - 8C5BCEC61EB3859200A9AAEF /* bctoolbox-tester.framework */, - 8C3EA9EF1EB8A78C00B732B6 /* msx264.framework */, - 8C3EA9E01EB892D600B732B6 /* msamr.framework */, - 8C3EA9E11EB892D600B732B6 /* mscodec2.framework */, - 8C3EA9E21EB892D600B732B6 /* msopenh264.framework */, - 8C5BCEC71EB3859200A9AAEF /* bctoolbox.framework */, - 8C5BCEC81EB3859200A9AAEF /* linphone.framework */, - 8C5BCEC91EB3859200A9AAEF /* mediastreamer_base.framework */, - 8C5BCECA1EB3859200A9AAEF /* mediastreamer_voip.framework */, - 8C5BCECB1EB3859200A9AAEF /* mssilk.framework */, - 8C5BCECC1EB3859200A9AAEF /* mswebrtc.framework */, - 8C5BCECD1EB3859200A9AAEF /* ortp.framework */, - 8C2595DE1DEDCC8E007A6424 /* CallKit.framework */, - 8C73477B1D9BA3A00022EE8C /* UserNotifications.framework */, - 8CA2004B1D8158440095F859 /* PushKit.framework */, - 570742661D5A63DB004B9C84 /* StoreKit.framework */, - 63CE583F1C85EBF400304800 /* VideoToolbox.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 */, + 8C5BCEC71EB3859200A9AAEF /* bctoolbox.framework */, + 8C435F8B20BBF862004CCA25 /* belcard.framework */, + 8C435FA520BC34DA004CCA25 /* belr.framework */, + 8C2595DE1DEDCC8E007A6424 /* CallKit.framework */, 228697C311AC29B800E9E0CA /* CFNetwork.framework */, + 24E1C7B91F9A235500D3F981 /* Contacts.framework */, 22744019106F31BD006EC466 /* CoreAudio.framework */, 22744056106F9BC9006EC466 /* CoreFoundation.framework */, 288765FC0DF74451002DB57D /* CoreGraphics.framework */, @@ -2512,6 +2493,8 @@ 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 */, @@ -2519,17 +2502,34 @@ 152F22351B15E889008C0621 /* libxml2.dylib */, 63EEE4091BBA9B110087D3AF /* libxml2.tbd */, F05BAA611A5D594E00411815 /* libz.dylib */, + 8C5BCEC81EB3859200A9AAEF /* linphone.framework */, + 8C3EAA191EB8D9C300B732B6 /* linphonetester.framework */, F0B89C2118DC89E30050B60E /* MediaPlayer.framework */, + 8C5BCEC91EB3859200A9AAEF /* mediastreamer_base.framework */, + 8C5BCECA1EB3859200A9AAEF /* mediastreamer_voip.framework */, + 8C601FD220B462B0004FF95C /* mediastreamer2.framework */, D37DC7171594AF3400B2A5EB /* MessageUI.framework */, 226EF06B15FA256B005865C7 /* MobileCoreServices.framework */, + 8C3EA9E01EB892D600B732B6 /* msamr.framework */, + 8C3EA9E11EB892D600B732B6 /* mscodec2.framework */, + 8C3EA9E21EB892D600B732B6 /* msopenh264.framework */, + 8C5BCECB1EB3859200A9AAEF /* mssilk.framework */, + 8C5BCECC1EB3859200A9AAEF /* mswebrtc.framework */, + 8C3EA9EF1EB8A78C00B732B6 /* msx264.framework */, + 5EF0C33820C806A5005081B0 /* NotificationCenter.framework */, 70E542F213E147E3002BA2C0 /* OpenGLES.framework */, + 8C5BCECD1EB3859200A9AAEF /* ortp.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 */, - 5EF0C33820C806A5005081B0 /* NotificationCenter.framework */, + 8C73477B1D9BA3A00022EE8C /* UserNotifications.framework */, 5E58962520DCE5700030868C /* UserNotificationsUI.framework */, + 63CE583F1C85EBF400304800 /* VideoToolbox.framework */, ); name = Frameworks; sourceTree = ""; From d8d8236d544ad71723bb17b2dea338ab3a9e056e Mon Sep 17 00:00:00 2001 From: Benjamin Verdier Date: Tue, 24 Jul 2018 10:31:49 +0200 Subject: [PATCH 002/229] Remove button when sip address already exists. Add toggle for button in xcode project. --- Classes/LinphoneUI/Base.lproj/UIContactDetailsCell.xib | 5 +++-- Classes/LinphoneUI/UIContactDetailsCell.m | 6 ++++-- linphone.xcodeproj/project.pbxproj | 4 ++++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Classes/LinphoneUI/Base.lproj/UIContactDetailsCell.xib b/Classes/LinphoneUI/Base.lproj/UIContactDetailsCell.xib index 6781f1e63..598a57545 100644 --- a/Classes/LinphoneUI/Base.lproj/UIContactDetailsCell.xib +++ b/Classes/LinphoneUI/Base.lproj/UIContactDetailsCell.xib @@ -97,9 +97,10 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Classes/SideMenuTableView.m b/Classes/SideMenuTableView.m index 223908d4e..f611a3cb7 100644 --- a/Classes/SideMenuTableView.m +++ b/Classes/SideMenuTableView.m @@ -60,6 +60,12 @@ }]]; } + [_sideMenuEntries + addObject:[[SideMenuEntry alloc] initWithTitle:NSLocalizedString(@"Recordings", nil) + tapBlock:^() { + [PhoneMainView.instance + changeCurrentView:AssistantView.compositeViewDescription]; + }]]; [_sideMenuEntries addObject:[[SideMenuEntry alloc] initWithTitle:NSLocalizedString(@"Settings", nil) tapBlock:^() { diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index aa32a22ff..c776e19ea 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -745,6 +745,11 @@ 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 */; }; + CF7602D7210867E800749F76 /* RecordingsListView.m in Sources */ = {isa = PBXBuildFile; fileRef = CF7602D5210867E800749F76 /* RecordingsListView.m */; }; + CF7602D8210867E800749F76 /* RecordingsListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = CF7602D6210867E800749F76 /* RecordingsListView.xib */; }; + 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 */; }; 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 */; }; @@ -1851,6 +1856,14 @@ 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 = ""; }; + 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 = ""; }; + CF7602D6210867E800749F76 /* RecordingsListView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RecordingsListView.xib; 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 = ""; }; 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 = ""; }; @@ -2205,12 +2218,6 @@ D3F83EEA1582021700336684 /* CallView.m */, D381881C15FE3FCA00C3EDCA /* CallView.xib */, 638F1A861C2167C2004B8E02 /* CallView~ipad.xib */, - 8CA70ACF1F9E0ABA00A3D2EB /* ChatConversationInfoView.h */, - 8CA70AD01F9E0AE100A3D2EB /* ChatConversationInfoView.m */, - 8CBD7BA220B6B7FD00E5DCC0 /* ChatConversationInfoView.xib */, - 8CD99A3D2090BA24008A7CDA /* ChatConversationImdnView.h */, - 8CD99A3B2090B9FA008A7CDA /* ChatConversationImdnView.m */, - 8CBD7BA520B6B80D00E5DCC0 /* ChatConversationImdnView.xib */, 8C9C5E0B1F83B2EF006987FA /* ChatConversationCreateCollectionViewController.h */, 8C9C5E0C1F83B2EF006987FA /* ChatConversationCreateCollectionViewController.m */, 6341807A1BBC103100F71761 /* ChatConversationCreateTableView.h */, @@ -2218,6 +2225,12 @@ 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 */, @@ -2238,9 +2251,9 @@ D35497FB15875372000081D8 /* ContactsListView.h */, D35497FC15875372000081D8 /* ContactsListView.m */, D38187C015FE342800C3EDCA /* ContactsListView.xib */, + 631098501D4660630041F2B3 /* CountryListView.xib */, 631098471D4660580041F2B3 /* CountryListView.h */, 631098481D4660580041F2B3 /* CountryListView.m */, - 631098501D4660630041F2B3 /* CountryListView.xib */, 22F2508B107141E100AC9B3F /* DialerView.h */, 22F2508C107141E100AC9B3F /* DialerView.m */, D38187C415FE345B00C3EDCA /* DialerView.xib */, @@ -2268,8 +2281,6 @@ 63E27A311C4FECD000D332AE /* LaunchScreen.xib */, 1D3623240D0F684500981E51 /* LinphoneAppDelegate.h */, 1D3623250D0F684500981E51 /* LinphoneAppDelegate.m */, - 8C2595D51DEDC8E1007A6424 /* ProviderDelegate.h */, - 8C2595DC1DEDC92D007A6424 /* ProviderDelegate.m */, D37DC6BF1594AE1800B2A5EB /* LinphoneCoreSettingsStore.h */, D37DC6C01594AE1800B2A5EB /* LinphoneCoreSettingsStore.m */, D3EA53FB159850E80037DC6B /* LinphoneManager.h */, @@ -2279,6 +2290,13 @@ D3F83F8C158229C500336684 /* PhoneMainView.h */, D3F83F8D15822ABD00336684 /* PhoneMainView.m */, 639E9CB31C0DB88200019A75 /* PhoneMainView.xib */, + 8C2595D51DEDC8E1007A6424 /* ProviderDelegate.h */, + 8C2595DC1DEDC92D007A6424 /* ProviderDelegate.m */, + CF7602DF21086EB100749F76 /* RecordingsListTableView.h */, + CF7602E021086EB200749F76 /* RecordingsListTableView.m */, + CF7602D4210867E800749F76 /* RecordingsListView.h */, + CF7602D5210867E800749F76 /* RecordingsListView.m */, + CF7602D6210867E800749F76 /* RecordingsListView.xib */, D35E759C159460B50066B1C1 /* SettingsView.h */, D35E759D159460B50066B1C1 /* SettingsView.m */, 636316D61A1DEC650009B839 /* SettingsView.xib */, @@ -2385,6 +2403,9 @@ 63701DDD1BA32039006A9AE3 /* UIConfirmationDialog.h */, 63701DDE1BA32039006A9AE3 /* UIConfirmationDialog.m */, 639E9CAB1C0DB7FB00019A75 /* UIConfirmationDialog.xib */, + CF7602E42108759A00749F76 /* UIRecordingCell.h */, + CF7602E52108759A00749F76 /* UIRecordingCell.m */, + CF7602E62108759A00749F76 /* UIRecordingCell.xib */, D3A55FBA15877E5E003FD403 /* UIContactCell.h */, D3A55FBB15877E5E003FD403 /* UIContactCell.m */, F088488D19FF8C41007FFCF3 /* UIContactCell.xib */, @@ -3818,6 +3839,7 @@ 633FEDE91D3CD5590014B822 /* call_status_missed~ipad@2x.png in Resources */, 8CE24F4C1F8234A30077AC0A /* next_default@2x.png in Resources */, 244523B11E8266CC0037A187 /* chat_read.png in Resources */, + CF7602D8210867E800749F76 /* RecordingsListView.xib in Resources */, 639E9CAC1C0DB80300019A75 /* UIContactDetailsCell.xib in Resources */, 633FEE511D3CD5590014B822 /* deselect_all@2x.png in Resources */, 8CF25D951F9F336100BEA0C1 /* check_unselected@2x.png in Resources */, @@ -3914,6 +3936,7 @@ 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 */, 633FEED21D3CD55A0014B822 /* numpad_6~ipad@2x.png in Resources */, 633FEDCD1D3CD5590014B822 /* call_quality_indicator_0@2x.png in Resources */, 636316D41A1DEC650009B839 /* SettingsView.xib in Resources */, @@ -4384,6 +4407,7 @@ 34216F401547EBCD00EA9777 /* VideoZoomHandler.m in Sources */, D3F83EEC1582021700336684 /* CallView.m in Sources */, 8C2595DD1DEDC92D007A6424 /* ProviderDelegate.m in Sources */, + CF7602D7210867E800749F76 /* RecordingsListView.m in Sources */, 63F1DF4B1BCE983200EDED90 /* CallConferenceTableView.m in Sources */, D3F83F8E15822ABE00336684 /* PhoneMainView.m in Sources */, 6377AC801BDE4069007F7625 /* UIBackToCallButton.m in Sources */, @@ -4447,6 +4471,7 @@ D3807FC115C28940005BE9BC /* DCRoundSwitchKnobLayer.m in Sources */, 6306440E1BECB08500134C72 /* FirstLoginView.m in Sources */, D3807FC315C28940005BE9BC /* DCRoundSwitchOutlineLayer.m in Sources */, + CF7602E221086EB200749F76 /* RecordingsListTableView.m in Sources */, D3807FC515C28940005BE9BC /* DCRoundSwitchToggleLayer.m in Sources */, 633E41821D74259000320475 /* AssistantLinkView.m in Sources */, D3807FE815C2894A005BE9BC /* IASKAppSettingsViewController.m in Sources */, @@ -4459,6 +4484,7 @@ D3807FF215C2894A005BE9BC /* IASKSettingsStoreFile.m in Sources */, D3807FF415C2894A005BE9BC /* IASKSettingsStoreUserDefaults.m in Sources */, 639E9C801C0DB13D00019A75 /* UICheckBoxTableView.m in Sources */, + CF7602E72108759A00749F76 /* UIRecordingCell.m in Sources */, D3807FF615C2894A005BE9BC /* IASKSpecifier.m in Sources */, D3807FF815C2894A005BE9BC /* IASKPSSliderSpecifierViewCell.m in Sources */, D3807FFA15C2894A005BE9BC /* IASKPSTextFieldSpecifierViewCell.m in Sources */, From 0dc670ccb70e9e8da36442047bc1501d36ee1390 Mon Sep 17 00:00:00 2001 From: Benjamin Verdier Date: Wed, 25 Jul 2018 17:01:18 +0200 Subject: [PATCH 005/229] Add recorder button images --- Resources/images/rec_off_default.png | Bin 0 -> 597 bytes Resources/images/rec_off_default@2x.png | Bin 0 -> 1140 bytes Resources/images/rec_on_default.png | Bin 0 -> 689 bytes Resources/images/rec_on_default@2x.png | Bin 0 -> 1271 bytes linphone.xcodeproj/project.pbxproj | 96 ++++++++++++++---------- 5 files changed, 56 insertions(+), 40 deletions(-) create mode 100644 Resources/images/rec_off_default.png create mode 100644 Resources/images/rec_off_default@2x.png create mode 100644 Resources/images/rec_on_default.png create mode 100644 Resources/images/rec_on_default@2x.png diff --git a/Resources/images/rec_off_default.png b/Resources/images/rec_off_default.png new file mode 100644 index 0000000000000000000000000000000000000000..4dace8a7294ada50a7b34a277c28a26273bb9cf4 GIT binary patch literal 597 zcmV-b0;>IqP)0bZE$E!LjrDpxB_d5`E{RA@Lf3II_QWAO?-0~@f(vkQq`#0Y+jQ``V}+ZW#%s8*|ETI)B6=t5YxMnpdl(L3ww>$~nq2W}_4&2%9%b9j6Y0FEPK ztZVGA<>lo)xm+%2x7+vIwtWT>v*FkZ05||Jg@^_-|Kxezv+;QRO8500$JwKlI)jK) zVVwqm1|m*`uWP>VKW5wZ<;XfPitx5@o#Oz|CZc1m>t;O9+uv+959D&Wpj<9nwr$TN zVwRZ~UDwSRhOyT$jQy=vE6vQGA>u)$)TvUbbo28Ri$zpQokYYbW?t1=KUJ+(lZIjJ za$R>HGk=4KDa*1xEtktyWE~h)fE($;t`5{%>%3)I7kcMttzR?@<0EFiwzjtR@c8(6 zqxUPCN~JC#VupxbHcfLD03Zm0r%luRgqb-Af@!7H#qPRhvzZzj8~Ys*lfLgCR!S{L z`aker?!pgl6&?TpB0d?Op6U$`03e-Cx0w0EaPHBYAIvab2u~M!!vg?FBoZ~>_m2cY z@aR^<0|1B(!<~$ozaB9BP( z0AvSTBLIN8t{?3VkJsV5L$y$;`hX;@!z)@~r21)5T&D zyH+P}A>ymy%4VTcH#0Lc$IRa%qG?&yS3wXw-g(|@wOaR1Oiaun;yuh;fVn4}1<#-RNo^cNlS4aHu$Zb9m!0;Lx>^#`ZY8aPSr*?{L0Z zpUdSklBUdTSkkzps+nB{h@xn(q{os9lBUgUczk@k1E5?kXC*z6^i|Tlq}!vTqp3gU z%c0+)*2Y}y@W`R3v8PZd^mrXfcg<`dilV-`xw$QprX`KVaeT(iuGEd(T3TA_mNX;j zlbH>e*)>U#ncZyVtD`A<$C~DANdx9=PW?2R{KDk=Ii)XJj(0*`537ER(1D@RUH<>5rA|$J+?+S z6GAxb?mrsF05X}(+jcKZHJN)4d~c(x0u#VO>r|{VG3V~l)YR1GP^VNX?KHD~cb^O) zbVpIt*U;B$wUcIcVZDaf=5WuU+9GqW9Zods8<{h+q2}ky%gfvAL4Ov<@mVvwB3c%myW`NV@Yk9h-Hy;qb~~(&3}S1BcUVwfTI0lcbqAj?b-Kt5hln z>K$3AkB7x#acg~TpQNXfijo#3-OuH6nZG@RyMRN$j`|@y6JRm9GZPXL5)u*;{wY5J XrU{xkrlVPn00000NkvXXu0mjflzKsF literal 0 HcmV?d00001 diff --git a/Resources/images/rec_on_default@2x.png b/Resources/images/rec_on_default@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2bd2505c1a9e4f357926f6c0fd3dd15a61fc6a8f GIT binary patch literal 1271 zcmVhWe*kLuqR@p_+iARcXO4vZ)m}iY_doE_7uVZiFHdx|oG@ zC0&RvT#9tj=|U6)g@9@CU+aJs8Ipox?378Gj_G7F%=>%4>mujDZ8~rArpbVk^Ml8m zckexKhHuV&=Q|Hj6h%=KMNt$*Q4~c{6h%=KMNt$*Q4}SWT$V)^7?h8D0PJ+8Y5*z# znmM4U0;Y@i7=UL1i~`sVpkJo10Vo6b3BZLMa76{YS-iafjsiFW;86f~0vK@OA^;wM zzXALVpa7t_S+nsL@hmW5flC%xvOsJBTEIF7EnqC*S)goz&nz(RZ27j3{D$O}Mx!wl zMbQD0Uy@uP>5-hAnwsiO)>bN&t;U$+BrlMxk!+Iu-57IXc6N3k?K|e@=Ld~3?~%MH zadnbKk|&p!m+$MAc!L%=F5-DDgtIM#j4V(Q5g*U=Jp#!ONk-Ozr1}xkF37G@B0styzIoqB>!=)uLVIc)(!CvTHssBytTx0MGP!3ZGmGJ z*wKN25y`qS=562ihl3y(tJmxI0zj!$+Cs7@>%Q}Se>jP6G#dAl{7UA2C=?1k$y`34 z&yk#xx$AKpzgVeMwu-PLB+tv-OsQ1bve5!gSm3H`Tid}w3)C%eHcJ+|nGr?N!B%UG zF|Wy*a;;XoyVVvY`KPtk8e`r_#^X4CN#YoW;Vr+V(P#{jtXpes7=}-6q=1jeHtZz( z+#|HWMGL&J*0azN@Y6QW$kVw>p^0LbNXV*tk5+#?2X#u<80&U4*#D}Db1M>P*%JISNHy}f5Uh${oQ zM|MNk=xH%llMW+Vc_iM>V-z>!pWg^WU6Kq;ElPz#p(hA}eQp&7Fe7nKrp1L}_=GX$ z^`ts)R1w)>fm0T^E+)CtD(qQc(gNdIt8g60&$lTM#}X^Dw6wH6rO=#`HJ>G=_lU**d?0P$x&Zj}%GKCwV?93M{nUbETUMe^&!OfN1j-qnpZ?qg}sqKqOM3)IAbAIZ|rWf4$} z?=Z<3$M)PHSt8j;yq+=UofdH;B>!;Y0+Msi^>P$N&vdJu8y7!Vkq(1xwrwopowvYS zS-KF}dXpq8p6BgZvy!azwC|GqQF>aBR7FVrSw;5yJm;Sd-a+&0BBtL34 zo4dRDGGWjWaauZzP%Ee2MNt$*Q4~c{6h%=KMNt$* hQ4~c{6h--u@-JKOYM^S?AprmY002ovPDHLkV1g2TM(F?m literal 0 HcmV?d00001 diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index c776e19ea..2e27f3a54 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -750,6 +750,10 @@ 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 */; }; @@ -1864,6 +1868,10 @@ 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 = ""; }; @@ -2704,41 +2712,7 @@ 633FEBE11D3CD5570014B822 /* images */ = { isa = PBXGroup; children = ( - CFBD7A2320E504AD007C5286 /* delete_img.png */, - 24BFAA9B209B062F004F47A7 /* callkit_logo.png */, - 24BFAA99209B062E004F47A7 /* contacts_sip_default.png */, - 24BFAA94209B062C004F47A7 /* contacts_sip_default@2x.png */, - 24BFAA97209B062E004F47A7 /* contacts_sip_selected.png */, - 24BFAA9C209B062F004F47A7 /* contacts_sip_selected@2x.png */, - 24BFAA8C209B062B004F47A7 /* dialer_background.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 */, - 8CF25D9B1F9F76BC00BEA0C1 /* chat_group_informations.png */, - 8CF25D9C1F9F76BD00BEA0C1 /* chat_group_informations@2x.png */, - 8CF25D941F9F336100BEA0C1 /* check_unselected.png */, - 8CF25D8B1F9F336000BEA0C1 /* check_unselected@2x.png */, - 8CA70AD31F9E285B00A3D2EB /* chat_group_add.png */, - 8CA70AD21F9E285B00A3D2EB /* chat_group_add@2x.png */, - 8C2A81941F87B8000012A66B /* chat_group_avatar.png */, - 8C2A81931F87B7FF0012A66B /* chat_group_avatar@2x.png */, - 8CB2B8F61F86229B0015CEE2 /* chat_secure.png */, - 8CB2B8F71F86229C0015CEE2 /* next_disabled.png */, - 8CB2B8F81F86229D0015CEE2 /* next_disabled@2x.png */, - 8CDC61961F84D9270087CF7F /* check_selected@2x.png */, - 8CDC618C1F84D89B0087CF7F /* check_selected.png */, - 8CE24F551F8268840077AC0A /* conference_delete.png */, - 8CE24F561F8268840077AC0A /* conference_delete@2x.png */, - 8CE24F491F8234A20077AC0A /* next_default.png */, - 8CE24F4A1F8234A30077AC0A /* next_default@2x.png */, - 8C300D981E40E0CC00728EF3 /* lime_ko.png */, - 8C300D991E40E0CC00728EF3 /* lime_ko@2x.png */, - 8CD99A1B20908C27008A7CDA /* callkit_logo@2x.png */, 633FEBE21D3CD5570014B822 /* add_field_default.png */, - 244523BC1E8D3A6C0037A187 /* chat_unsecure.png */, 633FEBE31D3CD5570014B822 /* add_field_default@2x.png */, 633FEBE41D3CD5570014B822 /* add_field_over.png */, 633FEBE51D3CD5570014B822 /* add_field_over@2x.png */, @@ -2791,9 +2765,6 @@ 633FEC141D3CD5570014B822 /* call_quality_indicator_1.png */, 633FEC151D3CD5570014B822 /* call_quality_indicator_1@2x.png */, 633FEC161D3CD5570014B822 /* call_quality_indicator_2.png */, - 244523AC1E8266CC0037A187 /* chat_delivered.png */, - 244523AD1E8266CC0037A187 /* chat_error.png */, - 244523AE1E8266CC0037A187 /* chat_read.png */, 633FEC171D3CD5570014B822 /* call_quality_indicator_2@2x.png */, 633FEC181D3CD5570014B822 /* call_quality_indicator_3.png */, 633FEC191D3CD5570014B822 /* call_quality_indicator_3@2x.png */, @@ -2831,6 +2802,8 @@ 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 */, @@ -2857,10 +2830,20 @@ 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 */, 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 */, @@ -2879,6 +2862,11 @@ 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 */, @@ -2893,6 +2881,8 @@ 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 */, @@ -2907,6 +2897,10 @@ 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 */, @@ -2915,6 +2909,7 @@ 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 */, @@ -2923,6 +2918,7 @@ 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 */, @@ -2932,8 +2928,8 @@ 633FECA61D3CD5570014B822 /* edit_list_disabled.png */, 633FECA71D3CD5570014B822 /* edit_list_disabled@2x.png */, 633FECA81D3CD5570014B822 /* footer_chat_default.png */, - 633FECAA1D3CD5570014B822 /* footer_chat_disabled.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 */, @@ -2969,6 +2965,14 @@ 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 */, @@ -2981,6 +2985,10 @@ 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 */, @@ -3117,6 +3125,10 @@ 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 */, 633FED681D3CD5590014B822 /* route_bluetooth_default.png */, 633FED691D3CD5590014B822 /* route_bluetooth_default@2x.png */, 633FED6A1D3CD5590014B822 /* route_bluetooth_disabled.png */, @@ -3151,14 +3163,14 @@ 633FED871D3CD5590014B822 /* select_all_default@2x.png */, 633FED881D3CD5590014B822 /* select_all_disabled.png */, 633FED891D3CD5590014B822 /* select_all_disabled@2x.png */, - 8CD99A362090A824008A7CDA /* splashscreen.png */, - 8CD99A352090A823008A7CDA /* splashscreen@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 */, @@ -3708,6 +3720,7 @@ 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 */, @@ -4005,6 +4018,7 @@ 633FEE8F1D3CD55A0014B822 /* list_details_default@2x.png in Resources */, 633FEE5E1D3CD5590014B822 /* edit_list_default.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 */, @@ -4121,6 +4135,7 @@ 633FEE851D3CD5590014B822 /* led_error@2x.png in Resources */, 633FEDBE1D3CD5590014B822 /* call_back_default.png in Resources */, 633FEF0F1D3CD55A0014B822 /* pause_big_default@2x.png in Resources */, + CF7602F6210898CC00749F76 /* rec_on_default@2x.png in Resources */, 633FEF081D3CD55A0014B822 /* options_start_conference_disabled.png in Resources */, 63F1DF511BCE986A00EDED90 /* UICallConferenceCell.xib in Resources */, 633FEE301D3CD5590014B822 /* color_H.png in Resources */, @@ -4192,6 +4207,7 @@ 639E9CA91C0DB7FB00019A75 /* UIConfirmationDialog.xib in Resources */, 633FEF111D3CD55A0014B822 /* pause_big_disabled@2x.png in Resources */, 633FEE321D3CD5590014B822 /* color_L.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 */, 633FEE661D3CD5590014B822 /* footer_contacts_default.png in Resources */, From 498d5fa25b61dc3b2d738e929eee1169aaf42649 Mon Sep 17 00:00:00 2001 From: Benjamin Verdier Date: Wed, 25 Jul 2018 17:02:29 +0200 Subject: [PATCH 006/229] Add basis for call recording --- Classes/Base.lproj/CallView.xib | 537 +++++++++++++++++++++++++++++--- Classes/CallView.h | 3 + Classes/CallView.m | 28 ++ Classes/LinphoneManager.m | 10 + Classes/Utils/Utils.h | 2 + Classes/Utils/Utils.m | 24 ++ 6 files changed, 563 insertions(+), 41 deletions(-) diff --git a/Classes/Base.lproj/CallView.xib b/Classes/Base.lproj/CallView.xib index ab5f35348..e43709a09 100644 --- a/Classes/Base.lproj/CallView.xib +++ b/Classes/Base.lproj/CallView.xib @@ -1,5 +1,5 @@ - + @@ -42,6 +42,7 @@ + @@ -88,18 +89,18 @@ - + @@ -199,11 +200,11 @@ - + @@ -37,8 +35,9 @@ + - + From 8796f8b2d804ef3bc3609f056337f1e67d5b8d75 Mon Sep 17 00:00:00 2001 From: Benjamin Verdier Date: Thu, 26 Jul 2018 16:25:22 +0200 Subject: [PATCH 013/229] Adding player almost done --- Classes/LinphoneUI/UILinphoneAudioPlayer.h | 25 +++ Classes/LinphoneUI/UILinphoneAudioPlayer.m | 196 +++++++++++++++++++ Classes/LinphoneUI/UILinphoneAudioPlayer.xib | 85 ++++++++ Classes/LinphoneUI/UIRecordingCell.m | 12 ++ linphone.xcodeproj/project.pbxproj | 53 ++--- 5 files changed, 349 insertions(+), 22 deletions(-) create mode 100644 Classes/LinphoneUI/UILinphoneAudioPlayer.h create mode 100644 Classes/LinphoneUI/UILinphoneAudioPlayer.m create mode 100644 Classes/LinphoneUI/UILinphoneAudioPlayer.xib diff --git a/Classes/LinphoneUI/UILinphoneAudioPlayer.h b/Classes/LinphoneUI/UILinphoneAudioPlayer.h new file mode 100644 index 000000000..e77e5319e --- /dev/null +++ b/Classes/LinphoneUI/UILinphoneAudioPlayer.h @@ -0,0 +1,25 @@ +// +// UILinphoneAudioPlayer.h +// linphone +// +// Created by David Idmansour on 13/07/2018. +// + +#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; + ++ (id)audioPlayerWithFilePath:(NSString *)filePath; +- (void)close; +- (BOOL)isOpened; +- (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 new file mode 100644 index 000000000..542cf28d5 --- /dev/null +++ b/Classes/LinphoneUI/UILinphoneAudioPlayer.m @@ -0,0 +1,196 @@ +// +// UILinphoneAudioPlayer.m +// linphone +// +// Created by David Idmansour on 13/07/2018. +// + +#import "UILinphoneAudioPlayer.h" +#import "Utils.h" + +@implementation UILinphoneAudioPlayer { + @private + LinphonePlayer *player; + LinphonePlayerCbs *cbs; + NSString *file; + int duration; + BOOL eofReached; +} + +#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, NULL, 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; + } + return self; +} + +- (void)dealloc { + [self close]; +} + +- (void)close { + if (player) { + linphone_player_unref(player); + player = NULL; + } + [self.view removeFromSuperview]; +} + +- (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; +} + +- (void)setFile:(NSString *)fileName { + 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; +} + +#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)update { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ + while (player && linphone_player_get_state(player) == LinphonePlayerPlaying) { + int start = linphone_player_get_current_position(player); + while (player && start + 100 < duration && start + 100 > linphone_player_get_current_position(player)) { + [NSThread sleepForTimeInterval:0.01]; + if (!player || linphone_player_get_state(player) == LinphonePlayerPaused) + break; + } + start = player ? linphone_player_get_current_position(player) : start; + dispatch_async(dispatch_get_main_queue(), ^{ + _timeProgress.progress = (float)start / (float)duration; + [self updateTimeLabel:start]; + }); + } + }); +} + +- (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); + 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 new file mode 100644 index 000000000..1349da0cf --- /dev/null +++ b/Classes/LinphoneUI/UILinphoneAudioPlayer.xib @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Classes/LinphoneUI/UIRecordingCell.m b/Classes/LinphoneUI/UIRecordingCell.m index d5544dbc4..534479e93 100644 --- a/Classes/LinphoneUI/UIRecordingCell.m +++ b/Classes/LinphoneUI/UIRecordingCell.m @@ -85,7 +85,19 @@ static UILinphoneAudioPlayer *player; } - (void)setSelected:(BOOL)selected { + if (!selected) + return; + if (!player) + player = [UILinphoneAudioPlayer audioPlayerWithFilePath:[self recording]]; + else + [player setFile:[self recording]]; + UILinphoneAudioPlayer *p = player; + [p.view removeFromSuperview]; + [self addSubview:p.view]; + [self bringSubviewToFront:p.view]; + p.view.frame = _playerView.frame; + p.view.bounds = _playerView.bounds; } diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 2e27f3a54..11ddb5bd6 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -745,6 +745,8 @@ 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 */; }; CF7602D8210867E800749F76 /* RecordingsListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = CF7602D6210867E800749F76 /* RecordingsListView.xib */; }; CF7602E221086EB200749F76 /* RecordingsListTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = CF7602E021086EB200749F76 /* RecordingsListTableView.m */; }; @@ -1761,7 +1763,6 @@ 8C5BCECC1EB3859200A9AAEF /* mswebrtc.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = mswebrtc.framework; path = "liblinphone-sdk/apple-darwin/Frameworks/mswebrtc.framework"; sourceTree = ""; }; 8C5BCECD1EB3859200A9AAEF /* ortp.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ortp.framework; path = "liblinphone-sdk/apple-darwin/Frameworks/ortp.framework"; sourceTree = ""; }; 8C5D1B991D9BC48100DC6539 /* UIShopTableCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIShopTableCell.h; sourceTree = ""; }; - 8C5D1B9A1D9BC48100DC6539 /* UIShopTableCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIShopTableCell.m; sourceTree = ""; }; 8C5D1B9B1D9BC48100DC6539 /* UIShopTableCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UIShopTableCell.xib; sourceTree = ""; }; 8C601FD220B462B0004FF95C /* mediastreamer2.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = mediastreamer2.framework; path = "liblinphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework"; sourceTree = ""; }; 8C73477B1D9BA3A00022EE8C /* UserNotifications.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotifications.framework; path = System/Library/Frameworks/UserNotifications.framework; sourceTree = SDKROOT; }; @@ -1860,6 +1861,9 @@ 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 = ""; }; CF7602D6210867E800749F76 /* RecordingsListView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RecordingsListView.xib; sourceTree = ""; }; @@ -2350,9 +2354,6 @@ 2214EB7012F84668002A5394 /* LinphoneUI */ = { isa = PBXGroup; children = ( - CF15F21B20E4F9A3008B1DE6 /* UIImageViewDeletable.h */, - CF15F21C20E4F9A3008B1DE6 /* UIImageViewDeletable.m */, - CF15F21D20E4F9A3008B1DE6 /* UIImageViewDeletable.xib */, 63F1DF421BCE618E00EDED90 /* UIAddressTextField.h */, 63F1DF431BCE618E00EDED90 /* UIAddressTextField.m */, 63C441C11BBC23ED0053DC5E /* UIAssistantTextField.h */, @@ -2381,27 +2382,24 @@ D3A8BB6E15A6C7D500F96BE5 /* UIChatBubbleTextCell.h */, D3A8BB6F15A6C7D500F96BE5 /* UIChatBubbleTextCell.m */, 639E9CA51C0DB7EA00019A75 /* UIChatBubbleTextCell.xib */, - 8C92ABF11FA773C20006FB5D /* UIChatNotifiedEventCell.h */, - 8C92ABF21FA773E50006FB5D /* UIChatNotifiedEventCell.m */, - 8C92ABE71FA773190006FB5D /* UIChatNotifiedEventCell.xib */, D3EA540F159853750037DC6B /* UIChatCell.h */, D3EA5410159853750037DC6B /* UIChatCell.m */, 639CEB0B1A1DF4FA004DE38F /* UIChatCell.xib */, - 8CA70AE11F9E39E400A3D2EB /* UIChatConversationInfoTableViewCell.h */, - 8CA70AE21F9E39E400A3D2EB /* UIChatConversationInfoTableViewCell.m */, - 8CBD7BA820B6B82400E5DCC0 /* UIChatConversationInfoTableViewCell.xib */, 8CD99A402090CE25008A7CDA /* UIChatConversationImdnTableViewCell.h */, 8CD99A412090CE6F008A7CDA /* UIChatConversationImdnTableViewCell.m */, 8CBD7BAB20B6B82A00E5DCC0 /* UIChatConversationImdnTableViewCell.xib */, - 8C9C5E0E1F83BD97006987FA /* UIChatCreateCollectionViewCell.h */, - 8C9C5E0F1F83BD97006987FA /* UIChatCreateCollectionViewCell.m */, - 8CBD7BAE20B6B82F00E5DCC0 /* UIChatCreateCollectionViewCell.xib */, + 8CA70AE11F9E39E400A3D2EB /* UIChatConversationInfoTableViewCell.h */, + 8CA70AE21F9E39E400A3D2EB /* UIChatConversationInfoTableViewCell.m */, + 8CBD7BA820B6B82400E5DCC0 /* UIChatConversationInfoTableViewCell.xib */, 63B8D69F1BCBF43100C12B09 /* UIChatCreateCell.h */, 63B8D6A01BCBF43100C12B09 /* UIChatCreateCell.m */, 639E9CA81C0DB7F200019A75 /* UIChatCreateCell.xib */, - 8C5D1B991D9BC48100DC6539 /* UIShopTableCell.h */, - 8C5D1B9A1D9BC48100DC6539 /* UIShopTableCell.m */, - 8C5D1B9B1D9BC48100DC6539 /* UIShopTableCell.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 */, @@ -2411,15 +2409,9 @@ 63701DDD1BA32039006A9AE3 /* UIConfirmationDialog.h */, 63701DDE1BA32039006A9AE3 /* UIConfirmationDialog.m */, 639E9CAB1C0DB7FB00019A75 /* UIConfirmationDialog.xib */, - CF7602E42108759A00749F76 /* UIRecordingCell.h */, - CF7602E52108759A00749F76 /* UIRecordingCell.m */, - CF7602E62108759A00749F76 /* UIRecordingCell.xib */, D3A55FBA15877E5E003FD403 /* UIContactCell.h */, D3A55FBB15877E5E003FD403 /* UIContactCell.m */, F088488D19FF8C41007FFCF3 /* UIContactCell.xib */, - 24A345A71D95799900881A5C /* UIShopTableCell.h */, - 24A345A51D95798A00881A5C /* UIShopTableCell.m */, - 24A3459D1D95797700881A5C /* UIShopTableCell.xib */, D3C6526515AC1A8F0092A874 /* UIContactDetailsCell.h */, D3C6526615AC1A8F0092A874 /* UIContactDetailsCell.m */, 639E9CAE1C0DB80300019A75 /* UIContactDetailsCell.xib */, @@ -2432,18 +2424,31 @@ 639CEB021A1DF4E4004DE38F /* UIHistoryCell.xib */, 636BC9951B5F921B00C754CE /* UIIconButton.h */, 636BC9961B5F921B00C754CE /* UIIconButton.m */, + CF15F21B20E4F9A3008B1DE6 /* UIImageViewDeletable.h */, + CF15F21C20E4F9A3008B1DE6 /* UIImageViewDeletable.m */, + CF15F21D20E4F9A3008B1DE6 /* UIImageViewDeletable.xib */, 634610041B61330300548952 /* UILabel+Boldify.h */, 634610051B61330300548952 /* UILabel+Boldify.m */, + CF1DE92C210A0F5C00A0A97E /* UILinphoneAudioPlayer.h */, + CF1DE924210A0F5A00A0A97E /* UILinphoneAudioPlayer.m */, + CF1DE92B210A0F5B00A0A97E /* UILinphoneAudioPlayer.xib */, D306459C1611EC2900BB571E /* UILoadingImageView.h */, D306459D1611EC2900BB571E /* UILoadingImageView.m */, 2214EBF112F86360002A5394 /* UIMutedMicroButton.h */, 2214EBF212F86360002A5394 /* UIMutedMicroButton.m */, D36FB2D31589EF7C0036F6F2 /* UIPauseButton.h */, D36FB2D41589EF7C0036F6F2 /* UIPauseButton.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 */, + 24A345A51D95798A00881A5C /* UIShopTableCell.m */, + 8C5D1B9B1D9BC48100DC6539 /* UIShopTableCell.xib */, + 24A345A71D95799900881A5C /* UIShopTableCell.h */, 22968A5D12F875C600588287 /* UISpeakerButton.h */, 22968A5E12F875C600588287 /* UISpeakerButton.m */, 630CF5551AF7CE1500539F7A /* UITextField+DoneButton.h */, @@ -2454,6 +2459,8 @@ D32648431588F6FB00930C67 /* UIToggleButton.m */, 340751E5150F38FC00B89C47 /* UIVideoButton.h */, 340751E6150F38FD00B89C47 /* UIVideoButton.m */, + 24A345A51D95798A00881A5C /* UIShopTableCell.m */, + 24A3459D1D95797700881A5C /* UIShopTableCell.xib */, ); path = LinphoneUI; sourceTree = ""; @@ -4069,6 +4076,7 @@ 633FEEA81D3CD55A0014B822 /* numpad_1_over~ipad@2x.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 */, 633FEDFF1D3CD5590014B822 /* camera_switch_disabled@2x.png in Resources */, 633FEDDF1D3CD5590014B822 /* call_start_body_over@2x.png in Resources */, @@ -4394,6 +4402,7 @@ buildActionMask = 2147483647; files = ( 63B81A0F1B57DA33009604A6 /* TPKeyboardAvoidingTableView.m in Sources */, + CF1DE92D210A0F5D00A0A97E /* UILinphoneAudioPlayer.m in Sources */, 1D60589B0D05DD56006BFB54 /* main.m in Sources */, 8CD99A3C2090B9FA008A7CDA /* ChatConversationImdnView.m in Sources */, 1D3623260D0F684500981E51 /* LinphoneAppDelegate.m in Sources */, From f11fb7388aa3e5c82947d90df2016cca5080b61c Mon Sep 17 00:00:00 2001 From: Benjamin Verdier Date: Thu, 26 Jul 2018 16:41:16 +0200 Subject: [PATCH 014/229] Finish adding player --- Classes/LinphoneUI/UIRecordingCell.m | 19 ++++++++++--------- Classes/Utils/Utils.h | 6 ++++++ Classes/Utils/Utils.m | 23 +++++++++++++++++++++++ 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/Classes/LinphoneUI/UIRecordingCell.m b/Classes/LinphoneUI/UIRecordingCell.m index 534479e93..58475a8d2 100644 --- a/Classes/LinphoneUI/UIRecordingCell.m +++ b/Classes/LinphoneUI/UIRecordingCell.m @@ -84,21 +84,22 @@ static UILinphoneAudioPlayer *player; [self setFrame:frame]; } -- (void)setSelected:(BOOL)selected { +-(void)setSelected:(BOOL)selected animated:(BOOL)animated{ + [super setSelected:selected animated:animated]; if (!selected) return; if (!player) player = [UILinphoneAudioPlayer audioPlayerWithFilePath:[self recording]]; else [player setFile:[self recording]]; - - UILinphoneAudioPlayer *p = player; - [p.view removeFromSuperview]; - [self addSubview:p.view]; - [self bringSubviewToFront:p.view]; - p.view.frame = _playerView.frame; - p.view.bounds = _playerView.bounds; + if ([player isOpened]) + [player close]; + [player.view removeFromSuperview]; + [self addSubview:player.view]; + [self bringSubviewToFront:player.view]; + player.view.frame = _playerView.frame; + player.view.bounds = _playerView.bounds; + [player open]; } - @end diff --git a/Classes/Utils/Utils.h b/Classes/Utils/Utils.h index 1f03d9fb4..b3cca7947 100644 --- a/Classes/Utils/Utils.h +++ b/Classes/Utils/Utils.h @@ -62,6 +62,12 @@ typedef enum { @end +@interface UIImage (systemIcons) + ++ (UIImage *)imageFromSystemBarButton:(UIBarButtonSystemItem)systemItem :(UIColor *) color; + +@end + @interface NSString (linphoneExt) - (NSString *)md5; diff --git a/Classes/Utils/Utils.m b/Classes/Utils/Utils.m index 039f64248..c757eb4a2 100644 --- a/Classes/Utils/Utils.m +++ b/Classes/Utils/Utils.m @@ -569,6 +569,29 @@ @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 NSString (md5) - (NSString *)md5 { From ade06f3f9522b09d9d7c9261c5ad1d6976cedfbb Mon Sep 17 00:00:00 2001 From: Benjamin Verdier Date: Thu, 26 Jul 2018 17:15:58 +0200 Subject: [PATCH 015/229] Add auto close of option menu and other record icon in call view --- Classes/Base.lproj/CallView.xib | 271 +++++++++++++++++--------------- Classes/CallView.h | 1 + Classes/CallView.m | 5 +- 3 files changed, 149 insertions(+), 128 deletions(-) diff --git a/Classes/Base.lproj/CallView.xib b/Classes/Base.lproj/CallView.xib index e43709a09..7dfbac661 100644 --- a/Classes/Base.lproj/CallView.xib +++ b/Classes/Base.lproj/CallView.xib @@ -1,6 +1,6 @@ - + @@ -43,6 +43,7 @@ + @@ -81,26 +82,26 @@ - + - + - + @@ -256,11 +265,11 @@ @@ -135,32 +142,32 @@ - + - + - - + + - + - - + - - + + + + + - + - + - - + + @@ -255,11 +273,11 @@ @@ -280,7 +298,7 @@ - + @@ -290,7 +308,7 @@ - + @@ -300,7 +318,7 @@ - + @@ -310,7 +328,7 @@ - + @@ -320,7 +338,7 @@ - + @@ -330,7 +348,7 @@ - + @@ -340,7 +358,7 @@ - + @@ -350,7 +368,7 @@ - + @@ -360,7 +378,7 @@ - + @@ -370,12 +388,12 @@ - + - + - @@ -587,7 +618,7 @@ - + @@ -606,7 +637,7 @@ - + @@ -618,7 +649,7 @@ - + @@ -630,7 +661,7 @@ - + @@ -645,7 +676,7 @@ - + @@ -659,10 +690,10 @@ - + - + @@ -682,14 +713,14 @@ - + - - + + @@ -700,14 +731,14 @@ - + - + @@ -728,32 +759,32 @@ - + - + - - + + - + - - + - - + + + + + - + - + - - + + @@ -848,11 +890,11 @@ @@ -873,7 +915,7 @@ - + @@ -883,7 +925,7 @@ - + @@ -893,7 +935,7 @@ - + @@ -903,7 +945,7 @@ - + @@ -913,7 +955,7 @@ - + @@ -923,7 +965,7 @@ - + @@ -933,7 +975,7 @@ - + @@ -943,7 +985,7 @@ - + @@ -953,7 +995,7 @@ - + @@ -963,12 +1005,12 @@ - + - + - - + - - + - - - - - - - - + + + + + + + + @@ -1280,62 +1334,64 @@ - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - + + + + + + + + + + - - - - + + + + - - - - + + + + diff --git a/Classes/CallView.h b/Classes/CallView.h index 8fe61cb58..ad058daa5 100644 --- a/Classes/CallView.h +++ b/Classes/CallView.h @@ -99,6 +99,7 @@ @property(weak, nonatomic) IBOutlet UIView *conferenceView; @property(strong, nonatomic) IBOutlet CallPausedTableView *conferenceCallsTable; @property (weak, nonatomic) IBOutlet UIView *waitView; +@property (weak, nonatomic) IBOutlet UIView *infoView; - (IBAction)onRoutesClick:(id)sender; - (IBAction)onRoutesBluetoothClick:(id)sender; diff --git a/Classes/CallView.m b/Classes/CallView.m index aa4e2f8e8..7fa271387 100644 --- a/Classes/CallView.m +++ b/Classes/CallView.m @@ -49,6 +49,10 @@ const NSInteger SECURE_BUTTON_TAG = 5; videoZoomHandler = [[VideoZoomHandler alloc] init]; videoHidden = TRUE; callRecording = FALSE; + _recordButtonOnView.hidden = TRUE; + CGRect frame = _callPauseButton.frame; + frame.origin.y = _recordButtonOnView.frame.origin.y; + _callPauseButton.frame = frame; } return self; } @@ -235,10 +239,26 @@ static UICompositeViewDescription *compositeDescription = nil; [self updateUnreadMessage:NO]; [self previewTouchLift]; [self hideStatusBar:!videoHidden && (_nameLabel.alpha <= 0.f)]; + [_recordButtonOnView setHidden:!callRecording]; + [self updateInfoView]; } #pragma mark - UI modification +- (void)updateInfoView { + CGRect infoFrame = _infoView.frame; + CGRect frame = _callPauseButton.frame; + if (videoHidden) { + infoFrame.origin.y = (_avatarImage.frame.origin.y-66)/2; + frame.origin.y = _recordButtonOnView.frame.origin.y; + } else { + infoFrame.origin.y = 0; + frame.origin.y = _videoCameraSwitch.frame.origin.y+_videoGroup.frame.origin.y; + } + _infoView.frame = infoFrame; + _callPauseButton.frame = frame; +} + - (void)hideSpinnerIndicator:(LinphoneCall *)call { _videoWaitingForFirstImage.hidden = TRUE; } @@ -527,6 +547,7 @@ static void hideSpinner(LinphoneCall *call, void *user_data) { [self displayAudioCall:animated]; } } + [self updateInfoView]; if (state != LinphoneCallPausedByRemote) { _pausedByRemoteView.hidden = YES; diff --git a/Resources/images/rec_off_default.png b/Resources/images/rec_off_default.png index 4dace8a7294ada50a7b34a277c28a26273bb9cf4..55ab37a87699cfeb5e857a88ae18ab094d899147 100644 GIT binary patch delta 1037 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 delta 1108 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 diff --git a/Resources/images/rec_on_default@2x.png b/Resources/images/rec_on_default@2x.png index 2bd2505c1a9e4f357926f6c0fd3dd15a61fc6a8f..2a01c59731bca5974f2c2f1b1f4d9200feb08927 100644 GIT binary patch delta 2245 zcmV;$2s-!o3EUAOiBL{Q4GJ0x0000DNk~Le0000a0000u2nGNE0F@M4c#$D7e+n25 zD=BsvKlcCt2x&<~K~z}7?OAmrA?Kl>Y=8AMk*gcN|k~tS_M*YRETJDhI@Cuz=2yLm8ueLNsA3B z2~iucvH6I-yKnkO-df9g5B&85HAC`FGN@yfHPV%(3<)jfQk^%tpL6wr93$#K*?lM96NUGhs?YIe?UZ&8NeX` z`whc5c<9if3t@Zf>+7dDjYx0W~%@j_T~}{0%cN_mQPi z>X~dd`{zO0++3y9CIE|lh6NQ|~^dlnH*cU_l-5a)}Eir!77Qay$C)Ya9^ zBBDP5DAB;amQJVl_XCtjBqrLn{SN?B0Juu2hqBphs(@Y0S4w>!f53wPCIqIt0Hl;s zFBY=5y1F`xh~Co9@*#lPQp(E!V0eql%gd7h68d~MWwY5=f{d!Fs>aTqJ^NS8{4#*K z07i$%8x3GC5v{JMsF+q(R+c_{_N?Py(B9tOR#{m&9zZpK@c`Vmwzh1a4Vk7n3BX#t z{-aT&M*Td*C?|~{e?LA4VATKvDiP7+kw~N^kw{DoPTID;5x_n12=;uxZQJ`A8ygKjF_+7A0@$QqC)u|B^&lWG`tA;L%;)pp2C!rp zPFCO9*|{o6Gz??6mf44aw5N0c7)wOQ)9G||h$ppcV;|1=e;^u-Rs@5gX_~D7?gwx! z8jVJUZQFBv!73GU*5(L+0f4EOE?tU+7@8-uxT~w{F2T&Re3Pfb)QyoF4M74k_sLXB z%@P16`z9}hY$zWoG(=P$Li^AMs8kTqXy4?=AseD2sG-Rrw5vW@#e#^g`w)%|+3?W_ z0{TzL35@rHe-lb6zrfFiXsB%j0fq6J>i>8_M5ld(FNOema|CVZ4WcCK>LWsVL+QT3KV9b~? zzxTX}h@MU)5_bl9UcGwtaRALj!1I>tx=)1UM4txmJXkCR zy}dsPGH7jWy&jE5moW1S0D1=iq=$%p8jVJm=5o1@L$tHOOYVqhb8Bns^&2wAs;a87 zxi!FvIC*U^uql+WLgBlQcVe{F4VS5{U|129jgB`apmoY}o{<;oMe zT#knVB$-SK!!Xtp(JlbvGD$YHHSmmD6;KYI7BU?Y^%9fRoI;AHW-#Oy;iz?CKt+)WgiY48XmC zf17=+l=8Pj?tU~hG?Y7zv(;Bx`$so`c4qcs*d5wSC-jeve1MtPXS3OJBher7ykk9p zW!ggqGOhvGuaw$6&?W^9)+VZ}t0xo}7eAnsT0}&511KY+30e)^x`TGgFpRf*dwW}Q zx!e`p9=FHs@qaWZkw}adLiCF(3l=Q6f1FGvRUy|eDJhBEjIj`+N9S3=9_D9+5Ho}j zwh-do!-o%Fy#bJAS!^7iU2eMc*o-(30ye4h-fzve+dm{ z9W&nz;7(@V1mKa71b#UYT@1nTzP{}%iD- zn?D(=t*vd2L?Y+3CSwI`|# zr_{+0Lu-- znCx?${|-c>K@G*3IZj0I3F%?x4Vg^l*9CZ7_BAg1^?U}K>I4CG;FDhpf1{Xrn$}uY zO1beSHZrG>QM;~tITGm;amPRaiNM)!ky2LLwp{_>Uz(PP#bRF>ib3n*&+D9&E?&I2 zUpLOOtTm=-?lVnuUpyY4FA6Ynh-iaP3mb=VJst8szNe?>oBoOU^XC^a^Ew?I8bUMV zt_AP~%_p15WZDYGA^l@5=?j1_=wA$BUbZjzXkln+X*mtxDP4n&W9F?ybb^RdMD&p6 zae;`QxaD0|Q&aOg0I&AC_vq21jYByzDdi3T2_iZXC=R=sd8gwz8}p=;Z2<5;xS6v! TV5HV700000NkvXXu0mjf8q_(7 delta 1240 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 Ad?-5y(Q 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 Date: Thu, 25 Oct 2018 14:58:13 +0200 Subject: [PATCH 037/229] fix send picture with empty text --- Classes/ChatConversationView.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/ChatConversationView.m b/Classes/ChatConversationView.m index 84f659702..7949777ec 100644 --- a/Classes/ChatConversationView.m +++ b/Classes/ChatConversationView.m @@ -545,7 +545,7 @@ static UICompositeViewDescription *compositeDescription = nil; BOOL isOneToOneChat = linphone_chat_room_get_capabilities(_chatRoom) & LinphoneChatRoomCapabilitiesOneToOne; if (isOneToOneChat) { [self startImageUpload:[_imagesArray objectAtIndex:i] assetId:[_assetIdsArray objectAtIndex:i] withQuality:[_qualitySettingsArray objectAtIndex:i].floatValue]; - if ([self.messageField text]) { + if (![[self.messageField text] isEqualToString:@""]) { [self sendMessage:[_messageField text] withExterlBodyUrl:nil withInternalURL:nil]; } } else { From 416b271460b8634edce0b776239c9eeea030505d Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Tue, 30 Oct 2018 15:46:43 +0100 Subject: [PATCH 038/229] 4.1 : new ChatConversationView --- Classes/ChatConversationTableView.m | 75 ++++++++--- .../Base.lproj/UIChatBubbleTextCell.xib | 84 ++++-------- Classes/LinphoneUI/UIChatBubbleTextCell.h | 13 +- Classes/LinphoneUI/UIChatBubbleTextCell.m | 123 +++++++++++++----- Resources/images/chat_delivered.png | Bin 799 -> 925 bytes Resources/images/chat_error.png | Bin 494 -> 540 bytes Resources/images/chat_read.png | Bin 867 -> 963 bytes 7 files changed, 181 insertions(+), 114 deletions(-) diff --git a/Classes/ChatConversationTableView.m b/Classes/ChatConversationTableView.m index 20842d192..40e6edde9 100644 --- a/Classes/ChatConversationTableView.m +++ b/Classes/ChatConversationTableView.m @@ -93,6 +93,7 @@ NSIndexPath *indexPath = [NSIndexPath indexPathForRow:pos inSection:0]; [self.tableView beginUpdates]; [self.tableView insertRowsAtIndexPaths:@[ indexPath ] withRowAnimation:UITableViewRowAnimationFade]; + [self.tableView reloadData]; [self.tableView endUpdates]; } @@ -165,6 +166,51 @@ [self reloadData]; } +- (BOOL)isFirstIndexInTableView:(NSIndexPath *)indexPath chat:(LinphoneChatMessage *)chat { + if (indexPath.row == 0) + return TRUE; + + LinphoneEventLog *previousEvent = nil; + NSInteger indexOfPreviousEvent = indexPath.row - 1; + while (!previousEvent && indexOfPreviousEvent > -1) { + LinphoneEventLog *tmp = [[eventList objectAtIndex:indexOfPreviousEvent] pointerValue]; + if (linphone_event_log_get_type(tmp) == LinphoneEventLogTypeConferenceChatMessage) { + previousEvent = tmp; + } + --indexOfPreviousEvent; + } + if (previousEvent) { + 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; + } + } + + 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 { @@ -190,8 +236,11 @@ cell = [[NSClassFromString(kCellId) alloc] initWithIdentifier:kCellId]; } [cell setEvent:event]; - if (chat) - [cell update]; + 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]; @@ -216,7 +265,7 @@ [_chatRoomDelegate tableViewIsScrolling]; } -static const CGFloat MESSAGE_SPACING_PERCENTAGE = 0.f; +static const CGFloat MESSAGE_SPACING_PERCENTAGE = 1.f; - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { LinphoneEventLog *event = [[eventList objectAtIndex:indexPath.row] pointerValue]; @@ -225,21 +274,11 @@ static const CGFloat MESSAGE_SPACING_PERCENTAGE = 0.f; //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; - 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) { - 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))) { - height += tableView.frame.size.height * MESSAGE_SPACING_PERCENTAGE / 100; - } - } + 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]; diff --git a/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.xib b/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.xib index 3540175ea..71473db07 100644 --- a/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.xib +++ b/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.xib @@ -11,85 +11,54 @@ - - + - - - - + + + - - + + + - + - - - - - - - - - - - - - - - - - - - - + + + - - + + - - - - - - - - - @@ -97,8 +66,7 @@ - - + diff --git a/Classes/LinphoneUI/UIChatBubbleTextCell.h b/Classes/LinphoneUI/UIChatBubbleTextCell.h index f5a4a25e4..382398711 100644 --- a/Classes/LinphoneUI/UIChatBubbleTextCell.h +++ b/Classes/LinphoneUI/UIChatBubbleTextCell.h @@ -30,17 +30,20 @@ @property(nonatomic, weak) IBOutlet UIImageView *backgroundColorImage; @property(nonatomic, weak) IBOutlet UIRoundedImageView *avatarImage; @property(nonatomic, weak) IBOutlet UILabel *contactDateLabel; -@property(weak, nonatomic) IBOutlet UIActivityIndicatorView *statusInProgressSpinner; +//@property(weak, nonatomic) IBOutlet UIActivityIndicatorView *statusInProgressSpinner; @property(nonatomic, weak) IBOutlet UITextViewNoDefine *messageText; -@property(weak, nonatomic) IBOutlet UIImageView *bottomBarColor; +//@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 *LIMEKO; @property(weak, nonatomic) IBOutlet UIImageView *imdmIcon; -@property(weak, nonatomic) IBOutlet UILabel *imdmLabel; - +//@property(weak, nonatomic) IBOutlet UILabel *imdmLabel; @property (nonatomic, strong) UIDocumentPickerViewController *documentPicker; +@property (weak, nonatomic) IBOutlet UIView *innerView; + +@property(nonatomic) Boolean isFirst; +@property(nonatomic) Boolean isLast; + (CGSize)ViewSizeForMessage:(LinphoneChatMessage *)chat withWidth:(int)width; + (CGSize)ViewHeightForMessageText:(LinphoneChatMessage *)chat withWidth:(int)width textForImdn:(NSString *)imdnText; diff --git a/Classes/LinphoneUI/UIChatBubbleTextCell.m b/Classes/LinphoneUI/UIChatBubbleTextCell.m index 75937c0a4..6e24788f1 100644 --- a/Classes/LinphoneUI/UIChatBubbleTextCell.m +++ b/Classes/LinphoneUI/UIChatBubbleTextCell.m @@ -44,8 +44,8 @@ UITapGestureRecognizer *limeRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onLime)]; limeRecognizer.numberOfTapsRequired = 1; - [_LIMEKO addGestureRecognizer:limeRecognizer]; - _LIMEKO.userInteractionEnabled = YES; + //[_LIMEKO addGestureRecognizer:limeRecognizer]; + //_LIMEKO.userInteractionEnabled = YES; UITapGestureRecognizer *resendRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onResend)]; resendRecognizer.numberOfTapsRequired = 1; @@ -54,8 +54,8 @@ UITapGestureRecognizer *resendRecognizer2 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onResend)]; resendRecognizer2.numberOfTapsRequired = 1; - [_imdmLabel addGestureRecognizer:resendRecognizer2]; - _imdmLabel.userInteractionEnabled = YES; + //[_imdmLabel addGestureRecognizer:resendRecognizer2]; + //_imdmLabel.userInteractionEnabled = YES; return self; } @@ -126,7 +126,7 @@ return; } - _statusInProgressSpinner.accessibilityLabel = @"Delivery in progress"; + //_statusInProgressSpinner.accessibilityLabel = @"Delivery in progress"; if (_messageText && ![LinphoneManager getMessageAppDataForKey:@"localvideo" inMessage:_message]) { LOGD(_messageText.text); @@ -145,27 +145,83 @@ 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)] + bordered:NO + withRoundedRadius:YES]; + _contactDateLabel.text = [self.class ContactDateForChat:_message]; + _contactDateLabel.textAlignment = NSTextAlignmentLeft; + _avatarImage.hidden = !_isFirst; + } + - if (outgoing) { - _avatarImage.image = [LinphoneUtils selfAvatar]; - } else { - [_avatarImage setImage:[FastAddressBook imageForAddress:linphone_chat_message_get_from_address(_message)] - bordered:NO - withRoundedRadius:YES]; - } - _contactDateLabel.text = [self.class ContactDateForChat:_message]; - - _backgroundColorImage.image = _bottomBarColor.image = + _backgroundColorImage.image = [UIImage imageNamed:(outgoing ? @"color_A.png" : @"color_D.png")]; - _contactDateLabel.textColor = [UIColor colorWithPatternImage:_backgroundColorImage.image]; + + // 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; + + + //_contactDateLabel.textColor = [UIColor colorWithPatternImage:_backgroundColorImage.image]; - if (outgoing && state == LinphoneChatMessageStateInProgress) { + /*if (outgoing && state == LinphoneChatMessageStateInProgress) { [_statusInProgressSpinner startAnimating]; } else if (!outgoing && state == LinphoneChatMessageStateFileTransferError) { [_statusInProgressSpinner stopAnimating]; } else { [_statusInProgressSpinner stopAnimating]; - } + }*/ [_messageText setAccessibilityLabel:outgoing ? @"Outgoing message" : @"Incoming message"]; if (outgoing && @@ -175,12 +231,12 @@ } else [self displayImdmStatus:LinphoneChatMessageStateInProgress]; - if (!outgoing && !linphone_chat_message_is_secured(_message) && + /*if (!outgoing && !linphone_chat_message_is_secured(_message) && linphone_core_lime_enabled(LC) == LinphoneLimeMandatory) { _LIMEKO.hidden = FALSE; } else { _LIMEKO.hidden = TRUE; - } + }*/ } - (void)setEditing:(BOOL)editing { @@ -250,8 +306,8 @@ } - (void)onLime { - if (!_LIMEKO.hidden) - [self displayLIMEWarning]; + /*if (!_LIMEKO.hidden) + [self displayLIMEWarning];*/ } - (void)onResend { @@ -349,25 +405,25 @@ static void message_status(LinphoneChatMessage *msg, LinphoneChatMessageState st - (void)displayImdmStatus:(LinphoneChatMessageState)state { if (state == LinphoneChatMessageStateDeliveredToUser) { [_imdmIcon setImage:[UIImage imageNamed:@"chat_delivered"]]; - [_imdmLabel setText:NSLocalizedString(@"Delivered", nil)]; - [_imdmLabel setTextColor:[UIColor grayColor]]; + //[_imdmLabel setText:NSLocalizedString(@"Delivered", nil)]; + //[_imdmLabel setTextColor:[UIColor grayColor]]; [_imdmIcon setHidden:FALSE]; - [_imdmLabel setHidden:FALSE]; + //[_imdmLabel setHidden:FALSE]; } else if (state == LinphoneChatMessageStateDisplayed) { [_imdmIcon setImage:[UIImage imageNamed:@"chat_read"]]; - [_imdmLabel setText:NSLocalizedString(@"Read", nil)]; - [_imdmLabel setTextColor:([UIColor colorWithRed:(24 / 255.0) green:(167 / 255.0) blue:(175 / 255.0) alpha:1.0])]; + //[_imdmLabel setText:NSLocalizedString(@"Read", nil)]; + //[_imdmLabel setTextColor:([UIColor colorWithRed:(24 / 255.0) green:(167 / 255.0) blue:(175 / 255.0) alpha:1.0])]; [_imdmIcon setHidden:FALSE]; - [_imdmLabel setHidden:FALSE]; + //[_imdmLabel setHidden:FALSE]; } else if (state == LinphoneChatMessageStateNotDelivered || state == LinphoneChatMessageStateFileTransferError) { [_imdmIcon setImage:[UIImage imageNamed:@"chat_error"]]; - [_imdmLabel setText:NSLocalizedString(@"Resend", nil)]; - [_imdmLabel setTextColor:[UIColor redColor]]; + //[_imdmLabel setText:NSLocalizedString(@"Resend", nil)]; + //[_imdmLabel setTextColor:[UIColor redColor]]; [_imdmIcon setHidden:FALSE]; - [_imdmLabel setHidden:FALSE]; + //[_imdmLabel setHidden:FALSE]; } else { [_imdmIcon setHidden:TRUE]; - [_imdmLabel setHidden:TRUE]; + //[_imdmLabel setHidden:TRUE]; } } @@ -389,7 +445,7 @@ static void message_status(LinphoneChatMessage *msg, LinphoneChatMessageState st static const CGFloat CELL_MIN_HEIGHT = 60.0f; static const CGFloat CELL_MIN_WIDTH = 190.0f; static const CGFloat CELL_MESSAGE_X_MARGIN = 78 + 10.0f; -static const CGFloat CELL_MESSAGE_Y_MARGIN = 52; // 44; +static const CGFloat CELL_MESSAGE_Y_MARGIN = 44; // 44; + (CGSize)ViewHeightForMessage:(LinphoneChatMessage *)chat withWidth:(int)width { return [self ViewHeightForMessageText:chat withWidth:width textForImdn:nil]; @@ -480,6 +536,7 @@ static const CGFloat CELL_MESSAGE_Y_MARGIN = 52; // 44; 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; } diff --git a/Resources/images/chat_delivered.png b/Resources/images/chat_delivered.png index 9d741055de31cb1e09060595830f1406db1d798b..356b8ecd187f6c8703e62a9f0ca2809c88637cc9 100644 GIT binary patch delta 899 zcmV-}1AP3S2Au~XiBL{Q4GJ0x0000DNk~Le0000P0000P2nGNE0L1BqW04^#e*gz` zNliru;tClL0yO9+!IuC411d>GK~zY`otD2#BWW1Nzwi6bOlHO(kQKC4QEaslj_qQs zL=Y{q>^8^k9}wKDx+$fUrfu8rgCKZAL>xVYF{T(}pFGcdBc=3uLNb}mO8}phQWl;mjIo+w7)i%* z@~!&NUv6)2f2WlCG6(woU-?0nnRlT0S_QYrPN9Xy~YP1BY(e>XS(XhNiv zrfHi04C+Bd=v?3TUq~rE4gjWU{xT>)(=_P1-Ys;NZQJhwfMv7U(Q38&Z$DMkE{ltc zNF)*ffU~nR6bglQZ-Swrp%>hB-5&=5OifK8nM^_m0U-nuiA0A-L?k@VOLHQ6^<02u zSy)|N1!Jt|-5>~FYmc2Af0EhRSu8Iv0{~7>PjPj16*^y8S;5H2NJv*G6wqiix)s1A zC!$!ZQV4;ywKc@!am3?sY;0^`dV0EfzOb->xw*NJp_`i4nG zw{nj4^>s{4Okiwmtm)xbX*3!*I50PibXf@TG3w&o-5vJ!_E4=>0RR^l7m?-K z#fuM8%1Uzz$6~R2BC?nKZX(-}gs_ z5I-}NS8#A~K0cJimzge*(Wr zL_t(Y$Gw)%OH@%5$3N%32g8^Sh{l)}n7PP>E5SizKoBb0gb2gT1OJBzYSFTw=wAq0 zgfb3>RHQ9x<3sW{IW9X0wc&-d~@_ndovT;T}x_xE40 zEUQOEZUL8o^SjhfRsCX&d2Nh&e;JF#ew5OXV#cANp=QtX9s#|8;b`Q6Vau}a$6~R? zV;v-u$zBn84xHm;_^qmaj^n&KXe_v0DwVn;A}>xM4p1o~!^vdwcF_n@sZ?B5lcmyj z0;sCS9mg5kcQ7z8aM2j^K}4$fH~5vy<*xSi^{p5H%d#GyMZBV-g38Lue}krwZQG9l zWN>h>5%^d}wG>5lbv51H-G~UIqoZtYZthVYaM=Jorxmv>i;j*CY}-aeP}Kq&=rO8# z{j{lRYilDE3IUK#r`g)t@*lZjMC6L!8V-jEhr>sTH#9WR)YJsP>gp<)Or}^lHQ7L2 z!Rv%VbaizhB1}z9vAB4se>n*TgS5A|1CY&TnV6XHr)LlK#$Wf@Y?hs!o&6Nl*Vh-e zz6g;>gg_twfa|)&Qd7{$-~A58#>U9ya)=0>ot@Oy*6#ByEiKg5{S7*k$*{bDd2n!1f%+1a1KmJ}x&d$!VwzhWM z?LAc;F^NQC33yiO)XdBbOG`@yk= zz#6a!%mZ&g2WSD8z?B0Z{Kf=xe}aObBTx!|790!a(gHleeahrvZwYcqfOWysn1F$I z1^KuNCIt-qMX+q!gV7c_j> zYW2GPc~nc`l>P?U18gg{S-6#>ev9BSc6yRP@c;?h2tE?$KB`5HMw&D8PNF_dUdaQ3 z=9Ks32Eo~sr|Sg4j#VngIVW}r+WLf*}(0Vw)r3{`YDCZHKvfdw=pIOtDDn&j>N z@L2y=oCH_~*Z}r{RbUBN0A7LikN>V~2R@_nd;tI-)#g*foJ0Ts002ovPDHLkV1k0m B-E05= delta 465 zcmV;?0WSWW1nvVNiBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_>mzge*un3 zL_t(Y$Gw)%N&-<7#(!h8v{nZF6Qt}>`m-wuBBB=vT11afi+TZ*=@Ht5OMM01=w_54 zB`ktgX)2O>TFfm)rnz?#{NTWWd*=J@z30q1*CGG{%Rma)1LDAO1)@L~f`#sb+a42NL^Y6zT7(R*}uia^4sEk~mw znT$v}?fH80zIZbP1n#sSIL@dSIgW|I?RYP`1X_W&X^j<|KG99!YO4f>0W000000NkvXX Hu0mjfV}Qw) diff --git a/Resources/images/chat_read.png b/Resources/images/chat_read.png index b7ae0d29a6f45214229c55d6e709253c232de594..8f8f467c1e84ecd7088333160b9221f07621884f 100644 GIT binary patch delta 937 zcmV;a16KUw2Ezv-iBL{Q4GJ0x0000DNk~Le0000P0000P2nGNE0L1BqW04^#e*gz` zNliru;tClL0UvL+YZL$g15imsK~zY`t(H%0R8OOZbwMN!F{wMoMx{s@D_|oat)ap& z1EtK+N;~sr-gO}@^E!R)wEFGde>vx#@1A?UbMF(DLG!?Xf97uPRjqV~Ko|%C8-Y6r z39X5X5DnD$PhD+m%X;OJC9ScT8A_!OYfbNi#4F*p7CuVV*B&Dh$*)Kf>Oaxw7%D27 zt*jouD8uYbSnU&@B*Fe~T2XupJjU9QLY(&G!LH#Fl2HGNMy=G@|41;8e@X2)yHed< z;{a;D2achl{}TbgCQ<5ZVli`pB$!I~tg#1F8U|H{v6O3DD3v}8Ak6~<{+Uen&oWiy zLeJApe6XbjfTO?u#urz{7l$MQ>-|runau3owGg~m|0um%pT(yXKBf3@OAC*fB^5RN zot}#*jnT1Mf;zvC&vx%Xe~Ehnv@VU+qB@kI!;2kz8-kqPzmK8)`*`i~V9CNycWxtC zRq3+zT^VP#P*`G1I;=okN99wB&tC}hWT2YOfol5pwDNNBq38}ZZRYhS+^2hCD$U0i zfA=c9L4n@jQj2L&ZJG<;6-v>!rBO=Me-GaiAYrvnAWr*oM5}oj z6K@>&tEl-!jXu~ltPHai7+F(#A+C^}#ZPYu$$Ul0%jd(0yalC$>ZKwP-cHun?k=ui z`Cp<3XgPk|Hmzge**(a zL_t(Y$Gw(MXjE4e#((F&hh{WMHD;WdL@~w*RKyldZL7ibkEK;NItIfe5V~_ESlXrw zcPb{h5DQ(1RS~hI(RLga+d>r)MHGS<|HWd|NHvpaiV0S0{>*#Fg-MzjXEHICe!F+R z`@VDU$2sR-VHD&ahy-lQ3aRKSe}S2RcaZ8r`4huY#|%WfDl0qFX-KM|_t4Rx`{rLYe-#}DAa0rZ z*AXwA7eAb)P1G3y8%t`)nsn1Kf z&pWF4^1=XB#j^l7^Pr1;f30n)>Z#ZO{*kd@ZVrtfF5%!uWz+j0oSpw~)Mv69D+C>C#KqB(8^8VuF6E zPM_y#JdQ2G?y^NJ%Fi3-*Uv5C1OIdY_O;&OxBDIGeH3Xos@zGAe_!qHVcoeV;;Lj> z7W Date: Wed, 31 Oct 2018 16:41:34 +0100 Subject: [PATCH 039/229] 4.1 chatConversationView(one to one chat): send media --- .../Base.lproj/UIChatBubblePhotoCell.xib | 167 ++++++++---------- .../Base.lproj/UIChatBubbleTextCell.xib | 2 +- Classes/LinphoneUI/UIChatBubblePhotoCell.m | 8 +- Classes/LinphoneUI/UIChatBubbleTextCell.m | 40 +++-- 4 files changed, 100 insertions(+), 117 deletions(-) diff --git a/Classes/LinphoneUI/Base.lproj/UIChatBubblePhotoCell.xib b/Classes/LinphoneUI/Base.lproj/UIChatBubblePhotoCell.xib index c453ff689..055b18056 100644 --- a/Classes/LinphoneUI/Base.lproj/UIChatBubblePhotoCell.xib +++ b/Classes/LinphoneUI/Base.lproj/UIChatBubblePhotoCell.xib @@ -11,10 +11,8 @@ - - @@ -28,102 +26,66 @@ - + - - + + + + + + + + + + - + - - + + - - - - - - - - - - - + + - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - @@ -218,12 +194,11 @@ - + - diff --git a/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.xib b/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.xib index 71473db07..bcdf8588c 100644 --- a/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.xib +++ b/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.xib @@ -31,7 +31,7 @@ b?z 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 BcCP>c delta 4347 zcmZu#4Ny~87Je6Eh%v@zh%sg{jWMP)rD-Nbs1}E zM;VHI*5^`}Qfk$@)HnRkb06EATf~r2oCk+Si{{8UYW6Vifm>t2`3Jbnh*KIXj%!Rv zh%Caa5e{l5uGgY7pk1rMz ze-Uj&waE-kv`oDLdrYqp?Fq}g0>2b(6@1J%qmr#*I&3xX#yYbM&p3+^92&QsO;!-dI4RqEXH|DxuEN~$5R+OEOVo0OGk!f(sD7Pf07QJjtxO`;V9?rXZmSX!3dmo$50qaf=m8AB{tb&l09xWFm-EpP#V! zFs*}Ws&(uPX))!ZR&q!$P?Bq<#UdvyQ*CIOY7&}`_*mHEc@RN3;tgtVd<}z~;1TYw zJg!0gV;X#(;KuO;o|Yg&m(LBH_BeX)^KYQnr*Y z_}$YS*fq_@jUy{H#>{n>Q{(pMa}QF5guV?)>d{mi8y^t0S|*hXxr3g|q(xLrr_*0S zRltPm3@uvH%t#BQa9YQ!np;6{dc&Z?`Wco11+1T8B-d+6<|b?w(Z{KeLtX|g%#8hl zUieEd;SH$H^a#E((@lIWa%Pqzer8>mb_;p@%mDSyFlIp4ue_w=q23Kw)?!_N0=<;-$-~L)OT-)1&N*p}2ueypP_6j2V+4xw9GrpS8T+_&GVp&g zP%uB*NrmGN~79esAbqvlt&6xqch0k63X`TVqT|4=A*A93E3rjm`jqycFo-I!)Wes1!ba=a#2BV zS%~-*n@465!t1m~1mbzYOh~#kUCNWv1+x7G+n6kp*GdmkWjm-|Lm_v*sKGorsk&$5)gRyGOokwLV-R7b5^jJ>|*2x@;D z%V!vldJPO~?c--tTs6|OlU}2LJbu05w{kmrKP&H>$#{Sh< zh@;I~)V*#YsRg$hgM!yJ$F(%`(}NGv;d-w{5_&?Z*&X3 zv*j`ZNE5VoldPk$q4n9f!LF8XGSJQ94To4bSKf$YShu+z9cL5OeM&NeW6LQqL5?kE zT#+?!w-yjKKNKbb2}7(yG4SS2I+#@jaeq>n$%e+E7Tj?Og+M z-d>85c0JPGuEUwF1z~Ij@vFs5=j^cIP)7D|XhO&=}apSNaho;HsK4c+zf#9qKTRG7Pcz{; z^{@uEkF8_5q)M!$fpd)8-}$i}+dj65@hL}*_3_%-o5^~5f_fR zaO#)`wZ|&Zbli&i<90F5`$-FpTTI1VO)=96{fP!~C$=!3`lk~U7=`paE#CQLn67^q z+f#^)lZgnN^ugS-8#$i_M$Dzb3pTzz5iy^Jb{OAT4XS#ohXjp1vqTtNQ2*yHzB^&h zXZy)Q5xPI?MAI!Qvd{J*t+)Uoo%QOazt9@WJ#E94FG9<~ch-QC(=MF+tDSHk^_H;F z5Wc74I4d(;ID00nOjn`v2FT}=aP7Q> z`uJgZ0%3`ReD{~h*!5+~Am4al1=e1u!>!Y$>V>bIO#R|3SLmx__a*blxzZddKwEyk z$Yt!`TG4jJh?=i=;=8XsqOjVoxCjfKNhw!-NVys-Y`0ypLH;J0WV}xhnCV*|Oy7#5 zQ|A=#eEtR&W2)!0162flW7qDEWRaioVarwY$M+UJyf;^Lc^b>fJ(I{LDWnj5c`Lu%R&P5B6^RxJF&I9lu?o(Omn@o`ma0nC!ITNom8JT&I zG7Q+v4;_)P9^wX$wD5UG$fMslzza>%@Q5;G}&2l;kQBJ)HI z^G(7$jt7T4_Boj&^v>6u%)_a{ch)N;OjHOL)g;1Ej!b4rO7~=zJmhk-ir?JO cM6+7?5R2sx{x?G&hY}T?huO4GN_zVJ7bS^O@Bjb+ diff --git a/Resources/sv.lproj/Localizable.strings b/Resources/sv.lproj/Localizable.strings index 3b36a711b9eac249e5648fbc9a1563e5a8f9ba26..46622b78733ff6caa7d86d6e83193c1adaf4d89a 100644 GIT binary patch literal 75190 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 Lvl||hO!WO9RFC_+ diff --git a/Resources/tr.lproj/Localizable.strings b/Resources/tr.lproj/Localizable.strings index 9e08a0fe3e61d178a3e719b47b8e87fa40e94aef..23f65bd9f971d337b4c8088c1422a99a41179fc5 100644 GIT binary patch delta 3702 zcmeHK&re)c6uuLNp-`%|ND;8*ffQ^4ouUgPBfe_uV_g%)<#X6?W!j-hKDHbI(2J-0ytn z&7%$Pji0@DpB%0JP{q}-^xbLBrBqlgsEkUgs7k9<#W(z2RyJn+%2H?4kd_RqWylwy zmsB4?o>oiHN#ki1Z)m~7yEr6aJjWoT-89CeUZ2tyQ#&?0pg&NDTZb{fZ+H4s=b^at zit3ci`I*;(@F|WURxoCDFewDa;4R!2aW4jJs{}3vo|4};n{ye(gqq}VoYyH}61aLE z@0b``rp!_yJ&S9pjTtSa)j8w@$-%EfRpd>b+ntdEaYrVrXPhTT|2WnZR1>(0z74}W zNMy6sb{;iny_dS-yrnS`*TE1YNKIZAL-?hOZ6syS74plovyy1@$<@=@wxD`j4XY8C z16Sa{2Wk}3A7!&6;{1C0!#U_ab zPMk_YZvkhK#0r8q0;dNH&dTJVpIQxNv}7yrxvUMgIBRcaeX@OaT!sSPwiTG*LGwt9 z5uf)kE2tm&cyz?+8F~1;Jn)UTU(l$adOH#|j*%W%C^8}l$dS#*4byx#jadfc0t{25 zJbHKljD#aSrWF<{i+KrS8X)Oceq1ZO*8Me})|?+=reFz%qk4mw>dmKw#gK%0Ogol< z4&fYzWVZvUl4$=mEVwgKuqfX?t~uloM-M1O=g;Xct8>Hpd^5;^rQSkzqM9l+5kQhb zer!l=$YZ$A;~sXE^%$_sBd^>-K-H-_nW>(1Zp`&m&82W~L<0+th)LnHfnPrH+=&1S zKSHk;TFbbbnUO9)V-<+t@f-djvUb{n+zGaa&p|S#cQD1AfEDf&%?DOsvkdG+V2`lp zt}K6!JJzs*O~%scAh*WwY&g}H&0uSe9Le{#=1s0sFK++}vTW&VC=MvbIUCku9l%&V7 z{E!bqh2^VY+y6(QkK&l?DA=H6D0JNUY5t_I(U87@jRD&=6<+_X%5%y;0Tf?EvtXGL zp}Ukc@<@S111d)XGRhU?|*ct*sR>?+P8b1 zh+{#Oi?zfw(?@5W{^d73Aer(6LZToe6BZ=L>$=uSi~PA$cO4o}XC)v_k@w(??Y*Bj36 zQ#TLX?c3gcTi^PmY0&g2cginoABumS_VN%mYVtO8DR1AtZ`DpA0DhsT*T1XsG!7U> zio$A0cQTd$s7u$hyN9vEnRdf2sQawEy77|V#fo}e1UASPrOoP~w{0xDt;}`KId^~f G`oiCdV(6~` delta 121 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 r$5d;iRE9K zMP<|it4JU&mFNyCfy4q7b=V*lZ4hDuLIkm>Di&pd#D)!G$M>8!Njy$*aU$9k8qK_! z`|dmU^X@%weqCss`=xQ-@->YqOU32q%fWJ9rBp%{RZgWm+tKvu;u0SG- z0n_e%aKEQz2Rt?O_FMADvw^T%)kJ)&=H=VKn3O_UZ%hrVxH_N)?F*rIn7IRq6a+_3n z+0grR&AG+Car@<`zG;@WD+98t#}k^tB5s2TfJzW8!xvtE^Tj8{zpu@H?HQ|GZU+X! z&+8qdas;stV5CI@<)4!A#b7(7Cm}6jOaRd0p7wB0nJN0nksh-e*eq(buE2#VG|8xJ5|MrhV zUwXoEy+=iaXQ+OJp4P2MhRMt5Tfs-%O>+@r82)e`Z zEMjI7R#OKK&#dV8v3l%uuuiyKv)@e^;oj0%i%_6qn+|Ni%t6N=EKoJl-&^Ml!eEVTBV~)g%rXf zpOn8!r{wn$U%3ulV6oShX^W?Rg&o&q^-d&NJTYqjIkLH_Y@xqcv+On2R}@@I=aQ&9 zU2TxFmJ;eLoMC_tC-Uj0>meQBnz5PzlR)z$FXeSYI0)LETG^@#`O&*ZS_O?m_@v!> z+P9%xtI^reFm62Ri^CDw4H~>Khwp(q4dednPWO{>%~|mv+C+%zUoE{tqRTs zsq@rfzS0?ZL6cNqlylOKY$=h{Q2_=|0F>p-jhaiR1;bk$#ms~rvlY}G7n z%R3kS(wyzE`!8Pen(n{qYI^6cB=pf^f;y{r=!l-H{Ey#drS9(AZ+LdpX-QtX6xin+ zE!Fv7i%np7S1@$Y@IbP2zH4(=gWjWvia)^xS-jb`*WstMj*tf?_Zd8fHxsw}2;u?d v93ni#^bfQoE^Xzp18Ymij*MTvClrc=) delta 133 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 W3*DERIb3^8W$WKZs8N literal 0 HcmV?d00001 diff --git a/Settings/InAppSettings.bundle/ar.lproj/Chat.strings b/Settings/InAppSettings.bundle/ar.lproj/Chat.strings index dc2602135f1af520a0688fee9162803f5bda4c92..669e88953c939873bbb2759323f0962cbfdc9389 100644 GIT binary patch literal 506 zcmb`E%}&BV6ot>~E_{kf7Xq4S2quIW76hk}L=(jD0Ekjdijua<&%-NUrzCXg!o^JQ znd$w`x$W;yq=CLv=u=Lw>>GV3P){`(>SzVqHGZLpD>{LHEetDk_)7c?&a5(Ngkn@BcJfDb zYSBKQpE?Ur?DJFS0g8Qo>LNg~&re+jDE29}p&b1)=w?l?vuVsdO57nbr5CC|Ml^uT zaB8e<%Mpi4doZQL#F*{DrcqmuvTf6-1hrK7rVZFax01d1{JmvD1uXWSOcvF7ls=4L zTY9t9=5~#KmQAd|*qL3cM#i|+Al2*;omt9%JxbgnZV=^$KIk1M-tY))j;{BZlD;9H zSp%Q_f{tM|>sm7AsIV+K429pCQ;b-_f)i9-AOR8*uxQl-wBaX6VTh7Y+MXR1K083NWWge_J@$O> zdCvb`4RuhZy@HnfkBZ8OpHx9xs)TCi*@lxfS*Ddr@|;dao#Q}z!@m|z{Hpj^i z+!CEXbc1^CCFl#)%ANFE>W|LX^s(<(K+0hS_O#7PG&k2BkEm5j>CH67&A6qtU@oCo z_#33|COXCLG&h32p%rj#I@8HDR%8)c?PLPO-qkiu;TkjIqIuU5r?zh-9+;}G(U>>N VyX(|yK_7a0x5}|8L_zE=B+w*aXx7 diff --git a/Settings/InAppSettings.bundle/de.lproj/Video.strings b/Settings/InAppSettings.bundle/de.lproj/Video.strings index f18b0d63549d026feb01ea3134e8ebf84b9dfb12..a95779d8927a829e7d3e0f7079970288351f1dd2 100644 GIT binary patch delta 27 icmaFH*2BKRj+xVgL65Q*W4*np=SYu-+Ieg&tjHQ?z3l<)CO;1(z z=lqxGMJM$-%ITAHRHK^z7UWccGSF9u3T|?uT6=ZGEtwje=|>6pneTpjPkKP@ol3sZ z?eO`<*Xc3T;dVldN2x{2(WiCR;aN;Qj=1$I$-OD1n&r&vm0T{* zYd>+Dz&%V{n_P3njIJwqHbd*G3~ZZoF;h;#)|+RxTdLZ@h#NAN`DHLG4cvC{qV7jv c4B>RzXid%kdx_Y#yvNK`av;^`1 diff --git a/Settings/InAppSettings.bundle/es.lproj/Video.strings b/Settings/InAppSettings.bundle/es.lproj/Video.strings index 59314e3db154d5bd88ebd6827f35ae7aca309203..125d843eb6c34031f8212c74ec3883404da3ac44 100644 GIT binary patch delta 27 icmbQnzK4B79y6y0gC2tsgBgSA4*np=SYu-+Ieg&tjHQ?z3l<)CO;1(z z=lqxGMJM$-%ITAHRHK^z7UWccGSF9u3T|?uT6=ZGEtwje=|>6pneTpjPkKP@ol3sZ z?eO`<*Xc3T;dVldN2x{2(WiCR;aN;Qj=1$I$-OD1n&r&vm0T{* zYd>+Dz&%V{n_P3njIJwqHbd*G3~ZZoF;h;#)|+RxTdLZ@h#NAN`DHLG4cvC{qV7jv c4B>RzXid%kdx_Y#yvNK`av;^`1 diff --git a/Settings/InAppSettings.bundle/es_AR.lproj/Video.strings b/Settings/InAppSettings.bundle/es_AR.lproj/Video.strings index 59314e3db154d5bd88ebd6827f35ae7aca309203..125d843eb6c34031f8212c74ec3883404da3ac44 100644 GIT binary patch delta 27 icmbQnzK4B79y6y0gC2tsgBgSA^j?XFz?Z5S1zw3DI(ZkU~fmev}_*IWb&<_OrJLXccXC$7|1w zz2E0Vk80Iuqo8;Gd#zQnr=Xw$lz~=$%84vEm71&Oyyd0@XZlhCeqbef(~0Pb=n|Gn zIoT`L8kIogs&-*1bR;{X4>(P=ah#~H4xA(EKB=y`J8%=!^{k*7+A+6x=ON|3bf*FJ zSlx9Oe`}(`&^xVQ+qzG4T=S*w-@4ty*w9nZi=J^bywMvFFPP1Oe&?*<%2xHCC)JLe z?2adTcyiCyUHv;dn?!!2GsaJai|EQ;%(CrGY}$ouUuO2|$h6GQR1Rn0IYKdA^-pY delta 11 Scmcb?zKMN97xUx|%o+e3xCBH1 diff --git a/Settings/InAppSettings.bundle/it.lproj/Account.strings b/Settings/InAppSettings.bundle/it.lproj/Account.strings new file mode 100644 index 0000000000000000000000000000000000000000..63656d194b0b7778c39576ad4c9c9ede1799e85d GIT binary patch literal 1332 zcmaKsPfx-?5XI;0r`T}u;72eX2w=iNC7|951!+Plf#M&&xfk{KcB#9?KWW-+XWqP- zc{|(BkB;3~Wm}t@W8GM71?$>&*1>Yc-LVn2_oM%C^cUDK?TlyFW?Yr+iK;=(Su>m3 zinlyrImHQ6fGUW}xT|l*K9LJ-d%R-IS{Y(pr;HolNA9Bwst|Kz9l^J=C49G7)#rkH z=5vRhBl9W3p-hNwx_*FbPCoTo^45-(#Su}nN)`EoT77cvU|SLQ2Ijx`9E`JPAF=0M zS{=AD-)Fr=9$d3QS#lc+&`5|e~5+85O=soPR+#=K2`A7r1tQro`Ti+)ASoUXgG$eB#)-W ZS^KXMl^erV(xq^!b7kjnr~kH~+ZP-8*L45@ literal 0 HcmV?d00001 diff --git a/Settings/InAppSettings.bundle/it.lproj/Advanced.strings b/Settings/InAppSettings.bundle/it.lproj/Advanced.strings new file mode 100644 index 0000000000000000000000000000000000000000..da183468bdf68cc93350aa60c694bb257e983262 GIT binary patch literal 1220 zcmai!O-{o=428Ys6j3*IZtWd=i*@GTH5q!)SMIrVZu*W4M(n4=EHmWX7I@~Cs42GvuZg42 z;c^StC3;c??qIV)k(k!bRvwYX5OxdB+LN(Ek5xsb;xxjTj6KNDd*#|UWXw4n`n-S_ z^H1yr?+>!Cv39HqcIt`hSMZ!h&-FD#^(YAZR!3M%=Od(~;utluDd|T~#tYZo!E51_ zsZgihsY=JOQEy`ONXE|Iz!5L8s`j{=GWmxInd2d^I6=qAk<~phs#%+LwWJ@?-27Iu zgjwx#92w;uNT)lmhkPUc#97Aa*BuBm-yh`L+LoB0M$>T4e&)ALy$(H3eZ9fbx_+tC z#D#teV?kY0wf^@EGp;)x^tJZsHC6V8%IcmaywX`kdqIU2r~g9DzJg6+Il`t+X|{!_ pe}d*Pp^eEPOR>K};@^=|IJNCqx;qK+iBomzFC@*F{#5C2@B_Hq$vpr7 literal 0 HcmV?d00001 diff --git a/Settings/InAppSettings.bundle/it.lproj/Audio.strings b/Settings/InAppSettings.bundle/it.lproj/Audio.strings new file mode 100644 index 0000000000000000000000000000000000000000..4fcc0a5b03ec2f7e16785dc21adb80a39c406a33 GIT binary patch literal 1616 zcma)6%T5A85UjIbG2!A#6Os6c@vtbt14JUx`w9zgM3(R{%EznKGYr%24ulXkyIs}Q z)jf~jpBnB^V2BI@EKq~NE&n=N!wrrY>0?G#hA-l0xWGFeuvQtn@M`we-rRt?%tzK; z(VIa70rNiNsIQr0!deD(=2rd2&~j$HQ=h3(mzf~pL{HE{2lqQBwT}~5sk4K!|FVka z#8u7@P|=*YN+UAMvKP(SrBYqXs!HH^l`fvto=f1q9ooc;-I-w*hlpdeaf(Y$p{_J^ z>_6)|!jhP0^;tdCYV(B1w?lKTf0H{Q;347}eY;mQ!$%yW$NVmyl}3nYMp9u!fj z)2(~{A9c)xx4PlyZnYqnesvbJqm@u6Ga-Q6vQZ-E0PpQSeQr4MR{TF(X&P1ta`;+$te=@hRs+w4D z;%CWxadvELh*n`8hp8E^P(jtyR*6?`5|uiJ`?BC~LEW%Uz9Q_v2 zQ=mraw4cdcP}`M{Lc>}~Z#AC$9z0~Dx}tOA5aOx8#kniV(m0oriE;@wxOdfX`#&2+ z<+nMX*q%x)6&TLSe(PN9kTSVJy}!q*bN;2lMN1~1gCWwhr|jQ@L;;bZfa=WE# YS*e1JDJz1Mj-n>XDMrP5#wmIYAMdtgmjD0& literal 0 HcmV?d00001 diff --git a/Settings/InAppSettings.bundle/it.lproj/Chat.strings b/Settings/InAppSettings.bundle/it.lproj/Chat.strings new file mode 100644 index 0000000000000000000000000000000000000000..0d63a3a170edabd1a6c545511b259beeb81b2eca GIT binary patch literal 522 zcmb`EOA5k35JYS3DTb`{4B|p0f}k741E~2Z#3)Jp9$tMtBSd#DT+C#uKUH0w=OfZk zCp9|ADdE1TRKa%za@v75puKCbzqw@$raujojbZt zT|bM{8r8;6()&>VwLY-N-d_dN5iW;Mb5^67zdc@1YqTXd)r4u{53LcoOcm9(sqgOG zM{IZHS8vcAleI0HuPyx*xJ0wv;>dR<#LpaaZ%o!r3UMQ{7DPCW(6mzN_o$$5HB3NP(LHsjC!(wW!2O`HhU(Y+(b7bmQvDKz zYgDb#GG;e58TL6}F+(4eSsbc!-kIN>j%6OexaQfwv*IKo^LNir&LOcGF{Z$2;2H7; zgK_4doD!d>U{AgNQ179bs;6x#n{q;SUKRcf#pl0fy7ax6>|-jHM;NB~{=!o3V=9(5 z>TPm1Xz8J*)Kx=;ospeJ&SSF|F`?djd{&Efq)YD-@Y~(gHz&OVYKGTtLE+yH=7Q|u zhEzQDZr%}NcPFPi@f@QyPI(&@HetqP6Yh4I>?@%@o1zu(w8qnE*u(vqc%D#giQoAi VTaTVpkHNC?Xy6~UbzW`OYwu%4% literal 0 HcmV?d00001 diff --git a/Settings/InAppSettings.bundle/it.lproj/Root.strings b/Settings/InAppSettings.bundle/it.lproj/Root.strings new file mode 100644 index 0000000000000000000000000000000000000000..495c4d1af8129747e10ea92e484959ad23801192 GIT binary patch literal 1424 zcmaJ>O;5r=5S_EXqUpu6Unk?CA|_mn0pq>Urfe*9a(IR*ytx#} zG+->{vX`A}c8+|@`1`!8fN3Z;jJh5{F*c0489^~NjJh2`F*c048$mHA7n9(%$xXkL7t$MGmN`k&l3Fu71BqZ@QUVc*8UM zUe{#?eYmwNWM=_qa`GRwCeQtZyuC74n85}XH$GB@mpHe8%^StJaVp{567jPlf_H+G zakv_G178Vb1SBU{g0t3XyS-qyoGkAh=gYg>!1C(;pW)_V@jPp#)vkMZ&dVyosij&G zKf_$h^oS^Tly!e1gL9@G{s&M=cG7BB%K*U*a9urXr!97XnpAQ?1=Jx`g)(@JZc73F zP}8AWsS2~XT?H)O4eH7I8`%72&F*aOb*I&_?-pm^oA)g_IA(cUiL4m;*h+!g$3^@#$3?&Q?fFjlmTtLzhs4j(}2&lFg2odT% f8S;SQnLwFLhAJS;hwBIcvWtLbAk@M{5}|4U{mm6V literal 0 HcmV?d00001 diff --git a/Settings/InAppSettings.bundle/it.lproj/Video.strings b/Settings/InAppSettings.bundle/it.lproj/Video.strings new file mode 100644 index 0000000000000000000000000000000000000000..f4ea4d485e035911909922f988d49597ac30ebdb GIT binary patch literal 948 zcma))PfNo<5XI;0rwF~PAS!}*@V^HOg+lK!+0w-{4N0`CGbvv1ye zGn?Ttx=YI@F`zk{RS$HeTdW~@6IIBSAoMpW} zI{pHL+shp{b5OKrzTHG-#3}I#hsISA^`|@u3R+b(eq;HhN?rM;FJow@Y!!2O%21mQ zPjMIm^_)G0UCNk~uTikZov3M}{XWTI1oJp+FPvKvn zp9NQ{7O~5Dzsd`{nhuUxo&V=wr20;YB9O+Yf9LLMQ@*8NonJCw?6R%H89iO}G~3u% ip5#bQSLo!1ukiA)lWe+0&eK`k} diff --git a/Settings/InAppSettings.bundle/ja.lproj/Chat.strings b/Settings/InAppSettings.bundle/ja.lproj/Chat.strings index fc8c7bb2efc3bb41fa95ccf2169e711720357fbb..f62486f461ee9b7c1b09f2871dbf6649aa09d6a9 100644 GIT binary patch literal 470 zcmezWPl>^ip_HM7A)i5kAq7a5GvqPk0O>>^Pk|v5$V&$Da>1;0phy~!mBWzAPz+=j z0A+H3{A7ko1|=Zh7Ko{5o;3p(&@^A5ODcfo76a|60@|y0H%~AmR6XdgEpq=SZKb8Y+D`Ch0%K0#O0$t;ZWYo=9+EN7eOFEL7R}B^# qEHQX(P#DOW4$~D3)KSDx1|}64LK%X9Zb5|iR-g+m7{Ek9_5c8zURbpN delta 17 Zcmcb{{DhI||G$a<940ZEP0nJ>0RT*U2fzRT diff --git a/Settings/InAppSettings.bundle/ja.lproj/Video.strings b/Settings/InAppSettings.bundle/ja.lproj/Video.strings index a777309a3cd467afa68518d0d11e56313ba77de7..1a736e8e5d0ee9e2a914d32ad03a37677dca4712 100644 GIT binary patch delta 41 ocmeBU+rqZt8I!CBgC2tsgBgPf>IKz?wL91_`v0H<^y5DS4sP$Y7Sz_)84 zE-5H>Ja2aVe(cXpqyt?k*H}({>Qt9Xc%FfrEH}GcY+@b5V8@xDmQO$#sy_))8_bc{R$d|%2fyN)wI?&w|D!nSDRUBFQ8dCr7g|r!3tY5U)h^I(r+2|RocQLRUQse@L$wt9HN|t xd~r=@#oMJl*SPPQJTWWa_Nv7%+bK+`u0wU|=mg)}f3sxUyYaPh`Lp4@d;yh{aY6t9 delta 11 ScmeBUnZ(5O|KG-c0*nA0Tm)Q%t(z8N|Y(5(yiP2cT#rgJxQahsQTli7rS)EN14OxpU7?d%r~* z>ZnQw8LilB?PWO^AfqiP1?@tWakHVaTC1ck=vZ*7iz4uV^*_G8IZfrJUYGW8B0ot>2~_2OTI`=+Gzo2_T`pE}%Xj6;; delta 10 Scmeyu{DYC{|G$ag%LJM>#Etr4CB?&p}RGPz2gr7IU&DOSDo>o^q3bBV84Mdwl=n>#7Oc7$+Bab98R# zI`q0N`Ul)~kh(@&P88NX*NQ7g3JZlob@!kX4^-IekHUjL4M zvJHBfO%>PJXSRtDU FeF5KRSIGbX delta 11 ScmZo;>0)B~|8L_z4n_bQtOU*g diff --git a/Settings/InAppSettings.bundle/pl.lproj/Video.strings b/Settings/InAppSettings.bundle/pl.lproj/Video.strings index cd54104e552b02fd4c431cc9fabf97c4c075ccbe..1a4693cd5719104171c897a2adfb42badc17d524 100644 GIT binary patch delta 41 ncmZo*U&g*6f?3vsL657~o=){h18`l{E%h delta 11 ScmZ3+-oU;gf_ZWsvjzYc4g-7u diff --git a/Settings/InAppSettings.bundle/pt_BR.lproj/Advanced.strings b/Settings/InAppSettings.bundle/pt_BR.lproj/Advanced.strings index eafbe8e2bfa5343a52eaa4bca239da5df3b9cbfa..2738578b30e6ebd72043001a651bc9f3a206760a 100644 GIT binary patch delta 100 zcmdnOd5Lp^7V~q4#EH7D{vHg83`q=`3^_nt0%R94D1g~zKvq7Gox+d`BvTpkz^o!5 f>p4)o7$}wr6e|JpK|0gHDuBF+C-pa8dc+I>xVad* delta 20 ccmcb_xrK9r7IQK~>O@`FiDo7nkMOYo07yIrqW}N^ diff --git a/Settings/InAppSettings.bundle/pt_BR.lproj/Chat.strings b/Settings/InAppSettings.bundle/pt_BR.lproj/Chat.strings index b6de012ff5cec5e7eaf26a839bfbdbeebefcd8b3..ef4434f19799729f318d4526fc7458844d6740ff 100644 GIT binary patch literal 536 zcmb`E&kn&r5XQf=r-to>Cam1GI~be+}I%-S9ss#zR(H^+?C#DP}#+O)3|or+@= zABMA}ongrE`cu-~G+loOs#e-t7HCX#`la4k&31W(?n*Rz=Kc(>%!}ZuD-tV4+$mUN T$=bjB@xI@-pvyH%tXjq!4mVnM delta 11 ScmbQiGKY!j|G$m@q!0H~h^(EtDd delta 11 ScmZ3&{*P@#81v*BW(@!vOat=( diff --git a/Settings/InAppSettings.bundle/ru.lproj/Account.strings b/Settings/InAppSettings.bundle/ru.lproj/Account.strings index cf8c34072ef096fbb57e42069fcc785819dfde8d..f1126856bb3da16f9319ebf17f18512a5c5a1313 100644 GIT binary patch delta 328 zcmZ9IOA5k35JV?Zy2!>4g5pAAA|mKwl!%`=iHToG&?|WaL%@aCP&|@&3@cF=N;5Fs z^}4$0n|{+zomv?#97Nb*1Vgy+u)ze=I2<%fm@y=lPzWdvnK{^FOH?7g$nHPk(aaD_ z%rnz1dlk+0h@Zzooz(-9hh|=nT3f4_SY*1-kuLuMuJ@d+RU6D~y7;WTi4aK%ky|4^ z&qg08MMQccUCIyvs}A3at%?z1&8lLS@~O!h$r;kBWBjq0d@MYQ3xeqhOyLMUDdt;! THq+V^7B`X9zO?+gNXCm7tT8Vc delta 123 zcmdnOwS{YfnyLtk9g95>TeH}*Sg<&;m;zZoK(;rFC5r-sBa1sw#A%|f;Y2ruiG6w# zrzlK(Rwoe3P|T3ZP{feOkjRh=WNmI?)M1=Fg-K-d5hf$X$;X&ACiAd(O%`IYnLLd} XZ}J=#g~?A?bSA%Ikz=uD;9>v(%atCd diff --git a/Settings/InAppSettings.bundle/ru.lproj/Advanced.strings b/Settings/InAppSettings.bundle/ru.lproj/Advanced.strings index e340e2dd74e918b252e58bf01d4fc68f1c6e9a14..fe502064fd868939c9309cff8be74ad16ca54da9 100644 GIT binary patch delta 362 zcmZvYxekIr6h%RAA;!X37%Oo}EG!JNL zx$oZdUgoB}lykSyM+A*0Mu>E>nz!Jys7#4$C=M$d2IBN- zr0-2fh0m^=Gez3v+n^(x$Ro9zV?%-qc+nn6u2j!bS-n(i?ICo|Fq!m7vhoQhWLJ5= z5_pI384fgw#l?`2s*fplf3rnR=ZQ-|Tt%xSc9X4$p`PUP7V{$3ODbY}0VoS|i+klW dR%r+rI$%ztjx}RuUWr|7A|g6Gep>dZet+=THS7QY delta 80 zcmcb>xruXvoIn6W5ko3NF%ai5Bm>EbS}qffOeU@>o6N!}GTDkzWwHaK*yJikt;r3H jGL!c(dQ3jVXf@f3$!Br^lilPCOwT6wFe^=d#QY8bqi`9D diff --git a/Settings/InAppSettings.bundle/ru.lproj/Call.strings b/Settings/InAppSettings.bundle/ru.lproj/Call.strings index e87d0e6970df335e102acab3cc5caa4e555db056..af07c512c0d937e61ffa6fdfea9ef3d30cfe7eb6 100644 GIT binary patch delta 119 zcmX@Z@`Po>4o0<5h9Cw{1_cIV7CRPeAa(>|BOtb9QDCqK((WuyEZ!`WuP{2f$b+Sv yfTRP9Es!(?DscuXHf1pZ@@#~z1G ze%)`rJ|pFNQKe@&-Lfw9q$&SvkkbQb1bPg+G0Z)?sqQpqKcg}QkMynx+~te3X_M4Y(#uVgk3; zbB4z^I?i$Mfg`7_;L_;^KUMI!UGw$d^FQiENM52eL(4G%pLtHt@iP5_Zj~m~PBp|$ zQR}s0oK8qEAf0y}TNjj)CkJP?L%uX{t>08fsQUT(TobyLA=9{~y}`|#Iri-UrFLyP kF%w=*=Ms%luVHn%(giO6-e{fa_QET8FDd&Ztnu>xH@6o|4*&oF delta 11 ScmbQi(!|8{|KDN>Mn(V`G6UTJ diff --git a/Settings/InAppSettings.bundle/ru.lproj/Network.strings b/Settings/InAppSettings.bundle/ru.lproj/Network.strings index 23a58a7989e0c7facdca4bc42e4c1663e4b6617e..36587602b9ad49a96b7bfa05f1b8b409003eb3cc 100644 GIT binary patch delta 225 zcmcb_@r+}G6QiO8iw%oEivoi^iyezKiw}!AkTzm5U~ytG1@eJ16aQ;Y-oq#~c@86o zs60@@0jf}eA%r26A&9|m^Jzv&Mj-{DlsQn+l*NO^0;t=EW%4_wbLIjpCO`>$pnwI? sSX&lv7E7RIRzNdsfno@=99ckOAig6=?c{o9TRSrKvM4cFGjK5g0G}Zv)c^nh delta 60 zcmaFHafxGt6XWC(Mv2K9j6#$17%hNotPh9iuYRcVl%V_ zRDr`<*I@hR3Vd)goOnv{S?e}i5Y(fNcVKR7R;#aZ3NpO`Jkq_U*1(kT?i&v zjA$yJXqt9V@J*o<4gmLYPC;cioQ3^pq-LM&sYEnoYXhBnSe(~)A8cev&^0z=G)(*E ei8c7KVFu7GZ%YB2nLdsaVkd>dES{oDUGWDlfKs^t delta 196 zcmdnO{fKLVoZl zlo%8kY#9_L8!`$r8iK?o-r$*R!YIIK1maBQV}$UG!OBgLl#5SJVN?RC+&qmjjFBe< zY)>9TDnky#|aC%aG5I!jQ@^QOSib0LU(4C}B`yux8+5004H21}Ojl diff --git a/Settings/InAppSettings.bundle/ru.lproj/Video.strings b/Settings/InAppSettings.bundle/ru.lproj/Video.strings index 974772188b0c6b52640865ccb440cf0733784b36..53c428c754fa9e81760f030d98a046f6373f0d76 100644 GIT binary patch delta 236 zcmZvWI|{;35Je|17k_QQfFOCKv(Y5@H0EPIDp~}@&Xu^4>0N`%aV28u_`uHc9?smk zuim@=xI4UeCbI}-LPlpw_tMo36Gjkr-hLydj0NmEFH*hY*>j3ZjU zINr3D%QXt&_1}ho3pJ3xny;$sehmh>*p>ZWVJAy6ly-@x#`ZUoV#~fOQ`@a66P8L| Xh{aEJ8=h!R39ZO*?0SyjgByPU_X8uA delta 51 zcmeyt{*7(JJjTg2j8c<>n4~8EV3eEugi#B~)&kNZlXI9jCNE)fnY@b0Y_b`1$>a;n F8UXN%5-0!w diff --git a/Settings/InAppSettings.bundle/sv.lproj/Account.strings b/Settings/InAppSettings.bundle/sv.lproj/Account.strings index c3d6e397fccaab9d3024dfad469e6292e0aebbb8..8b43f49ecd220a1fc9120a8350d1035ca3d3e41f 100644 GIT binary patch delta 182 zcmeC-`o=k-MBbYrpCON-1W1-JC@>^4WCQ6;hBAg!h9V%ZWa7kjaa|yz3@BI(7R&@H zPX~$=Z8l`|XW|ZJC;-9?hHnf-le?KM`F(&=c?>B)#o0hJQzqYLj@ESrnpMp31ZXnI w4s9UL1mY5)aXCPo26jOyLoN^kZJnIYVkmk9YzD{$3P3gAz*gr?-p&#V0IIbspa1{> delta 60 zcmV-C0K@H|EJUIZ?aWCS3Sssv1n{*6`3&g{N(|NvT$AgW94A*X31}BXovQ#;kp@%^Qint5 lSaVn0$r#6aYbr8`1y( diff --git a/Settings/InAppSettings.bundle/sv.lproj/Audio.strings b/Settings/InAppSettings.bundle/sv.lproj/Audio.strings index 2b5575b44469946502cd217268627591f3d79d6b..c0e7eb516dd2937f1ce9a402af045249fc321304 100644 GIT binary patch delta 136 zcmZqU*~2qIiqo4RpCN@Il_7hhsw0bVC_@1d7Bl1kMe-OjfjE8gQ&z>vZ7h1+*$hQM zwP`?{H~BfM{NyVvM)q*s3{fX{=}j&IfeBG E09y|aU;qFB diff --git a/Settings/InAppSettings.bundle/sv.lproj/Call.strings b/Settings/InAppSettings.bundle/sv.lproj/Call.strings index 400d46c2c7b1d6cd1e1567f6ad73fa0834a0aab3..6692e23e5b2abf7aac9f515df88e0f527704de73 100644 GIT binary patch delta 212 zcmZ3%a*Sny(Zn8}iF{HMLuT2AFk~{MFcdSSGZZmAVaNlr6d2MNz5#g(K$$#-Y=(S> zTp&yYvQrpRfuhAgb}mB+kj$AZ&SlaK)(lh6S`lhy$; I1Umo<0IMtyu>b%7 diff --git a/Settings/InAppSettings.bundle/sv.lproj/Chat.strings b/Settings/InAppSettings.bundle/sv.lproj/Chat.strings index eb6b0530a6ffc71b268afb35e8f6563cc10f5e01..76e92ff28081c9a0bcc462d8ac343ff57925e316 100644 GIT binary patch literal 502 zcmb`EI}XAy5Jacu6c!Z}oB&Z!fP{bs!~sGQ0#XPl3E#s5&o%^?6co01y`Gt!_4Coz zP$$(o$S7gIs8G%sks0mCVzRx9GHy0Rxl&ccM=Cjatee{81J?ie`f9;8r;{tZ6*_lx zjXJIuqcy6v>!cf~|N7pukDR{}rXySipVnE0X7=`YL9N!7+DsF=83kHXeUK?p^u{Ml zE@dte+%_tj`;f!yk72jdwEngrO6M&LH2e$CSTt3SUV^E9zzO4B117l34;PdI723bE`u9G=EU}c^149bJccrcCr~9tKsu2j z7f32GSTk@L+Ka)$s-$pONr3?-AFGP#PTGGsFp zF;p@X0PRQxvNC~2q)&EaZdO)c$bj0N$&e0Yrvg6>zRT>ZLxeh@ JePCxX004n2GKByD delta 91 zcmcb^afV|;k!UzWCW9LgD=?%oeRD diff --git a/Settings/InAppSettings.bundle/sv.lproj/Root.strings b/Settings/InAppSettings.bundle/sv.lproj/Root.strings index d9ac6997234b4caecbfaea52c0bef142529a8681..636b256c64a54d8b5869ebaeb97f55104a279b91 100644 GIT binary patch delta 127 zcmX@awT){-46|-1LkU9}Ln=cuLpDPWLncEWLpnn-LmE&d2S|SdisnH@6B&vo_cCjX z1_NcDFcbix0#Nn|LlIC#;^gzp$JK*@V);PXM4(ItP$m~>b|OOx&@2UpB%modV0O{u H!z}dx^Q|AO delta 31 ncmdnSb%<+24D)0KW|PT1%o>v?F-uK8!+d0N1dGAsT`V;KuW$<_ diff --git a/Settings/InAppSettings.bundle/sv.lproj/Video.strings b/Settings/InAppSettings.bundle/sv.lproj/Video.strings index e9ffbe04e553f69611d412b2e980f5677d203f2b..34256b495e3d15f5846cf39e03533585c15b50df 100644 GIT binary patch delta 127 zcmaFC*2g~K)no%kF7aZ9EQTixISge$n8{GgkOw657}7VhGR|aFPGTrxNM%R?!eWMW zAo~eWs+d6ms6>Gwn;{8EmrOp&q|E8fkPlRo%8)(zGn22Z2ZJ7i5rY|nDT5MFoh=Y6 MF~G$pn==~%0OUFwssI20 delta 42 ycmeBUf5A54)x;xmoB0^0F-}fn(wlsaNru~*A)g_IA(bJSp?LCVCf~_v%o+ej3=PKs diff --git a/Settings/InAppSettings.bundle/tr.lproj/Chat.strings b/Settings/InAppSettings.bundle/tr.lproj/Chat.strings index dacd59ae51ea710917efe2188bfc788993a99a13..28162cb46fa707117693ea4cb4f46ea050509047 100644 GIT binary patch literal 506 zcmb`EI}gGz41}*Mzar`c8_b9S36PLr0WqUeo>E(?raXT<@FhIT$iQI7j-9)+bH9b^ z>Y!4487=WAWlA_BGNTRyY{0@l(iX?(H&+W$oF`}qoxa#Et delta 10 Scmeyx{Ew08|G$a<{r~_UiUx-O diff --git a/Settings/InAppSettings.bundle/tr.lproj/Video.strings b/Settings/InAppSettings.bundle/tr.lproj/Video.strings index 0e82d86ce1a4aad46452c6552e902785f109711b..b6f430d2a5c4f30d2c4cc11c4134076bca759d18 100644 GIT binary patch delta 27 icmeyyHivzKA2X*1gC2tsgBgSAWJ6|QM$^fz%!UA7(goQ7 delta 11 ScmbQk{*7&eAM@lAW(@!uWCPOx diff --git a/Settings/InAppSettings.bundle/uk.lproj/Account.strings b/Settings/InAppSettings.bundle/uk.lproj/Account.strings new file mode 100644 index 0000000000000000000000000000000000000000..0a3a5cca1b5a6c973af58bf64e0c818c67b56a5a GIT binary patch literal 1346 zcmai!O>fgc5QgV4;=mChRpLO5FC4f8R78m5#);!rk)VkPm~+~sG!pqx;}-byz%y$* zc4#UTIkwlk&%E=_?Ed-f%STzujm*X4zL888+*h&{pOKKum#2E7$J*4swt0G^Eq$+^ zM2sXFYsgqzeF@|-b9-{hZ!NblGFH#IPvt_s^E9h5pX+N4G-YK9u?@?Un5R@byoLIf ztGS~NSbYWO7LHM;dr>N-KH9oYqw!Ae#VA#dA#LRv(m7f!=PRyDxMlto^95QWl-YlX zK2Lf@j8unCXQ-o{(l2o5_-R=$d8#;%$n2$zSZ^*yDDB~><=oV>y<8VCHe@=LUnsm! zYB0Ufnyfb8XMU5amAdwc{rqo?yOpAlnoAeSdpI3bT?^yNFIdmy`> zq%xM%TC8d$kCx!k25)VTR{Ebowz{9z>JS%-GUi(6*gl-GD%WQ_XaTFvuzhX4U@m@j zI!gy8JX|!hJV$&zy5+=Kc9yl51JYjjUL6nebZ@CoNV<4z;IcR$mh>Nkg7_v58k79QgnK6&W*`$ye3{S8cz5O_9T)cF1aOe%w+!lw0B-$bOHC z6;Fx+tJVw@$J&kmufh}bSzXN2z%$QSA#)S`xyw%axR7iy8f_d&s8&YSH!v|B53n(J zQZ#1k{o}0m;L;*3cV91s*8@Ivo+5-bVU{9wq9*e&tbB}GsC;X!|A$; zKl#7G$*AH01zmL1^}YA#%)4Z6S#=_MoFtq4pmQm|d_5*~+=6P&$rq9L{WMy?*(@4* zTi@dKh)K57a8|>Sj?a_(cnbPTzQa59`1a+no{Y#gOT|vJDRyG+zLr?CPoP-GY~O#j Sjcn05Yi z^zp`6>ot)*=6$ES03}#otkmy~b51d1t^ftbruF)~tC9Xn<4D(QB144iX%1~%qP3<| zn=pQs0xMY6zsllb{4B+Pu(%jMOUcvARV^-N9ZPyG(<~MfvvhIo?70x;-*_Vo_0F{W z*jfytgMA#a3k8S6wJoDgJSb(0Q3GbTxjH-{>fd;$T>pqW!TPNwMhx^`aS^e_Ao`5& z;>O{y78enw5Xxc@v;J@58 za#zUOkQVQ{G!wmc+6B}+#T#>s_*CpO{y%A()t-?9sZm`yQOMax_DE|!;X4P_6EiDq zo;DSam|>=whpa%=qq6jMRqA`eOLgkr=~YHf$()ySxngJXNw4RbqS0SWe1eI@3Z`!~6yO8SGzKP9M}Nlr8khxmB zomxy~z#37F?VM_l%-aFs)UzWx3Mzg2x|9Du?QiS?&Lv9bsHo6WHhS(g#>ZC2GIt6r z)8KHiWgnpHM4?K&&|YeTT-bzbHb0uV0k;ngG10W3;4m4 QoP6!vko(_$B`d#v0Q6{6n*aa+ literal 0 HcmV?d00001 diff --git a/Settings/InAppSettings.bundle/uk.lproj/Chat.strings b/Settings/InAppSettings.bundle/uk.lproj/Chat.strings new file mode 100644 index 0000000000000000000000000000000000000000..34c9596be10d003a7aebff218501ddfe5947e718 GIT binary patch literal 518 zcmb`EK~KU!5QX1iPM$pY113G`jTlWdh_nbs6NrgM?uuGWijua9`s3Aa7l=J_Fim&o z&33*w)BX8Ql<7^iUgdgVUFbyx`yI;ljGCZkG0Mq25fyq=MLg%EKu`3k1l{5NKVDl~ z&_;Cf0k^{E3t!i6?8SADYaKh;Yq)Rv{gOV2^Ocb1u$(!=WEGzIYQ_a_wWgd6bxAja zhSxgdy09bbTWV*vZ!PQaT$!tDr|7XAu%B4l4#^KK(bD@Ia`=;BwkeKfoGWkecc{y( u2ek_=P+WcZ$FRnb*Q6ULrQYM}y45wk{@uqm{wdxWm9C5^r8cas72y|$ZBL5; literal 0 HcmV?d00001 diff --git a/Settings/InAppSettings.bundle/uk.lproj/Network.strings b/Settings/InAppSettings.bundle/uk.lproj/Network.strings new file mode 100644 index 0000000000000000000000000000000000000000..bfea0545784f27278dc90522fc1d56a774e3fcd6 GIT binary patch literal 1124 zcmc(e%TK~U5XR>)@!*LNZzj_8pm;+9QXhZ?ADH+GDxM9fF@crFKI6?a zv)y)QzWL^x*|%3$_M|6wawCp}GL(tj%K&?k>u4WJATDQB%#|grYePNV){a)Rp!>W} z)tOYR)Z_&ahApOHL9tIclDed2et7_CY4 zp)}!Py_4^l(S=+}TTW8v_RmL;Whx)SdrU23xLmRtHUa+!>}-ZPbXXBn|EAX9pB)kC;mPR%$%9~X6D?1gSl~L*QL6E n{fKuzg_c2?!t@3f!Hc_TI$MR0osw46>A2@+BE1>Q|H%3dDe;x< literal 0 HcmV?d00001 diff --git a/Settings/InAppSettings.bundle/uk.lproj/Root.strings b/Settings/InAppSettings.bundle/uk.lproj/Root.strings new file mode 100644 index 0000000000000000000000000000000000000000..4d1eea03af107450d833158413ea83808c61ff78 GIT binary patch literal 1474 zcmai!!B1L25XR@Qr=FUoNiVH=<)8$8#O`fubDLR-vnH$XXt_Pta9vktmHDl?k~QoV z9+y5!7&E>*)||a?3Y2$l*B!c!YZIB+p=-GVaK5@GICX3}R(p*{VtWzB&I<;+AjuwB zyo@YwiIjbFAY8b7XZ(r0gN`$_6MqN9VEKu2t#-IyP8mE<@=uyC&bo zO4}16dUkCi5E5H}&}TP^ZhlK$QX*U6)Ih1BaG5$)T$Qt&L7RH_iH;**6IH>p@ak^B zfAbGk2Sy{l^-jsSufaM7ulbyd*yId4HY6_YuTNx~t?b{uMoSn@?N@~T9?T=wKHfRj zPv5;`B4QRLZf$xN=PS=PSucEN-{9SkaHU(tGpMtZVmbOTo(qpXu|M{ko#rC(%3pKy zEql$L>N&v{PhJ963SUj0W+buHb5dn1SqJr7*;HxQ4RB9M_m^RVegK9p%neJThX`u>%kue7@?y zDJKP!|M`TzKZV6TnG8Ybqtz0%M*R1@mVHj|(6@)8gEbXD!bw#R%u@0SlaaC8$D*ve zUR&v`yz|pya@6s2?ozE(qowB`)KK?^yH#Dyg|byQJw*9wJ~AqK0KS;$^oA)g_IA(cUiL4m;*h?N)=S?pQtSR7fxSPWT|7_1q%fMSk7H7N{5Ky}4H jh)^rQV#4CUVhU7k09P9TG_i=G1WA=V&^!kgC#VVlCRz`B literal 0 HcmV?d00001 diff --git a/Settings/InAppSettings.bundle/uk.lproj/Video.strings b/Settings/InAppSettings.bundle/uk.lproj/Video.strings new file mode 100644 index 0000000000000000000000000000000000000000..1cbb0ce9d31aabee2c86056303aca29f663e1a68 GIT binary patch literal 934 zcma))!B4_a490ut$(vVW!sMuZ#4!~97-VbOqCoJYI?rK`>VpOJkrBDpWi+o$S?tQicV{3TXeLBpa+c7)*Q9r`)2 zYH+$+T^$tc@uj3b=ypoYe#mMJ>LPrNHoeAGmoWI?Ytr{V$Q6zgYHCRfv?|*AaQJV9 zYw62v3iD?dKGU)!j*8~)u{~4NScjUdn32V7ChXb-MJ(ZmIxQj&_4QxR!jHp<=+WqeW84ais0k>d zZ{EH)GjCr{13l!(5J6zYSYV5Q_ku`ZL*x*JD)U%bGYjA%Wghb-Aa-zoLEPo}A72Me zvW@6uPu`R|N9qcg%8S5~s+n@quBrdpuh}iNUqYssT!MR+o2AtBK06jv%i!~EhymSL zH7zr*Y8QE*ox^BuK=bxFRsK@x+b3J1JbSg-hP>G)_hDBPV|FLlsVFdkq~7;WHEwxV I=}+~<8%j=2DgXcg delta 10 ScmdnRypNIT|G$a<_5c7H$_2*& diff --git a/Settings/InAppSettings.bundle/zh_CN.lproj/Video.strings b/Settings/InAppSettings.bundle/zh_CN.lproj/Video.strings index ff2ab71f9d2e17a830c9510dc05c974663a6449d..09b1c54b65e07548c78ef574977065c053c07d84 100644 GIT binary patch delta 41 ocmbQjx{Gx~4wI}0gC2tsgBgPrW0G+@FqyPW_ delta 11 ScmdnRI)!yZ4%6gGOd0?gCj-U+ diff --git a/Settings/InAppSettings.bundle/zh_TW.lproj/Chat.strings b/Settings/InAppSettings.bundle/zh_TW.lproj/Chat.strings index 664103d80d06d3f9d564937905433a4ee4aaa992..f99db8f96c9a24dabd7b692ae66fbd935edfc812 100644 GIT binary patch literal 478 zcmb`D%MQUn6o&tmg{PQw#WRS61tGzLh^4r;n!2Q|YvL`ug`Ee)*D2AZh{epDf99P3 zGLO5XsN zBXmya8WpS;qcN(nbyCczf7_q3*KEEJrVU(%oJq0>P4|^?k6J8`x0af?sb#c&n@*MM x@FxG5B=gVvjesO From dc1353ea65a2ec73cd0efa82bd66a7f457669756 Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Thu, 24 Jan 2019 09:24:56 +0100 Subject: [PATCH 142/229] diable Icloud Drive if ios 11 is available --- Classes/ChatConversationView.m | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Classes/ChatConversationView.m b/Classes/ChatConversationView.m index 72b1b3bf7..9228e2537 100644 --- a/Classes/ChatConversationView.m +++ b/Classes/ChatConversationView.m @@ -1086,7 +1086,12 @@ void on_chat_room_conference_alert(LinphoneChatRoom *cr, const LinphoneEventLog - (BOOL)writeFileInICloud:(NSData *)data fileURL:(NSURL *)fileURL { NSFileManager *fileManager = [NSFileManager defaultManager]; - if (![[fileManager URLForUbiquityContainerIdentifier:nil]URLByAppendingPathComponent:@"Documents"]) { + BOOL useMyDevice = FALSE; + if (@available(iOS 11.0, *)) { + useMyDevice = TRUE; + } + + if (!useMyDevice && ![[fileManager URLForUbiquityContainerIdentifier:nil]URLByAppendingPathComponent:@"Documents"]) { //notify : set configuration to use icloud [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Info", nil) message:NSLocalizedString(@"ICloud Drive is unavailable.", nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"Cancel", nil) otherButtonTitles:nil, nil] show]; return FALSE; From d84809f1ce3d707ce5e4b711b63731348843f2f5 Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Thu, 24 Jan 2019 15:03:46 +0100 Subject: [PATCH 143/229] fix onImageClick --- Classes/LinphoneUI/UIChatBubblePhotoCell.m | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Classes/LinphoneUI/UIChatBubblePhotoCell.m b/Classes/LinphoneUI/UIChatBubblePhotoCell.m index 183cb749d..b9cf97250 100644 --- a/Classes/LinphoneUI/UIChatBubblePhotoCell.m +++ b/Classes/LinphoneUI/UIChatBubblePhotoCell.m @@ -105,7 +105,6 @@ [_messageImageView setAsset:asset]; [_messageImageView stopLoading]; _messageImageView.hidden = YES; - //_imageGestureRecognizer.enabled = YES; _finalImage.hidden = NO; _fileView.hidden = YES; [self layoutSubviews]; @@ -198,7 +197,7 @@ static const CGFloat CELL_IMAGE_X_MARGIN = 100; if ([type isEqualToString:@"video"]) { UIImage* image = [UIChatBubbleTextCell getImageFromVideoUrl:[VIEW(ChatConversationView) getICloudFileUrl:localFile]]; [self loadImageAsset:nil image:image]; - _imageGestureRecognizer.enabled = YES; + _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]; From b62cf43995bf58cfb4845ab63c6d3ef46c47cb22 Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Thu, 24 Jan 2019 17:53:14 +0100 Subject: [PATCH 144/229] fix crash of call pending --- Classes/PhoneMainView.m | 11 +++++++++++ Classes/ProviderDelegate.m | 5 ++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Classes/PhoneMainView.m b/Classes/PhoneMainView.m index e7f2d5625..c5bc9847b 100644 --- a/Classes/PhoneMainView.m +++ b/Classes/PhoneMainView.m @@ -421,6 +421,17 @@ static RootViewManager *rootViewManagerInstance = nil; } } else { linphone_call_resume((LinphoneCall *)calls->data); + while (calls) { + if (linphone_call_get_state((LinphoneCall *)calls->data) == LinphoneCallIncomingReceived || + linphone_call_get_state((LinphoneCall *)calls->data) == LinphoneCallIncomingEarlyMedia) { + [self displayIncomingCall:(LinphoneCall *)calls->data]; + break; + } + calls = calls->next; + } + if (calls == NULL) { + [self changeCurrentView:CallView.compositeViewDescription]; + } } break; } diff --git a/Classes/ProviderDelegate.m b/Classes/ProviderDelegate.m index 96770e696..f3ea9e319 100644 --- a/Classes/ProviderDelegate.m +++ b/Classes/ProviderDelegate.m @@ -91,7 +91,10 @@ - (void)setPendingCall:(LinphoneCall *)pendingCall { if (pendingCall) { _pendingCall = pendingCall; + if (_pendingCall) + linphone_call_ref(_pendingCall); } else if (_pendingCall) { + linphone_call_unref(_pendingCall); _pendingCall = NULL; } } @@ -109,7 +112,7 @@ return; self.callKitCalls++; - _pendingCall = call; + [self setPendingCall:call]; } - (void)provider:(CXProvider *)provider performStartCallAction:(CXStartCallAction *)action { From 14b172f2adf7ec859c96b42eeb16b53d123badc9 Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Fri, 25 Jan 2019 10:55:19 +0100 Subject: [PATCH 145/229] update Imdn status --- Classes/ChatConversationImdnView.h | 1 + Classes/ChatConversationImdnView.m | 16 +++++++++++----- Classes/LinphoneUI/UIChatBubbleTextCell.m | 6 ++++++ 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Classes/ChatConversationImdnView.h b/Classes/ChatConversationImdnView.h index ea0991871..2d6b9d84c 100644 --- a/Classes/ChatConversationImdnView.h +++ b/Classes/ChatConversationImdnView.h @@ -34,6 +34,7 @@ @property (weak, nonatomic) IBOutlet UITableView *tableView; - (IBAction)onBackClick:(id)sender; +- (void)updateImdnList; @end diff --git a/Classes/ChatConversationImdnView.m b/Classes/ChatConversationImdnView.m index 703a4f3fc..60c075085 100644 --- a/Classes/ChatConversationImdnView.m +++ b/Classes/ChatConversationImdnView.m @@ -54,12 +54,18 @@ static UICompositeViewDescription *compositeDescription = nil; _tableView.delegate = self; _tableView.dataSource = self; - _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); + [self updateImdnList]; +} - [_tableView reloadData]; +- (void)updateImdnList { + 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 { diff --git a/Classes/LinphoneUI/UIChatBubbleTextCell.m b/Classes/LinphoneUI/UIChatBubbleTextCell.m index 93093ec74..281602762 100644 --- a/Classes/LinphoneUI/UIChatBubbleTextCell.m +++ b/Classes/LinphoneUI/UIChatBubbleTextCell.m @@ -88,6 +88,7 @@ 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); } @@ -369,6 +370,11 @@ static void message_status(LinphoneChatMessage *msg, LinphoneChatMessageState st [view.tableController updateEventEntry:event]; } +static void participant_imdn_status(LinphoneChatMessage* msg, const LinphoneParticipantImdnState *state) { + ChatConversationImdnView *imdnView = VIEW(ChatConversationImdnView); + [imdnView updateImdnList]; +} + - (void)displayImdmStatus:(LinphoneChatMessageState)state { if (state == LinphoneChatMessageStateDeliveredToUser) { [_imdmIcon setImage:[UIImage imageNamed:@"chat_delivered"]]; From 3d926149196d0dfa4858615065c2bfd75dcf4fc3 Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Fri, 25 Jan 2019 15:20:27 +0100 Subject: [PATCH 146/229] fix the view when deleting a message --- Classes/ChatConversationTableView.m | 1 + 1 file changed, 1 insertion(+) diff --git a/Classes/ChatConversationTableView.m b/Classes/ChatConversationTableView.m index fc2b4799d..b903b9bfa 100644 --- a/Classes/ChatConversationTableView.m +++ b/Classes/ChatConversationTableView.m @@ -325,6 +325,7 @@ static const CGFloat MESSAGE_SPACING_PERCENTAGE = 1.f; [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationBottom]; [tableView endUpdates]; + [self loadData]; } - (NSArray *)tableView:(UITableView *)tableView From ab279345ae640baeb02b429a8f565f6a3e2656f8 Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Fri, 25 Jan 2019 16:33:39 +0100 Subject: [PATCH 147/229] fix lost of unread notification --- Classes/LinphoneManager.m | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m index bb7e5551a..fed78bf7e 100644 --- a/Classes/LinphoneManager.m +++ b/Classes/LinphoneManager.m @@ -1440,8 +1440,10 @@ static void linphone_iphone_call_encryption_changed(LinphoneCore *lc, LinphoneCa } void linphone_iphone_chatroom_state_changed(LinphoneCore *lc, LinphoneChatRoom *cr, LinphoneChatRoomState state) { - if (state == LinphoneChatRoomStateCreated) - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneMessageReceived object:nil]; + if (state == LinphoneChatRoomStateCreated) { + // this will cause lost of unread notification of TabBarView + //[NSNotificationCenter.defaultCenter postNotificationName:kLinphoneMessageReceived object:nil]; + } } void linphone_iphone_version_update_check_result_received (LinphoneCore *lc, LinphoneVersionUpdateCheckResult result, const char *version, const char *url) { From 1075515bb9eae2cec3f535cdaee84b551745be9c Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Fri, 25 Jan 2019 17:37:26 +0100 Subject: [PATCH 148/229] fix crash of call --- Classes/PhoneMainView.m | 9 ++++----- Classes/ProviderDelegate.m | 10 +++++----- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/Classes/PhoneMainView.m b/Classes/PhoneMainView.m index c5bc9847b..f712e52f0 100644 --- a/Classes/PhoneMainView.m +++ b/Classes/PhoneMainView.m @@ -422,11 +422,10 @@ static RootViewManager *rootViewManagerInstance = nil; } else { linphone_call_resume((LinphoneCall *)calls->data); while (calls) { - if (linphone_call_get_state((LinphoneCall *)calls->data) == LinphoneCallIncomingReceived || - linphone_call_get_state((LinphoneCall *)calls->data) == LinphoneCallIncomingEarlyMedia) { - [self displayIncomingCall:(LinphoneCall *)calls->data]; - break; - } + if (calls->next) { + [self changeCurrentView:CallView.compositeViewDescription]; + break; + } calls = calls->next; } if (calls == NULL) { diff --git a/Classes/ProviderDelegate.m b/Classes/ProviderDelegate.m index f3ea9e319..ed8bc0227 100644 --- a/Classes/ProviderDelegate.m +++ b/Classes/ProviderDelegate.m @@ -112,7 +112,7 @@ return; self.callKitCalls++; - [self setPendingCall:call]; + self.pendingCall = call; } - (void)provider:(CXProvider *)provider performStartCallAction:(CXStartCallAction *)action { @@ -129,6 +129,7 @@ call = [LinphoneManager.instance callByCallId:callID]; } if (call != NULL) { + self.callKitCalls++; self.pendingCall = call; } } @@ -243,7 +244,7 @@ } } - self.pendingCall = NULL; + [self setPendingCall:NULL]; if (_pendingAddr) linphone_address_unref(_pendingAddr); _pendingAddr = NULL; @@ -251,9 +252,8 @@ } - (void)provider:(CXProvider *)provider didDeactivateAudioSession:(nonnull AVAudioSession *)audioSession { - LOGD(@"CallKit: Audio session deactivated"); - - self.pendingCall = NULL; + LOGD(@"CallKit : Audio session deactivated"); + [self setPendingCall:NULL]; if (_pendingAddr) linphone_address_unref(_pendingAddr); _pendingAddr = NULL; From c84ba5fe5fc394fa23f5481cbe81146b3647fed5 Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Mon, 28 Jan 2019 10:16:15 +0100 Subject: [PATCH 149/229] Revert "fix lost of unread notification" This reverts commit 5449420d312662a09dac245bbfb49edee42cf7db. --- Classes/LinphoneManager.m | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m index fed78bf7e..661fafd5c 100644 --- a/Classes/LinphoneManager.m +++ b/Classes/LinphoneManager.m @@ -1441,8 +1441,7 @@ static void linphone_iphone_call_encryption_changed(LinphoneCore *lc, LinphoneCa void linphone_iphone_chatroom_state_changed(LinphoneCore *lc, LinphoneChatRoom *cr, LinphoneChatRoomState state) { if (state == LinphoneChatRoomStateCreated) { - // this will cause lost of unread notification of TabBarView - //[NSNotificationCenter.defaultCenter postNotificationName:kLinphoneMessageReceived object:nil]; + [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneMessageReceived object:nil]; } } From 992dbb8415ce761425f38b0f8a074a07a91410bd Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Mon, 28 Jan 2019 13:39:44 +0100 Subject: [PATCH 150/229] fix problem of loading chats list --- Classes/ChatsListView.m | 14 -------------- Classes/LinphoneManager.m | 4 ++-- Classes/PhoneMainView.m | 6 +++++- 3 files changed, 7 insertions(+), 17 deletions(-) diff --git a/Classes/ChatsListView.m b/Classes/ChatsListView.m index 84e6d0f8c..a48149dc4 100644 --- a/Classes/ChatsListView.m +++ b/Classes/ChatsListView.m @@ -35,10 +35,6 @@ selector:@selector(callUpdateEvent:) name:kLinphoneCallUpdate object:nil]; - [NSNotificationCenter.defaultCenter addObserver:self - selector:@selector(onGlobalStateChanged:) - name:kLinphoneGlobalStateUpdate - object:nil]; [_backToCallButton update]; self.tableController.waitView = _waitView; [self setEditing:NO]; @@ -61,16 +57,6 @@ [_backToCallButton update]; } -- (void)onGlobalStateChanged:(NSNotification *)notif { - LinphoneGlobalState state = (LinphoneGlobalState)[[[notif userInfo] valueForKey:@"state"] integerValue]; - if (state == LinphoneGlobalStartup) { - _waitView.hidden = NO; - } else if (state == LinphoneGlobalOn) { - [_tableController loadData]; - _waitView.hidden = YES; - } -} - #pragma mark - UICompositeViewDelegate Functions static UICompositeViewDescription *compositeDescription = nil; diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m index 661fafd5c..52ee5690c 100644 --- a/Classes/LinphoneManager.m +++ b/Classes/LinphoneManager.m @@ -917,7 +917,7 @@ static void linphone_iphone_configuring_status_changed(LinphoneCore *lc, Linphon - (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]; @@ -1837,7 +1837,7 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach } linphone_core_set_zrtp_secrets_file(theLinphoneCore, [zrtpSecretsFileName UTF8String]); - linphone_core_set_chat_database_path(theLinphoneCore, [chatDBFileName UTF8String]); + //linphone_core_set_chat_database_path(theLinphoneCore, [chatDBFileName UTF8String]); linphone_core_set_call_logs_database_path(theLinphoneCore, [chatDBFileName UTF8String]); [self setupNetworkReachabilityCallback]; diff --git a/Classes/PhoneMainView.m b/Classes/PhoneMainView.m index f712e52f0..1a8de7336 100644 --- a/Classes/PhoneMainView.m +++ b/Classes/PhoneMainView.m @@ -329,7 +329,11 @@ static RootViewManager *rootViewManagerInstance = nil; [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 { From 19acd2981b2a8ef9ad2c4373916dcd1854b5a288 Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Mon, 28 Jan 2019 15:36:07 +0100 Subject: [PATCH 151/229] fix crash of creating chatroom when no network --- Classes/FirstLoginView.m | 13 +------------ Classes/LinphoneManager.m | 11 +---------- Classes/PhoneMainView.m | 7 ++++++- Classes/Utils/Utils.h | 1 + Classes/Utils/Utils.m | 17 +++++++++++++++++ 5 files changed, 26 insertions(+), 23 deletions(-) diff --git a/Classes/FirstLoginView.m b/Classes/FirstLoginView.m index d4eea95f5..3d6358c3a 100644 --- a/Classes/FirstLoginView.m +++ b/Classes/FirstLoginView.m @@ -200,18 +200,7 @@ static UICompositeViewDescription *compositeDescription = nil; - (void)onLoginClick:(id)sender { 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]; + [PhoneMainView.instance presentViewController:[LinphoneUtils networkErrorView] animated:YES completion:nil]; return; } diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m index 52ee5690c..e9c99228a 100644 --- a/Classes/LinphoneManager.m +++ b/Classes/LinphoneManager.m @@ -2676,16 +2676,7 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) { - (void)call:(const LinphoneAddress *)iaddr { // First verify that network is available, abort otherwise. if (!linphone_core_is_network_reachable(theLinphoneCore)) { - UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Network Error", nil) - message:NSLocalizedString(@"There is no network connection available, enable WIFI or WWAN prior to place a call", 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 presentViewController:[LinphoneUtils networkErrorView] animated:YES completion:nil]; return; } diff --git a/Classes/PhoneMainView.m b/Classes/PhoneMainView.m index 1a8de7336..5caa8790b 100644 --- a/Classes/PhoneMainView.m +++ b/Classes/PhoneMainView.m @@ -878,7 +878,12 @@ static RootViewManager *rootViewManagerInstance = nil; [self changeCurrentView:ChatsListView.compositeViewDescription]; return; } - + + if (!linphone_core_is_network_reachable(LC)) { + [PhoneMainView.instance presentViewController:[LinphoneUtils networkErrorView] animated:YES completion:nil]; + return; + } + const LinphoneAddress *local = linphone_proxy_config_get_contact(linphone_core_get_default_proxy_config(LC)); LinphoneChatRoom *room = linphone_core_find_one_to_one_chat_room_2(LC, local, remoteAddress, isEncrypted); if (!room) { diff --git a/Classes/Utils/Utils.h b/Classes/Utils/Utils.h index b3cca7947..ec0b87f9e 100644 --- a/Classes/Utils/Utils.h +++ b/Classes/Utils/Utils.h @@ -33,6 +33,7 @@ + (NSString *)deviceModelIdentifier; + (LinphoneAddress *)normalizeSipOrPhoneAddress:(NSString *)addr; ++ (UIAlertController *)networkErrorView; typedef enum { LinphoneDateHistoryList, diff --git a/Classes/Utils/Utils.m b/Classes/Utils/Utils.m index 97d678319..439536356 100644 --- a/Classes/Utils/Utils.m +++ b/Classes/Utils/Utils.m @@ -531,6 +531,23 @@ return res; } ++ (UIAlertController *)networkErrorView { + UIAlertController *errView = + [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Network Error", nil) + message:NSLocalizedString(@"There is no network connection available, " + @"enable WIFI or WWAN prior to place a call", + nil) + preferredStyle:UIAlertControllerStyleAlert]; + + UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) + style:UIAlertActionStyleDefault + handler:^(UIAlertAction *action){ + }]; + + [errView addAction:defaultAction]; + return errView; +} + @end @implementation NSNumber (HumanReadableSize) From f5c64116c083fac614dca62f1ae24a0386a9262f Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Tue, 29 Jan 2019 14:45:42 +0100 Subject: [PATCH 152/229] disable crashlythices for linphonetester --- Classes/LinphoneAppDelegate.m | 2 ++ Classes/Utils/Log.m | 4 ++++ linphone.xcodeproj/project.pbxproj | 1 + 3 files changed, 7 insertions(+) diff --git a/Classes/LinphoneAppDelegate.m b/Classes/LinphoneAppDelegate.m index 0f0ff665e..b0b14d8bc 100644 --- a/Classes/LinphoneAppDelegate.m +++ b/Classes/LinphoneAppDelegate.m @@ -239,11 +239,13 @@ #pragma deploymate pop - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { +#ifdef USE_FIREBASE NSString *pathForFile=[[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"GoogleService-Info.plist"]; if ([[NSFileManager defaultManager] fileExistsAtPath:pathForFile]){ // If GoogleService-Info.plist doesn't exist, not call this function avoiding a crash. [FIRApp configure]; } +#endif UIApplication *app = [UIApplication sharedApplication]; UIApplicationState state = app.applicationState; diff --git a/Classes/Utils/Log.m b/Classes/Utils/Log.m index f11329fc1..3484bfd08 100644 --- a/Classes/Utils/Log.m +++ b/Classes/Utils/Log.m @@ -26,7 +26,11 @@ #define FILE_SIZE 17 #define DOMAIN_SIZE 3 +#ifdef USE_FIREBASE #define USE_CRASHLYTICS TRUE +#else +#define USE_CRASHLYTICS FALSE +#endif + (NSString *)cacheDirectory { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 9b8c29ed6..797c8893c 100644 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -5638,6 +5638,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", "DEBUG=1", + "USE_FIREBASE=1", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; From 04fdabc94810d63b15346d3dbc0f8f3960f60881 Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Wed, 30 Jan 2019 11:58:55 +0100 Subject: [PATCH 153/229] add device name --- Classes/LinphoneUI/UIDeviceCell.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Classes/LinphoneUI/UIDeviceCell.m b/Classes/LinphoneUI/UIDeviceCell.m index 915b149f9..f5a687034 100644 --- a/Classes/LinphoneUI/UIDeviceCell.m +++ b/Classes/LinphoneUI/UIDeviceCell.m @@ -26,7 +26,8 @@ - (void)update { [_securityButton setImage:[FastAddressBook imageForSecurityLevel:linphone_participant_device_get_security_level(_device)] forState:UIControlStateNormal]; - _deviceLabel.text = [NSString stringWithUTF8String:linphone_address_as_string_uri_only(linphone_participant_device_get_address(_device))]; + _deviceLabel.text = [NSString stringWithUTF8String:linphone_participant_device_get_name(_device) ? : + linphone_address_as_string_uri_only(linphone_participant_device_get_address(_device))]; if (_isOneToOne) { CGRect frame =_deviceLabel.frame; frame.origin.x = 30; From cc8f7cded04e4e3e4c34eb24570d29b5b390944e Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Wed, 6 Feb 2019 17:01:08 +0100 Subject: [PATCH 154/229] active ipv6 and add testSuites --- TestsLiblinphone/LinphoneTester_Tests.m | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/TestsLiblinphone/LinphoneTester_Tests.m b/TestsLiblinphone/LinphoneTester_Tests.m index 85b1278c7..bb2493121 100644 --- a/TestsLiblinphone/LinphoneTester_Tests.m +++ b/TestsLiblinphone/LinphoneTester_Tests.m @@ -31,8 +31,6 @@ void dummy_logger(const char *domain, OrtpLogLevel lev, const char *fmt, va_list + (void)testForSuite:(NSString *)sSuite { LOGI(@"[message] Launching tests from suite %@", sSuite); - // currently, ipv6 is not supported - liblinphonetester_ipv6=FALSE; const char *suite = sSuite.UTF8String; bc_tester_register_suite_by_name(suite); int test_count = bc_tester_nb_tests(suite); @@ -358,3 +356,22 @@ void dummy_logger(const char *domain, OrtpLogLevel lev, const char *fmt, va_list [self testForSuite:@"Presence using server"]; } @end + +@interface CallRecoveryTests : LinphoneTesterBase +@end + +@implementation CallRecoveryTests ++ (void)initialize { + [self testForSuite:@"Call recovery"]; +} +@end + +@interface CallWithICETests : LinphoneTesterBase +@end + +@implementation CallWithICETests ++ (void)initialize { + [self testForSuite:@"Call with ICE"]; +} +@end + From 6a19fe2f9ac2d853a6374ca093007114fa60c160 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 8 Feb 2019 15:15:43 +0100 Subject: [PATCH 155/229] update x3dh_server_url server url --- Classes/ChatsListTableView.m | 6 +++--- Resources/linphonerc-factory | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Classes/ChatsListTableView.m b/Classes/ChatsListTableView.m index a9f88c771..9c0ea8ded 100644 --- a/Classes/ChatsListTableView.m +++ b/Classes/ChatsListTableView.m @@ -162,7 +162,7 @@ static int sorted_history_comparison(LinphoneChatRoom *to_insert, LinphoneChatRo } else { bctbx_list_t *participants = linphone_chat_room_get_participants(cr); LinphoneParticipant *firstParticipant = participants ? (LinphoneParticipant *)participants->data : NULL; - const LinphoneAddress *addr = firstParticipant ? linphone_participant_get_address(firstParticipant) : linphone_chat_room_get_peer_address(cr); + const LinphoneAddress *addr = firstParticipant ? linphone_participant_get_address(firstParticipant) : peer_address; if (!linphone_address_get_username(addr)) { sorted = sorted->next; continue; @@ -184,8 +184,8 @@ static int sorted_history_comparison(LinphoneChatRoom *to_insert, LinphoneChatRo if (addresses.count >= 4) //send no more data than needed break; sorted = sorted->next; - } - + } + [defaults setObject:addresses forKey:@"chatrooms"]; } diff --git a/Resources/linphonerc-factory b/Resources/linphonerc-factory index c04b3b86e..0d300c98a 100644 --- a/Resources/linphonerc-factory +++ b/Resources/linphonerc-factory @@ -60,7 +60,7 @@ display_filter_auto_rotate=0 [lime] lime_v2=1 -x3dh_server_url=http://54.36.232.93:8082/flexisip-account-manager/x3dh-25519.php +x3dh_server_url=http://sip-staging.linphone.org:8083/flexisip-account-manager/x3dh-25519.php lime_update_threshold=86400 max_nb_device_per_participant=255 allow_message_in_unsafe_chatroom=1 From 740cfa7e18025b7b4e400bf392455fa09bfd3399 Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Mon, 11 Feb 2019 13:37:34 +0100 Subject: [PATCH 156/229] update podfile --- Podfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Podfile b/Podfile index bca68b79e..3d2799a19 100644 --- a/Podfile +++ b/Podfile @@ -1,6 +1,6 @@ # Uncomment the next line to define a global platform for your project platform :ios, '9.0' -source "git@gitlab.linphone.org:BC/public/podspec.git" +source "https://gitlab.linphone.org/BC/public/podspec.git" source "https://github.com/CocoaPods/Specs.git" target 'latestCallsWidget' do @@ -24,7 +24,7 @@ target 'liblinphoneTester' do use_frameworks! # Pods for liblinphoneTester - pod 'linphone-sdk', '~> 4.1-152-g7a39770' + pod 'linphone-sdk', '~> 4.1-221-g241bbf9' pod 'Firebase/Core' pod 'Fabric', '~> 1.9.0' pod 'Crashlytics', '~> 3.12.0' @@ -42,7 +42,7 @@ target 'linphone' do use_frameworks! # Pods for linphone - pod 'linphone-sdk', '~> 4.1-152-g7a39770' + pod 'linphone-sdk', '~> 4.1-221-g241bbf9' pod 'Firebase/Core' pod 'Fabric', '~> 1.9.0' pod 'Crashlytics', '~> 3.12.0' From 9ebeee98b11d32c05c4d08da3a5d7df44442ff73 Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Thu, 14 Feb 2019 11:09:36 +0100 Subject: [PATCH 157/229] set lime x3dh server address --- Resources/linphonerc-factory | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/linphonerc-factory b/Resources/linphonerc-factory index 0d300c98a..ab9813143 100644 --- a/Resources/linphonerc-factory +++ b/Resources/linphonerc-factory @@ -60,7 +60,7 @@ display_filter_auto_rotate=0 [lime] lime_v2=1 -x3dh_server_url=http://sip-staging.linphone.org:8083/flexisip-account-manager/x3dh-25519.php +x3dh_server_url=http://lime.linphone.org:8083/flexisip-account-manager/x3dh-25519.php lime_update_threshold=86400 max_nb_device_per_participant=255 allow_message_in_unsafe_chatroom=1 From 029759955ff9e2af22b261a3b1e3df9a7b6b4fab Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Thu, 14 Feb 2019 11:12:32 +0100 Subject: [PATCH 158/229] fix security image --- Classes/ChatConversationCreateTableView.m | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Classes/ChatConversationCreateTableView.m b/Classes/ChatConversationCreateTableView.m index 3ab413c0a..3bdba2c35 100644 --- a/Classes/ChatConversationCreateTableView.m +++ b/Classes/ChatConversationCreateTableView.m @@ -131,7 +131,7 @@ NSString *key = [_addresses objectAtIndex:indexPath.row]; NSString *phoneOrAddr = [_phoneOrAddr objectAtIndex:indexPath.row]; - Contact *contact = [LinphoneManager.instance.fastAddressBook.addressBookMap objectForKey:key]; + Contact *contact = [LinphoneManager.instance.fastAddressBook.addressBookMap objectForKey:[FastAddressBook normalizeSipURI: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); @@ -140,8 +140,9 @@ return cell; cell.linphoneImage.hidden = !linphoneContact; - cell.securityImage.hidden = !(model && linphone_presence_model_has_capability(model, LinphoneFriendCapabilityLimeX3dh)); + int capabilities = [[_addressesCached objectAtIndex:indexPath.row] intValue]; + cell.securityImage.hidden = capabilities < 2; BOOL greyCellForEncryptedChat = _isEncrypted ? capabilities > 1 : TRUE; BOOL greyCellForGroupChat = _isGroupChat ? capabilities > 0 : TRUE; cell.userInteractionEnabled = cell.greyView.hidden = greyCellForEncryptedChat && greyCellForGroupChat; From ca117fddee09db12a7df2b3337414e7dba34556c Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Thu, 14 Feb 2019 17:18:57 +0100 Subject: [PATCH 159/229] remove useless files --- LiblinphoneTester/MasterView.m | 2 +- linphone.xcodeproj/project.pbxproj | 52 +++--------------------------- 2 files changed, 6 insertions(+), 48 deletions(-) diff --git a/LiblinphoneTester/MasterView.m b/LiblinphoneTester/MasterView.m index 388c16f29..3aefe7b55 100644 --- a/LiblinphoneTester/MasterView.m +++ b/LiblinphoneTester/MasterView.m @@ -41,7 +41,7 @@ [Log enableLogs:ORTP_DEBUG]; liblinphone_tester_keep_accounts(TRUE); - bundlePath = [[NSBundle mainBundle] bundlePath]; + bundlePath = [NSString stringWithFormat:@"%@/liblinphone_tester/", [[NSBundle mainBundle] bundlePath]]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); writablePath = [paths objectAtIndex:0]; diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 797c8893c..32062e220 100644 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -125,7 +125,7 @@ 61AE364F20C00B370089D9D3 /* ShareViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 61AE364E20C00B370089D9D3 /* ShareViewController.m */; }; 61AE365220C00B370089D9D3 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 61AE365020C00B370089D9D3 /* MainInterface.storyboard */; }; 61AE365620C00B370089D9D3 /* linphoneExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 61AE364B20C00B370089D9D3 /* linphoneExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 61AEBEA321906AFC00F35E7F /* BuildFile in Frameworks */ = {isa = PBXBuildFile; }; + 61AEBEA321906AFC00F35E7F /* (null) in Frameworks */ = {isa = PBXBuildFile; }; 61AEBEBD2191990A00F35E7F /* DevicesListView.m in Sources */ = {isa = PBXBuildFile; fileRef = 61AEBEBC2191990A00F35E7F /* DevicesListView.m */; }; 61AEBEBF2191991F00F35E7F /* DevicesListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 61AEBEBE2191991F00F35E7F /* DevicesListView.xib */; }; 61AEBEC22191D7C800F35E7F /* UIDevicesDetails.m in Sources */ = {isa = PBXBuildFile; fileRef = 61AEBEC12191D7C800F35E7F /* UIDevicesDetails.m */; }; @@ -156,16 +156,6 @@ 63058A3E1B4E822F00EFAE36 /* LinphoneTester_Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 63058A381B4E822F00EFAE36 /* LinphoneTester_Tests.m */; }; 63058A3F1B4E823000EFAE36 /* NSObject+DTRuntime.m in Sources */ = {isa = PBXBuildFile; fileRef = 63058A3A1B4E822F00EFAE36 /* NSObject+DTRuntime.m */; }; 63058A4F1B4E835200EFAE36 /* libKIF.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 630589FD1B4E816A00EFAE36 /* libKIF.a */; }; - 63058ACF1B4E922500EFAE36 /* certificates in Resources */ = {isa = PBXBuildFile; fileRef = 63058AC81B4E922500EFAE36 /* certificates */; }; - 63058AD11B4E922500EFAE36 /* images in Resources */ = {isa = PBXBuildFile; fileRef = 63058ACA1B4E922500EFAE36 /* images */; }; - 63058AD41B4E922500EFAE36 /* rcfiles in Resources */ = {isa = PBXBuildFile; fileRef = 63058ACD1B4E922500EFAE36 /* rcfiles */; }; - 63058AD51B4E922500EFAE36 /* sounds in Resources */ = {isa = PBXBuildFile; fileRef = 63058ACE1B4E922500EFAE36 /* sounds */; }; - 63058ADA1B4E937300EFAE36 /* certificates in Resources */ = {isa = PBXBuildFile; fileRef = 63058AC81B4E922500EFAE36 /* certificates */; }; - 63058ADC1B4E937300EFAE36 /* images in Resources */ = {isa = PBXBuildFile; fileRef = 63058ACA1B4E922500EFAE36 /* images */; }; - 63058ADF1B4E937300EFAE36 /* rcfiles in Resources */ = {isa = PBXBuildFile; fileRef = 63058ACD1B4E922500EFAE36 /* rcfiles */; }; - 63058AE01B4E937300EFAE36 /* sounds in Resources */ = {isa = PBXBuildFile; fileRef = 63058ACE1B4E922500EFAE36 /* sounds */; }; - 63058AE21B4E93A100EFAE36 /* tester_hosts in Resources */ = {isa = PBXBuildFile; fileRef = 63058AE11B4E93A100EFAE36 /* tester_hosts */; }; - 63058AE31B4E93B300EFAE36 /* tester_hosts in Resources */ = {isa = PBXBuildFile; fileRef = 63058AE11B4E93A100EFAE36 /* tester_hosts */; }; 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 */; }; @@ -615,7 +605,6 @@ 635173F91BA082A40095EB0A /* UIChatBubblePhotoCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 635173F81BA082A40095EB0A /* UIChatBubblePhotoCell.m */; }; 6352A5751BE0D4B800594C1C /* CallSideMenuView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6352A5731BE0D4B800594C1C /* CallSideMenuView.m */; }; 6352A5761BE0D4B800594C1C /* CallSideMenuView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6352A5741BE0D4B800594C1C /* CallSideMenuView.xib */; }; - 635598821C96AFFA006ED99A /* vcards in Resources */ = {isa = PBXBuildFile; fileRef = 635598811C96AFFA006ED99A /* vcards */; }; 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 */; }; @@ -672,12 +661,11 @@ 63CE58451C85EC1000304800 /* VideoToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63CE583F1C85EBF400304800 /* VideoToolbox.framework */; settings = {ATTRIBUTES = (Required, ); }; }; 63D11C531C3D501200E8FCEE /* Log.m in Sources */ = {isa = PBXBuildFile; fileRef = 63D11C521C3D501200E8FCEE /* Log.m */; }; 63D11C551C3D50A100E8FCEE /* Log.m in Sources */ = {isa = PBXBuildFile; fileRef = 63D11C521C3D501200E8FCEE /* Log.m */; }; - 63D8038D1C96E74100336B6F /* vcards in Resources */ = {isa = PBXBuildFile; fileRef = 635598811C96AFFA006ED99A /* vcards */; }; 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; }; + 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 */; }; 63F1DF4B1BCE983200EDED90 /* CallConferenceTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 63F1DF4A1BCE983200EDED90 /* CallConferenceTableView.m */; }; @@ -697,7 +685,6 @@ 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 */; }; 8C3EAA1C1EB8D9DB00B732B6 /* linphonetester.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C3EAA191EB8D9C300B732B6 /* linphonetester.framework */; }; - 8C56289F20236C25007A8ECC /* db in Resources */ = {isa = PBXBuildFile; fileRef = 8C56289120236AA6007A8ECC /* db */; }; 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 */; }; @@ -1167,12 +1154,6 @@ 63058A3A1B4E822F00EFAE36 /* NSObject+DTRuntime.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+DTRuntime.m"; sourceTree = ""; }; 63058A401B4E82C400EFAE36 /* LinphoneTesterTests-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "LinphoneTesterTests-Info.plist"; sourceTree = ""; }; 63058A411B4E82C400EFAE36 /* LinphoneTesterTests-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "LinphoneTesterTests-Prefix.pch"; sourceTree = ""; }; - 63058AC81B4E922500EFAE36 /* certificates */ = {isa = PBXFileReference; lastKnownFileType = folder; name = certificates; path = "../Pods/linphone-sdk/linphone-sdk/apple-darwin/Resources/liblinphone_tester/certificates"; sourceTree = ""; }; - 63058ACA1B4E922500EFAE36 /* images */ = {isa = PBXFileReference; lastKnownFileType = folder; name = images; path = "../Pods/linphone-sdk/linphone-sdk/apple-darwin/Resources/liblinphone_tester/images"; sourceTree = ""; }; - 63058ACD1B4E922500EFAE36 /* rcfiles */ = {isa = PBXFileReference; lastKnownFileType = folder; name = rcfiles; path = "../Pods/linphone-sdk/linphone-sdk/apple-darwin/Resources/liblinphone_tester/rcfiles"; sourceTree = ""; }; - 63058ACE1B4E922500EFAE36 /* sounds */ = {isa = PBXFileReference; lastKnownFileType = folder; name = sounds; path = "../Pods/linphone-sdk/linphone-sdk/apple-darwin/Resources/liblinphone_tester/sounds"; sourceTree = ""; }; - 63058AE11B4E93A100EFAE36 /* tester_hosts */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = tester_hosts; path = "Pods/linphone-sdk/linphone-sdk/apple-darwin/Resources/liblinphone_tester/tester_hosts"; sourceTree = SOURCE_ROOT; }; - 63058AE41B4E952E00EFAE36 /* share */ = {isa = PBXFileReference; lastKnownFileType = folder; name = share; path = "../liblinphone-sdk/apple-darwin/share"; sourceTree = ""; }; 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 = ""; }; @@ -1640,7 +1621,6 @@ 6352A5721BE0D4B800594C1C /* CallSideMenuView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CallSideMenuView.h; sourceTree = ""; }; 6352A5731BE0D4B800594C1C /* CallSideMenuView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CallSideMenuView.m; sourceTree = ""; }; 6352A5741BE0D4B800594C1C /* CallSideMenuView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CallSideMenuView.xib; sourceTree = ""; }; - 635598811C96AFFA006ED99A /* vcards */ = {isa = PBXFileReference; lastKnownFileType = folder; name = vcards; path = "../Pods/linphone-sdk/linphone-sdk/apple-darwin/Resources/liblinphone_tester/vcards"; 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 = ""; }; @@ -1763,7 +1743,6 @@ 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 = ""; }; 8C435FC320BD41C6004CCA25 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; - 8C56289120236AA6007A8ECC /* db */ = {isa = PBXFileReference; lastKnownFileType = folder; name = db; path = "Pods/linphone-sdk/linphone-sdk/apple-darwin/Resources/liblinphone_tester/db"; sourceTree = SOURCE_ROOT; }; 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 = ""; }; @@ -2470,7 +2449,7 @@ path = LinphoneUI; sourceTree = ""; }; - 29B97314FDCFA39411CA2CEA = { + 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( 8C23BCB71D82AAC3005F19BB /* linphone.entitlements */, @@ -2698,14 +2677,6 @@ 63058A0C1B4E821E00EFAE36 /* LiblinphoneTester */ = { isa = PBXGroup; children = ( - 8C56289120236AA6007A8ECC /* db */, - 635598811C96AFFA006ED99A /* vcards */, - 63058AE41B4E952E00EFAE36 /* share */, - 63058AE11B4E93A100EFAE36 /* tester_hosts */, - 63058AC81B4E922500EFAE36 /* certificates */, - 63058ACA1B4E922500EFAE36 /* images */, - 63058ACD1B4E922500EFAE36 /* rcfiles */, - 63058ACE1B4E922500EFAE36 /* sounds */, 63058A0D1B4E821E00EFAE36 /* AppDelegate.h */, 63058A0E1B4E821E00EFAE36 /* AppDelegate.m */, 63058A0F1B4E821E00EFAE36 /* InfoPlist.strings */, @@ -4437,12 +4408,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 63D8038D1C96E74100336B6F /* vcards in Resources */, - 63058AE31B4E93B300EFAE36 /* tester_hosts in Resources */, - 63058ACF1B4E922500EFAE36 /* certificates in Resources */, - 63058AD11B4E922500EFAE36 /* images in Resources */, - 63058AD41B4E922500EFAE36 /* rcfiles in Resources */, - 63058AD51B4E922500EFAE36 /* sounds in Resources */, 63058A3B1B4E822F00EFAE36 /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -4451,14 +4416,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8C56289F20236C25007A8ECC /* db in Resources */, - 635598821C96AFFA006ED99A /* vcards in Resources */, - 63058ADA1B4E937300EFAE36 /* certificates in Resources */, 63B21A7D1C623DA80074DFF8 /* test_inprogress.png in Resources */, - 63058ADC1B4E937300EFAE36 /* images in Resources */, - 63058ADF1B4E937300EFAE36 /* rcfiles in Resources */, - 63058AE01B4E937300EFAE36 /* sounds in Resources */, - 63058AE21B4E93A100EFAE36 /* tester_hosts in Resources */, 221234461D9E682100DEFA1F /* Images.xcassets in Resources */, 63058A2F1B4E821E00EFAE36 /* TesterImages.xcassets in Resources */, 63058A251B4E821E00EFAE36 /* InfoPlist.strings in Resources */, @@ -4662,7 +4620,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "$SRCROOT/Tools/git_version.sh"; + shellScript = $SRCROOT/Tools/git_version.sh; }; 7FF8A712621CDB927700B916 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; @@ -4693,7 +4651,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "$SRCROOT/Tools/deploy.sh"; + shellScript = $SRCROOT/Tools/deploy.sh; }; 97C36AF90B8C564FC115304D /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; From c3580036f091c2b61880996a611e4de7e41a12c6 Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Fri, 15 Feb 2019 10:06:40 +0100 Subject: [PATCH 160/229] fix text --- Resources/fr.lproj/Localizable.strings | Bin 78004 -> 77986 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Resources/fr.lproj/Localizable.strings b/Resources/fr.lproj/Localizable.strings index 3c4c21b58ecfd1714a3bab70bea7e76e00e0a71d..da674e2d0488b7582c968cdf00597ad11804c71c 100644 GIT binary patch delta 88 zcmdn;kY&+BmJJcvq7N7p7?K(C8FCp47;+e1GL$f+G89cN&UVKkb2VELyUb?6oW(}~ D&9fT= delta 106 zcmZ4VkY&q5mJJcv(nSoZ47m&i3^@#$48=g0%236i3lzy`$ef&;?T%OeWVRwc`OW{c H7asutAc`GB From 984652e41ea28210c959ef28caa22d1071c1595b Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 18 Feb 2019 10:22:12 +0100 Subject: [PATCH 161/229] keep only username@domaine for participant added to chatroom --- Classes/ChatConversationInfoView.m | 1 + Resources/linphonerc-factory | 1 + 2 files changed, 2 insertions(+) diff --git a/Classes/ChatConversationInfoView.m b/Classes/ChatConversationInfoView.m index db390de42..9d5c9c14e 100644 --- a/Classes/ChatConversationInfoView.m +++ b/Classes/ChatConversationInfoView.m @@ -159,6 +159,7 @@ static UICompositeViewDescription *compositeDescription = nil; 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 diff --git a/Resources/linphonerc-factory b/Resources/linphonerc-factory index ab9813143..caba9f879 100644 --- a/Resources/linphonerc-factory +++ b/Resources/linphonerc-factory @@ -62,6 +62,7 @@ display_filter_auto_rotate=0 lime_v2=1 x3dh_server_url=http://lime.linphone.org:8083/flexisip-account-manager/x3dh-25519.php lime_update_threshold=86400 +#lime_update_threshold=30 max_nb_device_per_participant=255 allow_message_in_unsafe_chatroom=1 unsafe_if_sas_refused=1 From 695896987ef9eeb8cf93ec73b16fbca607f08f9c Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Mon, 18 Feb 2019 11:22:58 +0100 Subject: [PATCH 162/229] set dynamic app version --- Classes/AboutView.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Classes/AboutView.m b/Classes/AboutView.m index 1bc831b8f..dd3f6d3a9 100644 --- a/Classes/AboutView.m +++ b/Classes/AboutView.m @@ -49,7 +49,8 @@ static UICompositeViewDescription *compositeDescription = nil; [super viewDidLoad]; NSString *name = [NSBundle.mainBundle objectForInfoDictionaryKey:@"CFBundleDisplayName"]; _nameLabel.text = name; - _appVersionLabel.text = [NSString stringWithFormat:@"%@ iOS %s", name, LINPHONE_IOS_VERSION]; + NSString *curVersion = [NSString stringWithFormat:@"version %@",[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]]; + _appVersionLabel.text = [NSString stringWithFormat:@"%@ iOS %@", name, curVersion]; _libVersionLabel.text = [NSString stringWithFormat:@"%@ Core %s", name, linphone_core_get_version()]; UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onLicenceTap)]; From 82de302e463d3f7a1d2e1b651687b18bc32196f0 Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Mon, 18 Feb 2019 11:42:25 +0100 Subject: [PATCH 163/229] fix crash of download images --- Classes/ChatConversationTableView.m | 4 ++-- Classes/LinphoneUI/UIChatBubblePhotoCell.m | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Classes/ChatConversationTableView.m b/Classes/ChatConversationTableView.m index b903b9bfa..4de6666e5 100644 --- a/Classes/ChatConversationTableView.m +++ b/Classes/ChatConversationTableView.m @@ -77,7 +77,7 @@ } bctbx_list_free_with_data(head, (bctbx_list_free_func)linphone_event_log_unref); - for (FileTransferDelegate *ftd in [LinphoneManager.instance fileTransferDelegates]) { + /*for (FileTransferDelegate *ftd in [LinphoneManager.instance fileTransferDelegates]) { const LinphoneAddress *ftd_peer = linphone_chat_room_get_peer_address(linphone_chat_message_get_chat_room(ftd.message)); const LinphoneAddress *peer = linphone_chat_room_get_peer_address(_chatRoom); @@ -85,7 +85,7 @@ LOGI(@"Appending transient upload message %p", ftd.message); //TODO : eventList = bctbx_list_append(eventList, linphone_chat_message_ref(ftd.event)); } - } + }*/ } - (void)refreshData { diff --git a/Classes/LinphoneUI/UIChatBubblePhotoCell.m b/Classes/LinphoneUI/UIChatBubblePhotoCell.m index b9cf97250..1939b5b30 100644 --- a/Classes/LinphoneUI/UIChatBubblePhotoCell.m +++ b/Classes/LinphoneUI/UIChatBubblePhotoCell.m @@ -223,7 +223,7 @@ static const CGFloat CELL_IMAGE_X_MARGIN = 100; _playButton.hidden = ![type isEqualToString:@"video"]; _fileName.hidden = _fileView.hidden = _fileButton.hidden = localFile ? NO : YES; // Should fix cell not resizing after doanloading image. - [self layoutSubviews]; + //[self layoutSubviews]; } } } From 0dd411b4273013baa38ce9040a601e309435f0e8 Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Mon, 18 Feb 2019 12:38:44 +0100 Subject: [PATCH 164/229] set chatConversationView topBar --- Classes/Base.lproj/ChatConversationView.xib | 14 +++++++------- Classes/ChatConversationView.m | 4 ++++ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Classes/Base.lproj/ChatConversationView.xib b/Classes/Base.lproj/ChatConversationView.xib index 8ada88f0c..d3e4475f1 100644 --- a/Classes/Base.lproj/ChatConversationView.xib +++ b/Classes/Base.lproj/ChatConversationView.xib @@ -83,9 +83,9 @@ -