mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-21 17:12:45 +02:00
b298dedc22
Merge commit 'f823ab9aae70e8d15ed7cc079210dd9bbbb6c8e1' into feature/foss_update_1_11_19 * commit 'f823ab9aae70e8d15ed7cc079210dd9bbbb6c8e1': finish version++ version++ comments update submodule remove obsolete tests removed unused code update submodule fix Libolm removal update license macro update license Prepare for new sprint # Conflicts: # Config/AppVersion.xcconfig # IDETemplateMacros.plist # LICENSE # README.md # Riot/Categories/MXSession+Riot.m # Riot/Managers/EncryptionKeyManager/EncryptionKeyManager.swift # Riot/Managers/KeyValueStorage/Extensions/Keychain.swift # Riot/Managers/KeyValueStorage/KeyValueStore.swift # Riot/Managers/KeyValueStorage/KeychainStore.swift # Riot/Managers/KeyValueStorage/MemoryStore.swift # Riot/Managers/PushNotification/PushNotificationService.m # Riot/Managers/Settings/RiotSettings.swift # Riot/Managers/Settings/Shared/RiotSharedSettings.swift # Riot/Modules/Analytics/AnalyticsUIElement.swift # Riot/Modules/Application/AppCoordinator.swift # Riot/Modules/Application/LegacyAppDelegate.h # Riot/Modules/Application/LegacyAppDelegate.m # Riot/Modules/Authentication/Legacy/AuthenticationViewController.h # Riot/Modules/Authentication/Legacy/AuthenticationViewController.m # Riot/Modules/Authentication/Legacy/Views/AuthInputsView.h # Riot/Modules/Authentication/Legacy/Views/AuthInputsView.m # Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m # Riot/Modules/Common/Recents/RecentsViewController.m # Riot/Modules/Common/WebViewController/WebViewViewController.m # Riot/Modules/Contacts/Details/ContactDetailsViewController.m # Riot/Modules/Contacts/Views/ContactTableViewCell.m # Riot/Modules/Favorites/FavouritesViewController.h # Riot/Modules/Favorites/FavouritesViewController.m # Riot/Modules/GlobalSearch/UnifiedSearchViewController.m # Riot/Modules/People/PeopleViewController.h # Riot/Modules/People/PeopleViewController.m # Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuViewModel.swift # Riot/Modules/Room/DataSources/RoomDataSource.m # Riot/Modules/Room/Files/RoomFilesViewController.m # Riot/Modules/Room/Members/Detail/RoomMemberDetailsViewController.m # Riot/Modules/Room/Members/RoomParticipantsViewController.m # Riot/Modules/Room/RoomViewController.m # Riot/Modules/Room/Settings/RoomSettingsViewController.m # Riot/Modules/Room/TimelineCells/RoomCreationIntro/RoomCreationIntroCell.swift # Riot/Modules/Room/TimelineCells/RoomCreationIntro/RoomCreationIntroCellContentView.swift # Riot/Modules/Room/TimelineCells/RoomCreationIntro/RoomCreationIntroViewData.swift # Riot/Modules/Room/TimelineCells/RoomTimelineCellIdentifier.h # Riot/Modules/Rooms/RoomsViewController.h # Riot/Modules/Rooms/ShowDirectory/Cells/Network/DirectoryNetworkTableHeaderFooterView.swift # Riot/Modules/Rooms/ShowDirectory/Cells/Room/DirectoryRoomTableViewCell.swift # Riot/Modules/Rooms/ShowDirectory/PublicRoomsDirectoryViewModel.swift # Riot/Modules/Secrets/Recover/RecoverWithKey/SecretsRecoveryWithKeyCoordinator.swift # Riot/Modules/Secrets/Recover/RecoverWithKey/SecretsRecoveryWithKeyViewController.swift # Riot/Modules/Secrets/Recover/RecoverWithPassphrase/SecretsRecoveryWithPassphraseCoordinator.swift # Riot/Modules/Secrets/Recover/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewController.swift # Riot/Modules/Secrets/Recover/SecretsRecoveryCoordinator.swift # Riot/Modules/SecureBackup/Setup/Intro/SecureBackupSetupIntroViewController.swift # Riot/Modules/SecureBackup/Setup/Intro/SecureBackupSetupIntroViewModel.swift # Riot/Modules/SecureBackup/Setup/Intro/SecureBackupSetupIntroViewModelType.swift # Riot/Modules/SetPinCode/PinCodePreferences.swift # Riot/Modules/SetPinCode/SetupBiometrics/BiometricsAuthenticationPresenter.swift # Riot/Modules/Settings/Security/ManageSession/ManageSessionViewController.m # Riot/Modules/Settings/Security/SecurityViewController.m # Riot/Modules/Settings/SettingsViewController.m # Riot/Modules/SplitView/SplitViewCoordinator.swift # Riot/Modules/SplitView/SplitViewCoordinatorType.swift # Riot/Modules/StartChat/StartChatViewController.m # Riot/Modules/TabBar/MasterTabBarController.h # Riot/Modules/TabBar/MasterTabBarController.m # Riot/Utils/EventFormatter.m # Riot/Utils/HTMLFormatter.swift # Riot/Utils/Tools.m # RiotNSE/NotificationService.swift
199 lines
6.3 KiB
Objective-C
199 lines
6.3 KiB
Objective-C
/*
|
|
Copyright 2024 New Vector Ltd.
|
|
Copyright 2017 Vector Creations Ltd
|
|
Copyright (c) 2021 BWI GmbH
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-only
|
|
Please see LICENSE in the repository root for full details.
|
|
*/
|
|
|
|
#import "PeopleViewController.h"
|
|
|
|
#import "UIViewController+RiotSearch.h"
|
|
|
|
#import "RageShakeManager.h"
|
|
|
|
#import "RecentsDataSource.h"
|
|
#import "RecentTableViewCell.h"
|
|
#import "InviteRecentTableViewCell.h"
|
|
|
|
#import "GeneratedInterface-Swift.h"
|
|
|
|
@interface PeopleViewController () <SpaceMembersCoordinatorBridgePresenterDelegate, MasterTabBarItemDisplayProtocol>
|
|
{
|
|
NSInteger directRoomsSectionNumber;
|
|
RecentsDataSource *recentsDataSource;
|
|
}
|
|
|
|
@property(nonatomic) SpaceMembersCoordinatorBridgePresenter *spaceMembersCoordinatorBridgePresenter;
|
|
@property (nonatomic, strong) MXThrottler *tableViewPaginationThrottler;
|
|
|
|
@end
|
|
|
|
@implementation PeopleViewController
|
|
|
|
+ (instancetype)instantiate
|
|
{
|
|
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
|
|
PeopleViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"PeopleViewController"];
|
|
return viewController;
|
|
}
|
|
|
|
- (void)finalizeInit
|
|
{
|
|
[super finalizeInit];
|
|
|
|
directRoomsSectionNumber = 0;
|
|
|
|
self.screenTracker = [[AnalyticsScreenTracker alloc] initWithScreen:AnalyticsScreenPeople];
|
|
self.tableViewPaginationThrottler = [[MXThrottler alloc] initWithMinimumDelay:0.1];
|
|
}
|
|
|
|
- (void)viewDidLoad
|
|
{
|
|
[super viewDidLoad];
|
|
// Do any additional setup after loading the view, typically from a nib.
|
|
|
|
self.view.accessibilityIdentifier = @"PeopleVCView";
|
|
self.recentsTableView.accessibilityIdentifier = @"PeopleVCTableView";
|
|
|
|
// Tag the recents table with the its recents data source mode.
|
|
// This will be used by the shared RecentsDataSource instance for sanity checks (see UITableViewDataSource methods).
|
|
self.recentsTableView.tag = RecentsDataSourceModePeople;
|
|
|
|
UIImage *fabImage = self.dataSource.currentSpace == nil ? AssetImages.peopleFloatingAction.image : AssetImages.addMemberFloatingAction.image;
|
|
// Add the (+) button programmatically
|
|
plusButtonImageView = [self vc_addFABWithImage:fabImage
|
|
target:self
|
|
action:@selector(onPlusButtonPressed)];
|
|
}
|
|
|
|
- (void)didReceiveMemoryWarning
|
|
{
|
|
[super didReceiveMemoryWarning];
|
|
// Dispose of any resources that can be recreated.
|
|
}
|
|
|
|
- (void)viewWillAppear:(BOOL)animated
|
|
{
|
|
[super viewWillAppear:animated];
|
|
[AppDelegate theDelegate].masterTabBarController.tabBar.tintColor = ThemeService.shared.theme.tintColor;
|
|
|
|
if ([self.dataSource isKindOfClass:RecentsDataSource.class])
|
|
{
|
|
// Take the lead on the shared data source.
|
|
recentsDataSource = (RecentsDataSource*)self.dataSource;
|
|
|
|
if (recentsDataSource.recentsDataSourceMode != RecentsDataSourceModePeople)
|
|
{
|
|
// Take the lead on the shared data source.
|
|
[recentsDataSource setDelegate:self andRecentsDataSourceMode:RecentsDataSourceModePeople];
|
|
|
|
// Reset filtering on the shared data source when switching tabs
|
|
[recentsDataSource searchWithPatterns:nil];
|
|
[self.recentsSearchBar setText:nil];
|
|
}
|
|
}
|
|
}
|
|
|
|
#pragma mark - UITableView delegate
|
|
|
|
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
|
|
{
|
|
if ([super respondsToSelector:@selector(tableView:willDisplayCell:forRowAtIndexPath:)])
|
|
{
|
|
[super tableView:tableView willDisplayCell:cell forRowAtIndexPath:indexPath];
|
|
}
|
|
|
|
[self.tableViewPaginationThrottler throttle:^{
|
|
NSInteger section = indexPath.section;
|
|
if (tableView.numberOfSections <= section)
|
|
{
|
|
return;
|
|
}
|
|
|
|
NSInteger numberOfRowsInSection = [tableView numberOfRowsInSection:section];
|
|
if (indexPath.row == numberOfRowsInSection - 1)
|
|
{
|
|
[self->recentsDataSource paginateInSection:section];
|
|
}
|
|
}];
|
|
}
|
|
|
|
#pragma mark - Override RecentsViewController
|
|
|
|
- (void)refreshCurrentSelectedCell:(BOOL)forceVisible
|
|
{
|
|
// Check whether the recents data source is correctly configured.
|
|
if (recentsDataSource.recentsDataSourceMode != RecentsDataSourceModePeople)
|
|
{
|
|
return;
|
|
}
|
|
|
|
[super refreshCurrentSelectedCell:forceVisible];
|
|
}
|
|
|
|
- (void)onPlusButtonPressed
|
|
{
|
|
if (self.dataSource.currentSpace != nil)
|
|
{
|
|
self.spaceMembersCoordinatorBridgePresenter = [[SpaceMembersCoordinatorBridgePresenter alloc] initWithUserSessionsService:[UserSessionsService shared] session:self.mainSession spaceId:self.dataSource.currentSpace.spaceId];
|
|
self.spaceMembersCoordinatorBridgePresenter.delegate = self;
|
|
[self.spaceMembersCoordinatorBridgePresenter presentFrom:self animated:YES];
|
|
}
|
|
else
|
|
{
|
|
[self performSegueWithIdentifier:@"presentStartChat" sender:self];
|
|
}
|
|
}
|
|
|
|
#pragma mark -
|
|
|
|
- (void)scrollToNextRoomWithMissedNotifications
|
|
{
|
|
// Check whether the recents data source is correctly configured.
|
|
if (recentsDataSource.recentsDataSourceMode == RecentsDataSourceModePeople)
|
|
{
|
|
[self scrollToTheTopTheNextRoomWithMissedNotificationsInSection:[recentsDataSource.sections sectionIndexForSectionType:RecentsDataSourceSectionTypePeople]];
|
|
}
|
|
}
|
|
|
|
#pragma mark - Empty view management
|
|
|
|
- (void)updateEmptyView
|
|
{
|
|
[self.emptyView fillWith:[self emptyViewArtwork]
|
|
title:[VectorL10n peopleEmptyViewTitle]
|
|
informationText:[VectorL10n peopleEmptyViewInformation]];
|
|
}
|
|
|
|
- (UIImage*)emptyViewArtwork
|
|
{
|
|
if (ThemeService.shared.isCurrentThemeDark)
|
|
{
|
|
return AssetImages.peopleEmptyScreenArtworkDark.image;
|
|
}
|
|
else
|
|
{
|
|
return AssetImages.peopleEmptyScreenArtwork.image;
|
|
}
|
|
}
|
|
|
|
#pragma mark - SpaceMembersCoordinatorBridgePresenterDelegate
|
|
|
|
- (void)spaceMembersCoordinatorBridgePresenterDelegateDidComplete:(SpaceMembersCoordinatorBridgePresenter *)coordinatorBridgePresenter
|
|
{
|
|
[coordinatorBridgePresenter dismissWithAnimated:YES completion:^{
|
|
self.spaceMembersCoordinatorBridgePresenter = nil;
|
|
}];
|
|
}
|
|
|
|
#pragma mark - MasterTabBarItemDisplayProtocol
|
|
|
|
- (NSString *)masterTabBarItemTitle
|
|
{
|
|
return [VectorL10n titlePeople];
|
|
}
|
|
|
|
@end
|