/* Copyright 2024 New Vector Ltd. Copyright 2017 Vector Creations Ltd Copyright 2016 OpenMarket Ltd Copyright (c) 2021 BWI GmbH SPDX-License-Identifier: AGPL-3.0-only Please see LICENSE in the repository root for full details. */ #import "RoomFilesViewController.h" #import "FilesSearchTableViewCell.h" #import "GeneratedInterface-Swift.h" #import "AttachmentsViewController.h" @interface RoomFilesViewController () { /** Observe kThemeServiceDidChangeThemeNotification to handle user interface theme change. */ id kThemeServiceDidChangeThemeNotificationObserver; } @end @implementation RoomFilesViewController #pragma mark - - (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.autoJoinInvitedRoom = NO; } return self; } - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { self.autoJoinInvitedRoom = NO; } return self; } #pragma mark - - (void)finalizeInit { [super finalizeInit]; // Setup `MXKViewControllerHandling` properties self.enableBarTintColorStatusChange = NO; self.rageShakeManager = [RageShakeManager sharedManager]; // Show / hide actions button in document preview according BuildSettings self.allowActionsInDocumentPreview = BWIBuildSettings.shared.messageDetailsAllowShare; } - (void)viewDidLoad { [super viewDidLoad]; // Do not show toolbar [self setRoomInputToolbarViewClass:nil]; // set the default extra [self setRoomActivitiesViewClass:nil]; // Custom the attachmnet viewer [self setAttachmentsViewerClass:AttachmentsViewController.class]; // Register first customized cell view classes used to render bubbles [self.bubblesTableView registerClass:FilesSearchTableViewCell.class forCellReuseIdentifier:FilesSearchTableViewCell.defaultReuseIdentifier]; self.bubblesTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; // Hide line separators of empty cells self.bubblesTableView.tableFooterView = [[UIView alloc] init]; [self setNavBarButtons]; // Observe user interface theme change. kThemeServiceDidChangeThemeNotificationObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kThemeServiceDidChangeThemeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) { [self userInterfaceThemeDidChange]; }]; [self userInterfaceThemeDidChange]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.screenTracker trackScreen]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // Update the inputToolBar height (This will trigger a layout refresh) [UIView setAnimationsEnabled:NO]; [self roomInputToolbarView:self.inputToolbarView heightDidChanged:0 completion:nil]; [UIView setAnimationsEnabled:YES]; } - (void)userInterfaceThemeDidChange { [ThemeService.shared.theme applyStyleOnNavigationBar:self.navigationController.navigationBar]; self.activityIndicator.backgroundColor = ThemeService.shared.theme.overlayBackgroundColor; // Check the table view style to select its bg color. self.bubblesTableView.backgroundColor = ((self.bubblesTableView.style == UITableViewStylePlain) ? ThemeService.shared.theme.backgroundColor : ThemeService.shared.theme.headerBackgroundColor); self.view.backgroundColor = self.bubblesTableView.backgroundColor; self.bubblesTableView.separatorColor = ThemeService.shared.theme.lineBreakColor; if (self.bubblesTableView.dataSource) { [self.bubblesTableView reloadData]; } [self setNeedsStatusBarAppearanceUpdate]; } - (UIStatusBarStyle)preferredStatusBarStyle { return ThemeService.shared.theme.statusBarStyle; } - (void)destroy { [super destroy]; if (kThemeServiceDidChangeThemeNotificationObserver) { [[NSNotificationCenter defaultCenter] removeObserver:kThemeServiceDidChangeThemeNotificationObserver]; kThemeServiceDidChangeThemeNotificationObserver = nil; } } // This method is called when the viewcontroller is added or removed from a container view controller. - (void)didMoveToParentViewController:(nullable UIViewController *)parent { [super didMoveToParentViewController:parent]; [self setNavBarButtons]; } - (void)setNavBarButtons { // Check whether the view controller is currently displayed inside a segmented view controller or not. UIViewController* topViewController = ((self.parentViewController) ? self.parentViewController : self); topViewController.navigationItem.rightBarButtonItem = nil; if (self.showCancelBarButtonItem) { topViewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(onCancel:)]; } else { topViewController.navigationItem.leftBarButtonItem = nil; } } - (void)onCancel:(id)sender { [self withdrawViewControllerAnimated:YES completion:nil]; } #pragma mark - MXKDataSourceDelegate - (Class)cellViewClassForCellData:(MXKCellData*)cellData { Class cellViewClass = nil; // Sanity check if ([cellData conformsToProtocol:@protocol(MXKRoomBubbleCellDataStoring)]) { id bubbleData = (id)cellData; // Select the suitable table view cell class if (bubbleData.attachment) { cellViewClass = FilesSearchTableViewCell.class; } } return cellViewClass; } - (NSString *)cellReuseIdentifierForCellData:(MXKCellData*)cellData { Class class = [self cellViewClassForCellData:cellData]; if ([class respondsToSelector:@selector(defaultReuseIdentifier)]) { return [class defaultReuseIdentifier]; } return nil; } #pragma mark - UITableView delegate - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath; { cell.backgroundColor = ThemeService.shared.theme.backgroundColor; // Update the selected background view if (ThemeService.shared.theme.selectedBackgroundColor) { cell.selectedBackgroundView = [[UIView alloc] init]; cell.selectedBackgroundView.backgroundColor = ThemeService.shared.theme.selectedBackgroundColor; } else { if (tableView.style == UITableViewStylePlain) { cell.selectedBackgroundView = nil; } else { cell.selectedBackgroundView.backgroundColor = nil; } } } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (tableView == self.bubblesTableView) { UITableViewCell *cell = [self.bubblesTableView cellForRowAtIndexPath:indexPath]; [self showAttachmentInCell:cell]; [tableView deselectRowAtIndexPath:indexPath animated:YES]; } } @end