Add views for call recording display

This commit is contained in:
Benjamin Verdier 2018-07-25 11:43:32 +02:00
parent 9d1afa7cee
commit 191c8d8a2f
10 changed files with 646 additions and 9 deletions

View file

@ -0,0 +1,19 @@
//
// UIRecordingCell.h
// linphone
//
// Created by benjamin_verdier on 25/07/2018.
//
#import <UIKit/UIKit.h>
@interface UIRecordingCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
@property (weak, nonatomic) IBOutlet UILabel *dateLabel;
@property(nonatomic, assign) NSString *recording;
- (id)initWithIdentifier:(NSString*)identifier;
@end

View file

@ -0,0 +1,75 @@
//
// UIRecordingCell.m
// linphone
//
// Created by benjamin_verdier on 25/07/2018.
//
#import "UIRecordingCell.h"
#import "PhoneMainView.h"
#import "UILabel+Boldify.h"
#import "Utils.h"
@implementation UIRecordingCell
#pragma mark - Lifecycle Functions
- (id)initWithIdentifier:(NSString *)identifier {
if ((self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]) != nil) {
NSArray *arrayOfViews =
[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil];
// resize cell to match .nib size. It is needed when resized the cell to
// correctly adapt its height too
UIView *sub = ((UIView *)[arrayOfViews objectAtIndex:0]);
[self setFrame:CGRectMake(0, 0, sub.frame.size.width, sub.frame.size.height)];
[self addSubview:sub];
self.recording = NULL;
}
return self;
}
- (void)dealloc {
self.recording = NULL;
[NSNotificationCenter.defaultCenter removeObserver:self];
}
#pragma mark - Property Functions
- (void)setRecording:(NSString *)arecording {
_recording = arecording;
if(_recording) {
//TODO: Parse file name to get name of contact and date
}
}
#pragma mark -
- (void)touchUp:(id)sender {
[self setHighlighted:true animated:true];
}
- (void)touchDown:(id)sender {
[self setHighlighted:false animated:true];
}
- (NSString *)accessibilityLabel {
return _nameLabel.text;
}
- (void)setEditing:(BOOL)editing {
[self setEditing:editing animated:FALSE];
}
- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
if (animated) {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.3];
}
if (animated) {
[UIView commitAnimations];
}
}
@end

View file

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14113" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="64" id="KGk-i7-Jjw" customClass="UIRecordingCell">
<rect key="frame" x="0.0" y="0.0" width="320" height="64"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
<rect key="frame" x="0.0" y="0.0" width="320" height="63.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Name" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="XQs-XC-lBb">
<rect key="frame" x="16" y="11" width="136" height="42"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Date" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="o4f-sF-niV">
<rect key="frame" x="202" y="11" width="102" height="42"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</tableViewCellContentView>
<viewLayoutGuide key="safeArea" id="aW0-zy-SZf"/>
<connections>
<outlet property="dateLabel" destination="o4f-sF-niV" id="8A8-UM-4FP"/>
<outlet property="nameLabel" destination="XQs-XC-lBb" id="1MA-DM-Xh7"/>
</connections>
<point key="canvasLocation" x="-172" y="62"/>
</tableViewCell>
</objects>
</document>

View file

@ -0,0 +1,23 @@
//
// RecordingsListTableView.h
// linphone
//
// Created by benjamin_verdier on 25/07/2018.
//
#import <UIKit/UIKit.h>
#import "UICheckBoxTableView.h"
#import "OrderedDictionary.h"
@interface RecordingsListTableView : UICheckBoxTableView {
@private
OrderedDictionary *recordings;
//This has sub arrays indexed with the date of the recordings, themselves containings the recordings.
}
@property(nonatomic) BOOL ongoing;
- (void)loadData;
- (void)removeAllRecordings;
@end

View file

