From 6abab61531c93613f871b95872cc9855990e6e00 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Tue, 7 Sep 2021 17:43:49 +0200 Subject: [PATCH 1/4] RoomVC: Add a delegate, factorize and reduce usage of AppDelegate. --- Riot/Modules/Room/RoomViewController.h | 134 +++++++++++-- Riot/Modules/Room/RoomViewController.m | 262 ++++++++++++++++++------- 2 files changed, 313 insertions(+), 83 deletions(-) diff --git a/Riot/Modules/Room/RoomViewController.h b/Riot/Modules/Room/RoomViewController.h index dac5cbb05a..755fa32bdc 100644 --- a/Riot/Modules/Room/RoomViewController.h +++ b/Riot/Modules/Room/RoomViewController.h @@ -28,41 +28,48 @@ #import "UIViewController+RiotSearch.h" @class BadgeLabel; +@protocol RoomViewControllerDelegate; + +NS_ASSUME_NONNULL_BEGIN /** Notification string used to indicate call tile tapped in a room. Notification object will be the `RoomBubbleCellData` object. */ -extern NSNotificationName const RoomCallTileTappedNotification; +extern NSNotificationName const _Nonnull RoomCallTileTappedNotification; /** Notification string used to indicate group call tile tapped in a room. Notification object will be the `RoomBubbleCellData` object. */ -extern NSNotificationName const RoomGroupCallTileTappedNotification; +extern NSNotificationName const _Nonnull RoomGroupCallTileTappedNotification; @interface RoomViewController : MXKRoomViewController + +// The delegate for the view controller. +@property (weak, nonatomic, nullable) id delegate; + // The preview header -@property (weak, nonatomic) IBOutlet UIView *previewHeaderContainer; -@property (weak, nonatomic) IBOutlet NSLayoutConstraint *previewHeaderContainerHeightConstraint; +@property (weak, nonatomic, nullable) IBOutlet UIView *previewHeaderContainer; +@property (weak, nonatomic, nullable) IBOutlet NSLayoutConstraint *previewHeaderContainerHeightConstraint; // The jump to last unread banner -@property (weak, nonatomic) IBOutlet UIView *jumpToLastUnreadBannerContainer; -@property (weak, nonatomic) IBOutlet UIView *jumpToLastUnreadBanner; -@property (weak, nonatomic) IBOutlet UIImageView *jumpToLastUnreadImageView; -@property (weak, nonatomic) IBOutlet UIButton *jumpToLastUnreadButton; -@property (weak, nonatomic) IBOutlet UILabel *jumpToLastUnreadLabel; -@property (weak, nonatomic) IBOutlet UIButton *resetReadMarkerButton; -@property (weak, nonatomic) IBOutlet UIView *inputBackgroundView; -@property (weak, nonatomic) IBOutlet UIButton *scrollToBottomButton; -@property (weak, nonatomic) IBOutlet BadgeLabel *scrollToBottomBadgeLabel; +@property (weak, nonatomic, nullable) IBOutlet UIView *jumpToLastUnreadBannerContainer; +@property (weak, nonatomic, nullable) IBOutlet UIView *jumpToLastUnreadBanner; +@property (weak, nonatomic, nullable) IBOutlet UIImageView *jumpToLastUnreadImageView; +@property (weak, nonatomic, nullable) IBOutlet UIButton *jumpToLastUnreadButton; +@property (weak, nonatomic, nullable) IBOutlet UILabel *jumpToLastUnreadLabel; +@property (weak, nonatomic, nullable) IBOutlet UIButton *resetReadMarkerButton; +@property (weak, nonatomic, nullable) IBOutlet UIView *inputBackgroundView; +@property (weak, nonatomic, nullable) IBOutlet UIButton *scrollToBottomButton; +@property (weak, nonatomic, nullable) IBOutlet BadgeLabel *scrollToBottomBadgeLabel; // Remove Jitsi widget container -@property (weak, nonatomic) IBOutlet UIView *removeJitsiWidgetContainer; +@property (weak, nonatomic, nullable) IBOutlet UIView *removeJitsiWidgetContainer; /** Preview data for a room invitation received by email, or a link to a room. */ -@property (nonatomic, readonly) RoomPreviewData *roomPreviewData; +@property (nonatomic, readonly, nullable) RoomPreviewData *roomPreviewData; /** Tell whether a badge must be added next to the chevron (back button) showing number of unread rooms. @@ -77,7 +84,7 @@ extern NSNotificationName const RoomGroupCallTileTappedNotification; @param roomPreviewData the data for the room preview. */ -- (void)displayRoomPreview:(RoomPreviewData*)roomPreviewData; +- (void)displayRoomPreview:(nonnull RoomPreviewData*)roomPreviewData; /** Action used to handle some buttons. @@ -86,5 +93,100 @@ extern NSNotificationName const RoomGroupCallTileTappedNotification; - (IBAction)scrollToBottomAction:(id)sender; +/** + Creates and returns a new `RoomViewController` object. + + @return An initialized `RoomViewController` object. + */ ++ (nonnull instancetype)instantiate; + +@end + +/** + `RoomViewController` delegate. + */ +@protocol RoomViewControllerDelegate + +/** + Tells the delegate that the user wants to open the room details (members, files, settings). + + @param roomViewController the `RoomViewController` instance. + */ +- (void)roomViewControllerShowRoomDetails:(nonnull RoomViewController *)roomViewController; + +/** + Tells the delegate that the user wants to display the details of a room member. + + @param roomViewController the `RoomViewController` instance. + @param roomMember the selected member + */ +- (void)roomViewController:(nonnull RoomViewController *)roomViewController + showMemberDetails:(nonnull MXRoomMember *)roomMember; + +/** + Tells the delegate that the user wants to display another room. + + @param roomViewController the `RoomViewController` instance. + @param roomID the selected roomId + */ +- (void)roomViewController:(nonnull RoomViewController *)roomViewController + showRoomWithId:(nonnull NSString *)roomID; + +/** + Tells the delegate that the user wants to start a direct chat with a user. + + @param roomViewController the `RoomViewController` instance. + @param userId the selected user id + @param completion Blocks called when the chat is created. + */ +- (void)roomViewController:(nonnull RoomViewController *)roomViewController + startChatWithUserId:(NSString*)userId + completion:(void (^)(void))completion; + +/** + Tells the delegate that the user wants to show complete security screen. + + @param roomViewController the `RoomViewController` instance. + @param session The selected Matrix session. + */ +- (void)roomViewController:(nonnull RoomViewController *)roomViewController showCompleteSecurityForSession:(MXSession*)session; + +/** + Tells the delegate that the user leaved the room. + + @param roomViewController the `RoomViewController` instance. + */ +- (void)roomViewControllerDidLeaveRoom:(nonnull RoomViewController *)roomViewController; + +/** + Tells the delegate that the user wants to cancel the room preview. + + @param roomViewController the `RoomViewController` instance. + */ +- (void)roomViewControllerPreviewDidTapCancel:(nonnull RoomViewController *)roomViewController; + +/** + Handle the fragment of a universal link. + + @param roomViewController the `RoomViewController` instance. + @param fragment the fragment part of the universal link. + @param universalLinkURL the unprocessed the universal link URL (optional). + @return true to indicate that the fragment has been handled, or false when the fragment is not supported. + */ +- (BOOL)roomViewController:(nonnull RoomViewController *)roomViewController +handleUniversalLinkFragment:(nonnull NSString*)fragment + fromURL:(nullable NSURL*)universalLinkURL; + +/** + Process universal link. + + @param roomViewController the `RoomViewController` instance. + @param universalLinkURL the unprocessed the universal link URL (optional). + @return YES in case of processing success. + */ +- (BOOL)roomViewController:(nonnull RoomViewController *)roomViewController + handleUniversalLinkURL:(NSURL*)universalLinkURL; + @end +NS_ASSUME_NONNULL_END diff --git a/Riot/Modules/Room/RoomViewController.m b/Riot/Modules/Room/RoomViewController.m index 725db7ad1d..7454c89e21 100644 --- a/Riot/Modules/Room/RoomViewController.m +++ b/Riot/Modules/Room/RoomViewController.m @@ -261,6 +261,12 @@ + (instancetype)roomViewController bundle:[NSBundle bundleForClass:self.class]]; } ++ (instancetype)instantiate +{ + UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; + return [storyboard instantiateViewControllerWithIdentifier:@"RoomViewControllerStoryboardId"]; +} + #pragma mark - - (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil @@ -656,7 +662,7 @@ - (void)viewDidAppear:(BOOL)animated self.keyboardHeight = MAX(self.keyboardHeight, 0); if (hasJitsiCall && - ![[AppDelegate theDelegate].callPresenter.jitsiVC.widget.roomId isEqualToString:self.roomDataSource.roomId]) + !self.isRoomHavingAJitsiCall) { // the room had a Jitsi call before, but not now hasJitsiCall = NO; @@ -691,9 +697,8 @@ - (void)viewDidDisappear:(BOOL)animated [[NSNotificationCenter defaultCenter] removeObserver:mxEventDidDecryptNotificationObserver]; mxEventDidDecryptNotificationObserver = nil; } - - JitsiViewController *jitsiVC = [AppDelegate theDelegate].callPresenter.jitsiVC; - if ([jitsiVC.widget.roomId isEqualToString:self.roomDataSource.roomId]) + + if (self.isRoomHavingAJitsiCall) { hasJitsiCall = YES; [self reloadBubblesTable:YES]; @@ -1081,7 +1086,14 @@ - (void)leaveRoomOnEvent:(MXEvent*)event [super leaveRoomOnEvent:event]; - [[LegacyAppDelegate theDelegate] restoreInitialDisplay:nil]; + if (self.delegate) + { + [self.delegate roomViewControllerDidLeaveRoom:self]; + } + else + { + [[AppDelegate theDelegate] restoreInitialDisplay:nil]; + } } // Set the input toolbar according to the current display @@ -1196,15 +1208,14 @@ - (BOOL)isIRCStyleCommand:(NSString*)string { // TODO: /join command does not support via parameters yet [self.mainSession joinRoom:roomAlias viaServers:nil success:^(MXRoom *room) { - - // Show the room - [[AppDelegate theDelegate] showRoom:room.roomId andEventId:nil withMatrixSession:self.mainSession]; + + [self showRoomWithId:room.roomId]; } failure:^(NSError *error) { MXLogDebug(@"[RoomVC] Join roomAlias (%@) failed", roomAlias); //Alert user - [[AppDelegate theDelegate] showErrorAsAlert:error]; + [self showError:error]; }]; } @@ -1548,8 +1559,7 @@ - (void)refreshRoomTitle // video call button for Jitsi call if (self.isCallActive) { - JitsiViewController *jitsiVC = [AppDelegate theDelegate].callPresenter.jitsiVC; - if ([jitsiVC.widget.roomId isEqualToString:self.roomDataSource.roomId]) + if (self.isRoomHavingAJitsiCall) { // show a disabled call button UIBarButtonItem *item = [self videoCallBarButtonItem]; @@ -1945,7 +1955,7 @@ - (void)roomInputToolbarViewPresentStickerPicker } failure:^(NSError * _Nonnull error) { MXLogDebug(@"[RoomVC] Cannot display widget %@", widget); - [[AppDelegate theDelegate] showErrorAsAlert:error]; + [self showError:error]; }]; } else @@ -2004,6 +2014,125 @@ - (void)roomInputToolbarViewDidTapFileUpload self.documentPickerPresenter = documentPickerPresenter; } +- (void)showRoomWithId:(NSString*)roomId +{ + if (self.delegate) + { + [self.delegate roomViewController:self showRoomWithId:roomId]; + } + else + { + [[AppDelegate theDelegate] showRoom:roomId andEventId:nil withMatrixSession:self.roomDataSource.mxSession]; + } +} + +- (void)leaveRoom +{ + [self startActivityIndicator]; + + [self.roomDataSource.room leave:^{ + + [self stopActivityIndicator]; + + // We remove the current view controller. + if (self.delegate) + { + [self.delegate roomViewControllerDidLeaveRoom:self]; + } + else + { + [[AppDelegate theDelegate] restoreInitialDisplay:^{}]; + } + + } failure:^(NSError *error) { + + [self stopActivityIndicator]; + MXLogDebug(@"[RoomVC] Failed to reject an invited room (%@) failed", self.roomDataSource.room.roomId); + + }]; +} + +- (void)roomPreviewDidTapCancelAction +{ + // Decline this invitation = leave this page + if (self.delegate) + { + [self.delegate roomViewControllerPreviewDidTapCancel:self]; + } + else + { + [[AppDelegate theDelegate] restoreInitialDisplay:^{}]; + } +} + +- (void)startChatWithUserId:(NSString *)userId completion:(void (^)(void))completion +{ + if (self.delegate) + { + [self.delegate roomViewController:self startChatWithUserId:userId completion:completion]; + } + else + { + [[AppDelegate theDelegate] createDirectChatWithUserId:userId completion:completion]; + } +} + +- (void)showError:(NSError*)error +{ + [[AppDelegate theDelegate] showErrorAsAlert:error]; +} + +- (UIAlertController*)showAlertWithTitle:(NSString*)title message:(NSString*)message +{ + return [[AppDelegate theDelegate] showAlertWithTitle:title message:message]; +} + +- (BOOL)handleUniversalLinkURL:(NSURL*)universalLinkURL +{ + if (self.delegate) + { + return [self.delegate roomViewController:self handleUniversalLinkURL:universalLinkURL]; + } + else + { + return [[AppDelegate theDelegate] handleUniversalLinkURL:universalLinkURL]; + } +} + +- (BOOL)handleUniversalLinkFragment:(NSString*)fragment fromURL:(NSURL*)universalLinkURL +{ + if (self.delegate) + { + return [self.delegate roomViewController:self handleUniversalLinkFragment:fragment fromURL:universalLinkURL]; + } + else + { + return [[AppDelegate theDelegate] handleUniversalLinkFragment:fragment fromURL:universalLinkURL]; + } +} + +#pragma mark - Jitsi + +- (void)showJitsiCallWithWidget:(Widget*)widget +{ + [[AppDelegate theDelegate].callPresenter displayJitsiCallWithWidget:widget]; +} + +- (void)endActiveJitsiCall +{ + [[AppDelegate theDelegate].callPresenter endActiveJitsiCall]; +} + +- (BOOL)isRoomHavingAJitsiCall +{ + return [self isRoomHavingAJitsiCallForWidgetId:self.roomDataSource.roomId]; +} + +- (BOOL)isRoomHavingAJitsiCallForWidgetId:(NSString*)widgetId +{ + return [[AppDelegate theDelegate].callPresenter.jitsiVC.widget.roomId isEqualToString:widgetId]; +} + #pragma mark - Dialpad - (void)openDialpad @@ -2546,7 +2675,7 @@ - (void)dataSource:(MXKDataSource *)dataSource didRecognizeAction:(NSString *)ac if (predecessorRoomId) { // Show predecessor room - [[AppDelegate theDelegate] showRoom:predecessorRoomId andEventId:nil withMatrixSession:self.mainSession]; + [self showRoomWithId:predecessorRoomId]; } else { @@ -2622,7 +2751,7 @@ - (void)dataSource:(MXKDataSource *)dataSource didRecognizeAction:(NSString *)ac [roomDataSource acceptVerificationRequestForEventId:eventId success:^{ } failure:^(NSError *error) { - [[AppDelegate theDelegate] showErrorAsAlert:error]; + [self showError:error]; }]; } else if ([actionIdentifier isEqualToString:kMXKRoomBubbleCellKeyVerificationIncomingRequestDeclinePressed]) @@ -2634,7 +2763,7 @@ - (void)dataSource:(MXKDataSource *)dataSource didRecognizeAction:(NSString *)ac [roomDataSource declineVerificationRequestForEventId:eventId success:^{ } failure:^(NSError *error) { - [[AppDelegate theDelegate] showErrorAsAlert:error]; + [self showError:error]; }]; } else if ([actionIdentifier isEqualToString:kMXKRoomBubbleCellTapOnAttachmentView]) @@ -2764,7 +2893,7 @@ - (void)dataSource:(MXKDataSource *)dataSource didRecognizeAction:(NSString *)ac Widget *jitsiWidget = [self->customizedRoomDataSource jitsiWidget]; if (jitsiWidget) { - [[AppDelegate theDelegate].callPresenter displayJitsiCallWithWidget:jitsiWidget]; + [self showJitsiCallWithWidget:jitsiWidget]; } } else @@ -2780,7 +2909,7 @@ - (void)dataSource:(MXKDataSource *)dataSource didRecognizeAction:(NSString *)ac } else if ([actionIdentifier isEqualToString:RoomGroupCallStatusBubbleCell.leaveAction]) { - [[AppDelegate theDelegate].callPresenter endActiveJitsiCall]; + [self endActiveJitsiCall]; [self reloadBubblesTable:YES]; } else if ([actionIdentifier isEqualToString:RoomGroupCallStatusBubbleCell.declineAction]) @@ -3004,7 +3133,7 @@ - (void)showAdditionalActionsMenuForEvent:(MXEvent*)selectedEvent inCell:(id Date: Fri, 17 Sep 2021 13:21:53 +0200 Subject: [PATCH 2/4] Update Riot/Modules/Room/RoomViewController.h Co-authored-by: manuroe --- Riot/Modules/Room/RoomViewController.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Modules/Room/RoomViewController.h b/Riot/Modules/Room/RoomViewController.h index 755fa32bdc..2d27daa940 100644 --- a/Riot/Modules/Room/RoomViewController.h +++ b/Riot/Modules/Room/RoomViewController.h @@ -152,7 +152,7 @@ extern NSNotificationName const _Nonnull RoomGroupCallTileTappedNotification; - (void)roomViewController:(nonnull RoomViewController *)roomViewController showCompleteSecurityForSession:(MXSession*)session; /** - Tells the delegate that the user leaved the room. + Tells the delegate that the user left the room. @param roomViewController the `RoomViewController` instance. */ From f8e9d15a4a1c19896739ecf787cf92d18f872c0b Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Fri, 17 Sep 2021 14:19:38 +0200 Subject: [PATCH 3/4] RoomVC: Remove unnecessary nonnull. --- Riot/Modules/Room/RoomViewController.h | 32 +++++++++++++------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Riot/Modules/Room/RoomViewController.h b/Riot/Modules/Room/RoomViewController.h index 2d27daa940..b523cd5a01 100644 --- a/Riot/Modules/Room/RoomViewController.h +++ b/Riot/Modules/Room/RoomViewController.h @@ -35,12 +35,12 @@ NS_ASSUME_NONNULL_BEGIN /** Notification string used to indicate call tile tapped in a room. Notification object will be the `RoomBubbleCellData` object. */ -extern NSNotificationName const _Nonnull RoomCallTileTappedNotification; +extern NSNotificationName const RoomCallTileTappedNotification; /** Notification string used to indicate group call tile tapped in a room. Notification object will be the `RoomBubbleCellData` object. */ -extern NSNotificationName const _Nonnull RoomGroupCallTileTappedNotification; +extern NSNotificationName const RoomGroupCallTileTappedNotification; @interface RoomViewController : MXKRoomViewController @@ -84,7 +84,7 @@ extern NSNotificationName const _Nonnull RoomGroupCallTileTappedNotification; @param roomPreviewData the data for the room preview. */ -- (void)displayRoomPreview:(nonnull RoomPreviewData*)roomPreviewData; +- (void)displayRoomPreview:(RoomPreviewData*)roomPreviewData; /** Action used to handle some buttons. @@ -98,7 +98,7 @@ extern NSNotificationName const _Nonnull RoomGroupCallTileTappedNotification; @return An initialized `RoomViewController` object. */ -+ (nonnull instancetype)instantiate; ++ (instancetype)instantiate; @end @@ -112,7 +112,7 @@ extern NSNotificationName const _Nonnull RoomGroupCallTileTappedNotification; @param roomViewController the `RoomViewController` instance. */ -- (void)roomViewControllerShowRoomDetails:(nonnull RoomViewController *)roomViewController; +- (void)roomViewControllerShowRoomDetails:(RoomViewController *)roomViewController; /** Tells the delegate that the user wants to display the details of a room member. @@ -120,8 +120,8 @@ extern NSNotificationName const _Nonnull RoomGroupCallTileTappedNotification; @param roomViewController the `RoomViewController` instance. @param roomMember the selected member */ -- (void)roomViewController:(nonnull RoomViewController *)roomViewController - showMemberDetails:(nonnull MXRoomMember *)roomMember; +- (void)roomViewController:(RoomViewController *)roomViewController + showMemberDetails:(MXRoomMember *)roomMember; /** Tells the delegate that the user wants to display another room. @@ -129,8 +129,8 @@ extern NSNotificationName const _Nonnull RoomGroupCallTileTappedNotification; @param roomViewController the `RoomViewController` instance. @param roomID the selected roomId */ -- (void)roomViewController:(nonnull RoomViewController *)roomViewController - showRoomWithId:(nonnull NSString *)roomID; +- (void)roomViewController:(RoomViewController *)roomViewController + showRoomWithId:(NSString *)roomID; /** Tells the delegate that the user wants to start a direct chat with a user. @@ -139,7 +139,7 @@ extern NSNotificationName const _Nonnull RoomGroupCallTileTappedNotification; @param userId the selected user id @param completion Blocks called when the chat is created. */ -- (void)roomViewController:(nonnull RoomViewController *)roomViewController +- (void)roomViewController:(RoomViewController *)roomViewController startChatWithUserId:(NSString*)userId completion:(void (^)(void))completion; @@ -149,21 +149,21 @@ extern NSNotificationName const _Nonnull RoomGroupCallTileTappedNotification; @param roomViewController the `RoomViewController` instance. @param session The selected Matrix session. */ -- (void)roomViewController:(nonnull RoomViewController *)roomViewController showCompleteSecurityForSession:(MXSession*)session; +- (void)roomViewController:(RoomViewController *)roomViewController showCompleteSecurityForSession:(MXSession*)session; /** Tells the delegate that the user left the room. @param roomViewController the `RoomViewController` instance. */ -- (void)roomViewControllerDidLeaveRoom:(nonnull RoomViewController *)roomViewController; +- (void)roomViewControllerDidLeaveRoom:(RoomViewController *)roomViewController; /** Tells the delegate that the user wants to cancel the room preview. @param roomViewController the `RoomViewController` instance. */ -- (void)roomViewControllerPreviewDidTapCancel:(nonnull RoomViewController *)roomViewController; +- (void)roomViewControllerPreviewDidTapCancel:(RoomViewController *)roomViewController; /** Handle the fragment of a universal link. @@ -173,8 +173,8 @@ extern NSNotificationName const _Nonnull RoomGroupCallTileTappedNotification; @param universalLinkURL the unprocessed the universal link URL (optional). @return true to indicate that the fragment has been handled, or false when the fragment is not supported. */ -- (BOOL)roomViewController:(nonnull RoomViewController *)roomViewController -handleUniversalLinkFragment:(nonnull NSString*)fragment +- (BOOL)roomViewController:(RoomViewController *)roomViewController +handleUniversalLinkFragment:(NSString*)fragment fromURL:(nullable NSURL*)universalLinkURL; /** @@ -184,7 +184,7 @@ handleUniversalLinkFragment:(nonnull NSString*)fragment @param universalLinkURL the unprocessed the universal link URL (optional). @return YES in case of processing success. */ -- (BOOL)roomViewController:(nonnull RoomViewController *)roomViewController +- (BOOL)roomViewController:(RoomViewController *)roomViewController handleUniversalLinkURL:(NSURL*)universalLinkURL; @end From bdecdfb5183abcaa9a2296e825394d655fb343ec Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Fri, 17 Sep 2021 14:21:27 +0200 Subject: [PATCH 4/4] RoomVC: Fix comment mistake. --- Riot/Modules/Room/RoomViewController.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Modules/Room/RoomViewController.h b/Riot/Modules/Room/RoomViewController.h index b523cd5a01..6e70591a44 100644 --- a/Riot/Modules/Room/RoomViewController.h +++ b/Riot/Modules/Room/RoomViewController.h @@ -181,7 +181,7 @@ handleUniversalLinkFragment:(NSString*)fragment Process universal link. @param roomViewController the `RoomViewController` instance. - @param universalLinkURL the unprocessed the universal link URL (optional). + @param universalLinkURL the universal link URL. @return YES in case of processing success. */ - (BOOL)roomViewController:(RoomViewController *)roomViewController