mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-23 18:12:44 +02:00
Add support for Apple context menus in matrix items list screens (#5963)
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user