@ -0,0 +1,179 @@
//
// RecordingsListTableView.m
// linphone
//
// Created by benjamin_verdier on 25/07/2018.
//
#import "RecordingsListTableView.h"
#import "UIRecordingCell.h"
#import "LinphoneManager.h"
#import "PhoneMainView.h"
#import "Utils.h"
@implementation RecordingsListTableView
NSArray *sortedRecordings;
#pragma mark - Lifecycle Functions
- (void)initRecordingsTableViewController {
recordings = [[OrderedDictionary alloc] init];
sortedRecordings = [[NSArray alloc] init];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if (![self selectFirstRow]) {
//TODO: Make first cell expand to show player
}
}
- (id)init {
self = [super init];
if (self) {
[self initRecordingsTableViewController];
}
_ongoing = FALSE;
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 {
_ongoing = TRUE;
LOGI(@"====>>>> Load recording list - Start");
//Clear recording cells
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]] setContact:nil];
}
}
//TODO: Fill the recordings dictionnary with the recording names, keys are dates
LOGI(@"====>>>> Load recording list - End");
[super loadData];
_ongoing = FALSE;
}
#pragma mark - UITableViewDataSource Functions
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
return [recordings allKeys];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [recordings count];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [(OrderedDictionary *)[recordings objectForKey:[recordings keyAtIndex: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 *recording = @"";
//TODO: Set recording to the path of the recording
[cell setRecording:recording];
[super accessoryForCell:cell atPath:indexPath];
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];
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 = [recordings keyAtIndex: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]) {
//TODO: Expand selected cell to display player
}
}
- (void)tableView:(UITableView *)tableView
commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
[NSNotificationCenter.defaultCenter removeObserver:self];
[tableView beginUpdates];
NSString *date = [recordings keyAtIndex:[indexPath section]];
NSMutableArray *subAr = [recordings objectForKey:date];
//NSString *recording = 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];
//TODO: Delete recording file here
[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 = [recordings keyAtIndex:[indexPath section]];
NSMutableArray *subAr = [recordings objectForKey:date];
//NSString *recording = subAr[indexPath.row];
[subAr removeObjectAtIndex:indexPath.row];
if (subAr.count == 0) {
[recordings removeObjectForKey:date];
}
UIRecordingCell* cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setRecording:NULL];
//TODO: Delete recording file here
}];
}
@end

View file

@ -0,0 +1,33 @@
//
// RecordingsListView.h
// linphone
//
// Created by benjamin_verdier on 25/07/2018.
//
#import <UIKit/UIKit.h>
#import "UICompositeView.h"
#import "RecordingsListTableView.h"
#import "UIIconButton.h"
typedef enum _RecordingSelectionMode { RecordingSelectionModeNone, RecordingSelectionModeEdit } RecordingSelectionMode;
@interface RecordingSelection : NSObject <UISearchBarDelegate> {
}
+ (void)setSelectionMode:(RecordingSelectionMode)selectionMode;
+ (RecordingSelectionMode)getSelectionMode;
@end
@interface RecordingsListView : UIViewController <UICompositeViewDelegate>
@property(strong, nonatomic) IBOutlet RecordingsListTableView *tableController;
@property(strong, nonatomic) IBOutlet UIView *topBar;
@property(weak, nonatomic) IBOutlet UIIconButton *deleteButton;
- (IBAction)onDeleteClick:(id)sender;
- (IBAction)onEditionChangeClick:(id)sender;
@end

View file

