/* * Copyright (c) 2010-2020 Belledonne Communications SARL. * * This file is part of linphone-iphone * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #import "RecordingsListTableView.h" #import "UIRecordingCell.h" #import "LinphoneManager.h" #import "PhoneMainView.h" #import "Utils.h" @implementation RecordingsListTableView #pragma mark - Lifecycle Functions - (void)initRecordingsTableViewController { recordings = [NSMutableDictionary dictionary]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); writablePath = [paths objectAtIndex:0]; writablePath = [writablePath stringByAppendingString:@"/"]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; if (![self selectFirstRow]) { //TODO: Make first cell expand to show player } [self loadData]; } - (id)init { self = [super init]; if (self) { [self initRecordingsTableViewController]; } return self; } - (id)initWithCoder:(NSCoder *)decoder { self = [super initWithCoder:decoder]; if (self) { [self initRecordingsTableViewController]; } return self; } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; [self removeAllRecordings]; } - (void)removeAllRecordings { for (NSInteger j = 0; j < [self.tableView numberOfSections]; ++j) { for (NSInteger i = 0; i < [self.tableView numberOfRowsInSection:j]; ++i) { [[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:j]] setRecording:nil]; } } } - (void)loadData { LOGI(@"====>>>> Load recording list - Start"); recordings = [NSMutableDictionary dictionary]; NSArray *directoryContent = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:writablePath error:NULL]; for (NSString *file in directoryContent) { if (![file hasPrefix:@"recording_"]) { continue; } NSArray *parsedName = [LinphoneUtils parseRecordingName:file]; NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"EEEE, MMM d, yyyy"]; if ([parsedName count] < 2) { LOGW(@"Can not parse this recoding file: %@", file); continue; } NSString *dayPretty = [dateFormat stringFromDate:[parsedName objectAtIndex:1]]; NSMutableArray *recOfDay = [recordings objectForKey:dayPretty]; if (recOfDay) { // Loop through the object until a later object, then insert it right before int i; for (i = 0; i < [recOfDay count]; ++i) { NSString *fileAtIndex = [recOfDay objectAtIndex:i]; NSArray *parsedNameAtIndex = [LinphoneUtils parseRecordingName:fileAtIndex]; if ([[parsedName objectAtIndex:1] compare:[parsedNameAtIndex objectAtIndex:1]] == NSOrderedDescending) { break; } } [recOfDay insertObject:[writablePath stringByAppendingString:file] atIndex:i]; } else { recOfDay = [NSMutableArray arrayWithObjects:[writablePath stringByAppendingString:file], nil]; [recordings setObject:recOfDay forKey:dayPretty]; } } LOGI(@"====>>>> Load recording list - End"); [super loadData]; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSIndexPath *selectedRow = [self.tableView indexPathForSelectedRow]; if (selectedRow && [selectedRow compare:indexPath] == NSOrderedSame) { return 150; } else { return 40; } } #pragma mark - UITableViewDataSource Functions - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { return nil; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return [recordings count]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { NSArray *sortedKey = [self getSortedKeys]; return [(NSArray *)[recordings objectForKey:[sortedKey objectAtIndex:section]] count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *kCellId = NSStringFromClass(UIRecordingCell.class); UIRecordingCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId]; if (cell == nil) { cell = [[UIRecordingCell alloc] initWithIdentifier:kCellId]; } NSString *date = [[self getSortedKeys] objectAtIndex:[indexPath section]]; NSMutableArray *subAr = [recordings objectForKey:date]; NSString *recordingPath = subAr[indexPath.row]; [cell setRecording:recordingPath]; [super accessoryForCell:cell atPath:indexPath]; //accessoryForCell set it to gray but we don't want it cell.selectionStyle = UITableViewCellSelectionStyleNone; [cell updateFrame]; cell.contentView.userInteractionEnabled = false; return cell; } - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { CGRect frame = CGRectMake(0, 0, tableView.frame.size.width, tableView.sectionHeaderHeight); UIView *tempView = [[UIView alloc] initWithFrame:frame]; if (@available(iOS 13, *)) { tempView.backgroundColor = [UIColor systemBackgroundColor]; } else { tempView.backgroundColor = [UIColor whiteColor]; } UILabel *tempLabel = [[UILabel alloc] initWithFrame:frame]; tempLabel.backgroundColor = [UIColor clearColor]; tempLabel.textColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"color_A.png"]]; tempLabel.text = [[self getSortedKeys] objectAtIndex:section]; tempLabel.textAlignment = NSTextAlignmentCenter; tempLabel.font = [UIFont boldSystemFontOfSize:17]; tempLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; [tempView addSubview:tempLabel]; return tempView; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [super tableView:tableView didSelectRowAtIndexPath:indexPath]; if (![self isEditing]) { [tableView beginUpdates]; [(UIRecordingCell *)[self tableView:tableView cellForRowAtIndexPath:indexPath] updateFrame]; [tableView endUpdates]; } } - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { [NSNotificationCenter.defaultCenter removeObserver:self]; [tableView beginUpdates]; NSString *date = [[self getSortedKeys] objectAtIndex:[indexPath section]]; NSMutableArray *subAr = [recordings objectForKey:date]; NSString *recordingPath = subAr[indexPath.row]; [subAr removeObjectAtIndex:indexPath.row]; if (subAr.count == 0) { [recordings removeObjectForKey:date]; [tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationFade]; } UIRecordingCell* cell = [self.tableView cellForRowAtIndexPath:indexPath]; [cell setRecording:NULL]; remove([recordingPath cStringUsingEncoding:NSUTF8StringEncoding]); [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; [tableView endUpdates]; [self loadData]; } } - (void)removeSelectionUsing:(void (^)(NSIndexPath *))remover { [super removeSelectionUsing:^(NSIndexPath *indexPath) { [NSNotificationCenter.defaultCenter removeObserver:self]; NSString *date = [[self getSortedKeys] objectAtIndex:[indexPath section]]; NSMutableArray *subAr = [recordings objectForKey:date]; NSString *recordingPath = subAr[indexPath.row]; [subAr removeObjectAtIndex:indexPath.row]; if (subAr.count == 0) { [recordings removeObjectForKey:date]; } UIRecordingCell* cell = [self.tableView cellForRowAtIndexPath:indexPath]; [cell setRecording:NULL]; remove([recordingPath cStringUsingEncoding:NSUTF8StringEncoding]); }]; } - (void)setSelected:(NSString *)filepath { NSArray *parsedName = [LinphoneUtils parseRecordingName:filepath]; NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"EEEE, MMM d, yyyy"]; NSString *dayPretty = [dateFormat stringFromDate:[parsedName objectAtIndex:1]]; NSUInteger section; NSArray *keys = [recordings allKeys]; for (section = 0; section < [keys count]; ++section) { if ([dayPretty isEqualToString:(NSString *)[keys objectAtIndex:section]]) { break; } } NSUInteger row; NSArray *recs = [recordings objectForKey:dayPretty]; for (row = 0; row < [recs count]; ++row) { if ([filepath isEqualToString:(NSString *)[recs objectAtIndex:row]]) { break; } } NSUInteger indexes[] = {section, row}; [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathWithIndexes:indexes length:2] animated:TRUE scrollPosition:UITableViewScrollPositionNone]; } #pragma mark - Utilities - (NSArray *)getSortedKeys { return [[recordings allKeys] sortedArrayUsingComparator:^NSComparisonResult(NSString *day2, NSString *day1){ NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"EEEE, MMM d, yyyy"]; NSDate *date1 = [dateFormat dateFromString:day1]; NSDate *date2 = [dateFormat dateFromString:day2]; return [date1 compare:date2]; }]; } @end