diff --git a/Riot/Modules/Common/Recents/RecentsViewController.h b/Riot/Modules/Common/Recents/RecentsViewController.h index ec0d613fe..b2b640d80 100644 --- a/Riot/Modules/Common/Recents/RecentsViewController.h +++ b/Riot/Modules/Common/Recents/RecentsViewController.h @@ -165,6 +165,16 @@ */ - (void)muteEditedRoomNotifications:(BOOL)mute; +/** + Show room directory. + */ +- (void)showRoomDirectory; + +/** + Show a public room. + */ +- (void)openPublicRoom:(MXPublicRoom *)publicRoom; + #pragma mark - Scrolling /** diff --git a/Riot/Modules/Common/Recents/RecentsViewController.m b/Riot/Modules/Common/Recents/RecentsViewController.m index 3cdcc85bc..464bdfd84 100644 --- a/Riot/Modules/Common/Recents/RecentsViewController.m +++ b/Riot/Modules/Common/Recents/RecentsViewController.m @@ -34,7 +34,7 @@ #import "Riot-Swift.h" -@interface RecentsViewController () +@interface RecentsViewController () { // Tell whether a recents refresh is pending (suspended during editing mode). BOOL isRefreshPending; @@ -68,6 +68,8 @@ @property (nonatomic, strong) CreateRoomCoordinatorBridgePresenter *createRoomCoordinatorBridgePresenter; +@property (nonatomic, strong) RoomsDirectoryCoordinatorBridgePresenter *roomsDirectoryCoordinatorBridgePresenter; + @end @implementation RecentsViewController @@ -856,6 +858,18 @@ self.view.userInteractionEnabled = userInteractionEnabled; } +- (RecentsDataSource*)recentsDataSource +{ + RecentsDataSource* recentsDataSource = nil; + + if ([self.dataSource isKindOfClass:[RecentsDataSource class]]) + { + recentsDataSource = (RecentsDataSource*)self.dataSource; + } + + return recentsDataSource; +} + #pragma mark - MXKDataSourceDelegate - (Class)cellViewClassForCellData:(MXKCellData*)cellData @@ -1783,73 +1797,58 @@ - (void)joinARoom { - [currentAlert dismissViewControllerAnimated:NO completion:nil]; - - __weak typeof(self) weakSelf = self; - - // Prompt the user to type a room id or room alias - currentAlert = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"room_recents_join_room_title", @"Vector", nil) - message:NSLocalizedStringFromTable(@"room_recents_join_room_prompt", @"Vector", nil) - preferredStyle:UIAlertControllerStyleAlert]; - - [currentAlert addTextFieldWithConfigurationHandler:^(UITextField *textField) { - - textField.secureTextEntry = NO; - textField.placeholder = nil; - textField.keyboardType = UIKeyboardTypeDefault; - }]; - - [currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] - style:UIAlertActionStyleCancel - handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - self->currentAlert = nil; - } - - }]]; - - [currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"join", @"Vector", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - - NSString *roomAliasOrId = [self->currentAlert textFields].firstObject.text; - - self->currentAlert = nil; - - [self.activityIndicator startAnimating]; + [self showRoomDirectory]; +} - // TODO - self->currentRequest = [self.mainSession joinRoom:roomAliasOrId viaServers:nil success:^(MXRoom *room) { - - self->currentRequest = nil; - [self.activityIndicator stopAnimating]; - - // Show the room - [[AppDelegate theDelegate] showRoom:room.roomId andEventId:nil withMatrixSession:self.mainSession]; - - } failure:^(NSError *error) { - - NSLog(@"[RecentsViewController] Join joinARoom (%@) failed", roomAliasOrId); - - self->currentRequest = nil; - [self.activityIndicator stopAnimating]; - - // Alert user - [[AppDelegate theDelegate] showErrorAsAlert:error]; - }]; - } - - }]]; +- (void)showRoomDirectory +{ + if (!self.self.mainSession) + { + NSLog(@"[RecentsViewController] Fail to show room directory, session is nil"); + return; + } - [currentAlert mxk_setAccessibilityIdentifier:@"RecentsVCJoinARoomAlert"]; - [self presentViewController:currentAlert animated:YES completion:nil]; + self.roomsDirectoryCoordinatorBridgePresenter = [[RoomsDirectoryCoordinatorBridgePresenter alloc] initWithSession:self.mainSession dataSource:[self.recentsDataSource.publicRoomsDirectoryDataSource copy]]; + self.roomsDirectoryCoordinatorBridgePresenter.delegate = self; + [self.roomsDirectoryCoordinatorBridgePresenter presentFrom:self animated:YES]; +} + +- (void)openPublicRoom:(MXPublicRoom *)publicRoom +{ + if (!self.recentsDataSource) + { + NSLog(@"[RecentsViewController] Fail to open public room, dataSource is not kind of class MXKRecentsDataSource"); + return; + } + + // Check whether the user has already joined the selected public room + if ([self.recentsDataSource.publicRoomsDirectoryDataSource.mxSession roomWithRoomId:publicRoom.roomId]) + { + // Open the public room + [[AppDelegate theDelegate] showRoom:publicRoom.roomId andEventId:nil withMatrixSession:self.recentsDataSource.publicRoomsDirectoryDataSource.mxSession restoreInitialDisplay:NO]; + } + else + { + // Preview the public room + if (publicRoom.worldReadable) + { + RoomPreviewData *roomPreviewData = [[RoomPreviewData alloc] initWithPublicRoom:publicRoom andSession:self.recentsDataSource.publicRoomsDirectoryDataSource.mxSession]; + + [self startActivityIndicator]; + + // Try to get more information about the room before opening its preview + [roomPreviewData peekInRoom:^(BOOL succeeded) { + [self stopActivityIndicator]; + + [[AppDelegate theDelegate].masterTabBarController showRoomPreview:roomPreviewData]; + }]; + } + else + { + RoomPreviewData *roomPreviewData = [[RoomPreviewData alloc] initWithPublicRoom:publicRoom andSession:self.recentsDataSource.publicRoomsDirectoryDataSource.mxSession]; + [[AppDelegate theDelegate].masterTabBarController showRoomPreview:roomPreviewData]; + } + } } #pragma mark - Table view scrolling @@ -2052,4 +2051,28 @@ return NO; } +#pragma mark - RoomsDirectoryCoordinatorBridgePresenterDelegate + +- (void)roomsDirectoryCoordinatorBridgePresenterDelegateDidComplete:(RoomsDirectoryCoordinatorBridgePresenter *)coordinatorBridgePresenter +{ + [coordinatorBridgePresenter dismissWithAnimated:YES completion:nil]; + self.roomsDirectoryCoordinatorBridgePresenter = nil; +} + +- (void)roomsDirectoryCoordinatorBridgePresenterDelegate:(RoomsDirectoryCoordinatorBridgePresenter *)coordinatorBridgePresenter didSelectRoom:(MXPublicRoom *)room +{ + [coordinatorBridgePresenter dismissWithAnimated:YES completion:^{ + [self openPublicRoom:room]; + }]; + self.roomsDirectoryCoordinatorBridgePresenter = nil; +} + +- (void)roomsDirectoryCoordinatorBridgePresenterDelegateDidTapCreateNewRoom:(RoomsDirectoryCoordinatorBridgePresenter *)coordinatorBridgePresenter +{ + [coordinatorBridgePresenter dismissWithAnimated:YES completion:^{ + [self createNewRoom]; + }]; + self.roomsDirectoryCoordinatorBridgePresenter = nil; +} + @end diff --git a/Riot/Modules/Rooms/RoomsViewController.m b/Riot/Modules/Rooms/RoomsViewController.m index ee58b242e..a7f42cb85 100644 --- a/Riot/Modules/Rooms/RoomsViewController.m +++ b/Riot/Modules/Rooms/RoomsViewController.m @@ -22,7 +22,7 @@ #import "Riot-Swift.h" -@interface RoomsViewController () +@interface RoomsViewController () { RecentsDataSource *recentsDataSource; @@ -30,8 +30,6 @@ UIView* footerSpinnerView; } -@property (nonatomic, strong) RoomsDirectoryCoordinatorBridgePresenter *roomsDirectoryCoordinatorBridgePresenter; - @end @implementation RoomsViewController @@ -128,9 +126,7 @@ - (void)onPlusButtonPressed { - self.roomsDirectoryCoordinatorBridgePresenter = [[RoomsDirectoryCoordinatorBridgePresenter alloc] initWithSession:self.mainSession dataSource:[recentsDataSource.publicRoomsDirectoryDataSource copy]]; - self.roomsDirectoryCoordinatorBridgePresenter.delegate = self; - [self.roomsDirectoryCoordinatorBridgePresenter presentFrom:self animated:YES]; + [self showRoomDirectory]; } #pragma mark - @@ -263,38 +259,6 @@ [self openPublicRoom:publicRoom]; } -- (void)openPublicRoom:(MXPublicRoom *)publicRoom -{ - // Check whether the user has already joined the selected public room - if ([recentsDataSource.publicRoomsDirectoryDataSource.mxSession roomWithRoomId:publicRoom.roomId]) - { - // Open the public room - [[AppDelegate theDelegate] showRoom:publicRoom.roomId andEventId:nil withMatrixSession:recentsDataSource.publicRoomsDirectoryDataSource.mxSession restoreInitialDisplay:NO]; - } - else - { - // Preview the public room - if (publicRoom.worldReadable) - { - RoomPreviewData *roomPreviewData = [[RoomPreviewData alloc] initWithPublicRoom:publicRoom andSession:recentsDataSource.publicRoomsDirectoryDataSource.mxSession]; - - [self startActivityIndicator]; - - // Try to get more information about the room before opening its preview - [roomPreviewData peekInRoom:^(BOOL succeeded) { - [self stopActivityIndicator]; - - [[AppDelegate theDelegate].masterTabBarController showRoomPreview:roomPreviewData]; - }]; - } - else - { - RoomPreviewData *roomPreviewData = [[RoomPreviewData alloc] initWithPublicRoom:publicRoom andSession:recentsDataSource.publicRoomsDirectoryDataSource.mxSession]; - [[AppDelegate theDelegate].masterTabBarController showRoomPreview:roomPreviewData]; - } - } -} - - (void)triggerDirectoryPagination { if (!recentsDataSource @@ -351,30 +315,6 @@ } } -#pragma mark - RoomsDirectoryCoordinatorBridgePresenterDelegate - -- (void)roomsDirectoryCoordinatorBridgePresenterDelegateDidComplete:(RoomsDirectoryCoordinatorBridgePresenter *)coordinatorBridgePresenter -{ - [coordinatorBridgePresenter dismissWithAnimated:YES completion:nil]; - self.roomsDirectoryCoordinatorBridgePresenter = nil; -} - -- (void)roomsDirectoryCoordinatorBridgePresenterDelegate:(RoomsDirectoryCoordinatorBridgePresenter *)coordinatorBridgePresenter didSelectRoom:(MXPublicRoom *)room -{ - [coordinatorBridgePresenter dismissWithAnimated:YES completion:^{ - [self openPublicRoom:room]; - }]; - self.roomsDirectoryCoordinatorBridgePresenter = nil; -} - -- (void)roomsDirectoryCoordinatorBridgePresenterDelegateDidTapCreateNewRoom:(RoomsDirectoryCoordinatorBridgePresenter *)coordinatorBridgePresenter -{ - [coordinatorBridgePresenter dismissWithAnimated:YES completion:^{ - [self createNewRoom]; - }]; - self.roomsDirectoryCoordinatorBridgePresenter = nil; -} - #pragma mark - Empty view management - (void)updateEmptyView