chat: refresh iPad fragments when needed

This commit is contained in:
Gautier Pelloux-Prayer 2016-02-03 11:24:19 +01:00
parent ee8ecb4117
commit 215a86c9ca
7 changed files with 48 additions and 40 deletions

View file

@ -95,6 +95,11 @@
[view setChatRoom:room];
[PhoneMainView.instance popCurrentView];
[PhoneMainView.instance changeCurrentView:view.compositeViewDescription];
// refresh list of chatrooms if we are using fragment
if (IPAD) {
ChatsListView *listView = VIEW(ChatsListView);
[listView.tableController loadData];
}
}
}

View file

@ -32,16 +32,15 @@
@interface ChatConversationTableView : UICheckBoxTableView {
@private
LinphoneChatRoom *chatRoom;
MSList *messageList;
}
@property(nonatomic) LinphoneChatRoom *chatRoom;
@property(nonatomic, strong) id<ChatConversationDelegate> chatRoomDelegate;
- (void)addChatEntry:(LinphoneChatMessage *)chat;
- (void)scrollToBottom:(BOOL)animated;
- (void)scrollToLastUnread:(BOOL)animated;
- (void)updateChatEntry:(LinphoneChatMessage *)chat;
- (void)setChatRoom:(LinphoneChatRoom *)room;
@end

View file

