Add support for Apple context menus in matrix items list screens (#5963)

This commit is contained in:
Gil Eluard
2022-04-04 20:07:06 +02:00
committed by GitHub
parent ff78d21755
commit 1adfa904ae
27 changed files with 1577 additions and 376 deletions
@@ -21,7 +21,7 @@
#import "GeneratedInterface-Swift.h"
@interface DirectoryViewController ()
@interface DirectoryViewController () <RoomNotificationSettingsCoordinatorBridgePresenterDelegate, RoomContextActionServiceDelegate>
{
PublicRoomsDirectoryDataSource *dataSource;
@@ -37,6 +37,10 @@
@property (nonatomic) AnalyticsScreenTracker *screenTracker;
@property (nonatomic, strong) RoomNotificationSettingsCoordinatorBridgePresenter *roomNotificationSettingsCoordinatorBridgePresenter;
@property (nonatomic, strong) PublicRoomContextMenuProvider *contextMenuProvider;
@end
@implementation DirectoryViewController
@@ -45,6 +49,9 @@
{
[super finalizeInit];
self.contextMenuProvider = [PublicRoomContextMenuProvider new];
self.contextMenuProvider.serviceDelegate = self;
// Setup `MXKViewControllerHandling` properties
self.enableBarTintColorStatusChange = NO;
self.rageShakeManager = [RageShakeManager sharedManager];
@@ -191,36 +198,7 @@
{
MXPublicRoom *publicRoom = [dataSource roomAtIndexPath:indexPath];
// Check whether the user has already joined the selected public room
if ([dataSource.mxSession isJoinedOnRoom:publicRoom.roomId])
{
// Open the public room.
[self showRoomWithId:publicRoom.roomId inMatrixSession:dataSource.mxSession];
}
else
{
// Preview the public room
if (publicRoom.worldReadable)
{
RoomPreviewData *roomPreviewData = [[RoomPreviewData alloc] initWithPublicRoom:publicRoom andSession:dataSource.mxSession];
[self startActivityIndicator];
// Try to get more information about the room before opening its preview
[roomPreviewData peekInRoom:^(BOOL succeeded) {
[self stopActivityIndicator];
[self showRoomPreviewWithData:roomPreviewData];
}];
}
else
{
RoomPreviewData *roomPreviewData = [[RoomPreviewData alloc] initWithPublicRoom:publicRoom andSession:dataSource.mxSession];
[self showRoomPreviewWithData:roomPreviewData];
}
}
[self showRoomWithPublicRoom:publicRoom];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
@@ -360,4 +338,120 @@
}
}
- (void)showRoomWithPublicRoom:(MXPublicRoom*)publicRoom
{
// Check whether the user has already joined the selected public room
if ([dataSource.mxSession isJoinedOnRoom:publicRoom.roomId])
{
// Open the public room.
[self showRoomWithId:publicRoom.roomId inMatrixSession:dataSource.mxSession];
}
else
{
// Preview the public room
if (publicRoom.worldReadable)
{
RoomPreviewData *roomPreviewData = [[RoomPreviewData alloc] initWithPublicRoom:publicRoom andSession:dataSource.mxSession];
[self startActivityIndicator];
// Try to get more information about the room before opening its preview
[roomPreviewData peekInRoom:^(BOOL succeeded) {
[self stopActivityIndicator];
[self showRoomPreviewWithData:roomPreviewData];
}];
}
else
{
RoomPreviewData *roomPreviewData = [[RoomPreviewData alloc] initWithPublicRoom:publicRoom andSession:dataSource.mxSession];
[self showRoomPreviewWithData:roomPreviewData];
}
}
}
- (void)changeRoomNotificationSettingsForRoomWithId:(NSString*)roomId
{
MXRoom *room = [dataSource.mxSession roomWithRoomId:roomId];
if (room)
{
// navigate
self.roomNotificationSettingsCoordinatorBridgePresenter = [[RoomNotificationSettingsCoordinatorBridgePresenter alloc] initWithRoom:room];
self.roomNotificationSettingsCoordinatorBridgePresenter.delegate = self;
[self.roomNotificationSettingsCoordinatorBridgePresenter presentFrom:self animated:YES];
}
}
#pragma mark - Context Menu
- (UIContextMenuConfiguration *)tableView:(UITableView *)tableView contextMenuConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath point:(CGPoint)point API_AVAILABLE(ios(13.0))
{
MXPublicRoom *publicRoom = [dataSource roomAtIndexPath:indexPath];
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (!publicRoom || !cell)
{
return nil;
}
return [self.contextMenuProvider contextMenuConfigurationWith:publicRoom from:cell session:dataSource.mxSession];
}
- (void)tableView:(UITableView *)tableView willPerformPreviewActionForMenuWithConfiguration:(UIContextMenuConfiguration *)configuration animator:(id<UIContextMenuInteractionCommitAnimating>)animator API_AVAILABLE(ios(13.0))
{
MXPublicRoom *publicRoom = [self.contextMenuProvider publicRoomFrom:configuration.identifier];
if (!publicRoom)
{
return;
}
[animator addCompletion:^{
[self showRoomWithPublicRoom:publicRoom];
}];
}
#pragma mark - RoomContextActionServiceDelegate
- (void)roomContextActionServiceDidJoinRoom:(id<RoomContextActionServiceProtocol>)service
{
// Nothing to do here
}
- (void)roomContextActionServiceDidLeaveRoom:(id<RoomContextActionServiceProtocol>)service
{
// Nothing to do here
}
- (void)roomContextActionService:(id<RoomContextActionServiceProtocol>)service presentAlert:(UIAlertController *)alertController
{
[self presentViewController:alertController animated:YES completion:nil];
}
- (void)roomContextActionService:(id<RoomContextActionServiceProtocol>)service updateActivityIndicator:(BOOL)isActive
{
if (isActive)
{
[self startActivityIndicator];
}
else
{
[self stopActivityIndicator];
}
}
- (void)roomContextActionService:(id<RoomContextActionServiceProtocol>)service showRoomNotificationSettingsForRoomWithId:(NSString *)roomId
{
[self changeRoomNotificationSettingsForRoomWithId:roomId];
}
#pragma mark - RoomNotificationSettingsCoordinatorBridgePresenterDelegate
-(void)roomNotificationSettingsCoordinatorBridgePresenterDelegateDidComplete:(RoomNotificationSettingsCoordinatorBridgePresenter *)coordinatorBridgePresenter
{
[coordinatorBridgePresenter dismissWithAnimated:YES completion:nil];
self.roomNotificationSettingsCoordinatorBridgePresenter = nil;
}
@end