From 6fad67f9e3c4c864ad8e9a1cc22c0aae1261b784 Mon Sep 17 00:00:00 2001 From: Benjamin Reis Date: Mon, 13 Nov 2017 11:40:41 +0100 Subject: [PATCH] dynamically change ChatConversationInfoView when another admin changes the chat room --- Classes/ChatConversationCreateTableView.h | 1 - Classes/ChatConversationCreateTableView.m | 6 +- Classes/ChatConversationCreateView.m | 5 +- Classes/ChatConversationInfoView.h | 8 +- Classes/ChatConversationInfoView.m | 101 ++++++++++++++---- Classes/ChatConversationView.m | 11 +- Classes/DialerView.m | 4 +- Classes/LinphoneManager.m | 4 +- .../UIChatConversationInfoTableViewCell.m | 2 +- .../UIChatCreateCollectionViewCell.m | 1 - 10 files changed, 98 insertions(+), 45 deletions(-) diff --git a/Classes/ChatConversationCreateTableView.h b/Classes/ChatConversationCreateTableView.h index e83829751..0f7d1526c 100644 --- a/Classes/ChatConversationCreateTableView.h +++ b/Classes/ChatConversationCreateTableView.h @@ -13,7 +13,6 @@ @property(nonatomic) Boolean allFilter; @property(nonatomic) Boolean notFirstTime; @property(nonatomic, strong) NSMutableArray *contactsGroup; -@property(nonatomic, strong) NSMutableDictionary *contactsDict; @property (weak, nonatomic) IBOutlet UICollectionView *collectionView; @property (weak, nonatomic) IBOutlet UIIconButton *controllerNextButton; diff --git a/Classes/ChatConversationCreateTableView.m b/Classes/ChatConversationCreateTableView.m index 67e5644cf..f9b2364ae 100644 --- a/Classes/ChatConversationCreateTableView.m +++ b/Classes/ChatConversationCreateTableView.m @@ -32,7 +32,6 @@ } _contacts = [[NSMutableDictionary alloc] initWithCapacity:_allContacts.count]; _contactsGroup = [[NSMutableArray alloc] init]; - _contactsDict = [[NSMutableDictionary alloc] init]; _allFilter = TRUE; [_searchBar setText:@""]; [self searchBar:_searchBar textDidChange:_searchBar.text]; @@ -146,14 +145,13 @@ if(cell.selectedImage.hidden) { if(![_contactsGroup containsObject:cell.addressLabel.text]) { [_contactsGroup addObject:cell.addressLabel.text]; - _contactsDict[cell.addressLabel.text] = cell.displayNameLabel.text; [_collectionView registerClass:UIChatCreateCollectionViewCell.class forCellWithReuseIdentifier:cell.addressLabel.text]; } } else if([_contactsGroup containsObject:cell.addressLabel.text]) { index = (NSInteger)[_contactsGroup indexOfObject:cell.addressLabel.text]; [_contactsGroup removeObject:cell.addressLabel.text]; - if(index == _contactsGroup.count) index = index-1; - [_contactsDict removeObjectForKey:cell.addressLabel.text]; + if(index == _contactsGroup.count) + index = index-1; } cell.selectedImage.hidden = !cell.selectedImage.hidden; _controllerNextButton.enabled = (_contactsGroup.count > 0) || _isForEditing; diff --git a/Classes/ChatConversationCreateView.m b/Classes/ChatConversationCreateView.m index 1be3469b9..6ffdd4ea7 100644 --- a/Classes/ChatConversationCreateView.m +++ b/Classes/ChatConversationCreateView.m @@ -102,7 +102,7 @@ void create_chat_room_state_changed(LinphoneChatRoom *cr, LinphoneChatRoomState - (void)createChatRoom { _waitView.hidden = NO; LinphoneChatRoom *room = linphone_core_create_client_group_chat_room(LC, "dummy subject"); - NSString *addr = _tableController.contactsDict.allKeys[0]; + NSString *addr = _tableController.contactsGroup[0]; LinphoneAddress *linphoneAddress = linphone_address_new(addr.UTF8String); LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(room); linphone_chat_room_cbs_set_state_changed(cbs, create_chat_room_state_changed); @@ -115,7 +115,6 @@ void create_chat_room_state_changed(LinphoneChatRoom *cr, LinphoneChatRoomState #pragma mark - Buttons signals - (IBAction)onBackClick:(id)sender { - [_tableController.contactsDict removeAllObjects]; [_tableController.contactsGroup removeAllObjects]; [PhoneMainView.instance popToView:ChatsListView.compositeViewDescription]; } @@ -127,7 +126,7 @@ void create_chat_room_state_changed(LinphoneChatRoom *cr, LinphoneChatRoomState } ChatConversationInfoView *view = VIEW(ChatConversationInfoView); - view.contacts = _tableController.contactsDict; + view.contacts = _tableController.contactsGroup; view.create = !_isForEditing; [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; } diff --git a/Classes/ChatConversationInfoView.h b/Classes/ChatConversationInfoView.h index 5f2baa25c..8084996b6 100644 --- a/Classes/ChatConversationInfoView.h +++ b/Classes/ChatConversationInfoView.h @@ -12,13 +12,13 @@ @interface ChatConversationInfoView : UIViewController -@property(nonatomic, strong) NSMutableDictionary *contacts; -@property(nonatomic, strong) NSMutableArray *admins; @property(nonatomic) BOOL create; @property(nonatomic) BOOL imAdmin; -@property(nonatomic) NSString *oldSubject; -@property(nonatomic, strong) NSMutableDictionary *oldContacts; +@property(nonatomic, strong) NSMutableArray *contacts; +@property(nonatomic, strong) NSMutableArray *admins; +@property(nonatomic, strong) NSMutableArray *oldContacts; @property(nonatomic, strong) NSMutableArray *oldAdmins; +@property(nonatomic) NSString *oldSubject; @property(nonatomic) LinphoneChatRoom *room; @property (weak, nonatomic) IBOutlet UIIconButton *nextButton; diff --git a/Classes/ChatConversationInfoView.m b/Classes/ChatConversationInfoView.m index 9a351b921..8485f6520 100644 --- a/Classes/ChatConversationInfoView.m +++ b/Classes/ChatConversationInfoView.m @@ -52,7 +52,7 @@ static UICompositeViewDescription *compositeDescription = nil; _tableView.delegate = self; _admins = [[NSMutableArray alloc] init]; _oldAdmins = [[NSMutableArray alloc] init]; - _oldContacts = [[NSMutableDictionary alloc] init]; + _oldContacts = [[NSMutableArray alloc] init]; _room = NULL; } @@ -85,6 +85,16 @@ static UICompositeViewDescription *compositeDescription = nil; height )]; + if (_room) { + LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(_room); + linphone_chat_room_cbs_set_state_changed(cbs, chat_room_state_changed); + linphone_chat_room_cbs_set_subject_changed(cbs, chat_room_subject_changed); + linphone_chat_room_cbs_set_participant_added(cbs, chat_room_participant_added); + linphone_chat_room_cbs_set_participant_removed(cbs, chat_room_participant_removed); + linphone_chat_room_cbs_set_participant_admin_status_changed(cbs, chat_room_participant_admin_status_changed); + linphone_chat_room_cbs_set_user_data(cbs, (__bridge void*)self); + } + [_tableView reloadData]; } @@ -100,7 +110,7 @@ static UICompositeViewDescription *compositeDescription = nil; linphone_chat_room_cbs_set_state_changed(cbs, chat_room_state_changed); linphone_chat_room_cbs_set_user_data(cbs, (__bridge void*)self); bctbx_list_t *addresses = NULL; - for(NSString *addr in _contacts.allKeys) { + for(NSString *addr in _contacts) { LinphoneAddress *linphoneAddress = linphone_address_new(addr.UTF8String); if (!linphoneAddress) continue; @@ -123,8 +133,8 @@ static UICompositeViewDescription *compositeDescription = nil; // Add participants if necessary bctbx_list_t *addedPartipants = NULL; - for (NSString *uri in _contacts.allKeys) { - if ([_oldContacts objectForKey:uri]) + for (NSString *uri in _contacts) { + if ([_oldContacts containsObject:uri]) continue; LinphoneAddress *addr = linphone_address_new(uri.UTF8String); @@ -141,8 +151,8 @@ static UICompositeViewDescription *compositeDescription = nil; // Remove participants if necessary bctbx_list_t *removedPartipants = NULL; - for (NSString *uri in _oldContacts.allKeys) { - if ([_contacts objectForKey:uri]) + for (NSString *uri in _oldContacts) { + if ([_contacts containsObject:uri]) continue; LinphoneAddress *addr = linphone_address_new(uri.UTF8String); @@ -204,8 +214,7 @@ static UICompositeViewDescription *compositeDescription = nil; - (IBAction)onBackClick:(id)sender { if(_create) { ChatConversationCreateView *view = VIEW(ChatConversationCreateView); - view.tableController.contactsDict = _contacts; - view.tableController.contactsGroup = [[_contacts allKeys] mutableCopy]; + view.tableController.contactsGroup = [_contacts mutableCopy]; view.tableController.notFirstTime = TRUE; view.isForEditing = FALSE; [PhoneMainView.instance popToView:view.compositeViewDescription]; @@ -216,9 +225,6 @@ static UICompositeViewDescription *compositeDescription = nil; } - (IBAction)onQuitClick:(id)sender { - LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(_room); - linphone_chat_room_cbs_set_user_data(cbs, (__bridge void*)self); - linphone_chat_room_cbs_set_state_changed(cbs, chat_room_state_changed); linphone_chat_room_leave(_room); } @@ -226,8 +232,7 @@ static UICompositeViewDescription *compositeDescription = nil; ChatConversationCreateView *view = VIEW(ChatConversationCreateView); view.tableController.notFirstTime = TRUE; view.isForEditing = !_create; - view.tableController.contactsDict = _contacts; - view.tableController.contactsGroup = [[_contacts allKeys] mutableCopy]; + view.tableController.contactsGroup = [_contacts mutableCopy]; [PhoneMainView.instance popToView:view.compositeViewDescription]; } @@ -247,7 +252,7 @@ static UICompositeViewDescription *compositeDescription = nil; if (cell == nil) { cell = [[UIChatConversationInfoTableViewCell alloc] initWithIdentifier:kCellId]; } - cell.uri = _contacts.allKeys[indexPath.row]; + cell.uri = _contacts[indexPath.row]; LinphoneAddress *addr = linphone_address_new(cell.uri.UTF8String); cell.nameLabel.text = [FastAddressBook displayNameForAddress:addr]; [cell.avatarImage setImage:[FastAddressBook imageForAddress:addr] bordered:YES withRoundedRadius:YES]; @@ -256,11 +261,10 @@ static UICompositeViewDescription *compositeDescription = nil; cell.adminLabel.enabled = FALSE; cell.adminImage.image = [UIImage imageNamed:@"check_unselected.png"]; } - cell.adminButton.hidden = _create; // (linphone_chat_room_find_participant(_room, addr) == NULL) ? - linphone_address_unref(addr); - - cell.adminButton.hidden = !_imAdmin; + cell.adminButton.hidden = _create || (!_imAdmin && !cell.adminLabel.enabled); + cell.adminButton.userInteractionEnabled = _imAdmin; cell.removeButton.hidden = !_create && !_imAdmin; + linphone_address_unref(addr); return cell; } @@ -290,6 +294,25 @@ static UICompositeViewDescription *compositeDescription = nil; [PhoneMainView.instance changeCurrentView:view.compositeViewDescription]; } +- (void)myAdminStatusChanged:(BOOL)admin { + NSString *message = admin + ? NSLocalizedString(@"You are now an admin of the chat room", nil) + : NSLocalizedString(@"You are no longer an admin of the chat room", nil); + + static UIAlertController *alertView; + // avoid having multiple popups + [PhoneMainView.instance dismissViewControllerAnimated:YES completion:nil]; + alertView = [UIAlertController alertControllerWithTitle:[NSString stringWithFormat:@"%@", message] + message:nil + preferredStyle:UIAlertControllerStyleAlert]; + + UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) + style:UIAlertActionStyleDefault + handler:^(UIAlertAction * action) {}]; + [alertView addAction:defaultAction]; + [PhoneMainView.instance presentViewController:alertView animated:YES completion:nil]; +} + void chat_room_state_changed(LinphoneChatRoom *cr, LinphoneChatRoomState newState) { ChatConversationInfoView *view = (__bridge ChatConversationInfoView *)linphone_chat_room_cbs_get_user_data(linphone_chat_room_get_callbacks(cr)); switch (newState) { @@ -310,4 +333,46 @@ void chat_room_state_changed(LinphoneChatRoom *cr, LinphoneChatRoomState newStat } } +void chat_room_subject_changed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { + ChatConversationInfoView *view = (__bridge ChatConversationInfoView *)linphone_chat_room_cbs_get_user_data(linphone_chat_room_get_callbacks(cr)); + view.nameLabel.text = [NSString stringWithUTF8String:linphone_event_log_get_subject(event_log)]; +} + +void chat_room_participant_added(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { + ChatConversationInfoView *view = (__bridge ChatConversationInfoView *)linphone_chat_room_cbs_get_user_data(linphone_chat_room_get_callbacks(cr)); + NSString *participantAddress = [NSString stringWithUTF8String:linphone_address_as_string(linphone_event_log_get_participant_address(event_log))]; + [view.oldContacts addObject:participantAddress]; + [view.contacts addObject:participantAddress]; + [view.tableView reloadData]; +} + +void chat_room_participant_removed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { + ChatConversationInfoView *view = (__bridge ChatConversationInfoView *)linphone_chat_room_cbs_get_user_data(linphone_chat_room_get_callbacks(cr)); + NSString *participantAddress = [NSString stringWithUTF8String:linphone_address_as_string(linphone_event_log_get_participant_address(event_log))]; + [view.oldContacts removeObject:participantAddress]; + [view.contacts removeObject:participantAddress]; + [view.tableView reloadData]; +} + +void chat_room_participant_admin_status_changed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { + ChatConversationInfoView *view = (__bridge ChatConversationInfoView *)linphone_chat_room_cbs_get_user_data(linphone_chat_room_get_callbacks(cr)); + NSString *participantAddress = [NSString stringWithUTF8String:linphone_address_as_string(linphone_event_log_get_participant_address(event_log))]; + + LinphoneParticipant *me = linphone_chat_room_get_me(cr); + if (me && linphone_address_equal(linphone_participant_get_address(me), linphone_event_log_get_participant_address(event_log))) { + [view myAdminStatusChanged:(linphone_event_log_get_type(event_log) == LinphoneEventLogTypeConferenceParticipantSetAdmin)]; + [view viewWillAppear:TRUE]; + return; + } + + if (linphone_event_log_get_type(event_log) == LinphoneEventLogTypeConferenceParticipantSetAdmin) { + [view.admins addObject:participantAddress]; + [view.oldAdmins addObject:participantAddress]; + } else { // linphone_event_log_get_type(event_log) == LinphoneEventLogTypeConferenceParticipantUnsetAdmin + [view.admins removeObject:participantAddress]; + [view.oldAdmins removeObject:participantAddress]; + } + [view.tableView reloadData]; +} + @end diff --git a/Classes/ChatConversationView.m b/Classes/ChatConversationView.m index 47d75105e..dd93fd634 100644 --- a/Classes/ChatConversationView.m +++ b/Classes/ChatConversationView.m @@ -517,16 +517,13 @@ static UICompositeViewDescription *compositeDescription = nil; } - (IBAction)onInfoClick:(id)sender { - NSMutableDictionary *contactsDict = [[NSMutableDictionary alloc] init]; + NSMutableArray *contactsArray = [[NSMutableArray alloc] init]; NSMutableArray *admins = [[NSMutableArray alloc] init]; bctbx_list_t *participants = linphone_chat_room_get_participants(_chatRoom); while (participants) { LinphoneParticipant *participant = (LinphoneParticipant *)participants->data; - NSString *name = [NSString stringWithUTF8String:linphone_address_get_display_name(linphone_participant_get_address(participant)) - ? linphone_address_get_display_name(linphone_participant_get_address(participant)) - : linphone_address_get_username(linphone_participant_get_address(participant))]; NSString *uri = [NSString stringWithUTF8String:linphone_address_as_string_uri_only(linphone_participant_get_address(participant))]; - [contactsDict setObject:name forKey:uri]; + [contactsArray addObject:uri]; if(linphone_participant_is_admin(participant)) [admins addObject:uri]; @@ -534,8 +531,8 @@ static UICompositeViewDescription *compositeDescription = nil; } ChatConversationInfoView *view = VIEW(ChatConversationInfoView); view.create = FALSE; - view.contacts = [contactsDict mutableCopy]; - view.oldContacts = [contactsDict mutableCopy]; + view.contacts = [contactsArray mutableCopy]; + view.oldContacts = [contactsArray mutableCopy]; view.admins = [admins mutableCopy]; view.oldAdmins = [admins mutableCopy]; view.oldSubject = [NSString stringWithUTF8String:linphone_chat_room_get_subject(_chatRoom)]; diff --git a/Classes/DialerView.m b/Classes/DialerView.m index a22ea7415..ee8d57048 100644 --- a/Classes/DialerView.m +++ b/Classes/DialerView.m @@ -383,9 +383,7 @@ static UICompositeViewDescription *compositeDescription = nil; - (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error { - [controller dismissViewControllerAnimated:TRUE - completion:^{ - }]; + [controller dismissViewControllerAnimated:TRUE completion:nil]; [self.navigationController setNavigationBarHidden:TRUE animated:FALSE]; } diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m index b17478c0b..52e96fb75 100644 --- a/Classes/LinphoneManager.m +++ b/Classes/LinphoneManager.m @@ -1011,9 +1011,7 @@ static void linphone_iphone_popup_password_request(LinphoneCore *lc, LinphoneAut static UIAlertController *alertView = nil; // avoid having multiple popups - if ([alertView isBeingPresented]) { - [alertView dismissViewControllerAnimated:YES completion:nil]; - } + [PhoneMainView.instance dismissViewControllerAnimated:YES completion:nil]; // dont pop up if we are in background, in any case we will refresh registers when entering // the application again diff --git a/Classes/LinphoneUI/UIChatConversationInfoTableViewCell.m b/Classes/LinphoneUI/UIChatConversationInfoTableViewCell.m index 20120fc6c..8a09e7188 100644 --- a/Classes/LinphoneUI/UIChatConversationInfoTableViewCell.m +++ b/Classes/LinphoneUI/UIChatConversationInfoTableViewCell.m @@ -36,7 +36,7 @@ } - (IBAction)onDelete:(id)sender { - [_controllerView.contacts removeObjectForKey:_uri]; + [_controllerView.contacts removeObject:_uri]; if ([_controllerView.admins containsObject:_uri]) [_controllerView.admins removeObject:_uri]; diff --git a/Classes/LinphoneUI/UIChatCreateCollectionViewCell.m b/Classes/LinphoneUI/UIChatCreateCollectionViewCell.m index 40d720162..868dad471 100644 --- a/Classes/LinphoneUI/UIChatCreateCollectionViewCell.m +++ b/Classes/LinphoneUI/UIChatCreateCollectionViewCell.m @@ -32,7 +32,6 @@ - (void) onDelete { [_controller.tableController.contactsGroup removeObject:_uri]; - [_controller.tableController.contactsDict removeObjectForKey:_uri]; if (_controller.tableController.contactsGroup.count == 0) { [UIView animateWithDuration:0.2 delay:0