@ -0,0 +1,97 @@
//
// RecordingsListView.m
// linphone
//
// Created by benjamin_verdier on 25/07/2018.
//
#import "RecordingsListView.h"
#import "PhoneMainView.h"
@implementation RecordingSelection
static RecordingSelectionMode sSelectionMode = RecordingSelectionModeNone;
+ (void)setSelectionMode:(RecordingSelectionMode)selectionMode {
sSelectionMode = selectionMode;
}
+ (RecordingSelectionMode)getSelectionMode {
return sSelectionMode;
}
@end
@implementation RecordingsListView
@synthesize tableController;
@synthesize topBar;
#pragma mark - UICompositeViewDelegate Functions
static UICompositeViewDescription *compositeDescription = nil;
+ (UICompositeViewDescription *)compositeViewDescription {
if (compositeDescription == nil) {
compositeDescription = [[UICompositeViewDescription alloc] init:self.class
statusBar:StatusBarView.class
tabBar:TabBarView.class
sideMenu:SideMenuView.class
fullscreen:false
isLeftFragment:YES
fragmentWith:ContactDetailsView.class];
}
return compositeDescription;
}
- (UICompositeViewDescription *)compositeViewDescription {
return self.class.compositeViewDescription;
}
#pragma mark - ViewController Functions
- (void)viewDidLoad {
[super viewDidLoad];
tableController.tableView.accessibilityIdentifier = @"Recordings table";
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if (tableController.isEditing) {
tableController.editing = NO;
}
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
}
- (void) viewWillDisappear:(BOOL)animated {
self.view = NULL;
[self.tableController removeAllRecordings];
}
#pragma mark - Action Functions
- (IBAction)onDeleteClick:(id)sender {
NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"Do you want to delete selected recordings?", nil)];
[LinphoneManager.instance setContactsUpdated:TRUE];
[UIConfirmationDialog ShowWithMessage:msg
cancelMessage:nil
confirmMessage:nil
onCancelClick:^() {
[self onEditionChangeClick:nil];
}
onConfirmationClick:^() {
[tableController removeSelectionUsing:nil];
[tableController loadData];
[self onEditionChangeClick:nil];
}];
}
- (IBAction)onEditionChangeClick:(id)sender {
_deleteButton.hidden = !self.tableController.isEditing;
}
@end

View file

