2017-03-23 16:48:05 +00:00
|
|
|
|
/*
|
|
|
|
|
Copyright 2017 Vector Creations Ltd
|
2018-07-23 16:06:53 +00:00
|
|
|
|
Copyright 2018 New Vector Ltd
|
|
|
|
|
|
2017-03-23 16:48:05 +00:00
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
|
limitations under the License.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#import "MasterTabBarController.h"
|
|
|
|
|
|
|
|
|
|
#import "UnifiedSearchViewController.h"
|
|
|
|
|
|
|
|
|
|
#import "RecentsDataSource.h"
|
2017-12-12 15:03:26 +00:00
|
|
|
|
#import "GroupsDataSource.h"
|
2017-03-23 16:48:05 +00:00
|
|
|
|
|
|
|
|
|
|
2017-04-18 13:55:51 +00:00
|
|
|
|
#import "MXRoom+Riot.h"
|
2017-08-22 07:46:53 +00:00
|
|
|
|
#import "MXSession+Riot.h"
|
2017-04-18 13:55:51 +00:00
|
|
|
|
|
2020-05-04 17:59:11 +00:00
|
|
|
|
#import "SettingsViewController.h"
|
|
|
|
|
#import "SecurityViewController.h"
|
|
|
|
|
|
2018-07-02 12:51:47 +00:00
|
|
|
|
#import "Riot-Swift.h"
|
|
|
|
|
|
2020-09-15 14:48:35 +00:00
|
|
|
|
@interface MasterTabBarController () <AuthenticationViewControllerDelegate>
|
2017-03-23 16:48:05 +00:00
|
|
|
|
{
|
|
|
|
|
// Array of `MXSession` instances.
|
|
|
|
|
NSMutableArray *mxSessionArray;
|
|
|
|
|
|
|
|
|
|
// Tell whether the authentication screen is preparing.
|
|
|
|
|
BOOL isAuthViewControllerPreparing;
|
|
|
|
|
|
|
|
|
|
// Observer that checks when the Authentification view controller has gone.
|
|
|
|
|
id authViewControllerObserver;
|
2019-07-23 14:20:07 +00:00
|
|
|
|
id authViewRemovedAccountObserver;
|
2017-03-23 16:48:05 +00:00
|
|
|
|
|
|
|
|
|
// The parameters to pass to the Authentification view controller.
|
|
|
|
|
NSDictionary *authViewControllerRegistrationParameters;
|
2019-07-19 12:25:45 +00:00
|
|
|
|
MXCredentials *softLogoutCredentials;
|
2017-03-23 16:48:05 +00:00
|
|
|
|
|
2017-04-06 12:27:45 +00:00
|
|
|
|
// The recents data source shared between all the view controllers of the tab bar.
|
|
|
|
|
RecentsDataSource *recentsDataSource;
|
2021-05-20 19:42:04 +00:00
|
|
|
|
|
2017-03-23 16:48:05 +00:00
|
|
|
|
// Current alert (if any).
|
2017-07-14 14:41:25 +00:00
|
|
|
|
UIAlertController *currentAlert;
|
2017-07-21 09:28:17 +00:00
|
|
|
|
|
|
|
|
|
// Keep reference on the pushed view controllers to release them correctly
|
|
|
|
|
NSMutableArray *childViewControllers;
|
2017-08-11 14:56:09 +00:00
|
|
|
|
|
2019-01-11 09:32:56 +00:00
|
|
|
|
// Observe kThemeServiceDidChangeThemeNotification to handle user interface theme change.
|
|
|
|
|
id kThemeServiceDidChangeThemeNotificationObserver;
|
2017-12-12 15:03:26 +00:00
|
|
|
|
|
|
|
|
|
// The groups data source
|
|
|
|
|
GroupsDataSource *groupsDataSource;
|
2017-03-23 16:48:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2017-04-27 10:37:29 +00:00
|
|
|
|
@property(nonatomic,getter=isHidden) BOOL hidden;
|
|
|
|
|
|
2020-05-04 17:59:11 +00:00
|
|
|
|
@property(nonatomic) BOOL reviewSessionAlertHasBeenDisplayed;
|
2020-04-30 13:28:43 +00:00
|
|
|
|
|
2017-03-23 16:48:05 +00:00
|
|
|
|
@end
|
|
|
|
|
|
|
|
|
|
@implementation MasterTabBarController
|
|
|
|
|
|
2021-05-20 19:42:04 +00:00
|
|
|
|
#pragma mark - Properties override
|
|
|
|
|
|
|
|
|
|
- (HomeViewController *)homeViewController
|
|
|
|
|
{
|
|
|
|
|
return (HomeViewController*)[self viewControllerForClass:HomeViewController.class];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (FavouritesViewController *)favouritesViewController
|
|
|
|
|
{
|
|
|
|
|
return (FavouritesViewController*)[self viewControllerForClass:FavouritesViewController.class];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (PeopleViewController *)peopleViewController
|
|
|
|
|
{
|
|
|
|
|
return (PeopleViewController*)[self viewControllerForClass:PeopleViewController.class];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (RoomsViewController *)roomsViewController
|
|
|
|
|
{
|
|
|
|
|
return (RoomsViewController*)[self viewControllerForClass:RoomsViewController.class];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (GroupsViewController *)groupsViewController
|
|
|
|
|
{
|
|
|
|
|
return (GroupsViewController*)[self viewControllerForClass:GroupsViewController.class];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#pragma mark - Life cycle
|
|
|
|
|
|
2017-03-23 16:48:05 +00:00
|
|
|
|
- (void)viewDidLoad
|
|
|
|
|
{
|
|
|
|
|
[super viewDidLoad];
|
|
|
|
|
// Do any additional setup after loading the view, typically from a nib.
|
2020-05-05 07:17:47 +00:00
|
|
|
|
|
2020-09-15 14:48:35 +00:00
|
|
|
|
_authenticationInProgress = NO;
|
|
|
|
|
|
2020-05-05 07:17:47 +00:00
|
|
|
|
// Note: UITabBarViewController shoud not be embed in a UINavigationController (https://github.com/vector-im/riot-ios/issues/3086)
|
|
|
|
|
[self vc_removeBackTitle];
|
2017-04-14 15:01:44 +00:00
|
|
|
|
|
2017-07-21 09:28:17 +00:00
|
|
|
|
childViewControllers = [NSMutableArray array];
|
2017-08-11 14:56:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)userInterfaceThemeDidChange
|
|
|
|
|
{
|
2019-01-11 10:45:27 +00:00
|
|
|
|
[ThemeService.shared.theme applyStyleOnNavigationBar:self.navigationController.navigationBar];
|
2018-11-29 16:31:41 +00:00
|
|
|
|
|
2019-02-19 08:39:01 +00:00
|
|
|
|
[ThemeService.shared.theme applyStyleOnTabBar:self.tabBar];
|
2017-08-11 14:56:09 +00:00
|
|
|
|
|
2019-01-11 10:45:27 +00:00
|
|
|
|
self.view.backgroundColor = ThemeService.shared.theme.backgroundColor;
|
2017-08-11 14:56:09 +00:00
|
|
|
|
|
|
|
|
|
[self setNeedsStatusBarAppearanceUpdate];
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-08 15:02:25 +00:00
|
|
|
|
- (UIViewController *)childViewControllerForStatusBarStyle
|
2017-08-11 14:56:09 +00:00
|
|
|
|
{
|
2020-04-08 15:02:25 +00:00
|
|
|
|
return self.selectedViewController;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (UIViewController *)childViewControllerForStatusBarHidden
|
|
|
|
|
{
|
|
|
|
|
return self.selectedViewController;
|
2017-03-23 16:48:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2017-04-27 10:37:29 +00:00
|
|
|
|
- (void)viewWillAppear:(BOOL)animated
|
|
|
|
|
{
|
|
|
|
|
[super viewWillAppear:animated];
|
|
|
|
|
|
|
|
|
|
// Show the tab bar view controller content only when a user is logged in.
|
|
|
|
|
self.hidden = ([MXKAccountManager sharedManager].accounts.count == 0);
|
2021-04-23 20:26:54 +00:00
|
|
|
|
|
2021-05-20 19:42:04 +00:00
|
|
|
|
if (!kThemeServiceDidChangeThemeNotificationObserver)
|
|
|
|
|
{
|
|
|
|
|
// Observe user interface theme change.
|
|
|
|
|
kThemeServiceDidChangeThemeNotificationObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kThemeServiceDidChangeThemeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) {
|
|
|
|
|
|
|
|
|
|
[self userInterfaceThemeDidChange];
|
|
|
|
|
|
|
|
|
|
}];
|
|
|
|
|
[self userInterfaceThemeDidChange];
|
|
|
|
|
}
|
2017-04-27 10:37:29 +00:00
|
|
|
|
}
|
|
|
|
|
|
2017-03-23 16:48:05 +00:00
|
|
|
|
- (void)viewDidAppear:(BOOL)animated
|
|
|
|
|
{
|
2021-06-03 08:30:07 +00:00
|
|
|
|
MXLogDebug(@"[MasterTabBarController] viewDidAppear");
|
2017-03-23 16:48:05 +00:00
|
|
|
|
[super viewDidAppear:animated];
|
|
|
|
|
|
|
|
|
|
// Check whether we're not logged in
|
2019-07-19 12:25:45 +00:00
|
|
|
|
BOOL authIsShown = NO;
|
2017-03-23 16:48:05 +00:00
|
|
|
|
if (![MXKAccountManager sharedManager].accounts.count)
|
|
|
|
|
{
|
|
|
|
|
[self showAuthenticationScreen];
|
2019-07-19 12:25:45 +00:00
|
|
|
|
authIsShown = YES;
|
2017-03-23 16:48:05 +00:00
|
|
|
|
}
|
2019-07-19 12:25:45 +00:00
|
|
|
|
else if (![MXKAccountManager sharedManager].activeAccounts.count)
|
|
|
|
|
{
|
|
|
|
|
// Display a login screen if the account is soft logout
|
|
|
|
|
// Note: We support only one account
|
|
|
|
|
MXKAccount *account = [MXKAccountManager sharedManager].accounts.firstObject;
|
|
|
|
|
if (account.isSoftLogout)
|
|
|
|
|
{
|
|
|
|
|
[self showAuthenticationScreenAfterSoftLogout:account.mxCredentials];
|
|
|
|
|
authIsShown = YES;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!authIsShown)
|
2017-03-23 16:48:05 +00:00
|
|
|
|
{
|
|
|
|
|
// Check whether the user has been already prompted to send crash reports.
|
2018-07-02 12:51:47 +00:00
|
|
|
|
// (Check whether 'enableCrashReport' flag has been set once)
|
2018-07-02 16:04:52 +00:00
|
|
|
|
if (!RiotSettings.shared.isEnableCrashReportHasBeenSetOnce)
|
2017-03-23 16:48:05 +00:00
|
|
|
|
{
|
2018-06-27 08:43:22 +00:00
|
|
|
|
[self promptUserBeforeUsingAnalytics];
|
2017-03-23 16:48:05 +00:00
|
|
|
|
}
|
2017-04-14 15:01:44 +00:00
|
|
|
|
|
2017-04-28 12:06:58 +00:00
|
|
|
|
[self refreshTabBarBadges];
|
2017-07-21 09:28:17 +00:00
|
|
|
|
|
|
|
|
|
// Release properly pushed and/or presented view controller
|
|
|
|
|
if (childViewControllers.count)
|
|
|
|
|
{
|
|
|
|
|
for (id viewController in childViewControllers)
|
|
|
|
|
{
|
|
|
|
|
if ([viewController isKindOfClass:[UINavigationController class]])
|
|
|
|
|
{
|
|
|
|
|
UINavigationController *navigationController = (UINavigationController*)viewController;
|
|
|
|
|
for (id subViewController in navigationController.viewControllers)
|
|
|
|
|
{
|
|
|
|
|
if ([subViewController respondsToSelector:@selector(destroy)])
|
|
|
|
|
{
|
|
|
|
|
[subViewController destroy];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if ([viewController respondsToSelector:@selector(destroy)])
|
|
|
|
|
{
|
|
|
|
|
[viewController destroy];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[childViewControllers removeAllObjects];
|
|
|
|
|
}
|
2020-04-30 13:28:43 +00:00
|
|
|
|
|
2020-07-10 19:28:57 +00:00
|
|
|
|
[[AppDelegate theDelegate] checkAppVersion];
|
2017-03-23 16:48:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-05-20 19:42:04 +00:00
|
|
|
|
if (self.unifiedSearchViewController)
|
2017-03-23 16:48:05 +00:00
|
|
|
|
{
|
2021-05-20 19:42:04 +00:00
|
|
|
|
[self.unifiedSearchViewController destroy];
|
|
|
|
|
self.unifiedSearchViewController = nil;
|
2017-03-23 16:48:05 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-04-14 15:01:44 +00:00
|
|
|
|
- (void)viewDidDisappear:(BOOL)animated
|
|
|
|
|
{
|
|
|
|
|
[super viewDidDisappear:animated];
|
|
|
|
|
}
|
|
|
|
|
|
2017-03-23 16:48:05 +00:00
|
|
|
|
- (void)dealloc
|
|
|
|
|
{
|
|
|
|
|
mxSessionArray = nil;
|
|
|
|
|
|
|
|
|
|
if (currentAlert)
|
|
|
|
|
{
|
2017-07-14 14:41:25 +00:00
|
|
|
|
[currentAlert dismissViewControllerAnimated:NO completion:nil];
|
2017-03-23 16:48:05 +00:00
|
|
|
|
currentAlert = nil;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (authViewControllerObserver)
|
|
|
|
|
{
|
|
|
|
|
[[NSNotificationCenter defaultCenter] removeObserver:authViewControllerObserver];
|
|
|
|
|
authViewControllerObserver = nil;
|
|
|
|
|
}
|
2019-07-23 14:20:07 +00:00
|
|
|
|
if (authViewRemovedAccountObserver)
|
|
|
|
|
{
|
|
|
|
|
[[NSNotificationCenter defaultCenter] removeObserver:authViewRemovedAccountObserver];
|
|
|
|
|
authViewRemovedAccountObserver = nil;
|
|
|
|
|
}
|
2017-07-21 09:28:17 +00:00
|
|
|
|
|
2019-01-11 09:32:56 +00:00
|
|
|
|
if (kThemeServiceDidChangeThemeNotificationObserver)
|
2017-08-11 14:56:09 +00:00
|
|
|
|
{
|
2019-01-11 09:32:56 +00:00
|
|
|
|
[[NSNotificationCenter defaultCenter] removeObserver:kThemeServiceDidChangeThemeNotificationObserver];
|
|
|
|
|
kThemeServiceDidChangeThemeNotificationObserver = nil;
|
2017-08-11 14:56:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
2017-07-21 09:28:17 +00:00
|
|
|
|
childViewControllers = nil;
|
2017-03-23 16:48:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-05-20 19:42:04 +00:00
|
|
|
|
#pragma mark - Public
|
|
|
|
|
|
|
|
|
|
- (void)updateViewControllers:(NSArray<UIViewController*>*)viewControllers
|
|
|
|
|
{
|
|
|
|
|
self.viewControllers = viewControllers;
|
|
|
|
|
|
|
|
|
|
[self initializeDataSources];
|
|
|
|
|
|
|
|
|
|
// Adjust the display of the icons in the tabbar.
|
|
|
|
|
for (UITabBarItem *tabBarItem in self.tabBar.items)
|
|
|
|
|
{
|
|
|
|
|
if (@available(iOS 13.0, *))
|
|
|
|
|
{
|
|
|
|
|
// Fix iOS 13 misalignment tab bar images. Some titles are nil and other empty strings. Nil title behaves as if a non-empty title was set.
|
|
|
|
|
// Note: However no need to modify imageInsets property on iOS 13.
|
|
|
|
|
tabBarItem.title = @"";
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
tabBarItem.imageInsets = UIEdgeInsetsMake(5, 0, -5, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-03-23 16:48:05 +00:00
|
|
|
|
#pragma mark -
|
|
|
|
|
|
|
|
|
|
- (NSArray*)mxSessions
|
|
|
|
|
{
|
|
|
|
|
return [NSArray arrayWithArray:mxSessionArray];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)initializeDataSources
|
|
|
|
|
{
|
|
|
|
|
MXSession *mainSession = mxSessionArray.firstObject;
|
|
|
|
|
|
|
|
|
|
if (mainSession)
|
|
|
|
|
{
|
2021-06-03 08:30:07 +00:00
|
|
|
|
MXLogDebug(@"[MasterTabBarController] initializeDataSources");
|
2017-06-14 15:30:01 +00:00
|
|
|
|
|
2017-03-23 16:48:05 +00:00
|
|
|
|
// Init the recents data source
|
2017-04-06 12:27:45 +00:00
|
|
|
|
recentsDataSource = [[RecentsDataSource alloc] initWithMatrixSession:mainSession];
|
|
|
|
|
|
2021-05-20 19:42:04 +00:00
|
|
|
|
[self.homeViewController displayList:recentsDataSource];
|
|
|
|
|
[self.favouritesViewController displayList:recentsDataSource];
|
|
|
|
|
[self.peopleViewController displayList:recentsDataSource];
|
|
|
|
|
[self.roomsViewController displayList:recentsDataSource];
|
2017-03-23 16:48:05 +00:00
|
|
|
|
|
2017-06-14 15:30:01 +00:00
|
|
|
|
// Restore the right delegate of the shared recent data source.
|
2021-05-20 19:42:04 +00:00
|
|
|
|
id<MXKDataSourceDelegate> recentsDataSourceDelegate = self.homeViewController;
|
2017-06-14 15:30:01 +00:00
|
|
|
|
RecentsDataSourceMode recentsDataSourceMode = RecentsDataSourceModeHome;
|
2021-05-20 19:42:04 +00:00
|
|
|
|
|
|
|
|
|
NSInteger tabItemTag = self.tabBar.items[self.selectedIndex].tag;
|
|
|
|
|
|
|
|
|
|
switch (tabItemTag)
|
2017-06-14 15:30:01 +00:00
|
|
|
|
{
|
|
|
|
|
case TABBAR_HOME_INDEX:
|
|
|
|
|
break;
|
|
|
|
|
case TABBAR_FAVOURITES_INDEX:
|
2021-05-20 19:42:04 +00:00
|
|
|
|
recentsDataSourceDelegate = self.favouritesViewController;
|
2017-06-14 15:30:01 +00:00
|
|
|
|
recentsDataSourceMode = RecentsDataSourceModeFavourites;
|
|
|
|
|
break;
|
|
|
|
|
case TABBAR_PEOPLE_INDEX:
|
2021-05-20 19:42:04 +00:00
|
|
|
|
recentsDataSourceDelegate = self.peopleViewController;
|
2017-06-14 15:30:01 +00:00
|
|
|
|
recentsDataSourceMode = RecentsDataSourceModePeople;
|
|
|
|
|
break;
|
|
|
|
|
case TABBAR_ROOMS_INDEX:
|
2021-05-20 19:42:04 +00:00
|
|
|
|
recentsDataSourceDelegate = self.roomsViewController;
|
2017-06-14 15:30:01 +00:00
|
|
|
|
recentsDataSourceMode = RecentsDataSourceModeRooms;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
[recentsDataSource setDelegate:recentsDataSourceDelegate andRecentsDataSourceMode:recentsDataSourceMode];
|
|
|
|
|
|
2017-12-12 15:03:26 +00:00
|
|
|
|
// Init the recents data source
|
|
|
|
|
groupsDataSource = [[GroupsDataSource alloc] initWithMatrixSession:mainSession];
|
|
|
|
|
[groupsDataSource finalizeInitialization];
|
2021-05-20 19:42:04 +00:00
|
|
|
|
[self.groupsViewController displayList:groupsDataSource];
|
2017-12-12 15:03:26 +00:00
|
|
|
|
|
2017-03-23 16:48:05 +00:00
|
|
|
|
// Check whether there are others sessions
|
|
|
|
|
NSArray* mxSessions = self.mxSessions;
|
|
|
|
|
if (mxSessions.count > 1)
|
|
|
|
|
{
|
|
|
|
|
for (MXSession *mxSession in mxSessions)
|
|
|
|
|
{
|
|
|
|
|
if (mxSession != mainSession)
|
|
|
|
|
{
|
|
|
|
|
// Add the session to the recents data source
|
2017-04-06 12:27:45 +00:00
|
|
|
|
[recentsDataSource addMatrixSession:mxSession];
|
2017-03-23 16:48:05 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)addMatrixSession:(MXSession *)mxSession
|
|
|
|
|
{
|
|
|
|
|
// Check whether the controller's view is loaded into memory.
|
2021-05-20 19:42:04 +00:00
|
|
|
|
if (self.homeViewController)
|
2017-03-23 16:48:05 +00:00
|
|
|
|
{
|
|
|
|
|
// Check whether the data sources have been initialized.
|
2017-04-06 12:27:45 +00:00
|
|
|
|
if (!recentsDataSource)
|
2017-03-23 16:48:05 +00:00
|
|
|
|
{
|
|
|
|
|
// Add first the session. The updated sessions list will be used during data sources initialization.
|
|
|
|
|
mxSessionArray = [NSMutableArray array];
|
|
|
|
|
[mxSessionArray addObject:mxSession];
|
|
|
|
|
|
|
|
|
|
// Prepare data sources and return
|
|
|
|
|
[self initializeDataSources];
|
2020-04-30 13:28:43 +00:00
|
|
|
|
|
|
|
|
|
// Add matrix sessions observer on first added session
|
|
|
|
|
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onMatrixSessionStateDidChange:) name:kMXSessionStateDidChangeNotification object:nil];
|
2017-03-23 16:48:05 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2017-04-06 12:27:45 +00:00
|
|
|
|
// Add the session to the existing data sources
|
|
|
|
|
[recentsDataSource addMatrixSession:mxSession];
|
2017-03-23 16:48:05 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!mxSessionArray)
|
|
|
|
|
{
|
|
|
|
|
mxSessionArray = [NSMutableArray array];
|
2017-04-18 13:55:51 +00:00
|
|
|
|
|
|
|
|
|
// Add matrix sessions observer on first added session
|
|
|
|
|
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onMatrixSessionStateDidChange:) name:kMXSessionStateDidChangeNotification object:nil];
|
2017-03-23 16:48:05 +00:00
|
|
|
|
}
|
|
|
|
|
[mxSessionArray addObject:mxSession];
|
2017-12-12 15:03:26 +00:00
|
|
|
|
|
|
|
|
|
// @TODO: handle multi sessions for groups
|
2017-03-23 16:48:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)removeMatrixSession:(MXSession *)mxSession
|
|
|
|
|
{
|
2017-04-06 12:27:45 +00:00
|
|
|
|
[recentsDataSource removeMatrixSession:mxSession];
|
2017-03-23 16:48:05 +00:00
|
|
|
|
|
|
|
|
|
// Check whether there are others sessions
|
2017-04-06 12:27:45 +00:00
|
|
|
|
if (!recentsDataSource.mxSessions.count)
|
2017-03-23 16:48:05 +00:00
|
|
|
|
{
|
2017-04-18 13:55:51 +00:00
|
|
|
|
// Remove matrix sessions observer
|
|
|
|
|
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXSessionStateDidChangeNotification object:nil];
|
|
|
|
|
|
2021-05-20 19:42:04 +00:00
|
|
|
|
[self.homeViewController displayList:nil];
|
|
|
|
|
[self.favouritesViewController displayList:nil];
|
|
|
|
|
[self.peopleViewController displayList:nil];
|
|
|
|
|
[self.roomsViewController displayList:nil];
|
2017-04-06 12:27:45 +00:00
|
|
|
|
|
|
|
|
|
[recentsDataSource destroy];
|
|
|
|
|
recentsDataSource = nil;
|
2017-03-23 16:48:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[mxSessionArray removeObject:mxSession];
|
2017-12-12 15:03:26 +00:00
|
|
|
|
|
|
|
|
|
// @TODO: handle multi sessions for groups
|
2017-03-23 16:48:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2017-04-18 13:55:51 +00:00
|
|
|
|
- (void)onMatrixSessionStateDidChange:(NSNotification *)notif
|
|
|
|
|
{
|
2017-04-28 12:06:58 +00:00
|
|
|
|
[self refreshTabBarBadges];
|
2017-04-18 13:55:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-05-20 19:42:04 +00:00
|
|
|
|
// TODO: Move authentication presentation in an AuthenticationCoordinator managed at AppCoordinator level
|
|
|
|
|
- (void)presentAuthenticationViewController
|
|
|
|
|
{
|
|
|
|
|
AuthenticationViewController *authenticationViewController = [AuthenticationViewController authenticationViewController];
|
|
|
|
|
|
|
|
|
|
authenticationViewController.modalPresentationStyle = UIModalPresentationFullScreen;
|
|
|
|
|
|
|
|
|
|
[self presentViewController:authenticationViewController animated:YES completion:nil];
|
|
|
|
|
|
|
|
|
|
// Keep ref on the authentification view controller while it is displayed
|
|
|
|
|
// ie until we get the notification about a new account
|
|
|
|
|
_authViewController = authenticationViewController;
|
|
|
|
|
isAuthViewControllerPreparing = NO;
|
|
|
|
|
|
|
|
|
|
// Listen to the end of the authentication flow
|
|
|
|
|
_authViewController.authVCDelegate = self;
|
|
|
|
|
|
|
|
|
|
authViewControllerObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kMXKAccountManagerDidAddAccountNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) {
|
|
|
|
|
|
|
|
|
|
_authViewController = nil;
|
|
|
|
|
|
|
|
|
|
[[NSNotificationCenter defaultCenter] removeObserver:authViewControllerObserver];
|
|
|
|
|
authViewControllerObserver = nil;
|
|
|
|
|
}];
|
|
|
|
|
|
|
|
|
|
authViewRemovedAccountObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kMXKAccountManagerDidRemoveAccountNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) {
|
|
|
|
|
|
|
|
|
|
// The user has cleared data for their soft logged out account
|
|
|
|
|
_authViewController = nil;
|
|
|
|
|
|
|
|
|
|
[[NSNotificationCenter defaultCenter] removeObserver:authViewRemovedAccountObserver];
|
|
|
|
|
authViewRemovedAccountObserver = nil;
|
|
|
|
|
}];
|
|
|
|
|
|
|
|
|
|
// Forward parameters if any
|
|
|
|
|
if (authViewControllerRegistrationParameters)
|
|
|
|
|
{
|
|
|
|
|
_authViewController.externalRegistrationParameters = authViewControllerRegistrationParameters;
|
|
|
|
|
authViewControllerRegistrationParameters = nil;
|
|
|
|
|
}
|
|
|
|
|
if (softLogoutCredentials)
|
|
|
|
|
{
|
|
|
|
|
_authViewController.softLogoutCredentials = softLogoutCredentials;
|
|
|
|
|
softLogoutCredentials = nil;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-03-23 16:48:05 +00:00
|
|
|
|
- (void)showAuthenticationScreen
|
|
|
|
|
{
|
2021-06-03 08:30:07 +00:00
|
|
|
|
MXLogDebug(@"[MasterTabBarController] showAuthenticationScreen");
|
2017-10-30 15:39:58 +00:00
|
|
|
|
|
2017-03-23 16:48:05 +00:00
|
|
|
|
// Check whether an authentication screen is not already shown or preparing
|
|
|
|
|
if (!self.authViewController && !isAuthViewControllerPreparing)
|
|
|
|
|
{
|
|
|
|
|
isAuthViewControllerPreparing = YES;
|
2020-09-15 14:48:35 +00:00
|
|
|
|
_authenticationInProgress = YES;
|
2017-03-23 16:48:05 +00:00
|
|
|
|
|
2020-05-04 17:59:11 +00:00
|
|
|
|
[self resetReviewSessionsFlags];
|
|
|
|
|
|
2017-03-23 16:48:05 +00:00
|
|
|
|
[[AppDelegate theDelegate] restoreInitialDisplay:^{
|
2021-05-20 19:42:04 +00:00
|
|
|
|
|
|
|
|
|
[self presentAuthenticationViewController];
|
2017-03-23 16:48:05 +00:00
|
|
|
|
}];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)showAuthenticationScreenWithRegistrationParameters:(NSDictionary *)parameters
|
|
|
|
|
{
|
|
|
|
|
if (self.authViewController)
|
|
|
|
|
{
|
2021-06-03 08:30:07 +00:00
|
|
|
|
MXLogDebug(@"[MasterTabBarController] Universal link: Forward registration parameter to the existing AuthViewController");
|
2017-03-23 16:48:05 +00:00
|
|
|
|
self.authViewController.externalRegistrationParameters = parameters;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2021-06-03 08:30:07 +00:00
|
|
|
|
MXLogDebug(@"[MasterTabBarController] Universal link: Prompt to logout current sessions and open AuthViewController to complete the registration");
|
2017-03-23 16:48:05 +00:00
|
|
|
|
|
|
|
|
|
// Keep a ref on the params
|
|
|
|
|
authViewControllerRegistrationParameters = parameters;
|
|
|
|
|
|
2018-04-17 19:39:31 +00:00
|
|
|
|
// Prompt to logout. It will then display AuthViewController if the user is logged out.
|
|
|
|
|
[[AppDelegate theDelegate] logoutWithConfirmation:YES completion:^(BOOL isLoggedOut) {
|
|
|
|
|
if (!isLoggedOut)
|
|
|
|
|
{
|
|
|
|
|
// Reset temporary params
|
|
|
|
|
authViewControllerRegistrationParameters = nil;
|
|
|
|
|
}
|
|
|
|
|
}];
|
2017-03-23 16:48:05 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-07-19 12:25:45 +00:00
|
|
|
|
- (void)showAuthenticationScreenAfterSoftLogout:(MXCredentials*)credentials;
|
|
|
|
|
{
|
2021-06-03 08:30:07 +00:00
|
|
|
|
MXLogDebug(@"[MasterTabBarController] showAuthenticationScreenAfterSoftLogout");
|
2019-07-19 12:25:45 +00:00
|
|
|
|
|
|
|
|
|
softLogoutCredentials = credentials;
|
|
|
|
|
|
|
|
|
|
// Check whether an authentication screen is not already shown or preparing
|
|
|
|
|
if (!self.authViewController && !isAuthViewControllerPreparing)
|
|
|
|
|
{
|
|
|
|
|
isAuthViewControllerPreparing = YES;
|
2020-09-15 14:48:35 +00:00
|
|
|
|
_authenticationInProgress = YES;
|
2019-07-19 12:25:45 +00:00
|
|
|
|
|
|
|
|
|
[[AppDelegate theDelegate] restoreInitialDisplay:^{
|
|
|
|
|
|
2021-05-20 19:42:04 +00:00
|
|
|
|
[self presentAuthenticationViewController];
|
2019-07-19 12:25:45 +00:00
|
|
|
|
}];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-09-07 08:01:06 +00:00
|
|
|
|
- (void)showRoomDetails
|
|
|
|
|
{
|
|
|
|
|
[self releaseCurrentDetailsViewController];
|
|
|
|
|
|
|
|
|
|
if (_selectedRoomPreviewData)
|
|
|
|
|
{
|
|
|
|
|
// Replace the rootviewcontroller with a room view controller
|
|
|
|
|
// Get the RoomViewController from the storyboard
|
|
|
|
|
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
|
|
|
|
|
_currentRoomViewController = [storyboard instantiateViewControllerWithIdentifier:@"RoomViewControllerStoryboardId"];
|
|
|
|
|
|
2020-09-24 13:55:59 +00:00
|
|
|
|
[self.masterTabBarDelegate masterTabBarController:self wantsToDisplayDetailViewController:_currentRoomViewController];
|
2020-09-07 08:01:06 +00:00
|
|
|
|
|
|
|
|
|
[_currentRoomViewController displayRoomPreview:_selectedRoomPreviewData];
|
|
|
|
|
_selectedRoomPreviewData = nil;
|
|
|
|
|
|
|
|
|
|
[self setupLeftBarButtonItem];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
MXWeakify(self);
|
|
|
|
|
void (^openRoomDataSource)(MXKRoomDataSource *roomDataSource) = ^(MXKRoomDataSource *roomDataSource) {
|
|
|
|
|
MXStrongifyAndReturnIfNil(self);
|
|
|
|
|
|
|
|
|
|
// Replace the rootviewcontroller with a room view controller
|
|
|
|
|
// Get the RoomViewController from the storyboard
|
|
|
|
|
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
|
|
|
|
|
self->_currentRoomViewController = [storyboard instantiateViewControllerWithIdentifier:@"RoomViewControllerStoryboardId"];
|
|
|
|
|
|
2020-09-24 13:55:59 +00:00
|
|
|
|
[self.masterTabBarDelegate masterTabBarController:self wantsToDisplayDetailViewController:self.currentRoomViewController];
|
2020-09-07 08:01:06 +00:00
|
|
|
|
|
|
|
|
|
[self.currentRoomViewController displayRoom:roomDataSource];
|
|
|
|
|
|
|
|
|
|
[self setupLeftBarButtonItem];
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (_selectedRoomDataSource)
|
|
|
|
|
{
|
|
|
|
|
// If the room data source is already loaded, display it
|
|
|
|
|
openRoomDataSource(_selectedRoomDataSource);
|
|
|
|
|
_selectedRoomDataSource = nil;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// Else, load it. The user may see the EmptyDetailsViewControllerStoryboardId
|
|
|
|
|
// screen in this case
|
|
|
|
|
[self dataSourceOfRoomToDisplay:^(MXKRoomDataSource *roomDataSource) {
|
|
|
|
|
openRoomDataSource(roomDataSource);
|
|
|
|
|
}];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-03-23 16:48:05 +00:00
|
|
|
|
- (void)selectRoomWithId:(NSString*)roomId andEventId:(NSString*)eventId inMatrixSession:(MXSession*)matrixSession
|
2018-08-27 15:14:28 +00:00
|
|
|
|
{
|
|
|
|
|
[self selectRoomWithId:roomId andEventId:eventId inMatrixSession:matrixSession completion:nil];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)selectRoomWithId:(NSString*)roomId andEventId:(NSString*)eventId inMatrixSession:(MXSession*)matrixSession completion:(void (^)(void))completion
|
2017-03-23 16:48:05 +00:00
|
|
|
|
{
|
|
|
|
|
if (_selectedRoomId && [_selectedRoomId isEqualToString:roomId]
|
|
|
|
|
&& _selectedEventId && [_selectedEventId isEqualToString:eventId]
|
|
|
|
|
&& _selectedRoomSession && _selectedRoomSession == matrixSession)
|
|
|
|
|
{
|
|
|
|
|
// Nothing to do
|
2018-08-27 15:14:28 +00:00
|
|
|
|
if (completion)
|
|
|
|
|
{
|
|
|
|
|
completion();
|
|
|
|
|
}
|
2017-03-23 16:48:05 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_selectedRoomId = roomId;
|
|
|
|
|
_selectedEventId = eventId;
|
|
|
|
|
_selectedRoomSession = matrixSession;
|
|
|
|
|
|
|
|
|
|
if (roomId && matrixSession)
|
|
|
|
|
{
|
2018-08-09 14:30:31 +00:00
|
|
|
|
// Preload the data source before performing the segue
|
|
|
|
|
MXWeakify(self);
|
|
|
|
|
[self dataSourceOfRoomToDisplay:^(MXKRoomDataSource *roomDataSource) {
|
|
|
|
|
MXStrongifyAndReturnIfNil(self);
|
2018-08-27 15:14:28 +00:00
|
|
|
|
|
2018-08-09 14:30:31 +00:00
|
|
|
|
self->_selectedRoomDataSource = roomDataSource;
|
2018-08-27 15:14:28 +00:00
|
|
|
|
|
2020-09-07 08:01:06 +00:00
|
|
|
|
[self showRoomDetails];
|
2018-08-27 15:14:28 +00:00
|
|
|
|
|
|
|
|
|
if (completion)
|
|
|
|
|
{
|
|
|
|
|
completion();
|
|
|
|
|
}
|
2018-08-09 14:30:31 +00:00
|
|
|
|
}];
|
2017-03-23 16:48:05 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2017-03-28 15:26:50 +00:00
|
|
|
|
[self releaseSelectedItem];
|
2018-08-27 15:14:28 +00:00
|
|
|
|
if (completion)
|
|
|
|
|
{
|
|
|
|
|
completion();
|
|
|
|
|
}
|
2017-03-23 16:48:05 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)showRoomPreview:(RoomPreviewData *)roomPreviewData
|
|
|
|
|
{
|
|
|
|
|
_selectedRoomPreviewData = roomPreviewData;
|
|
|
|
|
_selectedRoomId = roomPreviewData.roomId;
|
|
|
|
|
_selectedRoomSession = roomPreviewData.mxSession;
|
|
|
|
|
|
2020-09-07 08:01:06 +00:00
|
|
|
|
[self showRoomDetails];
|
2017-03-23 16:48:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2017-03-28 15:26:50 +00:00
|
|
|
|
- (void)selectContact:(MXKContact*)contact
|
|
|
|
|
{
|
|
|
|
|
_selectedContact = contact;
|
|
|
|
|
|
2020-09-07 08:01:06 +00:00
|
|
|
|
[self showContactDetails];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)showContactDetails
|
|
|
|
|
{
|
|
|
|
|
[self releaseCurrentDetailsViewController];
|
|
|
|
|
|
|
|
|
|
// Replace the rootviewcontroller with a contact details view controller
|
|
|
|
|
_currentContactDetailViewController = [ContactDetailsViewController contactDetailsViewController];
|
|
|
|
|
_currentContactDetailViewController.enableVoipCall = NO;
|
|
|
|
|
_currentContactDetailViewController.contact = _selectedContact;
|
|
|
|
|
|
2020-09-24 13:55:59 +00:00
|
|
|
|
[self.masterTabBarDelegate masterTabBarController:self wantsToDisplayDetailViewController:_currentContactDetailViewController];
|
2020-09-07 08:01:06 +00:00
|
|
|
|
|
|
|
|
|
[self setupLeftBarButtonItem];
|
2017-03-28 15:26:50 +00:00
|
|
|
|
}
|
|
|
|
|
|
2017-12-12 15:03:26 +00:00
|
|
|
|
- (void)selectGroup:(MXGroup*)group inMatrixSession:(MXSession*)matrixSession
|
|
|
|
|
{
|
|
|
|
|
_selectedGroup = group;
|
|
|
|
|
_selectedGroupSession = matrixSession;
|
|
|
|
|
|
2020-09-07 08:01:06 +00:00
|
|
|
|
[self showGroupDetails];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)showGroupDetails
|
|
|
|
|
{
|
|
|
|
|
[self releaseCurrentDetailsViewController];
|
|
|
|
|
|
|
|
|
|
// Replace the rootviewcontroller with a group details view controller
|
|
|
|
|
_currentGroupDetailViewController = [GroupDetailsViewController groupDetailsViewController];
|
|
|
|
|
[_currentGroupDetailViewController setGroup:_selectedGroup withMatrixSession:_selectedGroupSession];
|
|
|
|
|
|
2020-09-24 13:55:59 +00:00
|
|
|
|
[self.masterTabBarDelegate masterTabBarController:self wantsToDisplayDetailViewController:_currentGroupDetailViewController];
|
2020-09-07 08:01:06 +00:00
|
|
|
|
|
|
|
|
|
[self setupLeftBarButtonItem];
|
2017-12-12 15:03:26 +00:00
|
|
|
|
}
|
|
|
|
|
|
2017-03-28 15:26:50 +00:00
|
|
|
|
- (void)releaseSelectedItem
|
2017-03-23 16:48:05 +00:00
|
|
|
|
{
|
|
|
|
|
_selectedRoomId = nil;
|
|
|
|
|
_selectedEventId = nil;
|
|
|
|
|
_selectedRoomSession = nil;
|
2018-08-09 14:30:31 +00:00
|
|
|
|
_selectedRoomDataSource = nil;
|
|
|
|
|
_selectedRoomPreviewData = nil;
|
2017-03-23 16:48:05 +00:00
|
|
|
|
|
2017-03-28 15:26:50 +00:00
|
|
|
|
_selectedContact = nil;
|
|
|
|
|
|
2017-12-12 15:03:26 +00:00
|
|
|
|
_selectedGroup = nil;
|
|
|
|
|
_selectedGroupSession = nil;
|
|
|
|
|
|
2017-12-22 13:33:40 +00:00
|
|
|
|
[self releaseCurrentDetailsViewController];
|
2017-03-23 16:48:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2017-04-18 13:55:51 +00:00
|
|
|
|
- (NSUInteger)missedDiscussionsCount
|
|
|
|
|
{
|
|
|
|
|
NSUInteger roomCount = 0;
|
|
|
|
|
|
|
|
|
|
// Considering all the current sessions.
|
|
|
|
|
for (MXSession *session in mxSessionArray)
|
|
|
|
|
{
|
2020-06-25 08:23:24 +00:00
|
|
|
|
roomCount += [session vc_missedDiscussionsCount];
|
2017-04-18 13:55:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return roomCount;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (NSUInteger)missedHighlightDiscussionsCount
|
|
|
|
|
{
|
|
|
|
|
NSUInteger roomCount = 0;
|
|
|
|
|
|
|
|
|
|
for (MXSession *session in mxSessionArray)
|
|
|
|
|
{
|
|
|
|
|
roomCount += [session missedHighlightDiscussionsCount];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return roomCount;
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-20 19:42:04 +00:00
|
|
|
|
- (UIViewController*)viewControllerForClass:(Class)klass
|
2017-03-23 16:48:05 +00:00
|
|
|
|
{
|
2021-05-20 19:42:04 +00:00
|
|
|
|
UIViewController *foundViewController;
|
2020-09-07 08:01:06 +00:00
|
|
|
|
|
2021-05-20 19:42:04 +00:00
|
|
|
|
NSInteger viewControllerIndex = [self.viewControllers indexOfObjectPassingTest:^BOOL(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
|
|
|
|
|
if ([obj isKindOfClass:klass])
|
2020-09-07 08:01:06 +00:00
|
|
|
|
{
|
2021-05-20 19:42:04 +00:00
|
|
|
|
*stop = YES;
|
|
|
|
|
return YES;
|
2017-03-28 15:26:50 +00:00
|
|
|
|
}
|
2021-05-20 19:42:04 +00:00
|
|
|
|
return NO;
|
|
|
|
|
}];
|
|
|
|
|
|
|
|
|
|
if (viewControllerIndex != NSNotFound)
|
2017-03-23 16:48:05 +00:00
|
|
|
|
{
|
2021-05-20 19:42:04 +00:00
|
|
|
|
foundViewController = self.viewControllers[viewControllerIndex];
|
2017-03-23 16:48:05 +00:00
|
|
|
|
}
|
2017-03-28 15:26:50 +00:00
|
|
|
|
|
2021-05-20 19:42:04 +00:00
|
|
|
|
return foundViewController;
|
2017-03-23 16:48:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-05-20 19:42:04 +00:00
|
|
|
|
#pragma mark -
|
|
|
|
|
|
2018-07-20 08:43:04 +00:00
|
|
|
|
/**
|
|
|
|
|
Load the data source of the room to open.
|
|
|
|
|
|
|
|
|
|
@param onComplete a block providing the loaded room data source.
|
|
|
|
|
*/
|
|
|
|
|
- (void)dataSourceOfRoomToDisplay:(void (^)(MXKRoomDataSource *roomDataSource))onComplete
|
|
|
|
|
{
|
|
|
|
|
// Check whether an event has been selected from messages or files search tab.
|
2021-05-20 19:42:04 +00:00
|
|
|
|
MXEvent *selectedSearchEvent = self.unifiedSearchViewController.selectedSearchEvent;
|
|
|
|
|
MXSession *selectedSearchEventSession = self.unifiedSearchViewController.selectedSearchEventSession;
|
2018-07-20 08:43:04 +00:00
|
|
|
|
|
|
|
|
|
if (!selectedSearchEvent)
|
|
|
|
|
{
|
|
|
|
|
if (!_selectedEventId)
|
|
|
|
|
{
|
|
|
|
|
// LIVE: Show the room live timeline managed by MXKRoomDataSourceManager
|
|
|
|
|
MXKRoomDataSourceManager *roomDataSourceManager = [MXKRoomDataSourceManager sharedManagerForMatrixSession:_selectedRoomSession];
|
|
|
|
|
|
|
|
|
|
[roomDataSourceManager roomDataSourceForRoom:_selectedRoomId create:YES onComplete:^(MXKRoomDataSource *roomDataSource) {
|
|
|
|
|
onComplete(roomDataSource);
|
|
|
|
|
}];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// Open the room on the requested event
|
|
|
|
|
[RoomDataSource loadRoomDataSourceWithRoomId:_selectedRoomId initialEventId:_selectedEventId andMatrixSession:_selectedRoomSession onComplete:^(id roomDataSource) {
|
|
|
|
|
|
|
|
|
|
((RoomDataSource*)roomDataSource).markTimelineInitialEvent = YES;
|
|
|
|
|
|
|
|
|
|
// Give the data source ownership to the room view controller.
|
|
|
|
|
self.currentRoomViewController.hasRoomDataSourceOwnership = YES;
|
|
|
|
|
|
|
|
|
|
onComplete(roomDataSource);
|
|
|
|
|
}];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// Search result: Create a temp timeline from the selected event
|
|
|
|
|
[RoomDataSource loadRoomDataSourceWithRoomId:selectedSearchEvent.roomId initialEventId:selectedSearchEvent.eventId andMatrixSession:selectedSearchEventSession onComplete:^(id roomDataSource) {
|
|
|
|
|
|
|
|
|
|
[roomDataSource finalizeInitialization];
|
|
|
|
|
|
|
|
|
|
((RoomDataSource*)roomDataSource).markTimelineInitialEvent = YES;
|
|
|
|
|
|
|
|
|
|
// Give the data source ownership to the room view controller.
|
|
|
|
|
self.currentRoomViewController.hasRoomDataSourceOwnership = YES;
|
|
|
|
|
|
|
|
|
|
onComplete(roomDataSource);
|
|
|
|
|
}];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2018-07-23 16:06:53 +00:00
|
|
|
|
- (void)setupLeftBarButtonItem
|
|
|
|
|
{
|
|
|
|
|
if (self.splitViewController)
|
|
|
|
|
{
|
|
|
|
|
// Refresh selected cell without scrolling the selected cell (We suppose it's visible here)
|
|
|
|
|
[self refreshCurrentSelectedCell:NO];
|
|
|
|
|
|
|
|
|
|
if (_currentRoomViewController)
|
|
|
|
|
{
|
|
|
|
|
_currentRoomViewController.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem;
|
|
|
|
|
_currentRoomViewController.navigationItem.leftItemsSupplementBackButton = YES;
|
|
|
|
|
}
|
|
|
|
|
else if (_currentContactDetailViewController)
|
|
|
|
|
{
|
|
|
|
|
_currentContactDetailViewController.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem;
|
|
|
|
|
_currentContactDetailViewController.navigationItem.leftItemsSupplementBackButton = YES;
|
|
|
|
|
}
|
|
|
|
|
else if (_currentGroupDetailViewController)
|
|
|
|
|
{
|
|
|
|
|
_currentGroupDetailViewController.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem;
|
|
|
|
|
_currentGroupDetailViewController.navigationItem.leftItemsSupplementBackButton = YES;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-07-21 09:28:17 +00:00
|
|
|
|
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
|
|
|
|
|
{
|
|
|
|
|
// Keep ref on presented view controller
|
|
|
|
|
[childViewControllers addObject:viewControllerToPresent];
|
|
|
|
|
|
|
|
|
|
[super presentViewController:viewControllerToPresent animated:flag completion:completion];
|
|
|
|
|
}
|
|
|
|
|
|
2017-03-27 13:59:51 +00:00
|
|
|
|
// Made the actual selected view controller update its selected cell.
|
|
|
|
|
- (void)refreshCurrentSelectedCell:(BOOL)forceVisible
|
|
|
|
|
{
|
|
|
|
|
UIViewController *selectedViewController = self.selectedViewController;
|
|
|
|
|
|
|
|
|
|
if ([selectedViewController respondsToSelector:@selector(refreshCurrentSelectedCell:)])
|
|
|
|
|
{
|
|
|
|
|
[(id)selectedViewController refreshCurrentSelectedCell:forceVisible];
|
2017-04-27 10:37:29 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-12-22 13:33:40 +00:00
|
|
|
|
- (void)releaseCurrentDetailsViewController
|
|
|
|
|
{
|
|
|
|
|
// Release the existing details view controller (if any).
|
|
|
|
|
if (_currentRoomViewController)
|
|
|
|
|
{
|
|
|
|
|
// If the displayed data is not a preview, let the manager release the room data source
|
|
|
|
|
// (except if the view controller has the room data source ownership).
|
|
|
|
|
if (!_currentRoomViewController.roomPreviewData && _currentRoomViewController.roomDataSource && !_currentRoomViewController.hasRoomDataSourceOwnership)
|
|
|
|
|
{
|
|
|
|
|
MXSession *mxSession = _currentRoomViewController.roomDataSource.mxSession;
|
|
|
|
|
MXKRoomDataSourceManager *roomDataSourceManager = [MXKRoomDataSourceManager sharedManagerForMatrixSession:mxSession];
|
|
|
|
|
|
|
|
|
|
// Let the manager release live room data sources where the user is in
|
2018-08-08 08:33:10 +00:00
|
|
|
|
[roomDataSourceManager closeRoomDataSourceWithRoomId:_currentRoomViewController.roomDataSource.roomId forceClose:NO];
|
2017-12-22 13:33:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[_currentRoomViewController destroy];
|
|
|
|
|
_currentRoomViewController = nil;
|
|
|
|
|
}
|
|
|
|
|
else if (_currentContactDetailViewController)
|
|
|
|
|
{
|
|
|
|
|
[_currentContactDetailViewController destroy];
|
|
|
|
|
_currentContactDetailViewController = nil;
|
|
|
|
|
}
|
|
|
|
|
else if (_currentGroupDetailViewController)
|
|
|
|
|
{
|
|
|
|
|
[_currentGroupDetailViewController destroy];
|
|
|
|
|
_currentGroupDetailViewController = nil;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-04-27 10:37:29 +00:00
|
|
|
|
- (void)setHidden:(BOOL)hidden
|
|
|
|
|
{
|
|
|
|
|
_hidden = hidden;
|
|
|
|
|
|
2019-01-11 10:45:27 +00:00
|
|
|
|
[self.view superview].backgroundColor = ThemeService.shared.theme.backgroundColor;
|
2017-04-27 10:37:29 +00:00
|
|
|
|
self.view.hidden = hidden;
|
|
|
|
|
self.navigationController.navigationBar.hidden = hidden;
|
|
|
|
|
}
|
2017-03-27 13:59:51 +00:00
|
|
|
|
|
2017-04-14 15:01:44 +00:00
|
|
|
|
#pragma mark -
|
|
|
|
|
|
2021-04-19 16:53:32 +00:00
|
|
|
|
- (void)refreshTabBarBadges
|
|
|
|
|
{
|
|
|
|
|
// Use a middle dot to signal missed notif in favourites
|
|
|
|
|
if (RiotSettings.shared.homeScreenShowFavouritesTab)
|
2021-03-11 08:01:44 +00:00
|
|
|
|
{
|
2021-04-19 16:53:32 +00:00
|
|
|
|
[self setMissedDiscussionsMark:(recentsDataSource.missedFavouriteDiscussionsCount? @"\u00B7": nil)
|
|
|
|
|
onTabBarItem:TABBAR_FAVOURITES_INDEX
|
|
|
|
|
withBadgeColor:(recentsDataSource.missedHighlightFavouriteDiscussionsCount ? ThemeService.shared.theme.noticeColor : ThemeService.shared.theme.noticeSecondaryColor)];
|
2021-03-11 08:01:44 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-04-19 16:53:32 +00:00
|
|
|
|
// Update the badge on People and Rooms tabs
|
|
|
|
|
if (RiotSettings.shared.homeScreenShowPeopleTab)
|
2021-03-11 08:01:44 +00:00
|
|
|
|
{
|
2021-04-19 16:53:32 +00:00
|
|
|
|
if (recentsDataSource.unsentMessagesDirectDiscussionsCount)
|
|
|
|
|
{
|
|
|
|
|
[self setBadgeValue:@"!"
|
|
|
|
|
onTabBarItem:TABBAR_PEOPLE_INDEX
|
|
|
|
|
withBadgeColor:ThemeService.shared.theme.noticeColor];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
[self setMissedDiscussionsCount:recentsDataSource.missedDirectDiscussionsCount
|
|
|
|
|
onTabBarItem:TABBAR_PEOPLE_INDEX
|
|
|
|
|
withBadgeColor:(recentsDataSource.missedHighlightDirectDiscussionsCount ? ThemeService.shared.theme.noticeColor : ThemeService.shared.theme.noticeSecondaryColor)];
|
|
|
|
|
}
|
2021-03-11 08:01:44 +00:00
|
|
|
|
}
|
2021-04-19 16:53:32 +00:00
|
|
|
|
|
|
|
|
|
if (RiotSettings.shared.homeScreenShowRoomsTab)
|
2021-03-11 08:01:44 +00:00
|
|
|
|
{
|
2021-04-19 16:53:32 +00:00
|
|
|
|
if (recentsDataSource.unsentMessagesGroupDiscussionsCount)
|
|
|
|
|
{
|
|
|
|
|
[self setMissedDiscussionsCount:recentsDataSource.unsentMessagesGroupDiscussionsCount
|
|
|
|
|
onTabBarItem:TABBAR_ROOMS_INDEX
|
|
|
|
|
withBadgeColor:ThemeService.shared.theme.noticeColor];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
[self setMissedDiscussionsCount:recentsDataSource.missedGroupDiscussionsCount
|
|
|
|
|
onTabBarItem:TABBAR_ROOMS_INDEX
|
|
|
|
|
withBadgeColor:(recentsDataSource.missedHighlightGroupDiscussionsCount ? ThemeService.shared.theme.noticeColor : ThemeService.shared.theme.noticeSecondaryColor)];
|
|
|
|
|
}
|
2021-03-11 08:01:44 +00:00
|
|
|
|
}
|
2017-04-28 12:06:58 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)setMissedDiscussionsCount:(NSUInteger)count onTabBarItem:(NSUInteger)index withBadgeColor:(UIColor*)badgeColor
|
2017-04-14 15:01:44 +00:00
|
|
|
|
{
|
2021-03-11 08:01:44 +00:00
|
|
|
|
[self setBadgeValue:count ? [self tabBarBadgeStringValue:count] : nil onTabBarItem:index withBadgeColor:badgeColor];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)setBadgeValue:(NSString *)value onTabBarItem:(NSUInteger)index withBadgeColor:(UIColor*)badgeColor
|
|
|
|
|
{
|
2021-04-19 16:53:32 +00:00
|
|
|
|
NSInteger itemIndex = [self indexOfTabItemWithTag:index];
|
|
|
|
|
if (itemIndex != NSNotFound)
|
2017-04-14 15:01:44 +00:00
|
|
|
|
{
|
2021-04-19 16:53:32 +00:00
|
|
|
|
if (value)
|
|
|
|
|
{
|
|
|
|
|
self.tabBar.items[itemIndex].badgeValue = value;
|
|
|
|
|
|
|
|
|
|
self.tabBar.items[itemIndex].badgeColor = badgeColor;
|
|
|
|
|
|
|
|
|
|
[self.tabBar.items[itemIndex] setBadgeTextAttributes:@{
|
|
|
|
|
NSForegroundColorAttributeName: ThemeService.shared.theme.baseTextPrimaryColor
|
|
|
|
|
}
|
|
|
|
|
forState:UIControlStateNormal];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
self.tabBar.items[itemIndex].badgeValue = nil;
|
|
|
|
|
}
|
2017-04-28 12:06:58 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-14 08:06:36 +00:00
|
|
|
|
- (void)setMissedDiscussionsMark:(NSString*)mark onTabBarItem:(NSUInteger)index withBadgeColor:(UIColor*)badgeColor
|
|
|
|
|
{
|
2021-04-19 16:53:32 +00:00
|
|
|
|
NSInteger itemIndex = [self indexOfTabItemWithTag:index];
|
|
|
|
|
if (itemIndex != NSNotFound)
|
2017-06-14 08:06:36 +00:00
|
|
|
|
{
|
2021-04-19 16:53:32 +00:00
|
|
|
|
if (mark)
|
|
|
|
|
{
|
|
|
|
|
self.tabBar.items[itemIndex].badgeValue = mark;
|
|
|
|
|
|
|
|
|
|
self.tabBar.items[itemIndex].badgeColor = badgeColor;
|
|
|
|
|
|
|
|
|
|
[self.tabBar.items[itemIndex] setBadgeTextAttributes:@{
|
|
|
|
|
NSForegroundColorAttributeName: ThemeService.shared.theme.baseTextPrimaryColor
|
|
|
|
|
}
|
|
|
|
|
forState:UIControlStateNormal];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
self.tabBar.items[itemIndex].badgeValue = nil;
|
|
|
|
|
}
|
2017-06-14 08:06:36 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-04-28 12:06:58 +00:00
|
|
|
|
- (NSString*)tabBarBadgeStringValue:(NSUInteger)count
|
|
|
|
|
{
|
|
|
|
|
NSString *badgeValue;
|
|
|
|
|
|
|
|
|
|
if (count > 1000)
|
|
|
|
|
{
|
|
|
|
|
CGFloat value = count / 1000.0;
|
|
|
|
|
badgeValue = [NSString stringWithFormat:NSLocalizedStringFromTable(@"large_badge_value_k_format", @"Vector", nil), value];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
badgeValue = [NSString stringWithFormat:@"%tu", count];
|
2017-04-14 15:01:44 +00:00
|
|
|
|
}
|
2017-04-28 12:06:58 +00:00
|
|
|
|
|
|
|
|
|
return badgeValue;
|
2017-04-14 15:01:44 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-04-19 16:53:32 +00:00
|
|
|
|
- (NSInteger)indexOfTabItemWithTag:(NSUInteger)tag
|
|
|
|
|
{
|
|
|
|
|
for (int i = 0 ; i < self.tabBar.items.count ; i++)
|
|
|
|
|
{
|
|
|
|
|
if (self.tabBar.items[i].tag == tag)
|
|
|
|
|
{
|
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return NSNotFound;
|
|
|
|
|
}
|
|
|
|
|
|
2017-04-28 12:06:58 +00:00
|
|
|
|
#pragma mark -
|
2017-03-23 16:48:05 +00:00
|
|
|
|
|
2018-06-27 08:43:22 +00:00
|
|
|
|
- (void)promptUserBeforeUsingAnalytics
|
2017-03-23 16:48:05 +00:00
|
|
|
|
{
|
2021-06-03 08:30:07 +00:00
|
|
|
|
MXLogDebug(@"[MasterTabBarController]: Invite the user to send crash reports");
|
2017-03-23 16:48:05 +00:00
|
|
|
|
|
|
|
|
|
__weak typeof(self) weakSelf = self;
|
|
|
|
|
|
2017-07-14 14:41:25 +00:00
|
|
|
|
[currentAlert dismissViewControllerAnimated:NO completion:nil];
|
2017-03-23 16:48:05 +00:00
|
|
|
|
|
2019-01-07 23:24:11 +00:00
|
|
|
|
NSString *appDisplayName = [[NSBundle mainBundle] infoDictionary][@"CFBundleDisplayName"];
|
2017-03-23 16:48:05 +00:00
|
|
|
|
|
2017-07-14 14:41:25 +00:00
|
|
|
|
currentAlert = [UIAlertController alertControllerWithTitle:[NSString stringWithFormat:NSLocalizedStringFromTable(@"google_analytics_use_prompt", @"Vector", nil), appDisplayName] message:nil preferredStyle:UIAlertControllerStyleAlert];
|
|
|
|
|
|
|
|
|
|
[currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"no"]
|
|
|
|
|
style:UIAlertActionStyleDefault
|
|
|
|
|
handler:^(UIAlertAction * action) {
|
|
|
|
|
|
2018-07-02 12:51:47 +00:00
|
|
|
|
RiotSettings.shared.enableCrashReport = NO;
|
2017-07-14 14:41:25 +00:00
|
|
|
|
|
|
|
|
|
if (weakSelf)
|
|
|
|
|
{
|
|
|
|
|
typeof(self) self = weakSelf;
|
|
|
|
|
self->currentAlert = nil;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}]];
|
|
|
|
|
|
|
|
|
|
[currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"yes"]
|
|
|
|
|
style:UIAlertActionStyleDefault
|
|
|
|
|
handler:^(UIAlertAction * action) {
|
2018-07-02 12:51:47 +00:00
|
|
|
|
|
|
|
|
|
RiotSettings.shared.enableCrashReport = YES;
|
2017-07-14 14:41:25 +00:00
|
|
|
|
|
|
|
|
|
if (weakSelf)
|
|
|
|
|
{
|
|
|
|
|
typeof(self) self = weakSelf;
|
|
|
|
|
self->currentAlert = nil;
|
|
|
|
|
}
|
2018-06-27 07:55:06 +00:00
|
|
|
|
|
|
|
|
|
[[Analytics sharedInstance] start];
|
2017-07-14 14:41:25 +00:00
|
|
|
|
|
|
|
|
|
}]];
|
|
|
|
|
|
2018-06-27 08:43:22 +00:00
|
|
|
|
[currentAlert mxk_setAccessibilityIdentifier: @"HomeVCUseAnalyticsAlert"];
|
2017-07-14 14:41:25 +00:00
|
|
|
|
[self presentViewController:currentAlert animated:YES completion:nil];
|
2017-03-23 16:48:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2020-05-04 17:59:11 +00:00
|
|
|
|
#pragma mark - Review session
|
|
|
|
|
|
|
|
|
|
- (void)presentVerifyCurrentSessionAlertIfNeededWithSession:(MXSession*)session
|
|
|
|
|
{
|
2020-09-25 11:06:34 +00:00
|
|
|
|
if (RiotSettings.shared.hideVerifyThisSessionAlert
|
|
|
|
|
|| self.reviewSessionAlertHasBeenDisplayed
|
|
|
|
|
|| self.authenticationInProgress)
|
2020-05-04 17:59:11 +00:00
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
self.reviewSessionAlertHasBeenDisplayed = YES;
|
|
|
|
|
[self presentVerifyCurrentSessionAlertWithSession:session];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)presentVerifyCurrentSessionAlertWithSession:(MXSession*)session
|
|
|
|
|
{
|
2021-06-03 08:30:07 +00:00
|
|
|
|
MXLogDebug(@"[MasterTabBarController] presentVerifyCurrentSessionAlertWithSession");
|
2020-09-29 15:02:02 +00:00
|
|
|
|
|
2020-05-04 17:59:11 +00:00
|
|
|
|
[currentAlert dismissViewControllerAnimated:NO completion:nil];
|
|
|
|
|
|
|
|
|
|
UIAlertController *alert = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"key_verification_self_verify_current_session_alert_title", @"Vector", nil)
|
|
|
|
|
message:NSLocalizedStringFromTable(@"key_verification_self_verify_current_session_alert_message", @"Vector", nil)
|
|
|
|
|
preferredStyle:UIAlertControllerStyleAlert];
|
|
|
|
|
|
|
|
|
|
[alert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"key_verification_self_verify_current_session_alert_validate_action", @"Vector", nil)
|
|
|
|
|
style:UIAlertActionStyleDefault
|
|
|
|
|
handler:^(UIAlertAction * action) {
|
|
|
|
|
[[AppDelegate theDelegate] presentCompleteSecurityForSession:session];
|
|
|
|
|
}]];
|
|
|
|
|
|
|
|
|
|
[alert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"later", @"Vector", nil)
|
|
|
|
|
style:UIAlertActionStyleCancel
|
|
|
|
|
handler:nil]];
|
|
|
|
|
|
|
|
|
|
[alert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"do_not_ask_again", @"Vector", nil)
|
|
|
|
|
style:UIAlertActionStyleDestructive
|
|
|
|
|
handler:^(UIAlertAction * action) {
|
|
|
|
|
RiotSettings.shared.hideVerifyThisSessionAlert = YES;
|
|
|
|
|
}]];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[self presentViewController:alert animated:YES completion:nil];
|
|
|
|
|
|
|
|
|
|
currentAlert = alert;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)presentReviewUnverifiedSessionsAlertIfNeededWithSession:(MXSession*)session
|
|
|
|
|
{
|
|
|
|
|
if (RiotSettings.shared.hideReviewSessionsAlert || self.reviewSessionAlertHasBeenDisplayed)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NSArray<MXDeviceInfo*> *devices = [session.crypto.store devicesForUser:session.myUserId].allValues;
|
|
|
|
|
|
|
|
|
|
BOOL isUserHasOneUnverifiedDevice = NO;
|
|
|
|
|
|
|
|
|
|
for (MXDeviceInfo *device in devices)
|
|
|
|
|
{
|
2020-05-08 05:52:33 +00:00
|
|
|
|
if (!device.trustLevel.isCrossSigningVerified)
|
2020-05-04 17:59:11 +00:00
|
|
|
|
{
|
|
|
|
|
isUserHasOneUnverifiedDevice = YES;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isUserHasOneUnverifiedDevice)
|
|
|
|
|
{
|
|
|
|
|
self.reviewSessionAlertHasBeenDisplayed = YES;
|
|
|
|
|
[self presentReviewUnverifiedSessionsAlertWithSession:session];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)presentReviewUnverifiedSessionsAlertWithSession:(MXSession*)session
|
|
|
|
|
{
|
2021-06-03 08:30:07 +00:00
|
|
|
|
MXLogDebug(@"[MasterTabBarController] presentReviewUnverifiedSessionsAlertWithSession");
|
2020-09-29 15:02:02 +00:00
|
|
|
|
|
2020-05-04 17:59:11 +00:00
|
|
|
|
[currentAlert dismissViewControllerAnimated:NO completion:nil];
|
|
|
|
|
|
|
|
|
|
UIAlertController *alert = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"key_verification_self_verify_unverified_sessions_alert_title", @"Vector", nil)
|
|
|
|
|
message:NSLocalizedStringFromTable(@"key_verification_self_verify_unverified_sessions_alert_message", @"Vector", nil)
|
|
|
|
|
preferredStyle:UIAlertControllerStyleAlert];
|
|
|
|
|
|
|
|
|
|
[alert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"key_verification_self_verify_unverified_sessions_alert_validate_action", @"Vector", nil)
|
|
|
|
|
style:UIAlertActionStyleDefault
|
|
|
|
|
handler:^(UIAlertAction * action) {
|
|
|
|
|
[self showSettingsSecurityScreenForSession:session];
|
|
|
|
|
}]];
|
|
|
|
|
|
|
|
|
|
[alert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"later", @"Vector", nil)
|
|
|
|
|
style:UIAlertActionStyleCancel
|
|
|
|
|
handler:nil]];
|
|
|
|
|
|
|
|
|
|
[alert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"do_not_ask_again", @"Vector", nil)
|
|
|
|
|
style:UIAlertActionStyleDestructive
|
|
|
|
|
handler:^(UIAlertAction * action) {
|
|
|
|
|
RiotSettings.shared.hideReviewSessionsAlert = YES;
|
|
|
|
|
}]];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[self presentViewController:alert animated:YES completion:nil];
|
|
|
|
|
|
|
|
|
|
currentAlert = alert;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)showSettingsSecurityScreenForSession:(MXSession*)session
|
|
|
|
|
{
|
|
|
|
|
SettingsViewController *settingsViewController = [SettingsViewController instantiate];
|
|
|
|
|
[settingsViewController loadViewIfNeeded];
|
|
|
|
|
SecurityViewController *securityViewController = [SecurityViewController instantiateWithMatrixSession:session];
|
|
|
|
|
|
|
|
|
|
[[AppDelegate theDelegate] restoreInitialDisplay:^{
|
2020-05-05 07:17:47 +00:00
|
|
|
|
self.navigationController.viewControllers = @[self, settingsViewController, securityViewController];
|
2020-05-04 17:59:11 +00:00
|
|
|
|
}];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)resetReviewSessionsFlags
|
|
|
|
|
{
|
|
|
|
|
self.reviewSessionAlertHasBeenDisplayed = NO;
|
|
|
|
|
RiotSettings.shared.hideVerifyThisSessionAlert = NO;
|
|
|
|
|
RiotSettings.shared.hideReviewSessionsAlert = NO;
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-14 07:41:15 +00:00
|
|
|
|
#pragma mark - UITabBarDelegate
|
|
|
|
|
|
|
|
|
|
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
|
|
|
|
|
{
|
2017-06-16 14:55:54 +00:00
|
|
|
|
// Detect multi-tap on the current selected tab.
|
|
|
|
|
if (item.tag == self.selectedIndex)
|
2017-06-14 07:41:15 +00:00
|
|
|
|
{
|
|
|
|
|
// Scroll to the next room with missed notifications.
|
2017-06-16 14:55:54 +00:00
|
|
|
|
if (item.tag == TABBAR_ROOMS_INDEX)
|
|
|
|
|
{
|
|
|
|
|
[self.roomsViewController scrollToNextRoomWithMissedNotifications];
|
|
|
|
|
}
|
|
|
|
|
else if (item.tag == TABBAR_PEOPLE_INDEX)
|
|
|
|
|
{
|
|
|
|
|
[self.peopleViewController scrollToNextRoomWithMissedNotifications];
|
|
|
|
|
}
|
|
|
|
|
else if (item.tag == TABBAR_FAVOURITES_INDEX)
|
|
|
|
|
{
|
|
|
|
|
[self.favouritesViewController scrollToNextRoomWithMissedNotifications];
|
|
|
|
|
}
|
2017-06-14 07:41:15 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-09-15 14:48:35 +00:00
|
|
|
|
#pragma mark - AuthenticationViewControllerDelegate
|
|
|
|
|
|
|
|
|
|
- (void)authenticationViewControllerDidDismiss:(AuthenticationViewController *)authenticationViewController
|
|
|
|
|
{
|
|
|
|
|
_authenticationInProgress = NO;
|
2020-09-24 09:37:24 +00:00
|
|
|
|
[self.masterTabBarDelegate masterTabBarControllerDidCompleteAuthentication:self];
|
2020-09-15 14:48:35 +00:00
|
|
|
|
}
|
|
|
|
|
|
2017-03-23 16:48:05 +00:00
|
|
|
|
@end
|