@ -45,16 +45,16 @@
}
- (void)updateData {
if (!chatRoom)
if (!_chatRoom)
return;
[self clearMessageList];
messageList = linphone_chat_room_get_history(chatRoom, 0);
messageList = linphone_chat_room_get_history(_chatRoom, 0);
// also append transient upload messages because they are not in history yet!
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);
const LinphoneAddress *peer = linphone_chat_room_get_peer_address(_chatRoom);
if (linphone_address_equal(ftd_peer, peer) && linphone_chat_message_is_outgoing(ftd.message)) {
LOGI(@"Appending transient upload message %p", ftd.message);
messageList = ms_list_append(messageList, linphone_chat_message_ref(ftd.message));
@ -109,7 +109,7 @@
}
- (void)scrollToLastUnread:(BOOL)animated {
if (messageList == nil || chatRoom == nil) {
if (messageList == nil || _chatRoom == nil) {
return;
}
@ -127,7 +127,7 @@
index = count - 1;
}
linphone_chat_room_mark_as_read(chatRoom);
linphone_chat_room_mark_as_read(_chatRoom);
TabBarView *tab = (TabBarView *)[PhoneMainView.instance.mainViewController
getCachedController:NSStringFromClass(TabBarView.class)];
[tab update:YES];
@ -144,7 +144,7 @@
#pragma mark - Property Functions
- (void)setChatRoom:(LinphoneChatRoom *)room {
chatRoom = room;
_chatRoom = room;
[self reloadData];
}
@ -197,7 +197,7 @@
if (editingStyle == UITableViewCellEditingStyleDelete) {
[tableView beginUpdates];
LinphoneChatMessage *chat = ms_list_nth_data(messageList, (int)[indexPath row]);
linphone_chat_room_delete_message(chatRoom, chat);
linphone_chat_room_delete_message(_chatRoom, chat);
messageList = ms_list_remove(messageList, chat);
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
@ -209,7 +209,7 @@
- (void)removeSelectionUsing:(void (^)(NSIndexPath *))remover {
[super removeSelectionUsing:^(NSIndexPath *indexPath) {
LinphoneChatMessage *chat = ms_list_nth_data(messageList, (int)[indexPath row]);
linphone_chat_room_delete_message(chatRoom, chat);
linphone_chat_room_delete_message(_chatRoom, chat);
messageList = ms_list_remove(messageList, chat);
}];
}

View file

@ -33,12 +33,13 @@
@interface ChatConversationView
: TPMultiLayoutViewController <HPGrowingTextViewDelegate, UICompositeViewDelegate, ImagePickerDelegate,
ChatConversationDelegate, UISearchBarDelegate> {
LinphoneChatRoom *chatRoom;
OrderedDictionary *imageQualities;
BOOL scrollOnGrowingEnabled;
BOOL composingVisible;
}
@property(nonatomic) LinphoneChatRoom *chatRoom;
@property(weak, nonatomic) IBOutlet UIIconButton *backButton;
@property(nonatomic, strong) IBOutlet ChatConversationTableView *tableController;
@property(weak, nonatomic) IBOutlet HPGrowingTextView *messageField;
@ -65,6 +66,4 @@
- (IBAction)onDeleteClick:(id)sender;
- (IBAction)onEditionChangeClick:(id)sender;
- (void)setChatRoom:(LinphoneChatRoom *)room;
@end

View file

@ -31,7 +31,7 @@
self = [super initWithNibName:NSStringFromClass(self.class) bundle:[NSBundle mainBundle]];
if (self != nil) {
scrollOnGrowingEnabled = TRUE;
chatRoom = NULL;
_chatRoom = NULL;
imageQualities = [[OrderedDictionary alloc]
initWithObjectsAndKeys:[NSNumber numberWithFloat:0.9], NSLocalizedString(@"Maximum", nil),
[NSNumber numberWithFloat:0.5], NSLocalizedString(@"Average", nil),
@ -152,16 +152,16 @@ static UICompositeViewDescription *compositeDescription = nil;
#pragma mark -
- (void)setChatRoom:(LinphoneChatRoom *)room {
chatRoom = room;
- (void)setChatRoom:(LinphoneChatRoom *)chatRoom {
_chatRoom = chatRoom;
[_messageField setText:@""];
[_tableController setChatRoom:room];
[_tableController setChatRoom:_chatRoom];
if (chatRoom != NULL) {
if (_chatRoom != NULL) {
_chatView.hidden = NO;
[self update];
linphone_chat_room_mark_as_read(chatRoom);
[self setComposingVisible:linphone_chat_room_is_remote_composing(chatRoom) withDelay:0];
linphone_chat_room_mark_as_read(_chatRoom);
[self setComposingVisible:linphone_chat_room_is_remote_composing(_chatRoom) withDelay:0];
TabBarView *tab = (TabBarView *)[PhoneMainView.instance.mainViewController
getCachedController:NSStringFromClass(TabBarView.class)];
[tab update:YES];
@ -172,8 +172,8 @@ static UICompositeViewDescription *compositeDescription = nil;
}
- (void)applicationWillEnterForeground:(NSNotification *)notif {
if (chatRoom != nil) {
linphone_chat_room_mark_as_read(chatRoom);
if (_chatRoom != nil) {
linphone_chat_room_mark_as_read(_chatRoom);
TabBarView *tab = (TabBarView *)[PhoneMainView.instance.mainViewController
getCachedController:NSStringFromClass(TabBarView.class)];
[tab update:YES];
@ -186,12 +186,12 @@ static UICompositeViewDescription *compositeDescription = nil;
}
- (void)update {
if (chatRoom == NULL) {
if (_chatRoom == NULL) {
LOGW(@"Cannot update chat room header: null contact");
return;
}
const LinphoneAddress *addr = linphone_chat_room_get_peer_address(chatRoom);
const LinphoneAddress *addr = linphone_chat_room_get_peer_address(_chatRoom);
if (addr == NULL) {
[PhoneMainView.instance popCurrentView];
UIAlertView *error = [[UIAlertView alloc]
@ -211,12 +211,12 @@ static UICompositeViewDescription *compositeDescription = nil;
}
- (BOOL)sendMessage:(NSString *)message withExterlBodyUrl:(NSURL *)externalUrl withInternalURL:(NSURL *)internalUrl {
if (chatRoom == NULL) {
if (_chatRoom == NULL) {
LOGW(@"Cannot send message: No chatroom");
return FALSE;
}
LinphoneChatMessage *msg = linphone_chat_room_create_message(chatRoom, [message UTF8String]);
LinphoneChatMessage *msg = linphone_chat_room_create_message(_chatRoom, [message UTF8String]);
if (externalUrl) {
linphone_chat_message_set_external_body_url(msg, [[externalUrl absoluteString] UTF8String]);
}
@ -226,7 +226,7 @@ static UICompositeViewDescription *compositeDescription = nil;
[LinphoneManager setValueInMessageAppData:[internalUrl absoluteString] forKey:@"localimage" inMessage:msg];
}
linphone_chat_room_send_chat_message(chatRoom, msg);
linphone_chat_room_send_chat_message(_chatRoom, msg);
[_tableController addChatEntry:msg];
[_tableController scrollToBottom:true];
@ -322,7 +322,7 @@ static UICompositeViewDescription *compositeDescription = nil;
}
char *fromStr = linphone_address_as_string_uri_only(from);
const LinphoneAddress *cr_from = linphone_chat_room_get_peer_address(chatRoom);
const LinphoneAddress *cr_from = linphone_chat_room_get_peer_address(_chatRoom);
char *cr_from_string = linphone_address_as_string_uri_only(cr_from);
if (fromStr && cr_from_string) {
@ -341,7 +341,7 @@ static UICompositeViewDescription *compositeDescription = nil;
- (void)textComposeEvent:(NSNotification *)notif {
LinphoneChatRoom *room = [[[notif userInfo] objectForKey:@"room"] pointerValue];
if (room && room == chatRoom) {
if (room && room == _chatRoom) {
BOOL composing = linphone_chat_room_is_remote_composing(room);
[self setComposingVisible:composing withDelay:0.3];
}
@ -363,8 +363,8 @@ static UICompositeViewDescription *compositeDescription = nil;
}
- (void)growingTextChanged:(HPGrowingTextView *)growingTextView text:(NSString *)text {
if ([text length] > 0 && chatRoom)
linphone_chat_room_compose(chatRoom);
if ([text length] > 0 && _chatRoom)
linphone_chat_room_compose(_chatRoom);
}
- (void)growingTextView:(HPGrowingTextView *)growingTextView willChangeHeight:(float)height {
@ -426,7 +426,7 @@ static UICompositeViewDescription *compositeDescription = nil;
- (void)textViewDidChange:(UITextView *)textView {
if ([textView.text length] > 0) {
linphone_chat_room_compose(chatRoom);
linphone_chat_room_compose(_chatRoom);
}
}
@ -515,7 +515,7 @@ static UICompositeViewDescription *compositeDescription = nil;
}
- (IBAction)onCallClick:(id)sender {
[LinphoneManager.instance call:linphone_chat_room_get_peer_address(chatRoom)];
[LinphoneManager.instance call:linphone_chat_room_get_peer_address(_chatRoom)];
}
- (IBAction)onListSwipe:(id)sender {
@ -539,7 +539,7 @@ static UICompositeViewDescription *compositeDescription = nil;
- (BOOL)startImageUpload:(UIImage *)image url:(NSURL *)url {
FileTransferDelegate *fileTransfer = [[FileTransferDelegate alloc] init];
[fileTransfer upload:image withURL:url forChatRoom:chatRoom];
[fileTransfer upload:image withURL:url forChatRoom:_chatRoom];
[_tableController addChatEntry:linphone_chat_message_ref(fileTransfer.message)];
[_tableController scrollToBottom:true];
return TRUE;

View file

@ -119,11 +119,16 @@ static void chatTable_free_chatrooms(void *data) {
[super loadData];
if (IPAD) {
// reset conversation view since in fragment mode, conversations are relative to current data
// select first conversation if any
// if conversation view is using a chatroom that does not exist anymore, update it
if (data != NULL) {
ChatConversationView *view = VIEW(ChatConversationView);
[view setChatRoom:(LinphoneChatRoom *)ms_list_nth_data(data, 0)];
LinphoneChatRoom *current = [view chatRoom];
// cannot find it anymore: replace it with the first one
if (ms_list_find(data, current) == NULL) {
[view setChatRoom:(LinphoneChatRoom *)ms_list_nth_data(data, 0)];
}
} else {
[PhoneMainView.instance changeCurrentView:ChatConversationCreateView.compositeViewDescription];
}
}
}

View file

@ -144,13 +144,13 @@ static int ms_strcmpfuz(const char *fuzzy_word, const char *sentence) {
}
}
[super loadData];
if (IPAD) {
// reset details view since in fragment mode, details are relative to current data
// select first contact if any
// if contact details view is using a contact that does not exist anymore, update it
ContactDetailsView *view = VIEW(ContactDetailsView);
ABRecordRef contact = ([self totalNumberOfItems] > 0)
? [self contactForIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]
: nil;
ContactDetailsView *view = VIEW(ContactDetailsView);
[view setContact:contact];
}
}