@ -0,0 +1,133 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14113" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="RecordingsListView">
<connections>
<outlet property="deleteButton" destination="zDs-pW-vyA" id="mye-fK-RaT"/>
<outlet property="tableController" destination="1pR-qo-CIP" id="FD0-NI-8ox"/>
<outlet property="topBar" destination="See-Aw-LPP" id="daF-pK-NHy"/>
<outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
</connections>
</placeholder>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="See-Aw-LPP" userLabel="topBar">
<rect key="frame" x="0.0" y="20" width="375" height="66"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="color_F.png" translatesAutoresizingMaskIntoConstraints="NO" id="7wu-Ow-YYU" userLabel="backgroundColor">
<rect key="frame" x="0.0" y="0.0" width="375" height="66"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" heightSizable="YES"/>
</imageView>
<button hidden="YES" opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="CqG-tB-maQ" userLabel="cancelButton" customClass="UIIconButton">
<rect key="frame" x="0.0" y="0.0" width="75" height="66"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" heightSizable="YES"/>
<accessibility key="accessibilityConfiguration" label="Delete all"/>
<state key="normal" image="cancel_edit_default.png">
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="disabled" image="cancel_edit_disabled.png"/>
<state key="highlighted" backgroundImage="color_E.png"/>
<connections>
<action selector="onCancelClick:" destination="1pR-qo-CIP" eventType="touchUpInside" id="qcZ-s6-jgK"/>
</connections>
</button>
<button hidden="YES" opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="zDs-pW-vyA" userLabel="deleteButton" customClass="UIIconButton">
<rect key="frame" x="300" y="0.0" width="75" height="66"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" heightSizable="YES"/>
<accessibility key="accessibilityConfiguration" label="Delete all"/>
<inset key="titleEdgeInsets" minX="0.0" minY="18" maxX="0.0" maxY="0.0"/>
<state key="normal" image="delete_default.png">
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="disabled" image="delete_disabled.png"/>
<state key="highlighted" backgroundImage="color_E.png"/>
<connections>
<action selector="onDeleteClick:" destination="-1" eventType="touchUpInside" id="8LI-ry-dTU"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="CWx-9g-0JG" userLabel="editButton" customClass="UIIconButton">
<rect key="frame" x="300" y="0.0" width="75" height="66"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" heightSizable="YES"/>
<accessibility key="accessibilityConfiguration" label="Edit"/>
<inset key="titleEdgeInsets" minX="0.0" minY="18" maxX="0.0" maxY="0.0"/>
<state key="normal" image="edit_list_default.png">
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="disabled" image="edit_list_disabled.png"/>
<state key="highlighted" backgroundImage="color_E.png"/>
<connections>
<action selector="onEditClick:" destination="1pR-qo-CIP" eventType="touchUpInside" id="0LH-n9-p0c"/>
<action selector="onEditionChangeClick:" destination="-1" eventType="touchUpInside" id="IeY-Yd-XP2"/>
</connections>
</button>
<button hidden="YES" opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="16S-9G-2cb" userLabel="toggleSelectionButton" customClass="UIIconButton">
<rect key="frame" x="225" y="0.0" width="75" height="66"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" heightSizable="YES"/>
<accessibility key="accessibilityConfiguration" label="Select all"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<inset key="titleEdgeInsets" minX="0.0" minY="18" maxX="0.0" maxY="0.0"/>
<state key="normal" image="deselect_all.png">
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="disabled" image="select_all_disabled.png"/>
<state key="selected" image="select_all_default.png"/>
<state key="highlighted" backgroundImage="color_E.png"/>
<connections>
<action selector="onAllClick:" destination="-1" eventType="touchUpInside" id="CfU-Uf-lX8"/>
<action selector="onSelectionToggle:" destination="1pR-qo-CIP" eventType="touchUpInside" id="Hfi-f6-qfI"/>
</connections>
</button>
</subviews>
</view>
<tableView clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" alwaysBounceVertical="YES" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="3b0-Nd-4r0">
<rect key="frame" x="0.0" y="94" width="375" height="573"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<connections>
<outlet property="dataSource" destination="1pR-qo-CIP" id="z2V-Yd-AwQ"/>
<outlet property="delegate" destination="1pR-qo-CIP" id="eJQ-AV-7ts"/>
</connections>
</tableView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<viewLayoutGuide key="safeArea" id="Q5M-cg-NOt"/>
<point key="canvasLocation" x="25.5" y="51.5"/>
</view>
<tableViewController id="1pR-qo-CIP" customClass="RecordingsListTableView">
<connections>
<outlet property="cancelButton" destination="CqG-tB-maQ" id="C90-0S-5WL"/>
<outlet property="deleteButton" destination="zDs-pW-vyA" id="mgV-PB-law"/>
<outlet property="editButton" destination="CWx-9g-0JG" id="hAA-6f-kX8"/>
<outlet property="toggleSelectionButton" destination="16S-9G-2cb" id="6pj-Yn-hy1"/>
<outlet property="view" destination="3b0-Nd-4r0" id="ng8-q5-bwm"/>
</connections>
<point key="canvasLocation" x="478" y="52"/>
</tableViewController>
</objects>
<resources>
<image name="cancel_edit_default.png" width="29" height="29"/>
<image name="cancel_edit_disabled.png" width="29" height="29"/>
<image name="color_E.png" width="2" height="2"/>
<image name="color_F.png" width="2" height="2"/>
<image name="delete_default.png" width="21" height="28"/>
<image name="delete_disabled.png" width="21" height="28"/>
<image name="deselect_all.png" width="27" height="27"/>
<image name="edit_list_default.png" width="30" height="28"/>
<image name="edit_list_disabled.png" width="30" height="28"/>
<image name="select_all_default.png" width="27" height="27"/>
<image name="select_all_disabled.png" width="27" height="27"/>
</resources>
</document>

View file

