diff --git a/Vector/AppDelegate.m b/Vector/AppDelegate.m index c2c8c725c..98a8c2894 100644 --- a/Vector/AppDelegate.m +++ b/Vector/AppDelegate.m @@ -798,51 +798,91 @@ continueUserActivity = YES; } - else if ([roomIdOrAlias hasPrefix:@"#"]) + else { - // The alias may be not part of user's rooms states - // Ask the HS to resolve the room alias into a room id and then retry - universalLinkFragmentPending = fragment; - MXKAccount* account = accountManager.activeAccounts.firstObject; - [account.mxSession.matrixRestClient roomIDForRoomAlias:roomIdOrAlias success:^(NSString *roomId) { + // We will display something but we need to do some requests before. + // So, come back to the home VC and show its loading wheel while processing + [self restoreInitialDisplay:^{ - // Check that 'fragment' has not been cancelled - if ([universalLinkFragmentPending isEqualToString:fragment]) + [_homeViewController startActivityIndicator]; + + if ([roomIdOrAlias hasPrefix:@"#"]) { - // Retry opening the link but with the returned room id - NSString *newUniversalLinkFragment = - [fragment stringByReplacingOccurrencesOfString:[roomIdOrAlias stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] - withString:[roomId stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; - [self handleUniversalLinkFragment:newUniversalLinkFragment]; + // The alias may be not part of user's rooms states + // Ask the HS to resolve the room alias into a room id and then retry + universalLinkFragmentPending = fragment; + MXKAccount* account = accountManager.activeAccounts.firstObject; + [account.mxSession.matrixRestClient roomIDForRoomAlias:roomIdOrAlias success:^(NSString *roomId) { + + // Note: the activity indicator will not disappear if the session is not ready + [_homeViewController stopActivityIndicator]; + + // Check that 'fragment' has not been cancelled + if ([universalLinkFragmentPending isEqualToString:fragment]) + { + // Retry opening the link but with the returned room id + NSString *newUniversalLinkFragment = + [fragment stringByReplacingOccurrencesOfString:[roomIdOrAlias stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] + withString:[roomId stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; + [self handleUniversalLinkFragment:newUniversalLinkFragment]; + } + + } failure:^(NSError *error) { + NSLog(@"[AppDelegate] Universal link: Error: The home server failed to resolve the room alias (%@)", roomIdOrAlias); + }]; } - - } failure:^(NSError *error) { - NSLog(@"[AppDelegate] Universal link: Error: The home server failed to resolve the room alias (%@)", roomIdOrAlias); - }]; - - // Let's say we are handling the case - continueUserActivity = YES; - } - else if ([roomIdOrAlias hasPrefix:@"!"] && ((MXKAccount*)accountManager.activeAccounts.firstObject).mxSession.state != MXSessionStateRunning) - { - // The user does not know the room id but this may be because their session is not yet sync'ed - // So, wait for the completion of the sync and then retry - // FIXME: Manange all user's accounts not only the first one - MXKAccount* account = accountManager.activeAccounts.firstObject; - - NSLog(@"[AppDelegate] Universal link: Need to wait for the session to be sync'ed and running"); - universalLinkFragmentPending = fragment; - - universalLinkWaitingObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kMXSessionStateDidChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull notif) { - - // Check that 'fragment' has not been cancelled - if ([universalLinkFragmentPending isEqualToString:fragment]) + else if ([roomIdOrAlias hasPrefix:@"!"] && ((MXKAccount*)accountManager.activeAccounts.firstObject).mxSession.state != MXSessionStateRunning) { - // Check whether the concerned session is the associated one - if (notif.object == account.mxSession && account.mxSession.state == MXSessionStateRunning) + // The user does not know the room id but this may be because their session is not yet sync'ed + // So, wait for the completion of the sync and then retry + // FIXME: Manange all user's accounts not only the first one + MXKAccount* account = accountManager.activeAccounts.firstObject; + + NSLog(@"[AppDelegate] Universal link: Need to wait for the session to be sync'ed and running"); + universalLinkFragmentPending = fragment; + + universalLinkWaitingObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kMXSessionStateDidChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull notif) { + + // Check that 'fragment' has not been cancelled + if ([universalLinkFragmentPending isEqualToString:fragment]) + { + // Check whether the concerned session is the associated one + if (notif.object == account.mxSession && account.mxSession.state == MXSessionStateRunning) + { + NSLog(@"[AppDelegate] Universal link: The session is running. Retry the link"); + [self handleUniversalLinkFragment:fragment]; + } + } + }]; + } + else + { + NSLog(@"[AppDelegate] Universal link: The room (%@) is not known by any account (email invitation: %@). Display its preview to try to join it", roomIdOrAlias, queryParams ? @"YES" : @"NO"); + + // FIXME: In case of multi-account, ask the user which one to use + MXKAccount* account = accountManager.activeAccounts.firstObject; + + RoomPreviewData *roomPreviewData; + if (queryParams) { - NSLog(@"[AppDelegate] Universal link: The session is running. Retry the link"); - [self handleUniversalLinkFragment:fragment]; + // Note: the activity indicator will not disappear if the session is not ready + [_homeViewController stopActivityIndicator]; + + roomPreviewData = [[RoomPreviewData alloc] initWithRoomId:roomIdOrAlias emailInvitationParams:queryParams andSession:account.mxSession]; + [self showRoomPreview:roomPreviewData]; + } + else + { + roomPreviewData = [[RoomPreviewData alloc] initWithRoomId:roomIdOrAlias andSession:account.mxSession]; + + // Try to get more information about the room before opening its preview + [roomPreviewData fetchPreviewData:^(BOOL successed) { + + // Note: the activity indicator will not disappear if the session is not ready + [_homeViewController stopActivityIndicator]; + + [self showRoomPreview:roomPreviewData]; + }]; } } }]; @@ -850,29 +890,6 @@ // Let's say we are handling the case continueUserActivity = YES; } - else - { - NSLog(@"[AppDelegate] Universal link: The room (%@) is not known by any account (email invitation: %@). Display its preview to try to join it", roomIdOrAlias, queryParams ? @"YES" : @"NO"); - - // FIXME: In case of multi-account, ask the user which one to use - MXKAccount* account = accountManager.activeAccounts.firstObject; - - RoomPreviewData *roomPreviewData; - if (queryParams) - { - roomPreviewData = [[RoomPreviewData alloc] initWithRoomId:roomIdOrAlias emailInvitationParams:queryParams andSession:account.mxSession]; - [self showRoomPreview:roomPreviewData]; - } - else - { - roomPreviewData = [[RoomPreviewData alloc] initWithRoomId:roomIdOrAlias andSession:account.mxSession]; - - // Try to get more information about the room before opening its preview - [roomPreviewData fetchPreviewData:^(BOOL successed) { - [self showRoomPreview:roomPreviewData]; - }]; - } - } } else { diff --git a/Vector/ViewController/HomeViewController.m b/Vector/ViewController/HomeViewController.m index ae45f05f4..1e6e47021 100644 --- a/Vector/ViewController/HomeViewController.m +++ b/Vector/ViewController/HomeViewController.m @@ -367,6 +367,18 @@ [super setKeyboardHeight:keyboardHeight]; } +- (void)startActivityIndicator +{ + // Redirect the operation to main displayed VC + [recentsViewController startActivityIndicator]; +} + +- (void)stopActivityIndicator +{ + // Redirect the operation to main displayed VC + [recentsViewController stopActivityIndicator]; + } + #pragma mark - Override UIViewController+VectorSearch - (void)setKeyboardHeightForBackgroundImage:(CGFloat)keyboardHeight