diff --git a/Riot/Modules/Room/RoomViewController.m b/Riot/Modules/Room/RoomViewController.m index bf7067533..c9869aec8 100644 --- a/Riot/Modules/Room/RoomViewController.m +++ b/Riot/Modules/Room/RoomViewController.m @@ -931,9 +931,9 @@ Class roomInputToolbarViewClass = RoomInputToolbarView.class; // Check the user has enough power to post message - if (self.roomDataSource.room.state) + if (self.roomDataSource.roomState) { - MXRoomPowerLevels *powerLevels = self.roomDataSource.room.state.powerLevels; + MXRoomPowerLevels *powerLevels = self.roomDataSource.roomState.powerLevels; NSInteger userPowerLevel = [powerLevels powerLevelOfUserWithUserID:self.mainSession.myUser.userId]; BOOL canSend = (userPowerLevel >= [powerLevels minimumPowerLevelForSendingEventAsMessage:kMXEventTypeStringRoomMessage]); @@ -1894,7 +1894,7 @@ { if ([actionIdentifier isEqualToString:kMXKRoomBubbleCellTapOnAvatarView]) { - selectedRoomMember = [self.roomDataSource.room.state.members memberWithUserId:userInfo[kMXKRoomBubbleCellUserIdKey]]; + selectedRoomMember = [self.roomDataSource.roomState.members memberWithUserId:userInfo[kMXKRoomBubbleCellUserIdKey]]; if (selectedRoomMember) { [self performSegueWithIdentifier:@"showMemberDetails" sender:self]; @@ -1903,7 +1903,7 @@ else if ([actionIdentifier isEqualToString:kMXKRoomBubbleCellLongPressOnAvatarView]) { // Add the member display name in text input - MXRoomMember *roomMember = [self.roomDataSource.room.state.members memberWithUserId:userInfo[kMXKRoomBubbleCellUserIdKey]]; + MXRoomMember *roomMember = [self.roomDataSource.roomState.members memberWithUserId:userInfo[kMXKRoomBubbleCellUserIdKey]]; if (roomMember) { [self mention:roomMember]; @@ -2656,7 +2656,7 @@ NSString *userId = absoluteURLString; - MXRoomMember* member = [self.roomDataSource.room.state.members memberWithUserId:userId]; + MXRoomMember* member = [self.roomDataSource.roomState.members memberWithUserId:userId]; if (member) { // Use the room member detail VC for room members @@ -2765,7 +2765,11 @@ // Files tab [titles addObject: NSLocalizedStringFromTable(@"room_details_files", @"Vector", nil)]; RoomFilesViewController *roomFilesViewController = [RoomFilesViewController roomViewController]; - MXKRoomDataSource *roomFilesDataSource = [[MXKRoomDataSource alloc] initWithRoomId:roomId andMatrixSession:session]; + // @TODO (async-state): This call should be synchronous. Every thing will be fine + __block MXKRoomDataSource *roomFilesDataSource; + [MXKRoomDataSource loadRoomDataSourceWithRoomId:roomId andMatrixSession:session onComplete:^(id roomDataSource) { + roomFilesDataSource = roomDataSource; + }]; roomFilesDataSource.filterMessagesWithURL = YES; [roomFilesDataSource finalizeInitialization]; // Give the data source ownership to the room files view controller. @@ -2858,25 +2862,18 @@ contactsDataSource.contactCellAccessoryImage = [UIImage imageNamed:@"plus_icon"]; // List all the participants matrix user id to ignore them during the contacts search. - MXSession* session = self.roomDataSource.mxSession; - NSString* roomId = self.roomDataSource.roomId; - MXRoom *room = [session roomWithRoomId:roomId]; - if (room) + NSArray *members = [self.roomDataSource.roomState.members membersWithoutConferenceUser]; + for (MXRoomMember *mxMember in members) { - NSArray *members = [room.state.members membersWithoutConferenceUser]; - - for (MXRoomMember *mxMember in members) + // Check his status + if (mxMember.membership == MXMembershipJoin || mxMember.membership == MXMembershipInvite) { - // Check his status - if (mxMember.membership == MXMembershipJoin || mxMember.membership == MXMembershipInvite) - { - // Create the contact related to this member - MXKContact *contact = [[MXKContact alloc] initMatrixContactWithDisplayName:mxMember.displayname andMatrixID:mxMember.userId]; - [contactsDataSource.ignoredContactsByMatrixId setObject:contact forKey:mxMember.userId]; - } + // Create the contact related to this member + MXKContact *contact = [[MXKContact alloc] initMatrixContactWithDisplayName:mxMember.displayname andMatrixID:mxMember.userId]; + [contactsDataSource.ignoredContactsByMatrixId setObject:contact forKey:mxMember.userId]; } } - + [contactsPickerViewController showSearch:YES]; contactsPickerViewController.searchBar.placeholder = NSLocalizedStringFromTable(@"room_participants_invite_another_user", @"Vector", nil); @@ -3067,7 +3064,7 @@ // In case of conference call, check that the user has enough power level else if (self.roomDataSource.room.summary.membersCount.joined > 2 && - ![MXCallManager canPlaceConferenceCallInRoom:self.roomDataSource.room]) + ![MXCallManager canPlaceConferenceCallInRoom:self.roomDataSource.room roomState:self.roomDataSource.roomState]) { [currentAlert dismissViewControllerAnimated:NO completion:nil]; @@ -3195,18 +3192,19 @@ [self showExpandedHeader:NO]; // Dismiss potential keyboard. [self dismissKeyboard]; - - MXKRoomDataSource *roomDataSource; + // Jump to the last unread event by using a temporary room data source initialized with the last unread event id. - roomDataSource = [[RoomDataSource alloc] initWithRoomId:self.roomDataSource.roomId initialEventId:self.roomDataSource.room.accountData.readMarkerEventId andMatrixSession:self.mainSession]; - [roomDataSource finalizeInitialization]; - - // Center the bubbles table content on the bottom of the read marker event in order to display correctly the read marker view. - self.centerBubblesTableViewContentOnTheInitialEventBottom = YES; - [self displayRoom:roomDataSource]; - - // Give the data source ownership to the room view controller. - self.hasRoomDataSourceOwnership = YES; + [RoomDataSource loadRoomDataSourceWithRoomId:self.roomDataSource.roomId initialEventId:self.roomDataSource.room.accountData.readMarkerEventId andMatrixSession:self.mainSession onComplete:^(id roomDataSource) { + + [roomDataSource finalizeInitialization]; + + // Center the bubbles table content on the bottom of the read marker event in order to display correctly the read marker view. + self.centerBubblesTableViewContentOnTheInitialEventBottom = YES; + [self displayRoom:roomDataSource]; + + // Give the data source ownership to the room view controller. + self.hasRoomDataSourceOwnership = YES; + }]; } else if (sender == self.resetReadMarkerButton) { @@ -3474,13 +3472,15 @@ // If an event was specified, replace the datasource by a non live datasource showing the event if (eventId) { - RoomDataSource *roomDataSource = [[RoomDataSource alloc] initWithRoomId:self.roomDataSource.roomId initialEventId:eventId andMatrixSession:self.mainSession]; - [roomDataSource finalizeInitialization]; - roomDataSource.markTimelineInitialEvent = YES; - - [self displayRoom:roomDataSource]; - - self.hasRoomDataSourceOwnership = YES; + [RoomDataSource loadRoomDataSourceWithRoomId:self.roomDataSource.roomId initialEventId:eventId andMatrixSession:self.mainSession onComplete:^(id roomDataSource) { + + [roomDataSource finalizeInitialization]; + ((RoomDataSource*)roomDataSource).markTimelineInitialEvent = YES; + + [self displayRoom:roomDataSource]; + + self.hasRoomDataSourceOwnership = YES; + }]; } else { @@ -3630,7 +3630,7 @@ { NSString* name = [currentTypingUsers objectAtIndex:i]; - MXRoomMember* member = [self.roomDataSource.room.state.members memberWithUserId:name]; + MXRoomMember* member = [self.roomDataSource.roomState.members memberWithUserId:name]; if (member && member.displayname.length) { @@ -3763,7 +3763,8 @@ - (NSUInteger)widgetsCount:(BOOL)includeUserWidgets { NSUInteger widgetsCount = [[WidgetManager sharedManager] widgetsNotOfTypes:@[kWidgetTypeJitsi] - inRoom:self.roomDataSource.room].count; + inRoom:self.roomDataSource.room + withRoomState:self.roomDataSource.roomState].count; if (includeUserWidgets) { widgetsCount += [[WidgetManager sharedManager] userWidgets:self.roomDataSource.room.mxSession].count; @@ -3792,7 +3793,7 @@ { [roomActivitiesView displayNetworkErrorNotification:NSLocalizedStringFromTable(@"room_offline_notification", @"Vector", nil)]; } - else if (customizedRoomDataSource.room.state.isOngoingConferenceCall) + else if (customizedRoomDataSource.roomState.isOngoingConferenceCall) { // Show the "Ongoing conference call" banner only if the user is not in the conference MXCall *callInRoom = [self.roomDataSource.mxSession.callManager callInRoom:self.roomDataSource.roomId]; @@ -3937,24 +3938,26 @@ { // Switch back to the room live timeline managed by MXKRoomDataSourceManager MXKRoomDataSourceManager *roomDataSourceManager = [MXKRoomDataSourceManager sharedManagerForMatrixSession:self.mainSession]; - MXKRoomDataSource *roomDataSource = [roomDataSourceManager roomDataSourceForRoom:self.roomDataSource.roomId create:YES]; - - // Scroll to bottom the bubble history on the display refresh. - shouldScrollToBottomOnTableRefresh = YES; - - [self displayRoom:roomDataSource]; - - // The room view controller do not have here the data source ownership. - self.hasRoomDataSourceOwnership = NO; - - [self refreshActivitiesViewDisplay]; - [self refreshJumpToLastUnreadBannerDisplay]; - - if (self.saveProgressTextInput) - { - // Restore the potential message partially typed before jump to last unread messages. - self.inputToolbarView.textMessage = roomDataSource.partialTextMessage; - } + + [roomDataSourceManager roomDataSourceForRoom:self.roomDataSource.roomId create:YES onComplete:^(MXKRoomDataSource *roomDataSource) { + + // Scroll to bottom the bubble history on the display refresh. + shouldScrollToBottomOnTableRefresh = YES; + + [self displayRoom:roomDataSource]; + + // The room view controller do not have here the data source ownership. + self.hasRoomDataSourceOwnership = NO; + + [self refreshActivitiesViewDisplay]; + [self refreshJumpToLastUnreadBannerDisplay]; + + if (self.saveProgressTextInput) + { + // Restore the potential message partially typed before jump to last unread messages. + self.inputToolbarView.textMessage = roomDataSource.partialTextMessage; + } + }]; } }