@ -60,6 +60,12 @@
}]];
}
[_sideMenuEntries
addObject:[[SideMenuEntry alloc] initWithTitle:NSLocalizedString(@"Recordings", nil)
tapBlock:^() {
[PhoneMainView.instance
changeCurrentView:AssistantView.compositeViewDescription];
}]];
[_sideMenuEntries
addObject:[[SideMenuEntry alloc] initWithTitle:NSLocalizedString(@"Settings", nil)
tapBlock:^() {

View file

@ -745,6 +745,11 @@
C90FAA7915AF54E6002091CB /* HistoryDetailsView.m in Sources */ = {isa = PBXBuildFile; fileRef = C90FAA7715AF54E6002091CB /* HistoryDetailsView.m */; };
CF15F21E20E4F9A3008B1DE6 /* UIImageViewDeletable.m in Sources */ = {isa = PBXBuildFile; fileRef = CF15F21C20E4F9A3008B1DE6 /* UIImageViewDeletable.m */; };
CF15F21F20E4F9A3008B1DE6 /* UIImageViewDeletable.xib in Resources */ = {isa = PBXBuildFile; fileRef = CF15F21D20E4F9A3008B1DE6 /* UIImageViewDeletable.xib */; };
CF7602D7210867E800749F76 /* RecordingsListView.m in Sources */ = {isa = PBXBuildFile; fileRef = CF7602D5210867E800749F76 /* RecordingsListView.m */; };
CF7602D8210867E800749F76 /* RecordingsListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = CF7602D6210867E800749F76 /* RecordingsListView.xib */; };
CF7602E221086EB200749F76 /* RecordingsListTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = CF7602E021086EB200749F76 /* RecordingsListTableView.m */; };
CF7602E72108759A00749F76 /* UIRecordingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CF7602E52108759A00749F76 /* UIRecordingCell.m */; };
CF7602E82108759A00749F76 /* UIRecordingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CF7602E62108759A00749F76 /* UIRecordingCell.xib */; };
CFBD7A2A20E504AE007C5286 /* delete_img.png in Resources */ = {isa = PBXBuildFile; fileRef = CFBD7A2320E504AD007C5286 /* delete_img.png */; };
D306459E1611EC2A00BB571E /* UILoadingImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = D306459D1611EC2900BB571E /* UILoadingImageView.m */; };
D3128FE115AABC7E00A2147A /* ContactDetailsView.m in Sources */ = {isa = PBXBuildFile; fileRef = D3128FDF15AABC7E00A2147A /* ContactDetailsView.m */; };
@ -1851,6 +1856,14 @@
CF15F21B20E4F9A3008B1DE6 /* UIImageViewDeletable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIImageViewDeletable.h; sourceTree = "<group>"; };
CF15F21C20E4F9A3008B1DE6 /* UIImageViewDeletable.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UIImageViewDeletable.m; sourceTree = "<group>"; };
CF15F21D20E4F9A3008B1DE6 /* UIImageViewDeletable.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UIImageViewDeletable.xib; sourceTree = "<group>"; };
CF7602D4210867E800749F76 /* RecordingsListView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RecordingsListView.h; sourceTree = "<group>"; };
CF7602D5210867E800749F76 /* RecordingsListView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RecordingsListView.m; sourceTree = "<group>"; };
CF7602D6210867E800749F76 /* RecordingsListView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RecordingsListView.xib; sourceTree = "<group>"; };
CF7602DF21086EB100749F76 /* RecordingsListTableView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RecordingsListTableView.h; sourceTree = "<group>"; };
CF7602E021086EB200749F76 /* RecordingsListTableView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RecordingsListTableView.m; sourceTree = "<group>"; };
CF7602E42108759A00749F76 /* UIRecordingCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIRecordingCell.h; sourceTree = "<group>"; };
CF7602E52108759A00749F76 /* UIRecordingCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UIRecordingCell.m; sourceTree = "<group>"; };
CF7602E62108759A00749F76 /* UIRecordingCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UIRecordingCell.xib; sourceTree = "<group>"; };
CFBD7A2320E504AD007C5286 /* delete_img.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = delete_img.png; sourceTree = "<group>"; };
D306459C1611EC2900BB571E /* UILoadingImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UILoadingImageView.h; sourceTree = "<group>"; };
D306459D1611EC2900BB571E /* UILoadingImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UILoadingImageView.m; sourceTree = "<group>"; };
@ -2205,12 +2218,6 @@
D3F83EEA1582021700336684 /* CallView.m */,
D381881C15FE3FCA00C3EDCA /* CallView.xib */,
638F1A861C2167C2004B8E02 /* CallView~ipad.xib */,
8CA70ACF1F9E0ABA00A3D2EB /* ChatConversationInfoView.h */,
8CA70AD01F9E0AE100A3D2EB /* ChatConversationInfoView.m */,
8CBD7BA220B6B7FD00E5DCC0 /* ChatConversationInfoView.xib */,
8CD99A3D2090BA24008A7CDA /* ChatConversationImdnView.h */,
8CD99A3B2090B9FA008A7CDA /* ChatConversationImdnView.m */,
8CBD7BA520B6B80D00E5DCC0 /* ChatConversationImdnView.xib */,
8C9C5E0B1F83B2EF006987FA /* ChatConversationCreateCollectionViewController.h */,
8C9C5E0C1F83B2EF006987FA /* ChatConversationCreateCollectionViewController.m */,
6341807A1BBC103100F71761 /* ChatConversationCreateTableView.h */,
@ -2218,6 +2225,12 @@
6336715E1BCBAAD200BFCBDE /* ChatConversationCreateView.h */,
6336715F1BCBAAD200BFCBDE /* ChatConversationCreateView.m */,
63B8D68E1BCBE65600C12B09 /* ChatConversationCreateView.xib */,
8CD99A3D2090BA24008A7CDA /* ChatConversationImdnView.h */,
8CD99A3B2090B9FA008A7CDA /* ChatConversationImdnView.m */,
8CBD7BA520B6B80D00E5DCC0 /* ChatConversationImdnView.xib */,
8CA70ACF1F9E0ABA00A3D2EB /* ChatConversationInfoView.h */,
8CA70AD01F9E0AE100A3D2EB /* ChatConversationInfoView.m */,
8CBD7BA220B6B7FD00E5DCC0 /* ChatConversationInfoView.xib */,
D32B6E2715A5BC430033019F /* ChatConversationTableView.h */,
D32B6E2815A5BC430033019F /* ChatConversationTableView.m */,
D3F795D315A582800077328B /* ChatConversationView.h */,
@ -2238,9 +2251,9 @@
D35497FB15875372000081D8 /* ContactsListView.h */,
D35497FC15875372000081D8 /* ContactsListView.m */,
D38187C015FE342800C3EDCA /* ContactsListView.xib */,
631098501D4660630041F2B3 /* CountryListView.xib */,
631098471D4660580041F2B3 /* CountryListView.h */,
631098481D4660580041F2B3 /* CountryListView.m */,
631098501D4660630041F2B3 /* CountryListView.xib */,
22F2508B107141E100AC9B3F /* DialerView.h */,
22F2508C107141E100AC9B3F /* DialerView.m */,
D38187C415FE345B00C3EDCA /* DialerView.xib */,
@ -2268,8 +2281,6 @@
63E27A311C4FECD000D332AE /* LaunchScreen.xib */,
1D3623240D0F684500981E51 /* LinphoneAppDelegate.h */,
1D3623250D0F684500981E51 /* LinphoneAppDelegate.m */,
8C2595D51DEDC8E1007A6424 /* ProviderDelegate.h */,
8C2595DC1DEDC92D007A6424 /* ProviderDelegate.m */,
D37DC6BF1594AE1800B2A5EB /* LinphoneCoreSettingsStore.h */,
D37DC6C01594AE1800B2A5EB /* LinphoneCoreSettingsStore.m */,
D3EA53FB159850E80037DC6B /* LinphoneManager.h */,
@ -2279,6 +2290,13 @@
D3F83F8C158229C500336684 /* PhoneMainView.h */,
D3F83F8D15822ABD00336684 /* PhoneMainView.m */,
639E9CB31C0DB88200019A75 /* PhoneMainView.xib */,
8C2595D51DEDC8E1007A6424 /* ProviderDelegate.h */,
8C2595DC1DEDC92D007A6424 /* ProviderDelegate.m */,
CF7602DF21086EB100749F76 /* RecordingsListTableView.h */,
CF7602E021086EB200749F76 /* RecordingsListTableView.m */,
CF7602D4210867E800749F76 /* RecordingsListView.h */,
CF7602D5210867E800749F76 /* RecordingsListView.m */,
CF7602D6210867E800749F76 /* RecordingsListView.xib */,
D35E759C159460B50066B1C1 /* SettingsView.h */,
D35E759D159460B50066B1C1 /* SettingsView.m */,
636316D61A1DEC650009B839 /* SettingsView.xib */,
@ -2385,6 +2403,9 @@
63701DDD1BA32039006A9AE3 /* UIConfirmationDialog.h */,
63701DDE1BA32039006A9AE3 /* UIConfirmationDialog.m */,
639E9CAB1C0DB7FB00019A75 /* UIConfirmationDialog.xib */,
CF7602E42108759A00749F76 /* UIRecordingCell.h */,
CF7602E52108759A00749F76 /* UIRecordingCell.m */,
CF7602E62108759A00749F76 /* UIRecordingCell.xib */,
D3A55FBA15877E5E003FD403 /* UIContactCell.h */,
D3A55FBB15877E5E003FD403 /* UIContactCell.m */,
F088488D19FF8C41007FFCF3 /* UIContactCell.xib */,
@ -3818,6 +3839,7 @@
633FEDE91D3CD5590014B822 /* call_status_missed~ipad@2x.png in Resources */,
8CE24F4C1F8234A30077AC0A /* next_default@2x.png in Resources */,
244523B11E8266CC0037A187 /* chat_read.png in Resources */,
CF7602D8210867E800749F76 /* RecordingsListView.xib in Resources */,
639E9CAC1C0DB80300019A75 /* UIContactDetailsCell.xib in Resources */,
633FEE511D3CD5590014B822 /* deselect_all@2x.png in Resources */,
8CF25D951F9F336100BEA0C1 /* check_unselected@2x.png in Resources */,
@ -3914,6 +3936,7 @@
633FEEA41D3CD55A0014B822 /* numpad_1_default@2x.png in Resources */,
63E27A321C4FECD000D332AE /* LaunchScreen.xib in Resources */,
633FEED11D3CD55A0014B822 /* numpad_6~ipad.png in Resources */,
CF7602E82108759A00749F76 /* UIRecordingCell.xib in Resources */,
633FEED21D3CD55A0014B822 /* numpad_6~ipad@2x.png in Resources */,
633FEDCD1D3CD5590014B822 /* call_quality_indicator_0@2x.png in Resources */,
636316D41A1DEC650009B839 /* SettingsView.xib in Resources */,
@ -4384,6 +4407,7 @@
34216F401547EBCD00EA9777 /* VideoZoomHandler.m in Sources */,
D3F83EEC1582021700336684 /* CallView.m in Sources */,
8C2595DD1DEDC92D007A6424 /* ProviderDelegate.m in Sources */,
CF7602D7210867E800749F76 /* RecordingsListView.m in Sources */,
63F1DF4B1BCE983200EDED90 /* CallConferenceTableView.m in Sources */,
D3F83F8E15822ABE00336684 /* PhoneMainView.m in Sources */,
6377AC801BDE4069007F7625 /* UIBackToCallButton.m in Sources */,
@ -4447,6 +4471,7 @@
D3807FC115C28940005BE9BC /* DCRoundSwitchKnobLayer.m in Sources */,
6306440E1BECB08500134C72 /* FirstLoginView.m in Sources */,
D3807FC315C28940005BE9BC /* DCRoundSwitchOutlineLayer.m in Sources */,
CF7602E221086EB200749F76 /* RecordingsListTableView.m in Sources */,
D3807FC515C28940005BE9BC /* DCRoundSwitchToggleLayer.m in Sources */,
633E41821D74259000320475 /* AssistantLinkView.m in Sources */,
D3807FE815C2894A005BE9BC /* IASKAppSettingsViewController.m in Sources */,
@ -4459,6 +4484,7 @@
D3807FF215C2894A005BE9BC /* IASKSettingsStoreFile.m in Sources */,
D3807FF415C2894A005BE9BC /* IASKSettingsStoreUserDefaults.m in Sources */,
639E9C801C0DB13D00019A75 /* UICheckBoxTableView.m in Sources */,
CF7602E72108759A00749F76 /* UIRecordingCell.m in Sources */,
D3807FF615C2894A005BE9BC /* IASKSpecifier.m in Sources */,
D3807FF815C2894A005BE9BC /* IASKPSSliderSpecifierViewCell.m in Sources */,
D3807FFA15C2894A005BE9BC /* IASKPSTextFieldSpecifierViewCell.m in Sources */,