Skip to content
This repository has been archived by the owner on Dec 12, 2022. It is now read-only.

Commit

Permalink
Redacting membership events should immediately reset the displayname …
Browse files Browse the repository at this point in the history
…& avatar of room members.

element-hq/element-ios#443

Refresh the display of the room settings and the room member details on state event redaction
  • Loading branch information
giomfo committed Aug 12, 2016
1 parent 1b9bd99 commit 21754a0
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 31 deletions.
89 changes: 58 additions & 31 deletions MatrixKit/Controllers/MXKRoomMemberDetailsViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ @interface MXKRoomMemberDetailsViewController ()

// Observe left rooms
id leaveRoomNotificationObserver;

// Observe kMXRoomDidFlushMessagesNotification to take into account the updated room members when the room history is flushed.
id roomDidFlushMessagesNotificationObserver;
}

@end
Expand Down Expand Up @@ -459,37 +462,7 @@ - (void)initObservers
// consider only live event
if (direction == MXTimelineDirectionForwards)
{
// Hide potential action sheet
if (currentAlert)
{
[currentAlert dismiss:NO];
currentAlert = nil;
}

MXRoomMember* nextRoomMember = nil;

// get the updated memmber
NSArray* membersList = [self.mxRoom.state members];
for (MXRoomMember* member in membersList)
{
if ([member.userId isEqualToString:_mxRoomMember.userId])
{
nextRoomMember = member;
break;
}
}

// does the member still exist ?
if (nextRoomMember)
{
// Refresh member
_mxRoomMember = nextRoomMember;
[self updateMemberInfo];
}
else
{
[self withdrawViewControllerAnimated:YES completion:nil];
}
[self refreshRoomMember];
}

}];
Expand All @@ -508,6 +481,19 @@ - (void)initObservers
}
}
}];

// Observe room history flush (sync with limited timeline, or state event redaction)
roomDidFlushMessagesNotificationObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kMXRoomDidFlushMessagesNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) {

MXRoom *room = notif.object;
if (self.mainSession == room.mxSession && [mxRoom.state.roomId isEqualToString:room.state.roomId])
{
// The existing room history has been flushed during server sync.
// Take into account the updated room members list by updating the room member instance
[self refreshRoomMember];
}

}];
}

[self updateMemberInfo];
Expand All @@ -520,6 +506,12 @@ - (void)removeObservers
[[NSNotificationCenter defaultCenter] removeObserver:leaveRoomNotificationObserver];
leaveRoomNotificationObserver = nil;
}
if (roomDidFlushMessagesNotificationObserver)
{
[[NSNotificationCenter defaultCenter] removeObserver:roomDidFlushMessagesNotificationObserver];
roomDidFlushMessagesNotificationObserver = nil;
}

[[NSNotificationCenter defaultCenter] removeObserver:self];

if (membersListener && mxRoom)
Expand All @@ -529,6 +521,41 @@ - (void)removeObservers
}
}

- (void)refreshRoomMember
{
// Hide potential action sheet
if (currentAlert)
{
[currentAlert dismiss:NO];
currentAlert = nil;
}

MXRoomMember* nextRoomMember = nil;

// get the updated memmber
NSArray* membersList = [self.mxRoom.state members];
for (MXRoomMember* member in membersList)
{
if ([member.userId isEqualToString:_mxRoomMember.userId])
{
nextRoomMember = member;
break;
}
}

// does the member still exist ?
if (nextRoomMember)
{
// Refresh member
_mxRoomMember = nextRoomMember;
[self updateMemberInfo];
}
else
{
[self withdrawViewControllerAnimated:YES completion:nil];
}
}

- (void)updateMemberInfo
{
self.title = _mxRoomMember.displayname ? _mxRoomMember.displayname : _mxRoomMember.userId;
Expand Down
21 changes: 21 additions & 0 deletions MatrixKit/Controllers/MXKRoomSettingsViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ @interface MXKRoomSettingsViewController()

// Observe kMXSessionWillLeaveRoomNotification to be notified if the user leaves the current room.
id leaveRoomNotificationObserver;

// Observe kMXRoomDidFlushMessagesNotification to take into account the updated room state when the room history is flushed.
id roomDidFlushMessagesNotificationObserver;
}
@end

Expand Down Expand Up @@ -69,6 +72,12 @@ - (void)destroy
leaveRoomNotificationObserver = nil;
}

if (roomDidFlushMessagesNotificationObserver)
{
[[NSNotificationCenter defaultCenter] removeObserver:roomDidFlushMessagesNotificationObserver];
roomDidFlushMessagesNotificationObserver = nil;
}

mxRoom = nil;
mxRoomState = nil;

Expand Down Expand Up @@ -143,6 +152,18 @@ - (void)initWithSession:(MXSession*)mxSession andRoomId:(NSString*)roomId

}];

// Observe room history flush (sync with limited timeline, or state event redaction)
roomDidFlushMessagesNotificationObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kMXRoomDidFlushMessagesNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) {

MXRoom *room = notif.object;
if (self.mainSession == room.mxSession && [self.roomId isEqualToString:room.state.roomId])
{
// The existing room history has been flushed during server sync. Take into account the updated room state.
[self updateRoomState:room.state];
}

}];

[self updateRoomState:mxRoom.state];
}

Expand Down

0 comments on commit 21754a0

Please # to comment.