SYIOS-30 - iOS needs typing notifs like the web client

We highlight here the avatar of the user who's typing
This commit is contained in:
giomfo
2015-01-13 18:32:52 +01:00
parent 4247348619
commit 8072956eed
6 changed files with 48 additions and 7 deletions
@@ -62,6 +62,8 @@ NSString *const kCmdResetUserPowerLevel = @"/deop";
// Typing notification
NSDate *lastTypingDate;
NSTimer* typingTimer;
id typingNotifListener;
NSArray *typingUsers;
// Back pagination
BOOL isBackPaginationInProgress;
@@ -154,6 +156,11 @@ NSString *const kCmdResetUserPowerLevel = @"/deop";
lastTypingDate = nil;
[typingTimer invalidate];
typingTimer = nil;
if (typingNotifListener) {
[self.mxRoom removeListener:typingNotifListener];
typingNotifListener = nil;
}
typingUsers = nil;
// Release local echo resources
pendingOutgoingEvents = nil;
@@ -390,12 +397,18 @@ NSString *const kCmdResetUserPowerLevel = @"/deop";
return;
}
// Remove potential listener
if (messagesListener && self.mxRoom) {
[self.mxRoom removeListener:messagesListener];
messagesListener = nil;
[[AppSettings sharedSettings] removeObserver:self forKeyPath:@"hideUnsupportedMessages"];
[[MatrixHandler sharedHandler] removeObserver:self forKeyPath:@"isResumeDone"];
if (self.mxRoom) {
// Remove potential listener
if (messagesListener){
[self.mxRoom removeListener:messagesListener];
messagesListener = nil;
[[AppSettings sharedSettings] removeObserver:self forKeyPath:@"hideUnsupportedMessages"];
[[MatrixHandler sharedHandler] removeObserver:self forKeyPath:@"isResumeDone"];
}
typingUsers = nil;
if (typingNotifListener) {
[self.mxRoom removeListener:typingNotifListener];
}
}
// The whole room history is flushed here to rebuild it from the current instant (live)
messages = nil;
@@ -565,6 +578,18 @@ NSString *const kCmdResetUserPowerLevel = @"/deop";
}
}];
// Add typing notification listener
typingNotifListener = [self.mxRoom listenToEventsOfTypes:@[kMXEventTypeStringTypingNotification] onEvent:^(MXEvent *event, MXEventDirection direction, MXRoomState *roomState) {
// Handle only live events
if (direction == MXEventDirectionForwards) {
// Refresh typing users list
typingUsers = self.mxRoom.typingUsers;
// Refresh tableView
[self.messagesTableView reloadData];
}
}];
typingUsers = self.mxRoom.typingUsers;
// Trigger a back pagination by reseting first backState to get room history from live
[self.mxRoom resetBackState];
[self triggerBackPagination];
@@ -1534,6 +1559,8 @@ NSString *const kCmdResetUserPowerLevel = @"/deop";
// Display user's display name except if the name appears in the displayed text (see emote and membership event)
incomingMsgCell.userNameLabel.hidden = (shouldHideSenderInfo || message.startsWithSenderName);
incomingMsgCell.userNameLabel.text = message.senderName;
// Set typing badge visibility
incomingMsgCell.typingBadge.hidden = (cell.pictureView.hidden || ([typingUsers indexOfObject:message.senderId] == NSNotFound));
} else {
// Add unsent label for failed components
CGFloat yPosition = (message.messageType == RoomMessageTypeText) ? ROOM_MESSAGE_TEXTVIEW_MARGIN : -ROOM_MESSAGE_TEXTVIEW_MARGIN;