/* Copyright 2018-2024 New Vector Ltd. Copyright 2017 Aram Sargsyan SPDX-License-Identifier: AGPL-3.0-only Please see LICENSE in the repository root for full details. */ #import "ReadReceiptsViewController.h" #import "RageShakeManager.h" #import "ThemeService.h" #import "GeneratedInterface-Swift.h" @interface ReadReceiptsViewController () { // Observe kThemeServiceDidChangeThemeNotification to handle user interface theme change. id kThemeServiceDidChangeThemeNotificationObserver; } @property (nonatomic) MXSession *session; @property (nonatomic) NSArray *roomMembers; @property (nonatomic) NSArray *placeholders; @property (nonatomic) NSArray *receipts; @property (weak, nonatomic) IBOutlet UIView *overlayView; @property (weak, nonatomic) IBOutlet UILabel *titleLabel; @property (weak, nonatomic) IBOutlet UIView *containerView; @property (weak, nonatomic) IBOutlet UITableView *receiptsTableView; @property (weak, nonatomic) IBOutlet UIButton *closeButton; @end @implementation ReadReceiptsViewController #pragma mark - Public + (void)openInViewController:(UIViewController *)viewController fromContainer:(MXKReceiptSendersContainer *)receiptSendersContainer withSession:(MXSession *)session { ReadReceiptsViewController *receiptsController = [[[self class] alloc] initWithNibName:NSStringFromClass([self class]) bundle:nil]; receiptsController.session = session; receiptsController.roomMembers = receiptSendersContainer.roomMembers; receiptsController.placeholders = receiptSendersContainer.placeholders; receiptsController.receipts = receiptSendersContainer.readReceipts; receiptsController.providesPresentationContextTransitionStyle = YES; receiptsController.definesPresentationContext = YES; receiptsController.modalPresentationStyle = UIModalPresentationOverFullScreen; receiptsController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; [viewController presentViewController:receiptsController animated:YES completion:nil]; } #pragma mark - Lifecycle - (void)viewDidLoad { [super viewDidLoad]; // Setup `MXKViewControllerHandling` properties self.enableBarTintColorStatusChange = NO; self.rageShakeManager = [RageShakeManager sharedManager]; [self configureViews]; [self configureReceiptsTableView]; [self addOverlayViewGesture]; // Observe user interface theme change. kThemeServiceDidChangeThemeNotificationObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kThemeServiceDidChangeThemeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) { [self userInterfaceThemeDidChange]; }]; [self userInterfaceThemeDidChange]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (void)userInterfaceThemeDidChange { [ThemeService.shared.theme applyStyleOnNavigationBar:self.navigationController.navigationBar]; self.activityIndicator.backgroundColor = ThemeService.shared.theme.overlayBackgroundColor; self.overlayView.backgroundColor = ThemeService.shared.theme.overlayBackgroundColor; self.overlayView.alpha = 1.0; self.titleLabel.textColor = ThemeService.shared.theme.textPrimaryColor; self.containerView.backgroundColor = ThemeService.shared.theme.backgroundColor; // Check the table view style to select its bg color. self.receiptsTableView.backgroundColor = ((self.receiptsTableView.style == UITableViewStylePlain) ? ThemeService.shared.theme.backgroundColor : ThemeService.shared.theme.headerBackgroundColor); self.closeButton.tintColor = ThemeService.shared.theme.tintColor; if (self.receiptsTableView.dataSource) { // Force table refresh [self.receiptsTableView reloadData]; } [self setNeedsStatusBarAppearanceUpdate]; } - (UIStatusBarStyle)preferredStatusBarStyle { return ThemeService.shared.theme.statusBarStyle; } - (void)destroy { if (kThemeServiceDidChangeThemeNotificationObserver) { [[NSNotificationCenter defaultCenter] removeObserver:kThemeServiceDidChangeThemeNotificationObserver]; kThemeServiceDidChangeThemeNotificationObserver = nil; } [super destroy]; } - (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion { [super dismissViewControllerAnimated:flag completion:completion]; [self destroy]; } #pragma mark - Views - (void)configureViews { self.containerView.layer.cornerRadius = 20; self.titleLabel.text = [VectorL10n readReceiptsList]; [_closeButton setTitle:[VectorL10n close] forState:UIControlStateNormal]; [_closeButton setTitle:[VectorL10n close] forState:UIControlStateHighlighted]; } - (void)configureReceiptsTableView { self.receiptsTableView.dataSource = self; self.receiptsTableView.delegate = self; self.receiptsTableView.showsVerticalScrollIndicator = NO; self.receiptsTableView.separatorStyle = UITableViewCellSeparatorStyleNone; [self.receiptsTableView registerNib:[MXKReadReceiptTableViewCell nib] forCellReuseIdentifier:[MXKReadReceiptTableViewCell defaultReuseIdentifier]]; } - (void)addOverlayViewGesture { UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(overlayTap)]; [tapRecognizer setNumberOfTapsRequired:1]; [tapRecognizer setNumberOfTouchesRequired:1]; [self.overlayView addGestureRecognizer:tapRecognizer]; } #pragma mark - Actions - (void)overlayTap { [self dismissViewControllerAnimated:YES completion:nil]; } - (IBAction)onCloseButtonPress:(id)sender { [self dismissViewControllerAnimated:YES completion:nil]; } #pragma mark - UITableViewDataSource - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.roomMembers.count; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { MXKReadReceiptTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[MXKReadReceiptTableViewCell defaultReuseIdentifier] forIndexPath:indexPath]; cell.displayNameLabel.textColor = ThemeService.shared.theme.textPrimaryColor; cell.receiptDescriptionLabel.textColor = ThemeService.shared.theme.textSecondaryColor; if (indexPath.row < self.roomMembers.count) { NSString *name = self.roomMembers[indexPath.row].displayname; if (name.length == 0) { name = self.roomMembers[indexPath.row].userId; } cell.displayNameLabel.text = name; } if (indexPath.row < self.placeholders.count) { NSString *avatarUrl = self.roomMembers[indexPath.row].avatarUrl; CGFloat side = CGRectGetWidth(cell.avatarImageView.frame); [cell.avatarImageView setImageURI:avatarUrl withType:nil andImageOrientation:UIImageOrientationUp toFitViewSize:CGSizeMake(side, side) withMethod:MXThumbnailingMethodCrop previewImage:self.placeholders[indexPath.row] mediaManager:self.session.mediaManager]; } if (indexPath.row < self.receipts.count) { NSString *receiptReadText = [VectorL10n receiptStatusRead]; NSString *receiptTimeText = [(MXKEventFormatter*)self.session.roomSummaryUpdateDelegate dateStringFromTimestamp:self.receipts[indexPath.row].ts withTime:YES]; NSMutableAttributedString *receiptDescription = [[NSMutableAttributedString alloc] initWithString:receiptReadText attributes:@{NSForegroundColorAttributeName : ThemeService.shared.theme.textSecondaryColor, NSFontAttributeName : [UIFont boldSystemFontOfSize:15]}]; [receiptDescription appendAttributedString:[[NSAttributedString alloc] initWithString:receiptTimeText attributes:@{NSForegroundColorAttributeName : ThemeService.shared.theme.textSecondaryColor, NSFontAttributeName : [UIFont systemFontOfSize:15]}]]; cell.receiptDescriptionLabel.attributedText = receiptDescription; } cell.selectionStyle = UITableViewCellSelectionStyleNone; return cell; } #pragma mark - UITableViewDelegate - (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; } } } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 70; } @end