From 885b88e1c3c59d5322b69585e9c5cd88c3234839 Mon Sep 17 00:00:00 2001 From: QuentinArguillere Date: Mon, 13 Jun 2022 17:27:32 +0200 Subject: [PATCH] Change available actions for chatrooms. New actions are: - 1-1: Contact / Mute / Delete / (DEBUG ONLY : chatroom infos) - Encrypted 1-1: Contact / Devices / Ephemeral / Mute / Delete / (DEBUG ONLY : chatroom infos) - Group: Infos / Mute / Delete / (DEBUG ONLY : chatroom infos) - Encrypted Group: Infos / Devices / Ephemeral / Mute / Delete / (DEBUG ONLY : chatroom infos) Mute action is not yet implemented --- Classes/ChatConversationView.h | 1 + Classes/ChatConversationView.m | 201 ++++++++++++++++---- Resources/images/menu_notifications_off.png | Bin 0 -> 3511 bytes Resources/images/menu_notifications_on.png | Bin 0 -> 2758 bytes Resources/images/more_menu_default.png | Bin 3543 -> 1895 bytes linphone.xcodeproj/project.pbxproj | 8 + 6 files changed, 174 insertions(+), 36 deletions(-) create mode 100644 Resources/images/menu_notifications_off.png create mode 100644 Resources/images/menu_notifications_on.png diff --git a/Classes/ChatConversationView.h b/Classes/ChatConversationView.h index cb600d244..b38d4b8f5 100644 --- a/Classes/ChatConversationView.h +++ b/Classes/ChatConversationView.h @@ -56,6 +56,7 @@ UIConfirmationDialog *securityDialog; UIRefreshControl *refreshControl; BOOL isOneToOne; + BOOL isEncrypted; } @property(nonatomic) LinphoneChatRoom *chatRoom; diff --git a/Classes/ChatConversationView.m b/Classes/ChatConversationView.m index 3dff644d1..ab1bf2877 100644 --- a/Classes/ChatConversationView.m +++ b/Classes/ChatConversationView.m @@ -116,6 +116,7 @@ _chatRoomCbs = NULL; securityDialog = NULL; isOneToOne = TRUE; + isEncrypted = FALSE; imageQualities = [[OrderedDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithFloat:0.9], NSLocalizedString(@"Maximum", nil), [NSNumber numberWithFloat:0.5], NSLocalizedString(@"Average", nil), @@ -330,6 +331,7 @@ static UICompositeViewDescription *compositeDescription = nil; if (peerAddr) { _chatRoom = linphone_core_get_chat_room([LinphoneManager getLc], peerAddr); isOneToOne = linphone_chat_room_get_capabilities(_chatRoom) & LinphoneChatRoomCapabilitiesOneToOne; + isEncrypted = linphone_chat_room_get_capabilities(_chatRoom) & LinphoneChatRoomCapabilitiesEncrypted; } [self configureForRoom:true]; _backButton.hidden = _tableController.isEditing; @@ -407,10 +409,8 @@ static UICompositeViewDescription *compositeDescription = nil; [self update]; [self shareFile]; - if (![ChatConversationView isBasicChatRoom:_chatRoom]) { - [self setupPopupMenu]; - _ephemeralndicator.hidden = !linphone_chat_room_ephemeral_enabled(_chatRoom); - } + [self setupPopupMenu]; + _ephemeralndicator.hidden = !linphone_chat_room_ephemeral_enabled(_chatRoom); [self handlePendingTransferIfAny]; } @@ -422,6 +422,14 @@ static UICompositeViewDescription *compositeDescription = nil; return capabilities & LinphoneChatRoomCapabilitiesBasic; } +-(BOOL) isEncryptedChatRoom:(LinphoneChatRoom *)room { + if (!room) + return true; + LinphoneChatRoomCapabilitiesMask capabilities = linphone_chat_room_get_capabilities(room); + return capabilities & LinphoneChatRoomCapabilitiesBasic; +} + + - (void)configureMessageField { if (isOneToOne) { @@ -480,6 +488,7 @@ static UICompositeViewDescription *compositeDescription = nil; if (peerAddr) { _chatRoom = linphone_core_get_chat_room([LinphoneManager getLc], peerAddr); isOneToOne = linphone_chat_room_get_capabilities(_chatRoom) & LinphoneChatRoomCapabilitiesOneToOne; + isEncrypted = linphone_chat_room_get_capabilities(_chatRoom) & LinphoneChatRoomCapabilitiesEncrypted; } [self configureForRoom:self.editing]; if (_chatRoom && _markAsRead) { @@ -654,8 +663,7 @@ static UICompositeViewDescription *compositeDescription = nil; [_backToCallButton update]; _infoButton.hidden = (isOneToOne|| !_backToCallButton.hidden || _tableController.tableView.isEditing); _callButton.hidden = !_backToCallButton.hidden || !_infoButton.hidden || _tableController.tableView.isEditing; - _toggleMenuButton.hidden = [ChatConversationView isBasicChatRoom:_chatRoom] || _tableController.tableView.isEditing; - _tableController.editButton.hidden = _tableController.editButton.hidden || ![ChatConversationView isBasicChatRoom:_chatRoom]; + _toggleMenuButton.hidden = _tableController.isEditing; } - (void)updateParticipantLabel { @@ -814,16 +822,17 @@ static UICompositeViewDescription *compositeDescription = nil; LOGI(@"onDeleteClick"); NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"Do you want to delete the selected messages?", nil)]; [UIConfirmationDialog ShowWithMessage:msg - cancelMessage:nil - confirmMessage:nil - onCancelClick:^() { - [self onEditionChangeClick:nil]; - } - onConfirmationClick:^() { - [_tableController removeSelectionUsing:nil]; - [_tableController loadData]; - [self onEditionChangeClick:nil]; - }]; + cancelMessage:nil + confirmMessage:nil + onCancelClick:^() { + [self onEditionChangeClick:nil]; + } + onConfirmationClick:^() { + [_tableController removeSelectionUsing:nil]; + _tableController.editButton.hidden = true; + [_tableController loadData]; + [self onEditionChangeClick:nil]; + }]; } - (IBAction)onEditionChangeClick:(id)sender { @@ -870,7 +879,7 @@ static UICompositeViewDescription *compositeDescription = nil; } -- (IBAction)onInfoClick:(id)sender { +- (void)displayGroupInfo { NSMutableArray *contactsArray = [[NSMutableArray alloc] init]; NSMutableArray *admins = [[NSMutableArray alloc] init]; bctbx_list_t *participants = linphone_chat_room_get_participants(_chatRoom); @@ -897,6 +906,10 @@ static UICompositeViewDescription *compositeDescription = nil; [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; } +- (IBAction)onInfoClick:(id)sender { + [self displayGroupInfo]; +} + #pragma mark ChatRoomDelegate - (BOOL)startMultiFilesUpload:(LinphoneChatMessage *)rootMessage { @@ -1651,17 +1664,70 @@ void on_chat_room_conference_alert(LinphoneChatRoom *cr, const LinphoneEventLog } // Popup menu +-(void) addOrGoToContact:(const LinphoneAddress *)contactAddress { + Contact *contact = [FastAddressBook getContactWithAddress:contactAddress]; + + if (contact) { + ContactDetailsView *view = VIEW(ContactDetailsView); + [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; + [ContactSelection setSelectionMode:ContactSelectionModeNone]; + [view setContact:contact]; + } else { + char *lAddress = linphone_address_as_string_uri_only(contactAddress); + if (lAddress != NULL) { + NSString *normSip = [NSString stringWithUTF8String:lAddress]; + normSip = [normSip hasPrefix:@"sip:"] ? [normSip substringFromIndex:4] : normSip; + normSip = [normSip hasPrefix:@"sips:"] ? [normSip substringFromIndex:5] : normSip; + [ContactSelection setAddAddress:normSip]; + [ContactSelection setSelectionMode:ContactSelectionModeEdit]; + [ContactSelection enableSipFilter:FALSE]; + [PhoneMainView.instance changeCurrentView:ContactsListView.compositeViewDescription]; + ms_free(lAddress); + } + } +} +-(BOOL) isConversationMuted { + return FALSE; // TODO +} +-(void) toggleMuteConversation { + // TODO +} --(BOOL) canAdminEphemeral:(LinphoneChatRoom *)cr { +-(void) showAddressAndIdentityPopup { + + char *localAddress = linphone_address_as_string(linphone_chat_room_get_local_address(_chatRoom)); + char *peerAddress = linphone_address_as_string(linphone_chat_room_get_peer_address(_chatRoom)); + NSString *infoMsg = [NSString stringWithFormat:@"Chat room id:\n%s\nLocal account:\n%s", peerAddress, localAddress]; + ms_free(localAddress); + ms_free(peerAddress); + + UIAlertController *popupView = + [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Chatroom debug infos", nil) + message:infoMsg + preferredStyle:UIAlertControllerStyleAlert]; + + UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Copy to clipboard", nil) + style:UIAlertActionStyleDefault + handler:^(UIAlertAction *action) { + UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; + pasteboard.string = infoMsg; + }]; + + [popupView addAction:defaultAction]; + [self presentViewController:popupView animated:YES completion:nil]; + +} + +-(BOOL) canAdminEphemeral:(const LinphoneChatRoom *)cr { if (!cr) return FALSE; + if ([ChatConversationView isBasicChatRoom:_chatRoom]) return FALSE; // If ephemeral mode is DeviceManaged, then we don't need to check anything else return (linphone_chat_room_params_get_ephemeral_mode(linphone_chat_room_get_current_params(cr)) == LinphoneChatRoomEphemeralModeDeviceManaged) || ( linphone_chat_room_has_capability(cr, LinphoneChatRoomCapabilitiesEphemeral) && linphone_chat_room_params_get_ephemeral_mode(linphone_chat_room_get_current_params(cr)) == LinphoneChatRoomEphemeralModeAdminManaged && linphone_participant_is_admin(linphone_chat_room_get_me(cr))); } - - (void) setupPopupMenu { _popupMenu.dataSource = self; _popupMenu.delegate = self; @@ -1678,19 +1744,38 @@ void on_chat_room_conference_alert(LinphoneChatRoom *cr, const LinphoneEventLog -(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self onToggleMenu:nil]; + BOOL isEncrypted = ![ChatConversationView isBasicChatRoom:_chatRoom]; + if (indexPath.row == 0) { + if (isOneToOne) { + [self addOrGoToContact:linphone_chat_room_get_peer_address(_chatRoom)]; + } else { + [self displayGroupInfo]; + } + } + + if (isEncrypted && indexPath.row == 1) { [self goToDeviceListView]; } - if (indexPath.row == 1) { + + BOOL canEphemeral = [self canAdminEphemeral:_chatRoom]; + if (canEphemeral && indexPath.row == 2) { + EphemeralSettingsView *view = VIEW(EphemeralSettingsView); + view.room = _chatRoom; + [PhoneMainView.instance popToView:view.compositeViewDescription]; + } + if ((!isEncrypted && indexPath.row == 1) || (isEncrypted && indexPath.row == 3)) { + [self toggleMuteConversation]; + } + + if ((!isEncrypted && indexPath.row == 2) || (isEncrypted && indexPath.row == 4)) { [_tableController onEditClick:nil]; [self onEditionChangeClick:nil]; } - if ([self canAdminEphemeral:_chatRoom]) { - if (indexPath.row == 2) { - EphemeralSettingsView *view = VIEW(EphemeralSettingsView); - view.room = _chatRoom; - [PhoneMainView.instance popToView:view.compositeViewDescription]; - } + + if ((isEncrypted && ((!canEphemeral && indexPath.row == 4)||(canEphemeral && indexPath.row == 5))) + || (!isEncrypted && indexPath.row == 3)) { + [self showAddressAndIdentityPopup]; } } @@ -1699,27 +1784,73 @@ void on_chat_room_conference_alert(LinphoneChatRoom *cr, const LinphoneEventLog } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return [self canAdminEphemeral:_chatRoom] ? 3 : 2; + int nbRows = 3; + + if ([LinphoneManager.instance lpConfigIntForKey:@"debugenable_preference"] == 1) // DEBOGUE == ALL + ++nbRows; + + if (!isEncrypted) + return nbRows; + else + ++nbRows; + + if ([self canAdminEphemeral:_chatRoom]) + ++nbRows; + + return nbRows; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [[UITableViewCell alloc] init]; if (indexPath.row == 0) { + if (isOneToOne) { + Contact *contact = [FastAddressBook getContactWithAddress:linphone_chat_room_get_peer_address(_chatRoom)]; + if (contact == nil) { + cell.imageView.image = [LinphoneUtils resizeImage:[UIImage imageNamed:@"contact_add_default.png"] newSize:CGSizeMake(20, 25)]; + cell.textLabel.text = NSLocalizedString(@"Add to contacts",nil); + } else { + cell.imageView.image = [LinphoneUtils resizeImage:[UIImage imageNamed:@"contacts_all_default.png"] newSize:CGSizeMake(20, 25)]; + cell.textLabel.text = NSLocalizedString(@"Go to contact",nil); + } + } else { + cell.imageView.image = [LinphoneUtils resizeImage:[UIImage imageNamed:@"chat_group_informations.png"] newSize:CGSizeMake(20, 25)]; + cell.textLabel.text = NSLocalizedString(@"Group infos",nil); + } + } + + if (isEncrypted && indexPath.row == 1) { cell.imageView.image = [LinphoneUtils resizeImage:[UIImage imageNamed:@"menu_security_default.png"] newSize:CGSizeMake(20, 25)]; cell.textLabel.text = NSLocalizedString(@"Conversation's devices",nil); } - if (indexPath.row == 1) { + + bool canEphemeral = [self canAdminEphemeral:_chatRoom]; + if (canEphemeral && indexPath.row == 2) { + cell.imageView.image = [LinphoneUtils resizeImage:[UIImage imageNamed:@"ephemeral_messages_default.png"] newSize:CGSizeMake(20, 25)]; + cell.textLabel.text = NSLocalizedString(@"Ephemeral messages",nil); + } + + if ((isEncrypted && indexPath.row == 3) || (!isEncrypted && indexPath.row == 1)) { + if ([self isConversationMuted]) { + cell.imageView.image = [LinphoneUtils resizeImage:[UIImage imageNamed:@"menu_notifications_off.png"] newSize:CGSizeMake(20, 25)]; + cell.textLabel.text = NSLocalizedString(@"NOT IMPLEMENTED",nil); + } else { + cell.imageView.image = [LinphoneUtils resizeImage:[UIImage imageNamed:@"menu_notifications_on.png"] newSize:CGSizeMake(20, 25)]; + cell.textLabel.text = NSLocalizedString(@"NOT IMPLEMENTED",nil); + } + } + + if ((isEncrypted && indexPath.row == 4) || (!isEncrypted && indexPath.row == 2)) { cell.imageView.image = [LinphoneUtils resizeImage:[UIImage imageNamed:@"delete_default.png"] newSize:CGSizeMake(20, 25)]; cell.textLabel.text = NSLocalizedString(@"Delete messages",nil); } - if ([self canAdminEphemeral:_chatRoom]) { - if (indexPath.row == 2) { - cell.imageView.image = [LinphoneUtils resizeImage:[UIImage imageNamed:@"ephemeral_messages_default.png"] newSize:CGSizeMake(20, 25)]; - cell.textLabel.text = NSLocalizedString(@"Ephemeral messages",nil); - } + if ((isEncrypted && ((!canEphemeral && indexPath.row == 4)||(canEphemeral && indexPath.row == 5))) + || (!isEncrypted && indexPath.row == 3)) { + cell.imageView.image = [LinphoneUtils resizeImage:[UIImage imageNamed:@"chat_group_informations.png"] newSize:CGSizeMake(20, 25)]; + cell.textLabel.text = NSLocalizedString(@"Show address and identity",nil); } + cell.imageView.contentMode = UIViewContentModeScaleAspectFit; return cell; } @@ -1729,9 +1860,7 @@ void on_chat_room_conference_alert(LinphoneChatRoom *cr, const LinphoneEventLog [_popupMenu selectRowAtIndexPath:nil animated:false scrollPosition:UITableViewScrollPositionNone]; } - -// Voice redcording - +// Voice recording - (IBAction)onVrDelete:(id)sender { [self cancelVoiceRecording]; diff --git a/Resources/images/menu_notifications_off.png b/Resources/images/menu_notifications_off.png new file mode 100644 index 0000000000000000000000000000000000000000..556e26a8b04413cdec9e2653aa9733bcf8cc2eed GIT binary patch literal 3511 zcmV;o4M_5dP)EX>4Tx04R}tkv&MmKpe$iTeVUu4t9{@kfAzR5G~@URVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRbWHa-`5n`d##c~(3vY`?uh+~SXQNBOt zvch?bvs$gQ_C5Iv!v$?+nd>x1kisICAVPqQIx48bLY!8O6cZWRPkQ*Hj$b5~Os)zT zITlcZ3d!+<|H1EW&EnLgn-oq0y)U-?F$x5CfmXw|zmILZbpiyQfh(=!uQh?0PtqG5 zEp`M9ZUYzB9ZlW?E_Z<8CtWfmM+(sN7mL9A8GTb87`g>QYi@7teVjf3S?Vf%0~{Oz zV4f8U+S zW)ei8S_Q4esx773_NevL(w?eyDUu0pl}W^EwT2m5b|j$E7F_Cv9!+9YpoJt5MacqK z6bh%6iWLi`9*%2Kz}AXNq(U;8dH3rd^O8J%7L+%b1UdifPD9GQ>Z9#jQ2W!YE-!47+@-JBQVHgqY5}c z3-AW86?hNi-|=g-A8;bbnV>^~EWqd9n+JRsmD5FKUPV=X<+$R&-p=NK;>ndqN20M? z1#a?~jDxZ=YRgyt$|mpQsK-B&-m0!P_L>0$PU1oKP_E3Bdf? z75yVIXBH6hz(#>psyel0U(?%DZvL^R1h}la{wNVd<)2Iw`<`}zt4ZaQJWWa>@UdZy{k zi$qTNWVowFZLkrbR*_$(3Kk#~EZnN9GlA!Un0t6I=v;UH{_PG5o;MnI0s}plJttyrDG3&A?e2L!23FN! zz*Qc*`VcXW;RmVT1|5F&=Nc(=97;lZ|hyN@mJ| zMalF^SKxJn?3_@1rA>Ve{Y<_i5&|ZBys-l7fxCg-2S^!BJ+Q{@eVFI}*A;0>HS7~h zmgiWXZvrsIEkxSJI?x#ks{wDVJRHQIdI>w^04I2k>{5}Gs`H|y%Q9Q7OqY1N>W#Cj zL8pa^3O5;LKj4k`C#p}fQwm(U=o!J-`~$qCXcH#Znljkhr!)6C8KodUOMqP?P>Qex zK#gey+2c8%<+Iu^rNA*UC?+>S$6NfZ{#Ytt7c5zx{i)-hsxTfH;OTd*2TBFDgo1?@ zz*=H%ki{pRXlXcD zxXF9HPh+ZxMGlzTm+YJLwd2vJ_*=HLAus0W4WQG3&v_*K63C2jFt9PzPSJ3L#=}dO zA0>|70L*lYfwr*$<(5!U!G?6q>pv2(74sW2)v+bO43A_1)}vAyDlXWVuDK7pgdZzg z;V0Xf08Bp!7D}zLFQs#S|KWy>^>-$LOeWrxZySFUm?hYkL&4GdUkj`~aMBM{{Vp>m zkq|J+1FOJGsLm8I8%v5t+jK8_aw={8pe85bPRHi^l9I+lRV#C{OzRD<8XxcW(k$>7 z6}iRN+Pa~ns30j=>+@Sg4v7C&$VoOrCMDs_sQO}l&hspgin1qk#iiYLB_FA&&k=R5 z5!KsW*fz;-Rgr1oV8I`Hq>`41BYfmtdLx{b?Xxeq@w;ylez0<>aSS7XpVHAIem5bX z?Yy2{`gFEY#z?&BcD(1*D*{u(!Gd)?Rmq!+M@50{KvO$|GBy%3=k!^n?_FHu%goEZ zObzpZlf1Fgiu~=64(h3;8P@S%2i$RB(ZNPVrZnSU*IPRjWHYd_qf%wK3iHaV>o5M* z^M8_F10Q8_F9Ep|IKy-8>nOho2Ma#v>c08)3w^Oj&P~AWbhL7DU$WF#-7vXmWUsw( z?%u5J0t-D_X53o+u7SHhyr5UW<<<44Nj#Y!=B}a=-$I#Db0Bckv$8VHk0h?fLp-79HG!!rtSc!Rl@i#t z5iSnwM|c`xHXS~9xiUmh0>L_4i|mNaIA4G7$oAlWxj zoggA>!(#$zNh(5P0uij!2<-E`|4BwQFKJ*!ji);aDk`>f=l5{!$}CYW1RgwKkzkvO zOi*LilmrXXnl7sNmH5tKd+H#jbG9xdED_*i&!I1ZeEXm{yKtG`=QvlQdS8Nr+N>~9 ztv(k{GpsAoi#(kYfcF(?PCC=F@Ug%aU`&Ty=r1d38U|o>Ge-A{#cvIlpgIj0?7967 zphD1hMfgH_bzQn3#UlOVzD6f`gy$f#CFb+(>Egbw!cyJ2AeC+mZeKa#jqqkS>-us+ z!wuk{ZYC5X{UaCnLP9(D&k8q(ivnAEluH|Z*VuzWcvZggM#SnYGtnercpvzyM`c4H-Ve zm#pgbh>QUp;%VI}u!s2P4tfM&qYD2JSSzAc0`HUr3uE2beiGfqC3TrtE)k?W!9l&P zqNSp~wRCK7p&~|9haff|mEA^s|FUZ3&@W<8oD+y|oHZ%(p0tPaPU47(s)%iN9Dhte zLq&n47QEYf_>tP>eu>FQU|s_3YoOCbc{Y@gL6y}s4hQ`e@HNm?V)XXVHKX<%vawgS z;zZ)6^Bv#?G0v@_F{5`J){e)5Csz4P%mjdY63WBZfLWlcLq!Lxkf;rSUWhUjxYDuC zx!orZ&PBjw@tDs@tXyzdds++Tuk=N-qJ_X*;1rMgzX@_%%=%XR{MwPNUD!#6cIaZ3 zdw+N16i@CB2k-W$Pr?sZKkIMFc1Ef&7dYLM8@~&b8Y2x|!Me@8oy0$70?0%8=0laW zzAj^aO?^HvoQ_WyTZlg+{lI0_D>4kx^Fi-Tfc+<`lN1_D#*Aw1Mn7Njv|uuT?`Gs@ zU(#tC=)rqLl*`@ftWAqPw#K*Vu&A_PM}Stiw$u(QN(sv9P;sE!Ez;9YI$_%zJO1$^ z=t(Z{P?XsfRrOKuZA6?_5G-U{_yK6CC!uKpR*t`B)b7Ki(mKxr3$RO&u!yW4cWq%( z`@t8EILnH49t3uH!rxg4OH`c46(%Z75p)sg0^qa*9ipi?oQ?QF9@y=`3{_T*D=z5K z=C}G~Gpch?ncG$)YrLYlI{w#b*nCq(W`OQU7jS1z>t46nwhnZr!Kn}R5H?EX>4Tx04R}tkv&MmKpe$iTeVUu4t9{@kfAzR5G~@URVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRbWHa-`5n`d##c~(3vY`?uh+~SXQNBOt zvch?bvs$gQ_C5Iv!v$?+nd>x1kisICAVPqQIx48bLY!8O6cZWRPkQ*Hj$b5~Os)zT zITlcZ3d!+<|H1EW&EnLgn-oq0y)U-?F$x5CfmXw|zmILZbpiyQfh(=!uQh?0PtqG5 zEp`M9ZUYzB9ZlW?E_Z<8CtWfmM+(sN7mL9A8GTb87`g>QYi@7teVjf3S?Vf%0~{Oz zVgO66N^?|m&Km>7opj4ZZKnU5r_uD`AuDL8G0o=`F#_!CXNzUHA_k8#FINx)A z$H)=xShdD{-{pHrzW{R+%LaP|YiuYIg;etFUMJ|VoMu4$P0-WymHO3sP8V2m5N zFS)nTnduTUZUw#&`sjV&E@5|9mltjN%zML%rel#`4$KRtdD`cXfSX-=WbwQ?GxmEU za|i2)i};hwxGr!ajkkfDB>grUWC5zm3b#gZ3xS^jTY{wma0D<{gZ=3TUAa(hbIS_%n6G+dHv?^fIf6J#zLoy;PwOowgl~^Gjg+_|m{J7s^l^;Z z`4xq&1u{oo4P~WN(Mer<-wlRtXEv1di;~w>&Sjp|ZTt?@huNPdi(_ z^ghNTA@fm4Coj7H;X&D4!>0m=r8Tm!b;5debkm5KH5)vcVLl<&(J?kFglpqXqXLnU z-mE;s|EHOk>F5TsPnmvL4=Jx>VB>)E`GHQD&k27{_;bPo z8pX`Ca|HReT5tBp5A_nYwV>zbTJ^hL>j4qOq+lsv&2VXsur z`nK2CyOxR95PybGW}5-CfL{qFFU=s`CE*DE7(>?rvqOShh-aK{i(?7bOg}(nMe%mf z3Sb?np{Wv7sQfopC%fqvr^LqVYLGvhb&)_{8I*my7m)i zk!q8mQx)1LaXQ+?8vYpc64?3abzsI1YvPT>oYoDtL`$m|>mU4lF=f)1cxmH?g7$Xr zOo<;5Zmbc_&h&h@gcWh`n6E~}xugnr27J}fqNGoAE3ssM8BphpfBfsUlyty`lWMF< zS64lZRYD*1SQA>hqG3GZ7eFaF=-BIx!3Um|vn&0Gy}n>(>ijF(Win`NcH$PLRMvDL zZ-C^_0y==_%=8nS|Hguu7yCVqFu?8cM(5#=F{~6QBh{@FW#3-O{xYIIupLIi+UwwZ^D36pJ+!I_q78)e&Hq(1@ zdeeEX*`egzijsZ4cR-_5v%Jv^8P@&RoS~#|Bc1uvfRizvHvC6Xq_sQGeWARV6(o}W zxe{lY@utCA8QW3!)fGvYNmb<~-QJh8X}NTH!}l?6A$6YoAy5{L>anXzyLV`5ynZU! zZKOJJ6F{|@mRFXQ?C!TkyxP0g#xRbd^YDBWa6%&K^7kXdoe+wnG2kR*1z8JYIT7*S zyC@OLSkf5hI*SOOiiP(*7z0KJYdDP-iDbVf9AH~Uf$cos)a~hfEa6QA&d4xt0k?Y~ z5Plul5c>Z#lU-4>yy1vXyZMf~ro$~&UHMwbywzYsRYl>RY&jLp6sCiQ{K#pZ@6Qg(N#PP}y;2RO*{gx&QVGZIEdR8__WyKm> zFl;NbS7qKuFsQYve0t8#tokJ5sfpLeFc&o+2lCCiWMx@luatiO4=+l5` zrwNr?ipX`I(X)n!irkCgU4QiF`<~C|ob&mdbN)Ez^F8O>cgCNUh8%`~Kp<(r!ImKM zjGrncDY9Xfpdk=QEFlnsaRx9LjT@9uzrYY*5J)E@I^&eXD{Iw`E9a9nNni`;&F=T+ z?s5m^;ZJPj^%x#SBygrv>q7uT=ks+M6;*{79-B9sexCoRCl#lzk&4GB9VhU2={Ctq zvZ-533zMG~)HICru;}NVAW}`rEzRS8)JIo0^u?u0)D3BlZ--_Hf50reMo-|WLc;E9+Oum5xuzH28bz-yQBnbR_n?pwR=&4EGhw+J4e~;~LP}d5jhd17DE8-$~)#ZKs+f%qGh7q|-vV%U;28-e8FS?D)sTZAki<2>_6#wc z`;~_af%>X;EltJVZkQ%v13PjwBrS857^T-WCA7ZwNbNgps`MK=gY9(^MhbAcZZe1n zJ^FW<#>4jTS}_Htl0r>Ry>`9+z97!OAjO(c9nGX#UTzmgMURnv`wr6YMd7tO>t@2` zUc>&keU@3GR{pP;D9fi1-J7hk-G;U}RB~>q0w8-Jdi8lJ*>EewZ?*I9a7&gp0)j3_ zqwml9aCHM0JY}|B@WB`Jg00|n-twA_W!S}@+AD;1QyFCXTnFFo;2HL@aeO3negrkF zHR8xcwYyJXJqVmeK1GzkCFL)}fKYM(>vP0H6p)EhEk^Qxq%CrZv3g(JBZq)xP4YEG zUwWyqHu*6e@Y5l=E~IrpkQ)xoCcQ#dUyo{MXw5hD;@!kRs78S;^UI4PxH~Y7s z*Q<2=z4MrMMK5D=RhE#`WW>ydb7eZ!%|Acu76OdfHZz>xwJEY8Z!FYB)4A2h%fHlg zc6P=%m6=utIo01|dyG{9wo>t&7e zb9>K)S!@`Oj$~*g9Cl~-3I3#4FBifPjKFzMnbwbQC&!qT_-i_7FJ=* zxMbn)dc)ry^jrCCzUko(4ydTB)4HB!Dr$%Dn$+*$>YX2ZK0#w#D6;UKl%u|B%>|G0+`dQsmg69l;wfPleZh6HuK z&e}la`{c%B`mT51yh?%wy)WAlk|=qFOGb;UJ_99I9D6!6=o|mt2lnGp8Er_%VMjI_ zfJ&6-bCxXRdiBlap1y$2SYoU&Wd+kA@yTP>>P+8%p9Uej$E6+N5>UM_Vy3;rF?;(c zCW;B0tz6!vr~zyj^#qY!*0hdFh=XmN*m`8SMN`#fz~)}|M1Zvly7}4dOZ(xoE;$8qn#q>UpAAa!Q17~OK5x$-nuQD}dxH>>G43ns?*Nq;)OfX|W9<_Jvb^Hv` z6DW6fmJ7$x$v!7vTg^!9qYLm&u({8Df-HW=K{s5aaZL{p+5j_-IYWoemlMxcKM!}Y z^BOcfyt{4YU%i<!QIK*fKh#lg0SL5Rdw!tZ7EBXM5H$N6J1ZAb@rm zf6n8GDZ;Qx^oXRRSD9E(?O>*I%T0!z=`Se%!+T+O#V_AZ=HUVksQfGe?C`c#HePZ6 E1$P2pyZ`_I literal 3543 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 RH;e!P002ovPDHLkV1mnD$3y@C diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index bf4006977..ad0ea7056 100644 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -632,6 +632,8 @@ 669B140827A1821F0012220A /* scroll_to_bottom_default.png in Resources */ = {isa = PBXBuildFile; fileRef = 669B140727A1821F0012220A /* scroll_to_bottom_default.png */; }; 669B140C27A29D140012220A /* FloatingScrollDownButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 669B140B27A29D140012220A /* FloatingScrollDownButton.swift */; }; 6F3A2542B1FC7C128439D37C /* Pods_linphone.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CFCC14A580A05DEC78090273 /* Pods_linphone.framework */; }; + 66E399F72857869300E73456 /* menu_notifications_off.png in Resources */ = {isa = PBXBuildFile; fileRef = 66E399F52857869200E73456 /* menu_notifications_off.png */; }; + 66E399F82857869300E73456 /* menu_notifications_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 66E399F62857869200E73456 /* menu_notifications_on.png */; }; 70E542F313E147E3002BA2C0 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F213E147E3002BA2C0 /* OpenGLES.framework */; }; 70E542F513E147EB002BA2C0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542F413E147EB002BA2C0 /* QuartzCore.framework */; }; 8C1B67061E671826001EA2FE /* AudioHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C1B67051E671826001EA2FE /* AudioHelper.m */; }; @@ -1624,6 +1626,8 @@ 666D795C283E67E300B07215 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; 669B140727A1821F0012220A /* scroll_to_bottom_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = scroll_to_bottom_default.png; sourceTree = ""; }; 669B140B27A29D140012220A /* FloatingScrollDownButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FloatingScrollDownButton.swift; sourceTree = ""; }; + 66E399F52857869200E73456 /* menu_notifications_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_notifications_off.png; sourceTree = ""; }; + 66E399F62857869200E73456 /* menu_notifications_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_notifications_on.png; sourceTree = ""; }; 70E542F213E147E3002BA2C0 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 70E542F413E147EB002BA2C0 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 87F00D1935382CCA03DF2F02 /* Pods-linphone.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-linphone.debug.xcconfig"; path = "Target Support Files/Pods-linphone/Pods-linphone.debug.xcconfig"; sourceTree = ""; }; @@ -2752,6 +2756,8 @@ 61586B86217A17150038AC45 /* menu_assistant@2x.png */, 61586B88217A17220038AC45 /* menu_link_account.png */, 61586B8A217A17320038AC45 /* menu_link_account@2x.png */, + 66E399F52857869200E73456 /* menu_notifications_off.png */, + 66E399F62857869200E73456 /* menu_notifications_on.png */, 61586B8C217A173F0038AC45 /* menu_options.png */, 61586B8E217A174F0038AC45 /* menu_options@2x.png */, 61586B90217A175C0038AC45 /* menu_recordings.png */, @@ -3947,6 +3953,7 @@ 633FEE1C1D3CD5590014B822 /* chat_start_body_default~ipad.png in Resources */, 633FEE011D3CD5590014B822 /* camera_switch_over@2x.png in Resources */, 633FEEA01D3CD55A0014B822 /* numpad_0_over~ipad@2x.png in Resources */, + 66E399F72857869300E73456 /* menu_notifications_off.png in Resources */, 633FEF3E1D3CD55A0014B822 /* security_pending.png in Resources */, D381881915FE3FCA00C3EDCA /* CallView.xib in Resources */, 633FEE7E1D3CD5590014B822 /* history_missed_selected.png in Resources */, @@ -3994,6 +4001,7 @@ 633FEE911D3CD55A0014B822 /* list_details_over@2x.png in Resources */, 633FEE121D3CD5590014B822 /* chat_message_not_delivered.png in Resources */, 633FEDCE1D3CD5590014B822 /* call_quality_indicator_1.png in Resources */, + 66E399F82857869300E73456 /* menu_notifications_on.png in Resources */, 8CB2B8F91F86229E0015CEE2 /* chat_secure.png in Resources */, 633FEF4E1D3CD55A0014B822 /* valid_default.png in Resources */, 570742581D5A0691004B9C84 /* ShopView.xib in Resources */,