From b915cdd9c6d99c8b7ef40563363067fa9f72c03f Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Thu, 14 Jun 2012 16:52:51 +0200 Subject: [PATCH] Rename classes ... split buttons enable/disable stuff Add OrderedDictionary --- Classes/CallHistoryTableViewController.m | 245 --------- Classes/ConferenceCallDetailView.m | 9 +- Classes/ConsoleViewController.h | 8 +- Classes/ConsoleViewController.m | 46 +- Classes/ContactTableViewController.h | 2 +- Classes/ContactTableViewController.m | 44 +- ...sController.h => ContactsViewController.h} | 7 +- ...sController.m => ContactsViewController.m} | 6 +- ...troller.xib => ContactsViewController.xib} | 14 +- ...troller.h => HistoryTableViewController.h} | 6 +- Classes/HistoryTableViewController.m | 133 +++++ ...ryController.h => HistoryViewController.h} | 14 +- ...ryController.m => HistoryViewController.m} | 16 +- ...ntroller.xib => HistoryViewController.xib} | 23 +- Classes/InCallViewController.h | 10 +- Classes/InCallViewController.m | 70 +-- Classes/InCallViewController.xib | 64 +-- Classes/LinphoneUI/ContactCell.xib | 195 ------- Classes/LinphoneUI/LinphoneCallBar.m | 152 ------ Classes/LinphoneUI/LinphoneManager.h | 2 +- Classes/LinphoneUI/LinphoneManager.m | 31 +- .../{LinphoneCallBar.h => UICallBar.h} | 25 +- Classes/LinphoneUI/UICallBar.m | 54 ++ .../{LinphoneCallBar.xib => UICallBar.xib} | 87 ++-- .../{ContactCell.h => UIContactCell.h} | 12 +- Classes/LinphoneUI/UIContactCell.m | 76 +++ Classes/LinphoneUI/UIContactCell.xib | 287 +++++++++++ Classes/LinphoneUI/UIHistoryCell.h | 32 ++ .../{ContactCell.m => UIHistoryCell.m} | 38 +- Classes/LinphoneUI/UIHistoryCell.xib | 282 ++++++++++ .../{LinphoneMainBar.h => UIMainBar.h} | 4 +- .../{LinphoneMainBar.m => UIMainBar.m} | 24 +- .../{LinphoneMainBar.xib => UIMainBar.xib} | 7 +- Classes/LinphoneUI/UIMicroButton.h | 4 +- Classes/LinphoneUI/UIMicroButton.m | 4 +- Classes/LinphoneUI/UIPauseButton.h | 25 + Classes/LinphoneUI/UIPauseButton.m | 106 ++++ Classes/LinphoneUI/UISpeakerButton.h | 2 +- Classes/LinphoneUI/UISpeakerButton.m | 18 +- .../{LinphoneStatusBar.h => UIStateBar.h} | 10 +- .../{LinphoneStatusBar.m => UIStateBar.m} | 28 +- .../{LinphoneStatusBar.xib => UIStateBar.xib} | 75 +-- Classes/LinphoneUI/UIToggleButton.h | 4 +- Classes/LinphoneUI/UIToggleButton.m | 8 +- Classes/LinphoneUI/UIToggleVideoButton.m | 75 --- ...{UIToggleVideoButton.h => UIVideoButton.h} | 7 +- Classes/LinphoneUI/UIVideoButton.m | 92 ++++ Classes/MainScreenWithVideoPreview.xib | 285 ++++++++++- Classes/PhoneMainView.h | 9 +- Classes/PhoneMainView.m | 62 ++- Classes/PhoneMainView.xib | 414 +++++++++++---- Classes/PhoneViewController.h | 1 + Classes/PhoneViewController.m | 1 + Classes/Utils/OrderedDictionary.h | 37 ++ Classes/Utils/OrderedDictionary.m | 170 +++++++ Classes/VideoViewController.m | 12 +- Resources/HP.png | Bin 3113 -> 0 bytes Resources/HP_inverse.png | Bin 6868 -> 0 bytes Resources/ajouter.png | Bin 2653 -> 0 bytes Resources/appel-entrant.png | Bin 0 -> 2326 bytes Resources/appel-manque.png | Bin 0 -> 2666 bytes Resources/appel-sortant.png | Bin 0 -> 2320 bytes Resources/clavier-01-106px.png | Bin 328 -> 0 bytes Resources/clavier-01-108px.png | Bin 330 -> 0 bytes Resources/clavier-01-160px.png | Bin 348 -> 0 bytes Resources/clavier.png | Bin 4259 -> 0 bytes Resources/contact.png | Bin 4547 -> 0 bytes Resources/contact_vide.png | Bin 2905 -> 0 bytes Resources/effacer.png | Bin 2180 -> 0 bytes Resources/fond-detail-numero.png | Bin 0 -> 3673 bytes Resources/grouper.png | Bin 4208 -> 0 bytes Resources/in_call.png | Bin 4087 -> 0 bytes Resources/in_call_video.png | Bin 5233 -> 0 bytes Resources/micro.png | Bin 5956 -> 0 bytes Resources/micro_inverse.png | Bin 9434 -> 0 bytes Resources/missed_call.png | Bin 4178 -> 0 bytes Resources/out_call.png | Bin 4030 -> 0 bytes Resources/out_call_video.png | Bin 5161 -> 0 bytes Resources/pause.png | Bin 2708 -> 0 bytes Resources/pause_inactif.png | Bin 6699 -> 0 bytes Resources/quality-call-0.png | Bin 0 -> 2137 bytes Resources/quality-call-1.png | Bin 0 -> 2158 bytes Resources/quality-call-2.png | Bin 0 -> 2160 bytes Resources/quality-call-3.png | Bin 0 -> 1979 bytes Resources/registration_inprogress.png | Bin 0 -> 664 bytes Resources/secured.png | Bin 838 -> 0 bytes Resources/startcall-gray.png | Bin 2111 -> 0 bytes Resources/stat_sys_signal_0.png | Bin 905 -> 0 bytes Resources/stat_sys_signal_1.png | Bin 597 -> 0 bytes Resources/stat_sys_signal_2.png | Bin 595 -> 0 bytes Resources/stat_sys_signal_3.png | Bin 594 -> 0 bytes Resources/stat_sys_signal_4.png | Bin 532 -> 0 bytes Resources/status_connected.png | Bin 0 -> 1701 bytes Resources/status_disconnected.png | Bin 0 -> 575 bytes Resources/status_error.png | Bin 0 -> 1488 bytes Resources/status_gray.png | Bin 948 -> 0 bytes Resources/status_green.png | Bin 1242 -> 0 bytes Resources/status_inprogress.png | Bin 0 -> 684 bytes Resources/status_orange.png | Bin 1252 -> 0 bytes Resources/status_red.png | Bin 1202 -> 0 bytes Resources/unverified.png | Bin 358 -> 0 bytes linphone.xcodeproj/project.pbxproj | 480 +++++++----------- 102 files changed, 2413 insertions(+), 1541 deletions(-) delete mode 100644 Classes/CallHistoryTableViewController.m rename Classes/{ContactsController.h => ContactsViewController.h} (94%) rename Classes/{ContactsController.m => ContactsViewController.m} (94%) rename Classes/{ContactsController.xib => ContactsViewController.xib} (97%) rename Classes/{CallHistoryTableViewController.h => HistoryTableViewController.h} (91%) create mode 100644 Classes/HistoryTableViewController.m rename Classes/{HistoryController.h => HistoryViewController.h} (83%) rename Classes/{HistoryController.m => HistoryViewController.m} (87%) rename Classes/{HistoryController.xib => HistoryViewController.xib} (95%) delete mode 100644 Classes/LinphoneUI/ContactCell.xib delete mode 100644 Classes/LinphoneUI/LinphoneCallBar.m rename Classes/LinphoneUI/{LinphoneCallBar.h => UICallBar.h} (65%) create mode 100644 Classes/LinphoneUI/UICallBar.m rename Classes/LinphoneUI/{LinphoneCallBar.xib => UICallBar.xib} (94%) rename Classes/LinphoneUI/{ContactCell.h => UIContactCell.h} (81%) create mode 100644 Classes/LinphoneUI/UIContactCell.m create mode 100644 Classes/LinphoneUI/UIContactCell.xib create mode 100644 Classes/LinphoneUI/UIHistoryCell.h rename Classes/LinphoneUI/{ContactCell.m => UIHistoryCell.m} (69%) create mode 100644 Classes/LinphoneUI/UIHistoryCell.xib rename Classes/LinphoneUI/{LinphoneMainBar.h => UIMainBar.h} (96%) rename Classes/LinphoneUI/{LinphoneMainBar.m => UIMainBar.m} (86%) rename Classes/LinphoneUI/{LinphoneMainBar.xib => UIMainBar.xib} (99%) create mode 100644 Classes/LinphoneUI/UIPauseButton.h create mode 100644 Classes/LinphoneUI/UIPauseButton.m rename Classes/LinphoneUI/{LinphoneStatusBar.h => UIStateBar.h} (88%) rename Classes/LinphoneUI/{LinphoneStatusBar.m => UIStateBar.m} (86%) rename Classes/LinphoneUI/{LinphoneStatusBar.xib => UIStateBar.xib} (75%) delete mode 100644 Classes/LinphoneUI/UIToggleVideoButton.m rename Classes/LinphoneUI/{UIToggleVideoButton.h => UIVideoButton.h} (91%) create mode 100644 Classes/LinphoneUI/UIVideoButton.m create mode 100644 Classes/Utils/OrderedDictionary.h create mode 100644 Classes/Utils/OrderedDictionary.m delete mode 100755 Resources/HP.png delete mode 100755 Resources/HP_inverse.png delete mode 100755 Resources/ajouter.png create mode 100644 Resources/appel-entrant.png create mode 100644 Resources/appel-manque.png create mode 100644 Resources/appel-sortant.png delete mode 100644 Resources/clavier-01-106px.png delete mode 100644 Resources/clavier-01-108px.png delete mode 100644 Resources/clavier-01-160px.png delete mode 100755 Resources/clavier.png delete mode 100755 Resources/contact.png delete mode 100755 Resources/contact_vide.png delete mode 100755 Resources/effacer.png create mode 100644 Resources/fond-detail-numero.png delete mode 100755 Resources/grouper.png delete mode 100644 Resources/in_call.png delete mode 100644 Resources/in_call_video.png delete mode 100755 Resources/micro.png delete mode 100755 Resources/micro_inverse.png delete mode 100644 Resources/missed_call.png delete mode 100644 Resources/out_call.png delete mode 100644 Resources/out_call_video.png delete mode 100755 Resources/pause.png delete mode 100755 Resources/pause_inactif.png create mode 100644 Resources/quality-call-0.png create mode 100644 Resources/quality-call-1.png create mode 100644 Resources/quality-call-2.png create mode 100644 Resources/quality-call-3.png create mode 100644 Resources/registration_inprogress.png delete mode 100644 Resources/secured.png delete mode 100644 Resources/startcall-gray.png delete mode 100644 Resources/stat_sys_signal_0.png delete mode 100644 Resources/stat_sys_signal_1.png delete mode 100644 Resources/stat_sys_signal_2.png delete mode 100644 Resources/stat_sys_signal_3.png delete mode 100644 Resources/stat_sys_signal_4.png create mode 100644 Resources/status_connected.png create mode 100644 Resources/status_disconnected.png create mode 100644 Resources/status_error.png delete mode 100644 Resources/status_gray.png delete mode 100644 Resources/status_green.png create mode 100644 Resources/status_inprogress.png delete mode 100644 Resources/status_orange.png delete mode 100644 Resources/status_red.png delete mode 100644 Resources/unverified.png diff --git a/Classes/CallHistoryTableViewController.m b/Classes/CallHistoryTableViewController.m deleted file mode 100644 index def9679e0..000000000 --- a/Classes/CallHistoryTableViewController.m +++ /dev/null @@ -1,245 +0,0 @@ -/* CallHistoryTableViewController.m - * - * Copyright (C) 2009 Belledonne Comunications, Grenoble, France - * - * 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 2 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, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#import "CallHistoryTableViewController.h" -#import "LinphoneManager.h" - - -@implementation CallHistoryTableViewController -/* -- (id)initWithStyle:(UITableViewStyle)style { - // Override initWithStyle: if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. - if (self = [super initWithStyle:style]) { - } - return self; -} -*/ -/* -- (void)viewDidLoad { - [super viewDidLoad]; -} -*/ -/* -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; -} -*/ -/* -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - -} -*/ -/* -- (void)viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; -} -*/ -/* -- (void)viewDidDisappear:(BOOL)animated { - [super viewDidDisappear:animated]; -} -*/ - -/* -// Override to allow orientations other than the default portrait orientation. -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - // Return YES for supported orientations - return (interfaceOrientation == UIInterfaceOrientationPortrait); -} -*/ - -- (void)didReceiveMemoryWarning { - // Releases the view if it doesn't have a superview. - [super didReceiveMemoryWarning]; - - // Release any cached data, images, etc that aren't in use. -} - -- (void)viewDidUnload { - // Release any retained subviews of the main view. - // e.g. self.myOutlet = nil; -} - - --(void) doAction:(id)sender { - linphone_core_clear_call_logs([LinphoneManager getLc]); - [self.tableView reloadData]; -} - -#pragma mark Table view methods - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 1; -} - - -// Customize the number of rows in the table view. -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - const MSList * logs = linphone_core_get_call_logs([LinphoneManager getLc]); - return ms_list_size(logs); -} - - -// Customize the appearance of table view cells. -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - - static NSString *CellIdentifier = @"Cell"; - - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; - if (cell == nil) { - cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; - [cell.textLabel setTextColor:[UIColor colorWithRed:0.7 green:0.745 blue:0.78 alpha:1.0]]; - [cell.detailTextLabel setTextColor:cell.textLabel.textColor]; - } - - // Set up the cell... - LinphoneAddress* partyToDisplay; - const MSList * logs = linphone_core_get_call_logs([LinphoneManager getLc]); - LinphoneCallLog* callLogs = ms_list_nth_data(logs, indexPath.row) ; - - NSString *path; - if (callLogs->dir == LinphoneCallIncoming) { - if (callLogs->status == LinphoneCallSuccess) { - path = [[NSBundle mainBundle] pathForResource:callLogs->video_enabled?@"in_call_video":@"in_call" ofType:@"png"]; - } else { - //missed call - path = [[NSBundle mainBundle] pathForResource:@"missed_call" ofType:@"png"]; - } - partyToDisplay=callLogs->from; - - } else { - path = [[NSBundle mainBundle] pathForResource:callLogs->video_enabled?@"out_call_video":@"out_call" ofType:@"png"]; - partyToDisplay=callLogs->to; - - } - UIImage *image = [UIImage imageWithContentsOfFile:path]; - cell.imageView.image = image; - cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; - - const char* username = linphone_address_get_username(partyToDisplay)!=0?linphone_address_get_username(partyToDisplay):""; - const char* displayName = linphone_address_get_display_name(partyToDisplay); - - if (displayName) { - NSString* str1 = [NSString stringWithFormat:@"%s", displayName]; - [cell.textLabel setText:str1]; - NSString* str2 = [NSString stringWithFormat:@"%s"/* [%s]"*/,username/*,callLogs->start_date*/]; - [cell.detailTextLabel setText:str2]; - } else { - NSString* str1 = [NSString stringWithFormat:@"%s", username]; - [cell.textLabel setText:str1]; - [cell.detailTextLabel setText:nil]; - } - - return cell; -} - - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - // Navigation logic may go here. Create and push another view controller. - // AnotherViewController *anotherViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherView" bundle:nil]; - // [self.navigationController pushViewController:anotherViewController]; - // [anotherViewController release]; - [tableView deselectRowAtIndexPath:indexPath animated:NO]; - - const MSList * logs = linphone_core_get_call_logs([LinphoneManager getLc]); - LinphoneCallLog* callLogs = ms_list_nth_data(logs, indexPath.row) ; - LinphoneAddress* partyToCall; - if (callLogs->dir == LinphoneCallIncoming) { - partyToCall=callLogs->from; - - } else { - partyToCall=callLogs->to; - - } - const char* username = linphone_address_get_username(partyToCall)!=0?linphone_address_get_username(partyToCall):""; - const char* displayName = linphone_address_get_display_name(partyToCall)!=0?linphone_address_get_display_name(partyToCall):""; - const char* domain = linphone_address_get_domain(partyToCall); - - LinphoneProxyConfig* proxyCfg; - linphone_core_get_default_proxy([LinphoneManager getLc],&proxyCfg); - - NSString* phoneNumber; - - if (proxyCfg && (strcmp(domain, linphone_proxy_config_get_domain(proxyCfg)) == 0)) { - phoneNumber = [[NSString alloc] initWithCString:username encoding:[NSString defaultCStringEncoding]]; - } else { - phoneNumber = [[NSString alloc] initWithCString:linphone_address_as_string_uri_only(partyToCall) encoding:[NSString defaultCStringEncoding]]; - } - - NSString* dispName = [[NSString alloc] initWithCString:displayName encoding:[NSString defaultCStringEncoding]]; - - - [[LinphoneManager instance] changeView:PhoneView_Dialer]; - - //TODO - /*[[LinphoneManager instance].callDelegate displayDialerFromUI:self - forUser:phoneNumber - withDisplayName:dispName];*/ - [phoneNumber release]; - [dispName release]; -} - - -/* -// Override to support conditional editing of the table view. -- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { - // Return NO if you do not want the specified item to be editable. - return YES; -} -*/ - - -/* -// Override to support editing the table view. -- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { - - if (editingStyle == UITableViewCellEditingStyleDelete) { - // Delete the row from the data source - [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES]; - } - else if (editingStyle == UITableViewCellEditingStyleInsert) { - // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view - } -} -*/ - - -/* -// Override to support rearranging the table view. -- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { -} -*/ - - -/* -// Override to support conditional rearranging of the table view. -- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { - // Return NO if you do not want the item to be re-orderable. - return YES; -} -*/ - -- (void)dealloc { - [super dealloc]; -} - - -@end - diff --git a/Classes/ConferenceCallDetailView.m b/Classes/ConferenceCallDetailView.m index d31b9cf57..a33907976 100644 --- a/Classes/ConferenceCallDetailView.m +++ b/Classes/ConferenceCallDetailView.m @@ -18,9 +18,10 @@ */ #import "ConferenceCallDetailView.h" -#import "linphonecore.h" #import "LinphoneManager.h" -#import "IncallViewController.h" +#import "InCallViewController.h" + +#include "linphonecore.h" @implementation ConferenceCallDetailView @@ -86,8 +87,8 @@ NSTimer *callQualityRefresher; -(void) viewWillAppear:(BOOL)animated { [table reloadData]; - [mute reset]; - [speaker reset]; + [mute update]; + [speaker update]; [[UIApplication sharedApplication] setIdleTimerDisabled:YES]; [super viewWillAppear:animated]; } diff --git a/Classes/ConsoleViewController.h b/Classes/ConsoleViewController.h index 2956112a2..5ae2f3a28 100644 --- a/Classes/ConsoleViewController.h +++ b/Classes/ConsoleViewController.h @@ -17,20 +17,18 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - #import -#import "LogView.h" +#import "LogView.h" @interface ConsoleViewController : UIViewController { UITextView* logs; UIView* logsView; - - } + -(void) doAction; + @property (nonatomic, retain) IBOutlet UITextView* logs; @property (nonatomic, retain) IBOutlet UIView* logsView; - @end diff --git a/Classes/ConsoleViewController.m b/Classes/ConsoleViewController.m index 246ced0eb..46e8c8cb4 100644 --- a/Classes/ConsoleViewController.m +++ b/Classes/ConsoleViewController.m @@ -20,25 +20,13 @@ #import "ConsoleViewController.h" - @implementation ConsoleViewController + NSMutableString* MoreViewController_logs; @synthesize logs; @synthesize logsView; -/* - // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { - // Custom initialization - } - return self; -} -*/ - - -// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; UIBarButtonItem* clear = [[[UIBarButtonItem alloc] @@ -48,34 +36,12 @@ NSMutableString* MoreViewController_logs; [self.navigationItem setRightBarButtonItem:clear]; } - -/* -// Override to allow orientations other than the default portrait orientation. -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - // Return YES for supported orientations - return (interfaceOrientation == UIInterfaceOrientationPortrait); -} -*/ - --(void) viewWillAppear:(BOOL)animated { +- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [logs setText:MoreViewController_logs]; } -- (void)didReceiveMemoryWarning { - // Releases the view if it doesn't have a superview. - [super didReceiveMemoryWarning]; - - // Release any cached data, images, etc that aren't in use. -} - -- (void)viewDidUnload { - // Release any retained subviews of the main view. - // e.g. self.myOutlet = nil; -} - - --(void) addLog:(NSString*) log { +- (void)addLog:(NSString*) log { @synchronized(self) { if (!MoreViewController_logs) { MoreViewController_logs = [[NSMutableString alloc] init]; @@ -87,7 +53,8 @@ NSMutableString* MoreViewController_logs; } } } --(void) doAction{ + +- (void)doAction{ @synchronized(self) { NSMutableString* oldString = MoreViewController_logs; MoreViewController_logs = [[NSMutableString alloc] init]; @@ -96,11 +63,8 @@ NSMutableString* MoreViewController_logs; } } - - - (void)dealloc { [super dealloc]; } - @end diff --git a/Classes/ContactTableViewController.h b/Classes/ContactTableViewController.h index 5141d7a03..97c0717e3 100644 --- a/Classes/ContactTableViewController.h +++ b/Classes/ContactTableViewController.h @@ -18,8 +18,8 @@ */ #import -#import #import + #import "OrderedDictionary.h" @interface ContactTableViewController : UITableViewController { diff --git a/Classes/ContactTableViewController.m b/Classes/ContactTableViewController.m index 03383d73b..70a8129cc 100644 --- a/Classes/ContactTableViewController.m +++ b/Classes/ContactTableViewController.m @@ -19,7 +19,7 @@ #include "ContactTableViewController.h" #import "FastAddressBook.h" -#import "ContactCell.h" +#import "UIContactCell.h" @implementation ContactTableViewController @@ -36,20 +36,25 @@ void sync_toc_address_book (ABAddressBookRef addressBook, CFDictionaryRef info, NSArray *lContacts = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook); for (id lPerson in lContacts) { - CFStringRef lValue = ABRecordCopyValue((ABRecordRef)lPerson, kABPersonFirstNameProperty); - CFStringRef lLocalizedLabel = ABAddressBookCopyLocalizedLabel(lValue); - + CFStringRef lFirstName = ABRecordCopyValue((ABRecordRef)lPerson, kABPersonFirstNameProperty); + CFStringRef lLocalizedFirstName = ABAddressBookCopyLocalizedLabel(lFirstName); + CFStringRef lLastName = ABRecordCopyValue((ABRecordRef)lPerson, kABPersonLastNameProperty); + CFStringRef lLocalizedLastName = ABAddressBookCopyLocalizedLabel(lLastName); + NSString *name =[NSString stringWithFormat:@"%@%@", [(NSString *)lLocalizedFirstName retain], [(NSString *)lLocalizedLastName retain]]; + // Put in correct subDic - NSString *firstChar = [[(NSString *)lLocalizedLabel substringToIndex:1] uppercaseString]; + NSString *firstChar = [[name substringToIndex:1] uppercaseString]; OrderedDictionary *subDic =[lAddressBookMap objectForKey: firstChar]; if(subDic == nil) { subDic = [[OrderedDictionary alloc] init]; [lAddressBookMap insertObject:subDic forKey:firstChar selector:@selector(caseInsensitiveCompare:)]; } - [subDic insertObject:lPerson forKey:[(NSString *)lLocalizedLabel retain] selector:@selector(caseInsensitiveCompare:)]; - - if (lLocalizedLabel) CFRelease(lLocalizedLabel); - CFRelease(lValue); + [subDic insertObject:lPerson forKey:name selector:@selector(caseInsensitiveCompare:)]; + + CFRelease(lLocalizedLastName); + CFRelease(lLastName); + CFRelease(lLocalizedFirstName); + CFRelease(lFirstName); } CFRelease(lContacts); } @@ -72,14 +77,29 @@ void sync_toc_address_book (ABAddressBookRef addressBook, CFDictionaryRef info, } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - ContactCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ContactCell"]; + UIContactCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UIContactCell"]; if (cell == nil) { - cell = [[ContactCell alloc] init]; + cell = [[UIContactCell alloc] init]; } OrderedDictionary *subDic = [addressBookMap objectForKey: [addressBookMap keyAtIndex: [indexPath section]]]; - [cell.label setText: (NSString *)[[subDic allKeys] objectAtIndex:[indexPath row]]]; + NSString *key = [[subDic allKeys] objectAtIndex:[indexPath row]]; + ABRecordRef record = [subDic objectForKey:key]; + + CFStringRef lFirstName = ABRecordCopyValue(record, kABPersonFirstNameProperty); + CFStringRef lLocalizedFirstName = ABAddressBookCopyLocalizedLabel(lFirstName); + CFStringRef lLastName = ABRecordCopyValue(record, kABPersonLastNameProperty); + CFStringRef lLocalizedLastName = ABAddressBookCopyLocalizedLabel(lLastName); + + [cell.firstName setText: [(NSString *)lLocalizedFirstName retain]]; + [cell.lastName setText: [(NSString *)lLocalizedLastName retain]]; + [cell update]; + + CFRelease(lLocalizedLastName); + CFRelease(lLastName); + CFRelease(lLocalizedFirstName); + CFRelease(lFirstName); return cell; } diff --git a/Classes/ContactsController.h b/Classes/ContactsViewController.h similarity index 94% rename from Classes/ContactsController.h rename to Classes/ContactsViewController.h index 2676c9d1b..f1244803b 100644 --- a/Classes/ContactsController.h +++ b/Classes/ContactsViewController.h @@ -1,4 +1,4 @@ -/* HistoryController.h +/* ContactsViewController.h * * Copyright (C) 2012 Belledonne Comunications, Grenoble, France * @@ -19,14 +19,17 @@ #import -@interface ContactsController : UIViewController { +@interface ContactsViewController : UIViewController { UITableViewController *tableController; UIButton *allButton; UIButton *linphoneButton; } + @property (nonatomic, retain) IBOutlet UITableViewController* tableController; @property (nonatomic, retain) IBOutlet UIButton* allButton; @property (nonatomic, retain) IBOutlet UIButton* linphoneButton; + -(IBAction) onAllClick: (id) event; -(IBAction) onLinphoneClick: (id) event; + @end diff --git a/Classes/ContactsController.m b/Classes/ContactsViewController.m similarity index 94% rename from Classes/ContactsController.m rename to Classes/ContactsViewController.m index 515784419..52ee33ce9 100644 --- a/Classes/ContactsController.m +++ b/Classes/ContactsViewController.m @@ -1,4 +1,4 @@ -/* HistoryController.m +/* ContactsViewController.m * * Copyright (C) 2012 Belledonne Comunications, Grenoble, France * @@ -17,11 +17,11 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#import "ContactsViewController.h" -#import "ContactsController.h" #import "AddressBook/ABPerson.h" -@implementation ContactsController +@implementation ContactsViewController @synthesize tableController; @synthesize allButton; diff --git a/Classes/ContactsController.xib b/Classes/ContactsViewController.xib similarity index 97% rename from Classes/ContactsController.xib rename to Classes/ContactsViewController.xib index 4273e7de4..6b12285d4 100644 --- a/Classes/ContactsController.xib +++ b/Classes/ContactsViewController.xib @@ -39,7 +39,7 @@ - 274 + 288 @@ -156,6 +156,7 @@ {{0, 58}, {320, 402}} + _NS:10 3 @@ -165,6 +166,10 @@ YES NO IBCocoaTouchFramework + 0.0 + 15 + 0.0 + 0.0 YES YES NO @@ -189,6 +194,7 @@ IBCocoaTouchFramework + NO 1 @@ -348,7 +354,7 @@ - ContactsController + ContactsViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -381,7 +387,7 @@ - ContactsController + ContactsViewController UIViewController id @@ -418,7 +424,7 @@ IBProjectSource - ./Classes/ContactsController.h + ./Classes/ContactsViewController.h diff --git a/Classes/CallHistoryTableViewController.h b/Classes/HistoryTableViewController.h similarity index 91% rename from Classes/CallHistoryTableViewController.h rename to Classes/HistoryTableViewController.h index 21b4abac5..990881727 100644 --- a/Classes/CallHistoryTableViewController.h +++ b/Classes/HistoryTableViewController.h @@ -1,4 +1,4 @@ -/* CallHistoryTableViewController.h +/* HistoryTableViewController.h * * Copyright (C) 2009 Belledonne Comunications, Grenoble, France * @@ -19,6 +19,8 @@ #import -@interface CallHistoryTableViewController : UITableViewController { +@interface HistoryTableViewController : UITableViewController { + } + @end diff --git a/Classes/HistoryTableViewController.m b/Classes/HistoryTableViewController.m new file mode 100644 index 000000000..ae8fc4aae --- /dev/null +++ b/Classes/HistoryTableViewController.m @@ -0,0 +1,133 @@ +/* HistoryTableViewController.m + * + * Copyright (C) 2009 Belledonne Comunications, Grenoble, France + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#import "HistoryTableViewController.h" +#import "UIHistoryCell.h" +#import "LinphoneManager.h" + +@implementation HistoryTableViewController + +-(void) doAction:(id)sender { + linphone_core_clear_call_logs([LinphoneManager getLc]); + [self.tableView reloadData]; +} + +#pragma mark Table view methods + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return 1; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + const MSList * logs = linphone_core_get_call_logs([LinphoneManager getLc]); + return ms_list_size(logs); +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + UIHistoryCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UIHistoryCell"]; + if (cell == nil) { + cell = [[UIHistoryCell alloc] init]; + } + + // Set up the cell... + LinphoneAddress* partyToDisplay; + const MSList * logs = linphone_core_get_call_logs([LinphoneManager getLc]); + LinphoneCallLog* callLogs = ms_list_nth_data(logs, indexPath.row) ; + + NSString *path; + if (callLogs->dir == LinphoneCallIncoming) { + if (callLogs->status == LinphoneCallSuccess) { + path = [[NSBundle mainBundle] pathForResource:callLogs->video_enabled?@"appel-entrant":@"appel-entrant" ofType:@"png"]; + } else { + //missed call + path = [[NSBundle mainBundle] pathForResource:@"appel-manque" ofType:@"png"]; + } + partyToDisplay=callLogs->from; + + } else { + path = [[NSBundle mainBundle] pathForResource:callLogs->video_enabled?@"appel-sortant":@"appel-sortant" ofType:@"png"]; + partyToDisplay=callLogs->to; + + } + UIImage *image = [UIImage imageWithContentsOfFile:path]; + + const char* username = linphone_address_get_username(partyToDisplay)!=0?linphone_address_get_username(partyToDisplay):""; + + //TODO + //const char* displayName = linphone_address_get_display_name(partyToDisplay); + + [cell.displayName setText:[NSString stringWithFormat:@"%s", username]]; + cell.imageView.image = image; + + return cell; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + [tableView deselectRowAtIndexPath:indexPath animated:NO]; + + const MSList * logs = linphone_core_get_call_logs([LinphoneManager getLc]); + LinphoneCallLog* callLogs = ms_list_nth_data(logs, indexPath.row) ; + LinphoneAddress* partyToCall; + if (callLogs->dir == LinphoneCallIncoming) { + partyToCall=callLogs->from; + + } else { + partyToCall=callLogs->to; + + } + const char* username = linphone_address_get_username(partyToCall)!=0?linphone_address_get_username(partyToCall):""; + const char* displayName = linphone_address_get_display_name(partyToCall)!=0?linphone_address_get_display_name(partyToCall):""; + const char* domain = linphone_address_get_domain(partyToCall); + + LinphoneProxyConfig* proxyCfg; + linphone_core_get_default_proxy([LinphoneManager getLc],&proxyCfg); + + NSString* phoneNumber; + + if (proxyCfg && (strcmp(domain, linphone_proxy_config_get_domain(proxyCfg)) == 0)) { + phoneNumber = [[NSString alloc] initWithCString:username encoding:[NSString defaultCStringEncoding]]; + } else { + phoneNumber = [[NSString alloc] initWithCString:linphone_address_as_string_uri_only(partyToCall) encoding:[NSString defaultCStringEncoding]]; + } + + NSString* dispName = [[NSString alloc] initWithCString:displayName encoding:[NSString defaultCStringEncoding]]; + + // Go to dialer view + NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys: + [[NSDictionary alloc] initWithObjectsAndKeys: + [[NSArray alloc] initWithObjects: dispName, nil] + , @"setText:", nil] + , @"mDisplayName", + [[NSDictionary alloc] initWithObjectsAndKeys: + [[NSArray alloc] initWithObjects: phoneNumber, nil] + , @"setText:", nil] + , @"address", + nil]; + [[LinphoneManager instance] changeView:PhoneView_Dialer dict:dict]; + + [phoneNumber release]; + [dispName release]; +} + +- (void)dealloc { + [super dealloc]; +} + +@end + diff --git a/Classes/HistoryController.h b/Classes/HistoryViewController.h similarity index 83% rename from Classes/HistoryController.h rename to Classes/HistoryViewController.h index 265f608ed..bfd90386e 100644 --- a/Classes/HistoryController.h +++ b/Classes/HistoryViewController.h @@ -1,4 +1,4 @@ -/* HistoryController.h +/* HistoryViewController.h * * Copyright (C) 2012 Belledonne Comunications, Grenoble, France * @@ -18,16 +18,20 @@ */ #import -#import "CallHistoryTableViewController.h" -@interface HistoryController : UIViewController { - CallHistoryTableViewController *tableController; +#import "HistoryTableViewController.h" + +@interface HistoryViewController : UIViewController { + HistoryTableViewController *tableController; UIButton *allButton; UIButton *missedButton; } -@property (nonatomic, retain) IBOutlet CallHistoryTableViewController* tableController; + +@property (nonatomic, retain) IBOutlet HistoryTableViewController* tableController; @property (nonatomic, retain) IBOutlet UIButton* allButton; @property (nonatomic, retain) IBOutlet UIButton* missedButton; + -(IBAction) onAllClick: (id) event; -(IBAction) onMissedClick: (id) event; + @end diff --git a/Classes/HistoryController.m b/Classes/HistoryViewController.m similarity index 87% rename from Classes/HistoryController.m rename to Classes/HistoryViewController.m index cdd746907..502827320 100644 --- a/Classes/HistoryController.m +++ b/Classes/HistoryViewController.m @@ -1,4 +1,4 @@ -/* HistoryController.m +/* HistoryViewController.m * * Copyright (C) 2012 Belledonne Comunications, Grenoble, France * @@ -17,11 +17,10 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#import "HistoryViewController.h" -#import "HistoryController.h" +@implementation HistoryViewController - -@implementation HistoryController @synthesize tableController; @synthesize allButton; @synthesize missedButton; @@ -32,8 +31,7 @@ typedef enum _HistoryView { History_MAX } HistoryView; - -- (void) changeView: (HistoryView) view { +- (void)changeView: (HistoryView) view { if(view == History_All) { allButton.selected = TRUE; } else { @@ -47,16 +45,16 @@ typedef enum _HistoryView { } } -- (void) viewDidLoad { +- (void)viewDidLoad { [super viewDidLoad]; [self changeView: History_All]; } --(IBAction) onAllClick: (id) event { +- (IBAction)onAllClick: (id) event { [self changeView: History_All]; } --(IBAction) onMissedClick: (id) event { +- (IBAction)onMissedClick: (id) event { [self changeView: History_Missed]; } diff --git a/Classes/HistoryController.xib b/Classes/HistoryViewController.xib similarity index 95% rename from Classes/HistoryController.xib rename to Classes/HistoryViewController.xib index 3f23429e4..9fb67afc8 100644 --- a/Classes/HistoryController.xib +++ b/Classes/HistoryViewController.xib @@ -39,7 +39,7 @@ - 274 + 288 @@ -164,6 +164,10 @@ YES IBCocoaTouchFramework + 0.0 + 15 + 0.0 + 0.0 YES 1 0 @@ -186,6 +190,7 @@ IBCocoaTouchFramework + NO 1 @@ -345,12 +350,12 @@ - HistoryController + HistoryViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - CallHistoryTableViewController + HistoryTableViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -370,15 +375,15 @@ - CallHistoryTableViewController + HistoryTableViewController UITableViewController IBProjectSource - ./Classes/CallHistoryTableViewController.h + ./Classes/HistoryTableViewController.h - HistoryController + HistoryViewController UIViewController id @@ -397,7 +402,7 @@ UIButton UIButton - CallHistoryTableViewController + HistoryTableViewController @@ -410,12 +415,12 @@ tableController - CallHistoryTableViewController + HistoryTableViewController IBProjectSource - ./Classes/HistoryController.h + ./Classes/HistoryViewController.h diff --git a/Classes/InCallViewController.h b/Classes/InCallViewController.h index fa5006ced..ccb5f3779 100644 --- a/Classes/InCallViewController.h +++ b/Classes/InCallViewController.h @@ -23,7 +23,7 @@ #import "linphonecore.h" #import "PhoneViewController.h" #import "ConferenceCallDetailView.h" -#import "UIToggleVideoButton.h" +#import "UIVideoButton.h" #import "VideoZoomHandler.h" #include "UILinphone.h" @@ -37,11 +37,7 @@ UIButton* endCtrl; UIButton* dialer; - UIMicroButton* mute; - UIButton* pause; - UISpeakerButton* speaker; UIButton* contacts; - UIToggleVideoButton* addVideo; UITableView* callTableView; UIButton* addCall, *mergeCalls; UIButton* transfer; @@ -114,11 +110,7 @@ @property (nonatomic, retain) IBOutlet UIButton* endCtrl; @property (nonatomic, retain) IBOutlet UIButton* dialer; -@property (nonatomic, retain) IBOutlet UIButton* mute; -@property (nonatomic, retain) IBOutlet UIButton* pause; -@property (nonatomic, retain) IBOutlet UIButton* speaker; @property (nonatomic, retain) IBOutlet UIButton* contacts; -@property (nonatomic, retain) IBOutlet UIToggleVideoButton* addVideo; @property (nonatomic, retain) IBOutlet UITableView* callTableView; @property (nonatomic, retain) IBOutlet UIButton* addCall; @property (nonatomic, retain) IBOutlet UIButton* mergeCalls; diff --git a/Classes/InCallViewController.m b/Classes/InCallViewController.m index f2de7fd9b..943341133 100644 --- a/Classes/InCallViewController.m +++ b/Classes/InCallViewController.m @@ -45,10 +45,7 @@ const NSInteger SECURE_BUTTON_TAG=5; @synthesize endCtrl; @synthesize close; -@synthesize mute; -@synthesize pause; @synthesize dialer; -@synthesize speaker; @synthesize contacts; @synthesize callTableView; @synthesize addCall; @@ -80,7 +77,7 @@ const NSInteger SECURE_BUTTON_TAG=5; @synthesize testVideoView; #endif -@synthesize addVideo; +//@synthesize addVideo; +(void) updateIndicator:(UIImageView*) indicator withCallQuality:(float) quality { @@ -167,12 +164,13 @@ void addAnimationFadeTransition(UIView* view, float duration) { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.2f]; endCtrl.imageView.transform = transform; - mute.imageView.transform = transform; - speaker.imageView.transform = transform; - pause.imageView.transform = transform; + //TODO + //mute.imageView.transform = transform; + //speaker.imageView.transform = transform; + //pause.imageView.transform = transform; contacts.imageView.transform = transform; addCall.imageView.transform = transform; - addVideo.imageView.transform = transform; + //addVideo.imageView.transform = transform; dialer.imageView.transform = transform; videoCallQuality.transform = transform; [UIView commitAnimations]; @@ -310,9 +308,10 @@ void addAnimationFadeTransition(UIView* view, float duration) { /* restore buttons orientation */ endCtrl.imageView.transform = CGAffineTransformIdentity; - mute.imageView.transform = CGAffineTransformIdentity; - speaker.imageView.transform = CGAffineTransformIdentity; - pause.imageView.transform = CGAffineTransformIdentity; + //TODO + //mute.imageView.transform = CGAffineTransformIdentity; + //speaker.imageView.transform = CGAffineTransformIdentity; + //pause.imageView.transform = CGAffineTransformIdentity; contacts.imageView.transform = CGAffineTransformIdentity; addCall.imageView.transform = CGAffineTransformIdentity; dialer.imageView.transform = CGAffineTransformIdentity; @@ -334,57 +333,24 @@ void addAnimationFadeTransition(UIView* view, float duration) { return; } // 1 call: show pause button, otherwise show merge btn - [LinphoneManager set:pause hidden:(callCount(lc) > 1) withName:"PAUSE button" andReason:"call count"]; - [LinphoneManager set:mergeCalls hidden:!pause.hidden withName:"MERGE button" andReason:"call count"]; + // [LinphoneManager set:mergeCalls hidden:!pause.hidden withName:"MERGE button" andReason:"call count"]; // reload table (glow update + call duration) [callTableView reloadData]; LinphoneCall* currentCall = linphone_core_get_current_call([LinphoneManager getLc]); - int callsCount = linphone_core_get_calls_nb(lc); // hide pause/resume if in conference if (currentCall) { - [mute reset]; - if (linphone_core_is_in_conference(lc)) { - [LinphoneManager set:pause hidden:YES withName:"PAUSE button" andReason:"is in conference"]; - } - else if (callCount(lc) == callsCount && callsCount == 1) { - [LinphoneManager set:pause hidden:NO withName:"PAUSE button" andReason:"call count == 1"]; - pause.selected = NO; - } else { - [LinphoneManager set:pause hidden:YES withName:"PAUSE button" andReason:AT]; - } - if (fullUpdate) { videoUpdateIndicator.hidden = YES; LinphoneCallState state = linphone_call_get_state(currentCall); if (state == LinphoneCallStreamsRunning || state == LinphoneCallUpdated || state == LinphoneCallUpdatedByRemote) { - if (linphone_call_params_video_enabled(linphone_call_get_current_params(currentCall))) { - [addVideo setTitle:NSLocalizedString(@"-video", nil) forState:UIControlStateNormal]; - [InCallViewController updateIndicator: videoCallQuality withCallQuality:linphone_call_get_average_quality(currentCall)]; - } else { - [addVideo setTitle:NSLocalizedString(@"+video", nil) forState:UIControlStateNormal]; - } - [addVideo setEnabled:YES]; } else { - [addVideo setEnabled:NO]; [videoCallQuality setImage:nil]; } } - } else { - if (callsCount == 1) { - LinphoneCall* c = (LinphoneCall*)linphone_core_get_calls(lc)->data; - if (linphone_call_get_state(c) == LinphoneCallPaused || - linphone_call_get_state(c) == LinphoneCallPausing) { - pause.selected = YES; - } - [LinphoneManager set:pause hidden:NO withName:"PAUSE button" andReason:AT]; - } else { - [LinphoneManager set:pause hidden:YES withName:"PAUSE button" andReason:AT]; - } - [addVideo setEnabled:NO]; - } - [LinphoneManager set:mergeCalls hidden:!pause.hidden withName:"MERGE button" andReason:AT]; + } + // [LinphoneManager set:mergeCalls hidden:!pause.hidden withName:"MERGE button" andReason:AT]; // update conference details view if displayed if (self.presentedViewController == conferenceDetail) { @@ -464,7 +430,7 @@ void addAnimationFadeTransition(UIView* view, float duration) { [videoCameraSwitch setPreview:videoPreview]; - addVideo.videoUpdateIndicator = videoUpdateIndicator; + //addVideo.videoUpdateIndicator = videoUpdateIndicator; [transfer addTarget:self action:@selector(transferPressed) forControlEvents:UIControlEventTouchUpInside]; @@ -593,7 +559,7 @@ void addAnimationFadeTransition(UIView* view, float duration) { bool enableVideo = [[NSUserDefaults standardUserDefaults] boolForKey:@"enable_video_preference"]; [LinphoneManager set:contacts hidden:enableVideo withName:"CONTACT button" andReason:AT]; - [LinphoneManager set:addVideo hidden:!contacts.hidden withName:"ADD_VIDEO button" andReason:AT]; + //[LinphoneManager set:addVideo hidden:!contacts.hidden withName:"ADD_VIDEO button" andReason:AT]; } } } @@ -747,6 +713,12 @@ static void hideSpinner(LinphoneCall* lc, void* user_data); } break; + } + case LinphoneCallPausing: + case LinphoneCallPaused: + { + [self disableVideoDisplay]; + break; } case LinphoneCallError: { if (canHideInCallView) { diff --git a/Classes/InCallViewController.xib b/Classes/InCallViewController.xib index 9a6774b53..f8880c72f 100644 --- a/Classes/InCallViewController.xib +++ b/Classes/InCallViewController.xib @@ -185,7 +185,6 @@ {{119, 251}, {82, 52}} - NO NO @@ -1020,7 +1019,6 @@ YES addCall - addVideo callTableView close conferenceDetail @@ -1034,14 +1032,11 @@ hangUpView hash mergeCalls - mute nine one padSubView - pause seven six - speaker star testVideoView three @@ -1060,7 +1055,6 @@ YES UIButton - UIToggleVideoButton UITableView UIButton UIViewController @@ -1076,13 +1070,10 @@ UIButton UIButton UIButton - UIButton UIView UIButton UIButton UIButton - UIButton - UIButton UIView UIButton UIButton @@ -1103,7 +1094,6 @@ YES addCall - addVideo callTableView close conferenceDetail @@ -1117,14 +1107,11 @@ hangUpView hash mergeCalls - mute nine one padSubView - pause seven six - speaker star testVideoView three @@ -1146,10 +1133,6 @@ addCall UIButton - - addVideo - UIToggleVideoButton - callTableView UITableView @@ -1202,10 +1185,6 @@ mergeCalls UIButton - - mute - UIButton - nine UIButton @@ -1218,10 +1197,6 @@ padSubView UIView - - pause - UIButton - seven UIButton @@ -1230,10 +1205,6 @@ six UIButton - - speaker - UIButton - star UIButton @@ -1333,11 +1304,11 @@ - UIMuteButton + UIMicroButton UIToggleButton IBProjectSource - ./Classes/UIMuteButton.h + ./Classes/UIMicroButton.h @@ -1348,25 +1319,6 @@ ./Classes/UIToggleButton.h - - UIToggleVideoButton - UIButton - - videoUpdateIndicator - UIActivityIndicatorView - - - videoUpdateIndicator - - videoUpdateIndicator - UIActivityIndicatorView - - - - IBProjectSource - ./Classes/UIToggleVideoButton.h - - VideoViewController UIViewController @@ -1412,9 +1364,9 @@ UIHangUpButton UIView UIView - UIMuteButton - UIMuteButton - UIMuteButton + UIMicroButton + UIMicroButton + UIMicroButton UIView UIView UIView @@ -1507,15 +1459,15 @@ mMute - UIMuteButton + UIMicroButton mMuteLandLeft - UIMuteButton + UIMicroButton mMuteLandRight - UIMuteButton + UIMicroButton mPortrait diff --git a/Classes/LinphoneUI/ContactCell.xib b/Classes/LinphoneUI/ContactCell.xib deleted file mode 100644 index 98886f8ae..000000000 --- a/Classes/LinphoneUI/ContactCell.xib +++ /dev/null @@ -1,195 +0,0 @@ - - - - 1296 - 11E53 - 2182 - 1138.47 - 569.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1181 - - - IBProxyObject - IBUILabel - IBUITableViewCell - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 292 - - - - 256 - - - - 274 - {{10, 0}, {310, 39}} - - - _NS:328 - NO - YES - 7 - 2 - NO - IBCocoaTouchFramework - Texte de test - - 1 - MCAwIDAAA - - - 1 - 10 - - 1 - 25 - - - Helvetica - 25 - 16 - - - - {320, 39} - - - - _NS:395 - - 3 - MCAwAA - - NO - YES - 4 - YES - IBCocoaTouchFramework - - - {320, 40} - - - - _NS:384 - IBCocoaTouchFramework - - ConferenceDetailCellIdentifier - - - - - - - - label - - - - 9 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 4 - - - - - - cell - - - 6 - - - label - - - - - ContactCell - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 9 - - - - - ContactCell - UITableViewCell - - label - UILabel - - - label - - label - UILabel - - - - IBProjectSource - ./Classes/ContactCell.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - YES - 3 - 1181 - - diff --git a/Classes/LinphoneUI/LinphoneCallBar.m b/Classes/LinphoneUI/LinphoneCallBar.m deleted file mode 100644 index 41ff73d57..000000000 --- a/Classes/LinphoneUI/LinphoneCallBar.m +++ /dev/null @@ -1,152 +0,0 @@ -/* LinphoneCallBar.m - * - * Copyright (C) 2012 Belledonne Comunications, Grenoble, France - * - * 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 2 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 Library General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#import "LinphoneCallBar.h" -#import "LinphoneManager.h" - -#include "linphonecore.h" -#include "private.h" - -#define STRINGIFY(x) #x -#define TOSTRING(x) STRINGIFY(x) -#define AT __FILE__ ":" TOSTRING(__LINE__) - -@implementation LinphoneCallBar - -@synthesize pauseButton; -@synthesize videoButton; -@synthesize microButton; -@synthesize speakerButton; - -- (void) viewDidLoad { - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callUpdate:) name:@"LinphoneCallUpdate" object:nil]; -} - -bool isInConference2(LinphoneCall* call) { - if (!call) - return false; - return linphone_call_get_current_params(call)->in_conference; -} - -int callCount2(LinphoneCore* lc) { - int count = 0; - const MSList* calls = linphone_core_get_calls(lc); - - while (calls != 0) { - if (!isInConference2((LinphoneCall*)calls->data)) { - count++; - } - calls = calls->next; - } - return count; -} - --(IBAction) onPauseClick: (id) event { - [LinphoneManager logUIElementPressed:"PAUSE button"]; - - LinphoneCore* lc = [LinphoneManager getLc]; - LinphoneCall* currentCall = linphone_core_get_current_call(lc); - if (currentCall) { - if (linphone_call_get_state(currentCall) == LinphoneCallStreamsRunning) { - [pauseButton setSelected:NO]; - linphone_core_pause_call(lc, currentCall); - - // hide video view - //TODO - //[self disableVideoDisplay]; - } - } else { - if (linphone_core_get_calls_nb(lc) == 1) { - LinphoneCall* c = (LinphoneCall*) linphone_core_get_calls(lc)->data; - if (linphone_call_get_state(c) == LinphoneCallPaused) { - linphone_core_resume_call(lc, c); - [pauseButton setSelected:YES]; - - const LinphoneCallParams* p = linphone_call_get_current_params(c); - if (linphone_call_params_video_enabled(p)) { - //TODO - //[self enableVideoDisplay]; - } - } - } - } -} - -- (void) callUpdate: (NSNotification*) notif { - bool fullUpdate = true; - // check LinphoneCore is initialized - LinphoneCore* lc = nil; - @try { - lc = [LinphoneManager getLc]; - } @catch (NSException* exc) { - return; - } - // 1 call: show pause button, otherwise show merge btn - [LinphoneManager set:pauseButton enabled:(callCount2(lc) == 1) withName:"PAUSE button" andReason:"call count"]; - //TODO - //[LinphoneManager set:mergeCalls hidden:!pause.hidden withName:"MERGE button" andReason:"call count"]; - - LinphoneCall* currentCall = linphone_core_get_current_call([LinphoneManager getLc]); - int callsCount = linphone_core_get_calls_nb(lc); - - // hide pause/resume if in conference - if (currentCall) { - [microButton reset]; - if (linphone_core_is_in_conference(lc)) { - [LinphoneManager set:pauseButton enabled:FALSE withName:"PAUSE button" andReason:"is in conference"]; - } - else if (callCount2(lc) == callsCount && callsCount == 1) { - [LinphoneManager set:pauseButton enabled:TRUE withName:"PAUSE button" andReason:"call count == 1"]; - pauseButton.selected = NO; - } else { - [LinphoneManager set:pauseButton enabled:FALSE withName:"PAUSE button" andReason:AT]; - } - - if (fullUpdate) { - //TODO - //videoUpdateIndicator.hidden = YES; - LinphoneCallState state = linphone_call_get_state(currentCall); - if (state == LinphoneCallStreamsRunning || state == LinphoneCallUpdated || state == LinphoneCallUpdatedByRemote) { - if (linphone_call_params_video_enabled(linphone_call_get_current_params(currentCall))) { - [videoButton setSelected:TRUE]; - } else { - [videoButton setSelected:FALSE]; - } - [videoButton setEnabled:YES]; - } else { - [videoButton setEnabled:NO]; - //[videoCallQuality setImage:nil]; - } - } - } else { - if (callsCount == 1) { - LinphoneCall* c = (LinphoneCall*)linphone_core_get_calls(lc)->data; - if (linphone_call_get_state(c) == LinphoneCallPaused || - linphone_call_get_state(c) == LinphoneCallPausing) { - pauseButton.selected = YES; - } - [LinphoneManager set:pauseButton enabled:TRUE withName:"PAUSE button" andReason:AT]; - } else { - [LinphoneManager set:pauseButton enabled:FALSE withName:"PAUSE button" andReason:AT]; - } - [videoButton setEnabled:NO]; - } -} - -@end diff --git a/Classes/LinphoneUI/LinphoneManager.h b/Classes/LinphoneUI/LinphoneManager.h index 60869ddd4..36bb3e922 100644 --- a/Classes/LinphoneUI/LinphoneManager.h +++ b/Classes/LinphoneUI/LinphoneManager.h @@ -92,7 +92,7 @@ typedef struct _LinphoneCallAppData { +(void) set:(UIView*)view hidden: (BOOL) hidden withName:(const char*)name andReason:(const char*) reason; +(void) set:(UIButton*)view enabled: (BOOL) enabled withName:(const char*)name andReason:(const char*) reason; +(void) logUIElementPressed:(const char*) name; - ++ (void)abstractCall:(id) object dict:(NSDictionary *) dict; -(void) registerLogView:(id) view; -(void) startLibLinphone; diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index 3102f382f..31655c117 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -80,21 +80,21 @@ extern void libmsbcg729_init(); return theLinphoneManager; } --(void) changeView:(PhoneView) view { +- (void)changeView:(PhoneView) view { [self changeView:view dict:nil]; } --(void) changeView:(PhoneView) view dict:(NSDictionary *)dict { +- (void)changeView:(PhoneView) view dict:(NSDictionary *)dict { currentView = view; NSMutableDictionary* mdict = [NSMutableDictionary dictionaryWithObject: [NSNumber numberWithInt:currentView] forKey:@"view"]; if(dict != nil) - [mdict addEntriesFromDictionary:dict]; + [mdict setObject:dict forKey:@"args"]; [[NSNotificationCenter defaultCenter] postNotificationName:@"LinphoneMainViewChange" object:self userInfo:mdict]; } --(PhoneView) currentView { +- (PhoneView)currentView { return currentView; } @@ -1025,5 +1025,26 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach ms_message("UI - '%s' pressed", name); } - ++ (void)abstractCall:(id) object dict:(NSDictionary *) dict { + for (NSString* identifier in dict) { + if([identifier characterAtIndex:([identifier length] -1)] == ':') { + NSArray *arguments = [dict objectForKey:identifier]; + SEL selector = NSSelectorFromString(identifier); + NSMethodSignature *signature = [object methodSignatureForSelector:selector]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; + [invocation setTarget:object]; + [invocation setSelector:selector]; + for(int i=0; i<[arguments count]; i++) + { + id arg = [arguments objectAtIndex:i]; + [invocation setArgument:&arg atIndex:i+2]; // The first two arguments are the hidden arguments self and _cmd + } + [invocation invoke]; // Invoke the selector + } else { + NSDictionary *arguments = [dict objectForKey:identifier]; + id new_object = [object performSelector:NSSelectorFromString(identifier)]; + [LinphoneManager abstractCall:new_object dict:arguments]; + } + } +} @end diff --git a/Classes/LinphoneUI/LinphoneCallBar.h b/Classes/LinphoneUI/UICallBar.h similarity index 65% rename from Classes/LinphoneUI/LinphoneCallBar.h rename to Classes/LinphoneUI/UICallBar.h index 0a4b18262..28c0cfc14 100644 --- a/Classes/LinphoneUI/LinphoneCallBar.h +++ b/Classes/LinphoneUI/UICallBar.h @@ -1,4 +1,4 @@ -/* LinphoneCallBar.h +/* UICallBar.h * * Copyright (C) 2012 Belledonne Comunications, Grenoble, France * @@ -20,17 +20,20 @@ #import #import "UIMicroButton.h" +#import "UIPauseButton.h" +#import "UISpeakerButton.h" +#import "UIVideoButton.h" -@interface LinphoneCallBar : UIViewController { - UIButton* pauseButton; - UIButton* videoButton; - UIMicroButton* microButton; - UIButton* speakerButton; +@interface UICallBar: UIViewController { + UIPauseButton* pauseButton; + UIVideoButton* videoButton; + UIMicroButton* microButton; + UISpeakerButton* speakerButton; } -@property (nonatomic, retain) IBOutlet UIButton* pauseButton; -@property (nonatomic, retain) IBOutlet UIButton* videoButton; -@property (nonatomic, retain) IBOutlet UIMicroButton* microButton; -@property (nonatomic, retain) IBOutlet UIButton* speakerButton; --(IBAction) onPauseClick: (id) event; +@property (nonatomic, retain) IBOutlet UIPauseButton* pauseButton; +@property (nonatomic, retain) IBOutlet UIVideoButton* videoButton; +@property (nonatomic, retain) IBOutlet UIMicroButton* microButton; +@property (nonatomic, retain) IBOutlet UISpeakerButton* speakerButton; + @end diff --git a/Classes/LinphoneUI/UICallBar.m b/Classes/LinphoneUI/UICallBar.m new file mode 100644 index 000000000..0171dfccf --- /dev/null +++ b/Classes/LinphoneUI/UICallBar.m @@ -0,0 +1,54 @@ +/* UICallBar.m + * + * Copyright (C) 2012 Belledonne Comunications, Grenoble, France + * + * 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 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#import "UICallBar.h" +#import "LinphoneManager.h" + +#include "linphonecore.h" +#include "private.h" + +@implementation UICallBar + +@synthesize pauseButton; +@synthesize videoButton; +@synthesize microButton; +@synthesize speakerButton; + +- (void)viewDidLoad { + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callUpdate:) name:@"LinphoneCallUpdate" object:nil]; +} + +- (void)callUpdate: (NSNotification*) notif { + // check LinphoneCore is initialized + LinphoneCore* lc = nil; + @try { + lc = [LinphoneManager getLc]; + } @catch (NSException* exc) { + return; + } + + //TODO + //[LinphoneManager set:mergeCalls hidden:!pause.hidden withName:"MERGE button" andReason:"call count"]; + + [microButton update]; + [pauseButton update]; + [videoButton update]; +} + +@end diff --git a/Classes/LinphoneUI/LinphoneCallBar.xib b/Classes/LinphoneUI/UICallBar.xib similarity index 94% rename from Classes/LinphoneUI/LinphoneCallBar.xib rename to Classes/LinphoneUI/UICallBar.xib index a9dda05bd..2b55621c8 100644 --- a/Classes/LinphoneUI/LinphoneCallBar.xib +++ b/Classes/LinphoneUI/UICallBar.xib @@ -167,11 +167,14 @@ NSImage speacker-ON-over.png - + + NSImage + speacker-ON-actif.png + + NSImage speacker-OFF-actif.png - @@ -343,14 +346,6 @@ 15 - - - speakerButton - - - - 16 - videoButton @@ -368,13 +363,12 @@ 14 - - onPauseClick: - - - 7 + + speakerButton + + - 18 + 16 @@ -437,12 +431,6 @@ pause - - 9 - - - speaker - 10 @@ -461,10 +449,16 @@ micro + + 9 + + + speaker + - LinphoneCallBar + UICallBar com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -473,7 +467,7 @@ UIMicroButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIToggleVideoButton + UIVideoButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -483,11 +477,12 @@ UIHangUpButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIPauseButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin UISpeakerButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - + @@ -498,24 +493,13 @@ - LinphoneCallBar + UICallBar UIViewController - - onPauseClick: - id - - - onPauseClick: - - onPauseClick: - id - - UIMicroButton - UIButton - UIButton - UIButton + UIPauseButton + UISpeakerButton + UIVideoButton @@ -524,20 +508,20 @@ pauseButton - UIButton + UIPauseButton speakerButton - UIButton + UISpeakerButton videoButton - UIButton + UIVideoButton IBProjectSource - ./Classes/LinphoneCallBar.h + ./Classes/UICallBar.h @@ -556,6 +540,14 @@ ./Classes/UIMicroButton.h + + UIPauseButton + UIToggleButton + + IBProjectSource + ./Classes/UIPauseButton.h + + UISpeakerButton UIToggleButton @@ -573,8 +565,8 @@ - UIToggleVideoButton - UIButton + UIVideoButton + UIToggleButton videoUpdateIndicator UIActivityIndicatorView @@ -588,7 +580,7 @@ IBProjectSource - ./Classes/UIToggleVideoButton.h + ./Classes/UIVideoButton.h @@ -614,6 +606,7 @@ {222, 136} {222, 136} {160, 134} + {160, 134} {160, 134} {160, 134} {160, 134} diff --git a/Classes/LinphoneUI/ContactCell.h b/Classes/LinphoneUI/UIContactCell.h similarity index 81% rename from Classes/LinphoneUI/ContactCell.h rename to Classes/LinphoneUI/UIContactCell.h index fafb4d8cd..4990ce768 100644 --- a/Classes/LinphoneUI/ContactCell.h +++ b/Classes/LinphoneUI/UIContactCell.h @@ -1,4 +1,4 @@ -/* ContactCell.h +/* UIContactCell.h * * Copyright (C) 2012 Belledonne Comunications, Grenoble, France * @@ -19,9 +19,13 @@ #import -@interface ContactCell : UITableViewCell { - UILabel *label; +@interface UIContactCell : UITableViewCell { + UILabel *firstName; + UILabel *lastName; } -@property (nonatomic, retain) IBOutlet UILabel* label; +@property (nonatomic, retain) IBOutlet UILabel* firstName; +@property (nonatomic, retain) IBOutlet UILabel* lastName; + +- (void) update; @end diff --git a/Classes/LinphoneUI/UIContactCell.m b/Classes/LinphoneUI/UIContactCell.m new file mode 100644 index 000000000..ea8980070 --- /dev/null +++ b/Classes/LinphoneUI/UIContactCell.m @@ -0,0 +1,76 @@ +/* UIContactCell.m + * + * Copyright (C) 2012 Belledonne Comunications, Grenoble, France + * + * 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 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#import "UIContactCell.h" + +@implementation UIContactCell + +@synthesize firstName; +@synthesize lastName; + +- (id)init { + if ((self = [super init]) != nil) { + NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"UIContactCell" + owner:self + options:nil]; + + if ([arrayOfViews count] >= 1) { + [self addSubview:[[arrayOfViews objectAtIndex:0] retain]]; + } + } + return self; +} + +- (void)touchUp:(id) sender { + [self setHighlighted:true animated:true]; +} + +- (void)touchDown:(id) sender { + [self setHighlighted:false animated:true]; +} + +- (void) update { + CGRect firstNameFrame = [firstName frame]; + CGRect lastNameFrame = [lastName frame]; + + lastNameFrame.origin.x -= firstNameFrame.size.width; + + // Compute firstName size + CGSize contraints; + contraints.height = [firstName frame].size.height; + contraints.width = ([lastName frame].size.width + [lastName frame].origin.x) - [firstName frame].origin.x; + CGSize firstNameSize = [[firstName text] sizeWithFont:[firstName font] constrainedToSize: contraints]; + firstNameFrame.size.width = firstNameSize.width; + + // Compute lastName size & position + lastNameFrame.origin.x += firstNameFrame.size.width; + lastNameFrame.size.width = (contraints.width + [firstName frame].origin.x) - lastNameFrame.origin.x; + + [firstName setFrame: firstNameFrame]; + [lastName setFrame: lastNameFrame]; +} + +- (void) dealloc { + [firstName release]; + [lastName release]; + + [super dealloc]; +} + +@end diff --git a/Classes/LinphoneUI/UIContactCell.xib b/Classes/LinphoneUI/UIContactCell.xib new file mode 100644 index 000000000..8544ad63c --- /dev/null +++ b/Classes/LinphoneUI/UIContactCell.xib @@ -0,0 +1,287 @@ + + + + 1296 + 11E53 + 2182 + 1138.47 + 569.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1181 + + + IBUIButton + IBUIView + IBUILabel + IBProxyObject + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 292 + + + + 292 + {320, 44} + + + + _NS:9 + NO + IBCocoaTouchFramework + 0 + 0 + NO + + 3 + MQA + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + 2 + 15 + + + Helvetica-Bold + 15 + 16 + + + + + 274 + {{10, 0}, {55, 44}} + + + + _NS:328 + NO + YES + 7 + 2 + NO + + Firstname + + IBCocoaTouchFramework + John + + 1 + MCAwIDAAA + + + 1 + 10 + + 1 + 25 + + + Helvetica + 25 + 16 + + NO + + + + 274 + {{75, 0}, {200, 44}} + + + + _NS:328 + NO + YES + 7 + 2 + NO + + Lastname + + IBCocoaTouchFramework + Doe + + + 1 + 10 + + 2 + 25 + + + Helvetica-Bold + 25 + 16 + + NO + + + {320, 44} + + + + _NS:9 + + 3 + MQA + + 2 + + + IBCocoaTouchFramework + + + + + + + backgroundView + + + + 15 + + + + firstName + + + + 11 + + + + lastName + + + + 12 + + + + + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 16 + + + + + + + + + + 14 + + + background + + + 6 + + + firstName + + + 10 + + + lastName + + + + + UIContactCell + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 16 + + + + + UIContactCell + UITableViewCell + + UILabel + UILabel + + + + firstName + UILabel + + + lastName + UILabel + + + + IBProjectSource + ./Classes/UIContactCell.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + YES + 3 + 1181 + + diff --git a/Classes/LinphoneUI/UIHistoryCell.h b/Classes/LinphoneUI/UIHistoryCell.h new file mode 100644 index 000000000..9af692820 --- /dev/null +++ b/Classes/LinphoneUI/UIHistoryCell.h @@ -0,0 +1,32 @@ +/* UIHistoryCell.h + * + * Copyright (C) 2012 Belledonne Comunications, Grenoble, France + * + * 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 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#import + +@interface UIHistoryCell : UITableViewCell { + UIImageView* imageView; + UILabel* displayName; +} + +@property (nonatomic, retain) IBOutlet UIImageView* imageView; +@property (nonatomic, retain) IBOutlet UILabel* displayName; + +-(IBAction) onDetails: (id) event; + +@end diff --git a/Classes/LinphoneUI/ContactCell.m b/Classes/LinphoneUI/UIHistoryCell.m similarity index 69% rename from Classes/LinphoneUI/ContactCell.m rename to Classes/LinphoneUI/UIHistoryCell.m index cbc0288b0..98924d8c6 100644 --- a/Classes/LinphoneUI/ContactCell.m +++ b/Classes/LinphoneUI/UIHistoryCell.m @@ -1,4 +1,4 @@ -/* ContactCell.m +/* UIHistoryCell.m * * Copyright (C) 2012 Belledonne Comunications, Grenoble, France * @@ -15,23 +15,37 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ + */ -#import "ContactCell.h" +#import "UIHistoryCell.h" -@implementation ContactCell +@implementation UIHistoryCell -@synthesize label; -- (id) init { - if((self = [super init]) != nil) { - NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"ContactCell" - owner:self - options:nil]; - - if ([arrayOfViews count] >= 1){ +@synthesize displayName; +@synthesize imageView; + +- (id)init { + if ((self = [super init]) != nil) { + NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"UIHistoryCell" + owner:self + options:nil]; + + if ([arrayOfViews count] >= 1) { [self addSubview:[[arrayOfViews objectAtIndex:0] retain]]; } } return self; } + +-(IBAction) onDetails: (id) event { + +} + +- (void) dealloc { + [displayName release]; + [imageView release]; + + [super dealloc]; +} + @end diff --git a/Classes/LinphoneUI/UIHistoryCell.xib b/Classes/LinphoneUI/UIHistoryCell.xib new file mode 100644 index 000000000..50980973a --- /dev/null +++ b/Classes/LinphoneUI/UIHistoryCell.xib @@ -0,0 +1,282 @@ + + + + 1296 + 11E53 + 2182 + 1138.47 + 569.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1181 + + + IBUIButton + IBUIImageView + IBUIView + IBUILabel + IBProxyObject + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 292 + + + + 292 + {{10, 8}, {27, 27}} + + + + _NS:9 + NO + IBCocoaTouchFramework + + + + 274 + {{45, 0}, {236, 44}} + + + + _NS:328 + NO + YES + 7 + 2 + NO + + Firstname + + IBCocoaTouchFramework + John + + 1 + MCAwIDAAA + + + 1 + 10 + + 1 + 25 + + + Helvetica + 25 + 16 + + NO + + + + 292 + {{289, 11}, {22, 22}} + + + + _NS:9 + NO + IBCocoaTouchFramework + 0 + 0 + NO + + 3 + MQA + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + NSImage + bouton-detail-contact-over.png + + + NSImage + bouton-detail-contact-actif.png + + + 2 + 15 + + + Helvetica-Bold + 15 + 16 + + + + {320, 44} + + + + _NS:9 + + 3 + MQA + + 2 + + + IBCocoaTouchFramework + + + + + + + imageView + + + + 11 + + + + displayName + + + + 8 + + + + + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 12 + + + + + + + + + + 6 + + + imageView + + + 5 + + + firstName + + + 7 + + + details + + + + + UIHistoryCell + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + + 12 + + + + + UIHistoryCell + UITableViewCell + + onDetails: + id + + + onDetails: + + onDetails: + id + + + + UILabel + UIImageView + + + + displayName + UILabel + + + imageView + UIImageView + + + + IBProjectSource + ./Classes/UIHistoryCell.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + YES + 3 + + {45, 45} + {45, 45} + + 1181 + + diff --git a/Classes/LinphoneUI/LinphoneMainBar.h b/Classes/LinphoneUI/UIMainBar.h similarity index 96% rename from Classes/LinphoneUI/LinphoneMainBar.h rename to Classes/LinphoneUI/UIMainBar.h index a059fa8a8..efb58843e 100644 --- a/Classes/LinphoneUI/LinphoneMainBar.h +++ b/Classes/LinphoneUI/UIMainBar.h @@ -1,4 +1,4 @@ -/* LinphoneMainBar.m +/* UIMainBar.m * * Copyright (C) 2012 Belledonne Comunications, Grenoble, France * @@ -19,7 +19,7 @@ #import -@interface LinphoneMainBar : UIViewController { +@interface UIMainBar : UIViewController { UIButton *historyButton; UIButton *contactsButton; UIButton *dialerButton; diff --git a/Classes/LinphoneUI/LinphoneMainBar.m b/Classes/LinphoneUI/UIMainBar.m similarity index 86% rename from Classes/LinphoneUI/LinphoneMainBar.m rename to Classes/LinphoneUI/UIMainBar.m index e3f858e21..32f84cbe1 100644 --- a/Classes/LinphoneUI/LinphoneMainBar.m +++ b/Classes/LinphoneUI/UIMainBar.m @@ -1,4 +1,4 @@ -/* LinphoneMainBar.m +/* UIMainBar.m * * Copyright (C) 2012 Belledonne Comunications, Grenoble, France * @@ -17,10 +17,10 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#import "LinphoneMainBar.h" +#import "UIMainBar.h" #import "PhoneMainView.h" -@implementation LinphoneMainBar +@implementation UIMainBar @synthesize historyButton; @synthesize contactsButton; @@ -28,11 +28,11 @@ @synthesize settingsButton; @synthesize chatButton; -- (void) viewDidLoad { +- (void)viewDidLoad { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveLinphoneMainViewChangeEvent:) name:@"LinphoneMainViewChange" object:nil]; } -- (void) receiveLinphoneMainViewChangeEvent: (NSNotification*) notif { +- (void)receiveLinphoneMainViewChangeEvent: (NSNotification*) notif { PhoneView view = [[notif.userInfo objectForKey: @"view"] intValue]; if(view == PhoneView_History) { historyButton.selected = TRUE; @@ -61,7 +61,7 @@ } } -- (void) viewDidUnload { +- (void)viewDidUnload { [[NSNotificationCenter defaultCenter] removeObserver:self]; [historyButton release]; [contactsButton release]; @@ -70,28 +70,28 @@ [chatButton release]; } -- (void) dealloc { +- (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; [super dealloc]; } -- (IBAction) onHistoryClick: (id) sender { +- (IBAction)onHistoryClick: (id) sender { [[LinphoneManager instance] changeView:PhoneView_History]; } --(IBAction) onContactsClick: (id) event { +- (IBAction)onContactsClick: (id) event { [[LinphoneManager instance] changeView:PhoneView_Contacts]; } --(IBAction) onDialerClick: (id) event { +- (IBAction)onDialerClick: (id) event { [[LinphoneManager instance] changeView:PhoneView_Dialer]; } --(IBAction) onSettingsClick: (id) event { +- (IBAction)onSettingsClick: (id) event { [[LinphoneManager instance] changeView:PhoneView_Settings]; } --(IBAction) onChatClick: (id) event { +- (IBAction)onChatClick: (id) event { [[LinphoneManager instance] changeView:PhoneView_Chat]; } diff --git a/Classes/LinphoneUI/LinphoneMainBar.xib b/Classes/LinphoneUI/UIMainBar.xib similarity index 99% rename from Classes/LinphoneUI/LinphoneMainBar.xib rename to Classes/LinphoneUI/UIMainBar.xib index e22c6d913..bdd3c6dba 100644 --- a/Classes/LinphoneUI/LinphoneMainBar.xib +++ b/Classes/LinphoneUI/UIMainBar.xib @@ -212,6 +212,7 @@ {{256, 0}, {64, 72}} + _NS:9 NO @@ -424,7 +425,7 @@ - LinphoneMainBar + UIMainBar com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -451,7 +452,7 @@ - LinphoneMainBar + UIMainBar UIViewController id @@ -513,7 +514,7 @@ IBProjectSource - ./Classes/LinphoneMainBar.h + ./Classes/UIMainBar.h diff --git a/Classes/LinphoneUI/UIMicroButton.h b/Classes/LinphoneUI/UIMicroButton.h index eab24d82b..40a208b0f 100644 --- a/Classes/LinphoneUI/UIMicroButton.h +++ b/Classes/LinphoneUI/UIMicroButton.h @@ -1,4 +1,4 @@ -/* UIMuteButton.h +/* UIMicroButton.h * * Copyright (C) 2011 Belledonne Comunications, Grenoble, France * @@ -18,8 +18,8 @@ */ #import -#import "UIToggleButton.h" +#import "UIToggleButton.h" @interface UIMicroButton : UIToggleButton { diff --git a/Classes/LinphoneUI/UIMicroButton.m b/Classes/LinphoneUI/UIMicroButton.m index 20b85983a..1238d0580 100644 --- a/Classes/LinphoneUI/UIMicroButton.m +++ b/Classes/LinphoneUI/UIMicroButton.m @@ -1,4 +1,4 @@ -/* UIMuteButton.m +/* UIMicroButton.m * * Copyright (C) 2011 Belledonne Comunications, Grenoble, France * @@ -31,7 +31,7 @@ linphone_core_mute_mic([LinphoneManager getLc], true); } -- (bool)isInitialStateOn { +- (bool)onUpdate { @try { return linphone_core_is_mic_muted([LinphoneManager getLc]) == false; } @catch(NSException* e) { diff --git a/Classes/LinphoneUI/UIPauseButton.h b/Classes/LinphoneUI/UIPauseButton.h new file mode 100644 index 000000000..963378287 --- /dev/null +++ b/Classes/LinphoneUI/UIPauseButton.h @@ -0,0 +1,25 @@ +/* UIPauseButton.h + * + * Copyright (C) 2012 Belledonne Comunications, Grenoble, France + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#import "UIToggleButton.h" + +@interface UIPauseButton : UIToggleButton { + +} +@end diff --git a/Classes/LinphoneUI/UIPauseButton.m b/Classes/LinphoneUI/UIPauseButton.m new file mode 100644 index 000000000..b271839ef --- /dev/null +++ b/Classes/LinphoneUI/UIPauseButton.m @@ -0,0 +1,106 @@ +/* UIPauseButton.m + * + * Copyright (C) 2012 Belledonne Comunications, Grenoble, France + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#import "UIPauseButton.h" +#import "LinphoneManager.h" + +#include "linphonecore.h" +#include "private.h" + +@implementation UIPauseButton + +- (void)onOn { + LinphoneCall* currentCall = [UIPauseButton getCall]; + if (currentCall != nil) { + linphone_core_pause_call([LinphoneManager getLc], currentCall); + } +} + +- (void)onOff { + LinphoneCall* currentCall = [UIPauseButton getCall]; + if (currentCall != nil) { + linphone_core_resume_call([LinphoneManager getLc], currentCall); + } +} + ++ (bool)isInConference: (LinphoneCall*) call { + if (!call) + return false; + return linphone_call_get_current_params(call)->in_conference; +} + ++ (int)notInConferenceCallCount: (LinphoneCore*) lc { + int count = 0; + const MSList* calls = linphone_core_get_calls(lc); + + while (calls != 0) { + if (![UIPauseButton isInConference: (LinphoneCall*)calls->data]) { + count++; + } + calls = calls->next; + } + return count; +} + +- (bool)onUpdate { + // TODO: disable pause on not running call + @try { + bool ret = false; + LinphoneCall* currentCall = [UIPauseButton getCall]; + if (currentCall != nil) { + LinphoneCallState state = linphone_call_get_state(currentCall); + if(state == LinphoneCallPaused || state == LinphoneCallPausing) { + ret = true; + } + } + LinphoneCore* lc = [LinphoneManager getLc]; + int callsCount = linphone_core_get_calls_nb(lc); + + if (currentCall) { + if (linphone_core_is_in_conference(lc)) { + [LinphoneManager set:self enabled:FALSE withName:"PAUSE button" andReason:"is in conference"]; + } else if ([UIPauseButton notInConferenceCallCount: lc] == callsCount && callsCount == 1) { + [LinphoneManager set:self enabled:TRUE withName:"PAUSE button" andReason:"call count == 1"]; + } else { + [LinphoneManager set:self enabled:FALSE withName:"PAUSE button" andReason:""]; + } + } else { + [LinphoneManager set:self enabled:FALSE withName:"PAUSE button" andReason:""]; + } + return ret; + } @catch(NSException* e) { + //not ready yet + return false; + } +} + ++ (LinphoneCall*)getCall { + LinphoneCore* lc = [LinphoneManager getLc]; + LinphoneCall* currentCall = linphone_core_get_current_call(lc); + if (currentCall == nil && linphone_core_get_calls_nb(lc) == 1) { + currentCall = (LinphoneCall*) linphone_core_get_calls(lc)->data; + } + return currentCall; +} + +- (void)dealloc { + [super dealloc]; +} + +@end diff --git a/Classes/LinphoneUI/UISpeakerButton.h b/Classes/LinphoneUI/UISpeakerButton.h index fb64c3e1f..02e723c84 100644 --- a/Classes/LinphoneUI/UISpeakerButton.h +++ b/Classes/LinphoneUI/UISpeakerButton.h @@ -18,8 +18,8 @@ */ #import -#import "UIToggleButton.h" +#import "UIToggleButton.h" @interface UISpeakerButton : UIToggleButton { diff --git a/Classes/LinphoneUI/UISpeakerButton.m b/Classes/LinphoneUI/UISpeakerButton.m index 3cf561365..6665fb799 100644 --- a/Classes/LinphoneUI/UISpeakerButton.m +++ b/Classes/LinphoneUI/UISpeakerButton.m @@ -31,7 +31,7 @@ static void audioRouteChangeListenerCallback ( const void *inPropertyValue // 4 ) { if (inPropertyID != kAudioSessionProperty_AudioRouteChange) return; // 5 - [(UISpeakerButton*)inUserData reset]; + [(UISpeakerButton*)inUserData update]; } @@ -48,7 +48,7 @@ static void audioRouteChangeListenerCallback ( } --(void) onOn { +- (void)onOn { //redirect audio to speaker UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute @@ -56,13 +56,13 @@ static void audioRouteChangeListenerCallback ( , &audioRouteOverride); } --(void) onOff { +- (void)onOff { UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None; AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute , sizeof (audioRouteOverride) , &audioRouteOverride); } --(bool) isInitialStateOn { +- (bool)onUpdate { CFStringRef lNewRoute=CFSTR("Unknown"); UInt32 lNewRouteSize = sizeof(lNewRoute); OSStatus lStatus = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute @@ -78,15 +78,6 @@ static void audioRouteChangeListenerCallback ( return false; } - -/* - // Only override drawRect: if you perform custom drawing. - // An empty implementation adversely affects performance during animation. - - (void)drawRect:(CGRect)rect { - // Drawing code. - } - */ - - (void)dealloc { OSStatus lStatus = AudioSessionRemovePropertyListenerWithUserData(routeChangeID, audioRouteChangeListenerCallback, self); if (lStatus) { @@ -95,5 +86,4 @@ static void audioRouteChangeListenerCallback ( [super dealloc]; } - @end diff --git a/Classes/LinphoneUI/LinphoneStatusBar.h b/Classes/LinphoneUI/UIStateBar.h similarity index 88% rename from Classes/LinphoneUI/LinphoneStatusBar.h rename to Classes/LinphoneUI/UIStateBar.h index bbd2d02c2..33a4a9ca5 100644 --- a/Classes/LinphoneUI/LinphoneStatusBar.h +++ b/Classes/LinphoneUI/UIStateBar.h @@ -1,6 +1,6 @@ -/* StatusSubViewController.h +/* UIStateBar.h * - * Copyright (C) 2011 Belledonne Comunications, Grenoble, France + * Copyright (C) 2012 Belledonne Comunications, Grenoble, France * * 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 @@ -16,10 +16,10 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#import -#include "linphonecore.h" -@interface LinphoneStatusBar : UIViewController { +#import + +@interface UIStateBar : UIViewController { UIImageView* image; UIActivityIndicatorView* spinner; UILabel* label; diff --git a/Classes/LinphoneUI/LinphoneStatusBar.m b/Classes/LinphoneUI/UIStateBar.m similarity index 86% rename from Classes/LinphoneUI/LinphoneStatusBar.m rename to Classes/LinphoneUI/UIStateBar.m index 472202c9f..22059760b 100644 --- a/Classes/LinphoneUI/LinphoneStatusBar.m +++ b/Classes/LinphoneUI/UIStateBar.m @@ -1,6 +1,6 @@ -/* StatusSubViewController.h +/* UIStateBar.m * - * Copyright (C) 2011 Belledonne Comunications, Grenoble, France + * Copyright (C) 2012 Belledonne Comunications, Grenoble, France * * 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 @@ -17,25 +17,25 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#import "LinphoneStatusBar.h" +#import "UIStateBar.h" #import "LinphoneManager.h" -@implementation LinphoneStatusBar +#include "linphonecore.h" + +@implementation UIStateBar @synthesize image; @synthesize spinner; @synthesize label; -- (void)viewDidLoad -{ +- (void)viewDidLoad { [super viewDidLoad]; // Set observer [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(registrationUpdate:) name:@"LinphoneRegistrationUpdate" object:nil]; } -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationPortrait); } @@ -76,22 +76,22 @@ [label setText:message != nil ? message : NSLocalizedString(@"No SIP account defined", nil)];*/ case LinphoneRegistrationFailed: image.hidden = NO; - [image setImage:[UIImage imageNamed:@"status_red.png"]]; + [image setImage:[UIImage imageNamed:@"status_error.png"]]; [spinner stopAnimating]; [label setText:message]; case LinphoneRegistrationNone: image.hidden = NO; - [image setImage:[UIImage imageNamed:@"status_gray.png"]]; + [image setImage:[UIImage imageNamed:@"status_disconnected.png"]]; [spinner stopAnimating]; [label setText:message]; case LinphoneRegistrationProgress: - image.hidden = YES; - spinner.hidden = NO; - [spinner startAnimating]; + image.hidden = NO; + [image setImage:[UIImage imageNamed:@"status_inprogress.png"]]; + [spinner stopAnimating]; [label setText:message]; case LinphoneRegistrationOk: image.hidden = NO; - [image setImage:[UIImage imageNamed:@"status_green.png"]]; + [image setImage:[UIImage imageNamed:@"status_connected.png"]]; [spinner stopAnimating]; [label setText:message]; } diff --git a/Classes/LinphoneUI/LinphoneStatusBar.xib b/Classes/LinphoneUI/UIStateBar.xib similarity index 75% rename from Classes/LinphoneUI/LinphoneStatusBar.xib rename to Classes/LinphoneUI/UIStateBar.xib index 11c18af81..013370200 100644 --- a/Classes/LinphoneUI/LinphoneStatusBar.xib +++ b/Classes/LinphoneUI/UIStateBar.xib @@ -12,7 +12,6 @@ IBUIImageView - IBUIActivityIndicatorView IBUIView IBUILabel IBProxyObject @@ -43,7 +42,7 @@ {320, 23} - + _NS:9 NO IBCocoaTouchFramework @@ -55,10 +54,10 @@ -2147483356 - {{0, -1}, {25, 23}} + {{6, 6}, {10, 10}} - + _NS:567 NO IBCocoaTouchFramework @@ -67,22 +66,10 @@ status_gray.png - - - -2147483356 - {{0, 1}, {20, 20}} - - - - _NS:1030 - NO - IBCocoaTouchFramework - 2 - -2147483356 - {{28, 0}, {280, 21}} + {{22, 0}, {298, 20}} @@ -114,7 +101,7 @@ {320, 23} - + _NS:196 3 @@ -141,14 +128,6 @@ 9 - - - spinner - - - - 10 - view @@ -181,24 +160,17 @@ 4 - - - 7 - - - spin - 6 - label + status 5 @@ -215,7 +187,7 @@ - LinphoneStatusBar + UIStateBar com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -223,7 +195,6 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -231,37 +202,7 @@ 12 - - - - LinphoneStatusBar - UIViewController - - UIImageView - UILabel - UIActivityIndicatorView - - - - image - UIImageView - - - label - UILabel - - - spinner - UIActivityIndicatorView - - - - IBProjectSource - ./Classes/LinphoneStatusBar.h - - - - + 0 IBCocoaTouchFramework diff --git a/Classes/LinphoneUI/UIToggleButton.h b/Classes/LinphoneUI/UIToggleButton.h index 50d8a6268..433fe8840 100644 --- a/Classes/LinphoneUI/UIToggleButton.h +++ b/Classes/LinphoneUI/UIToggleButton.h @@ -22,12 +22,12 @@ @protocol UIToggleButtonDelegate -(void) onOn; -(void) onOff; - -(bool) isInitialStateOn; + -(bool) onUpdate; @end @interface UIToggleButton : UIButton { } --(bool) reset; +-(bool) update; -(bool) toggle; @end diff --git a/Classes/LinphoneUI/UIToggleButton.m b/Classes/LinphoneUI/UIToggleButton.m index 0c34e15f2..73e3caae3 100644 --- a/Classes/LinphoneUI/UIToggleButton.m +++ b/Classes/LinphoneUI/UIToggleButton.m @@ -36,13 +36,13 @@ return self.selected; } -- (bool)reset { - self.selected = [self isInitialStateOn]; +- (bool)update { + self.selected = [self onUpdate]; return self.selected; } - (id) init { - [self reset]; + [self update]; [self addTarget:self action:@selector(touchUp:) forControlEvents:UIControlEventTouchUpInside]; return self; } @@ -75,7 +75,7 @@ [NSException raise:NSInternalInconsistencyException format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]; } --(bool) isInitialStateOn { +-(bool) onUpdate { [NSException raise:NSInternalInconsistencyException format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]; return false; diff --git a/Classes/LinphoneUI/UIToggleVideoButton.m b/Classes/LinphoneUI/UIToggleVideoButton.m deleted file mode 100644 index da69d7174..000000000 --- a/Classes/LinphoneUI/UIToggleVideoButton.m +++ /dev/null @@ -1,75 +0,0 @@ -/* UIToggleVideoButton.m - * - * Copyright (C) 2011 Belledonne Comunications, Grenoble, France - * - * 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 2 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 Library General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#import "UIToggleVideoButton.h" -#include "LinphoneManager.h" - -@implementation UIToggleVideoButton - -@synthesize videoUpdateIndicator; - --(void) touchUp:(id) sender { - LinphoneCore* lc = [LinphoneManager getLc]; - - if (!linphone_core_video_enabled(lc)) - return; - - [videoUpdateIndicator startAnimating]; - videoUpdateIndicator.hidden = NO; - self.enabled = NO; - - LinphoneCall* call = linphone_core_get_current_call([LinphoneManager getLc]); - if (call) { - LinphoneCallParams* call_params = linphone_call_params_copy(linphone_call_get_current_params(call)); - if (linphone_call_params_video_enabled(call_params)) { - ms_message("Disabling video"); - linphone_call_params_enable_video(call_params, FALSE); - } else { - ms_message("Enabling video"); - linphone_call_params_enable_video(call_params, TRUE); - } - linphone_core_update_call(lc, call, call_params); - linphone_call_params_destroy(call_params); - } else { - ms_warning("Cannot toggle video, because no current call"); - } -} - -- (id) init { - [self addTarget:self action:@selector(touchUp:) forControlEvents:UIControlEventTouchUpInside]; - return self; -} - -- (id)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - [self init]; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)decoder { - self = [super initWithCoder:decoder]; - if (self) { - [self init]; - } - return self; -} - -@end diff --git a/Classes/LinphoneUI/UIToggleVideoButton.h b/Classes/LinphoneUI/UIVideoButton.h similarity index 91% rename from Classes/LinphoneUI/UIToggleVideoButton.h rename to Classes/LinphoneUI/UIVideoButton.h index 37a712ddd..17d588343 100644 --- a/Classes/LinphoneUI/UIToggleVideoButton.h +++ b/Classes/LinphoneUI/UIVideoButton.h @@ -1,4 +1,4 @@ -/* UIToggleVideoButton.h +/* UIVideoButton.h * * Copyright (C) 2011 Belledonne Comunications, Grenoble, France * @@ -19,11 +19,12 @@ #import -@interface UIToggleVideoButton : UIButton { +#import "UIToggleButton.h" + +@interface UIVideoButton : UIToggleButton { UIActivityIndicatorView* videoUpdateIndicator; } -- (id)initWithCoder:(NSCoder *)decoder; @property (nonatomic, retain) IBOutlet UIActivityIndicatorView* videoUpdateIndicator; diff --git a/Classes/LinphoneUI/UIVideoButton.m b/Classes/LinphoneUI/UIVideoButton.m new file mode 100644 index 000000000..8d13c0495 --- /dev/null +++ b/Classes/LinphoneUI/UIVideoButton.m @@ -0,0 +1,92 @@ +/* UIToggleVideoButton.m + * + * Copyright (C) 2011 Belledonne Comunications, Grenoble, France + * + * 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 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#import "UIVideoButton.h" +#include "LinphoneManager.h" + +@implementation UIVideoButton + +@synthesize videoUpdateIndicator; + +- (void)onOn { + LinphoneCore* lc = [LinphoneManager getLc]; + + if (!linphone_core_video_enabled(lc)) + return; + + [videoUpdateIndicator startAnimating]; + [videoUpdateIndicator setHidden: FALSE]; + [self setEnabled: FALSE]; + LinphoneCall* call = linphone_core_get_current_call([LinphoneManager getLc]); + if (call) { + LinphoneCallParams* call_params = linphone_call_params_copy(linphone_call_get_current_params(call)); + linphone_call_params_enable_video(call_params, TRUE); + linphone_core_update_call(lc, call, call_params); + linphone_call_params_destroy(call_params); + } else { + ms_warning("Cannot toggle video, because no current call"); + } + +} + +- (void)onOff { + LinphoneCore* lc = [LinphoneManager getLc]; + + if (!linphone_core_video_enabled(lc)) + return; + + [videoUpdateIndicator startAnimating]; + [videoUpdateIndicator setHidden: FALSE]; + [self setEnabled: FALSE]; + LinphoneCall* call = linphone_core_get_current_call([LinphoneManager getLc]); + if (call) { + LinphoneCallParams* call_params = linphone_call_params_copy(linphone_call_get_current_params(call)); + linphone_call_params_enable_video(call_params, FALSE); + linphone_core_update_call(lc, call, call_params); + linphone_call_params_destroy(call_params); + } else { + ms_warning("Cannot toggle video, because no current call"); + } +} + +- (bool)onUpdate { + @try { + bool val = false; + LinphoneCall* currentCall = linphone_core_get_current_call([LinphoneManager getLc]); + if (currentCall) { + LinphoneCallState state = linphone_call_get_state(currentCall); + if (state == LinphoneCallStreamsRunning || state == LinphoneCallUpdated || state == LinphoneCallUpdatedByRemote) { + if (linphone_call_params_video_enabled(linphone_call_get_current_params(currentCall))) { + val = true; + } + [self setEnabled:TRUE]; + } else { + [self setEnabled:FALSE]; + } + } else { + [self setEnabled:FALSE]; + } + return val; + } @catch(NSException* e) { + //not ready yet + return false; + } +} + +@end diff --git a/Classes/MainScreenWithVideoPreview.xib b/Classes/MainScreenWithVideoPreview.xib index 813695dc9..9eadcbda7 100644 --- a/Classes/MainScreenWithVideoPreview.xib +++ b/Classes/MainScreenWithVideoPreview.xib @@ -44,6 +44,7 @@ 292 {768, 1024} + _NS:196 3 @@ -68,12 +69,19 @@ IBIPadFramework NO - - + + History + + History + + NSImage + history-orange.png + IBIPadFramework - 5 + + 1 1 @@ -82,25 +90,7 @@ NO - - History - - History - - NSImage - history-orange.png - - IBIPadFramework - - - - - 1 - 1 - - IBIPadFramework - NO - + Dialer @@ -109,6 +99,7 @@ dialer-orange.png IBIPadFramework + PhoneViewController-ipad @@ -120,11 +111,25 @@ IBIPadFramework NO - + + + IBIPadFramework + + 5 + + + + 1 + 1 + + IBIPadFramework + NO + IBIPadFramework + 0 @@ -142,12 +147,20 @@ 266 {{0, 975}, {768, 49}} + 3 MCAwAA NO IBIPadFramework + + + + + + + @@ -156,6 +169,7 @@ 274 {{0, 20}, {768, 1004}} + _NS:212 1 @@ -355,7 +369,7 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin PhoneViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin - CallHistoryTableViewController + HistoryTableViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin MoreViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -376,7 +390,228 @@ 44 - + + + + HistoryTableViewController + UITableViewController + + IBProjectSource + ./Classes/HistoryTableViewController.h + + + + MainScreenWithVideoPreview + UIViewController + + PhoneViewController + UIWindow + + + + phoneMainView + PhoneViewController + + + window + UIWindow + + + + IBProjectSource + ./Classes/MainScreenWithVideoPreview.h + + + + MoreViewController + UITableViewController + + UITableViewCell + UITableViewCell + UITextView + UITableViewCell + UILabel + + + + console + UITableViewCell + + + credit + UITableViewCell + + + creditText + UITextView + + + web + UITableViewCell + + + weburi + UILabel + + + + IBProjectSource + ./Classes/MoreViewController.h + + + + PhoneViewController + UIViewController + + onAddContact: + id + + + onAddContact: + + onAddContact: + id + + + + UITextField + UIButton + UIButton + UIButton + UIView + UIButton + UIEraseButton + UIButton + UIButton + UIButton + UILabel + MainScreenWithVideoPreview + UITabBarController + UIButton + UIButton + UIButton + UIButton + UIButton + UILabel + UIView + UIButton + UIButton + UIButton + UIButton + + + + address + UITextField + + + backToCallView + UIButton + + + callLarge + UIButton + + + callShort + UIButton + + + dialerView + UIView + + + eight + UIButton + + + erase + UIEraseButton + + + five + UIButton + + + four + UIButton + + + hash + UIButton + + + mDisplayName + UILabel + + + mMainScreenWithVideoPreview + MainScreenWithVideoPreview + + + myTabBarController + UITabBarController + + + nine + UIButton + + + one + UIButton + + + seven + UIButton + + + six + UIButton + + + star + UIButton + + + status + UILabel + + + statusViewHolder + UIView + + + switchCamera + UIButton + + + three + UIButton + + + two + UIButton + + + zero + UIButton + + + + IBProjectSource + ./Classes/PhoneViewController.h + + + + UIEraseButton + UIButton + + IBProjectSource + ./Classes/UIEraseButton.h + + + + 0 IBIPadFramework diff --git a/Classes/PhoneMainView.h b/Classes/PhoneMainView.h index 85e829d48..d730d95e8 100644 --- a/Classes/PhoneMainView.h +++ b/Classes/PhoneMainView.h @@ -21,27 +21,26 @@ #import "LinphoneManager.h" @interface PhoneMainView : UIViewController { - UIView *statusBarView; + UIView *stateBarView; UIView *contentView; UIView *tabBarView; - PhoneView currentView; @private NSMutableDictionary *viewDescriptions; NSArray *views; - UIViewController *statusBarController; + UIViewController *stateBarController; UIViewController *callTabBarController; UIViewController *mainTabBarController; UIViewController *incomingCallTabBarController; } -@property (nonatomic, retain) IBOutlet UIView* statusBarView; +@property (nonatomic, retain) IBOutlet UIView* stateBarView; @property (nonatomic, retain) IBOutlet UIView* contentView; @property (nonatomic, retain) IBOutlet UIView* tabBarView; -@property (nonatomic, retain) IBOutlet UIViewController* statusBarController; +@property (nonatomic, retain) IBOutlet UIViewController* stateBarController; @property (nonatomic, retain) IBOutlet UIViewController* callTabBarController; @property (nonatomic, retain) IBOutlet UIViewController* mainTabBarController; diff --git a/Classes/PhoneMainView.m b/Classes/PhoneMainView.m index 788272d0d..fbc5c5301 100644 --- a/Classes/PhoneMainView.m +++ b/Classes/PhoneMainView.m @@ -19,8 +19,8 @@ #import "PhoneMainView.h" #import "PhoneViewController.h" -#import "HistoryController.h" -#import "ContactsController.h" +#import "HistoryViewController.h" +#import "ContactsViewController.h" #import "InCallViewController.h" typedef enum _TabBar { @@ -41,11 +41,11 @@ typedef enum _TabBar { @implementation PhoneMainView -@synthesize statusBarView; +@synthesize stateBarView; @synthesize contentView; @synthesize tabBarView; -@synthesize statusBarController; +@synthesize stateBarController; @synthesize callTabBarController; @synthesize mainTabBarController; @@ -64,14 +64,15 @@ typedef enum _TabBar { if(description == nil) return; - [contentView addSubview: description->content.view]; + UIView *innerView = description->content.view; + [contentView addSubview: innerView]; CGRect contentFrame = contentView.frame; if(description->statusEnabled) { - statusBarView.hidden = false; - contentFrame.origin.y = statusBarView.frame.size.height + statusBarView.frame.origin.y; + stateBarView.hidden = false; + contentFrame.origin.y = stateBarView.frame.size.height + stateBarView.frame.origin.y; } else { - statusBarView.hidden = true; + stateBarView.hidden = true; contentFrame.origin.y = 0; } @@ -85,7 +86,7 @@ typedef enum _TabBar { tabFrame.size.width = description->tabBar.view.frame.size.width; tabFrame.origin.y -= tabFrame.size.height; tabFrame.origin.x -= tabFrame.size.width; - tabBarView.frame = tabFrame; + [tabBarView setFrame: tabFrame]; contentFrame.size.height = tabFrame.origin.y - contentFrame.origin.y; for (UIView *view in description->tabBar.view.subviews) { if(view.tag == -1) { @@ -99,7 +100,14 @@ typedef enum _TabBar { contentFrame.size.height = tabFrame.origin.y - tabFrame.size.height; } - contentView.frame = contentFrame; + [contentView setFrame: contentFrame]; + CGRect innerContentFrame = innerView.frame; + innerContentFrame.size = contentFrame.size; + [innerView setFrame: innerContentFrame]; + + NSDictionary *dict = [notif.userInfo objectForKey: @"args"]; + if(dict != nil) + [LinphoneManager abstractCall:description->content dict:dict]; } - (void)viewDidLoad { @@ -113,14 +121,14 @@ typedef enum _TabBar { dumb = mainTabBarController.view; // Status Bar - [statusBarView addSubview: statusBarController.view]; + [stateBarView addSubview: stateBarController.view]; // // Main View // PhoneViewController* myPhoneViewController = [[PhoneViewController alloc] - initWithNibName:@"PhoneViewController" - bundle:[NSBundle mainBundle]]; + initWithNibName:@"PhoneViewController" + bundle:[NSBundle mainBundle]]; //[myPhoneViewController loadView]; ViewsDescription *mainViewDescription = [ViewsDescription alloc]; mainViewDescription->content = myPhoneViewController; @@ -132,9 +140,9 @@ typedef enum _TabBar { // // Contacts View // - ContactsController* myContactsController = [[ContactsController alloc] - initWithNibName:@"ContactsController" - bundle:[NSBundle mainBundle]]; + ContactsViewController* myContactsController = [[ContactsViewController alloc] + initWithNibName:@"ContactsViewController" + bundle:[NSBundle mainBundle]]; //[myContactsController loadView]; ViewsDescription *contactsDescription = [ViewsDescription alloc]; contactsDescription->content = myContactsController; @@ -146,9 +154,9 @@ typedef enum _TabBar { // // Call History View // - HistoryController* myHistoryController = [[HistoryController alloc] - initWithNibName:@"HistoryController" - bundle:[NSBundle mainBundle]]; + HistoryViewController* myHistoryController = [[HistoryViewController alloc] + initWithNibName:@"HistoryViewController" + bundle:[NSBundle mainBundle]]; //[myHistoryController loadView]; ViewsDescription *historyDescription = [ViewsDescription alloc]; historyDescription->content = myHistoryController; @@ -161,8 +169,8 @@ typedef enum _TabBar { // InCall View // InCallViewController* myInCallController = [[InCallViewController alloc] - initWithNibName:@"InCallViewController" - bundle:[NSBundle mainBundle]]; + initWithNibName:@"InCallViewController" + bundle:[NSBundle mainBundle]]; //[myHistoryController loadView]; ViewsDescription *inCallDescription = [ViewsDescription alloc]; inCallDescription->content = myInCallController; @@ -180,11 +188,13 @@ typedef enum _TabBar { } - (void)dealloc { - [super dealloc]; - [viewDescriptions dealloc]; - [statusBarView dealloc]; - [statusBarController dealloc]; - [mainTabBarController dealloc]; [[NSNotificationCenter defaultCenter] removeObserver:self]; + + [viewDescriptions release]; + [stateBarView release]; + [stateBarController release]; + [mainTabBarController release]; + + [super dealloc]; } @end \ No newline at end of file diff --git a/Classes/PhoneMainView.xib b/Classes/PhoneMainView.xib index 9451833ab..178a8c774 100644 --- a/Classes/PhoneMainView.xib +++ b/Classes/PhoneMainView.xib @@ -49,11 +49,8 @@ _NS:9 - 3 - MQA - - 2 - + 1 + MCAxIDAuMDkwOTI0NTczOTEAA YES IBCocoaTouchFramework @@ -66,10 +63,6 @@ _NS:9 - - 1 - MCAxIDAuMDkwOTI0NTczOTEgMAA - YES IBCocoaTouchFramework @@ -79,6 +72,7 @@ {{0, 400}, {320, 60}} + _NS:9 1 @@ -96,7 +90,9 @@ 3 MQA - + + 2 + IBCocoaTouchFramework @@ -173,6 +169,7 @@ {{160, 0}, {160, 77}} + _NS:9 NO @@ -271,6 +268,7 @@ {{192, 0}, {128, 72}} + _NS:9 NO @@ -344,6 +342,7 @@ NO + UIMainBar 1 @@ -354,6 +353,7 @@ NO + UICallBar 1 @@ -364,6 +364,7 @@ NO + UIStatusBar 1 @@ -400,14 +401,6 @@ 159 - - - statusBarView - - - - 176 - mainTabBarController @@ -416,14 +409,6 @@ 192 - - - statusBarController - - - - 193 - callTabBarController @@ -432,6 +417,22 @@ 196 + + + stateBarController + + + + 201 + + + + stateBarView + + + + 202 + @@ -559,25 +560,25 @@ 175 - statusBar + stateBar 178 - mainBarController + mainTabBarController 190 - statusBarController + stateBarController 194 - callBarController + callTabBarController @@ -637,11 +638,11 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - LinphoneMainBar + UIMainBar com.apple.InterfaceBuilder.IBCocoaTouchPlugin - LinphoneStatusBar + UIStateBar com.apple.InterfaceBuilder.IBCocoaTouchPlugin - LinphoneCallBar + UICallBar com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -658,29 +659,280 @@ - 196 + 202 YES - LinphoneCallBar + PhoneMainView UIViewController + + YES + + YES + callTabBarController + contentView + incomingCallTabBarController + mainTabBarController + stateBarController + stateBarView + tabBarView + + + YES + UIViewController + UIView + UIViewController + UIViewController + UIViewController + UIView + UIView + + + + YES + + YES + callTabBarController + contentView + incomingCallTabBarController + mainTabBarController + stateBarController + stateBarView + tabBarView + + + YES + + callTabBarController + UIViewController + + + contentView + UIView + + + incomingCallTabBarController + UIViewController + + + mainTabBarController + UIViewController + + + stateBarController + UIViewController + + + stateBarView + UIView + + + tabBarView + UIView + + + IBProjectSource - ./Classes/LinphoneCallBar.h + ./Classes/PhoneMainView.h - LinphoneMainBar + UICallBar UIViewController + + YES + + YES + microButton + pauseButton + speakerButton + videoButton + + + YES + UIMicroButton + UIPauseButton + UISpeakerButton + UIVideoButton + + + + YES + + YES + microButton + pauseButton + speakerButton + videoButton + + + YES + + microButton + UIMicroButton + + + pauseButton + UIPauseButton + + + speakerButton + UISpeakerButton + + + videoButton + UIVideoButton + + + IBProjectSource - ./Classes/LinphoneMainBar.h + ./Classes/UICallBar.h - LinphoneStatusBar + UIMainBar + UIViewController + + YES + + YES + onChatClick: + onContactsClick: + onDialerClick: + onHistoryClick: + onSettingsClick: + + + YES + id + id + id + id + id + + + + YES + + YES + onChatClick: + onContactsClick: + onDialerClick: + onHistoryClick: + onSettingsClick: + + + YES + + onChatClick: + id + + + onContactsClick: + id + + + onDialerClick: + id + + + onHistoryClick: + id + + + onSettingsClick: + id + + + + + YES + + YES + chatButton + contactsButton + dialerButton + historyButton + settingsButton + + + YES + UIButton + UIButton + UIButton + UIButton + UIButton + + + + YES + + YES + chatButton + contactsButton + dialerButton + historyButton + settingsButton + + + YES + + chatButton + UIButton + + + contactsButton + UIButton + + + dialerButton + UIButton + + + historyButton + UIButton + + + settingsButton + UIButton + + + + + IBProjectSource + ./Classes/UIMainBar.h + + + + UIMicroButton + UIToggleButton + + IBProjectSource + ./Classes/UIMicroButton.h + + + + UIPauseButton + UIToggleButton + + IBProjectSource + ./Classes/UIPauseButton.h + + + + UISpeakerButton + UIToggleButton + + IBProjectSource + ./Classes/UISpeakerButton.h + + + + UIStateBar UIViewController YES @@ -723,82 +975,34 @@ IBProjectSource - ./Classes/LinphoneStatusBar.h + ./Classes/UIStateBar.h - PhoneMainView - UIViewController + UIToggleButton + UIButton + + IBProjectSource + ./Classes/UIToggleButton.h + + + + UIVideoButton + UIToggleButton - YES - - YES - callTabBarController - contentView - incomingCallTabBarController - mainTabBarController - statusBarController - statusBarView - tabBarView - - - YES - UIViewController - UIView - UIViewController - UIViewController - UIViewController - UIView - UIView - + videoUpdateIndicator + UIActivityIndicatorView - YES - - YES - callTabBarController - contentView - incomingCallTabBarController - mainTabBarController - statusBarController - statusBarView - tabBarView - - - YES - - callTabBarController - UIViewController - - - contentView - UIView - - - incomingCallTabBarController - UIViewController - - - mainTabBarController - UIViewController - - - statusBarController - UIViewController - - - statusBarView - UIView - - - tabBarView - UIView - + videoUpdateIndicator + + videoUpdateIndicator + UIActivityIndicatorView IBProjectSource - ./Classes/PhoneMainView.h + ./Classes/UIVideoButton.h diff --git a/Classes/PhoneViewController.h b/Classes/PhoneViewController.h index 5c99d57be..2312ce397 100644 --- a/Classes/PhoneViewController.h +++ b/Classes/PhoneViewController.h @@ -70,6 +70,7 @@ @property (nonatomic, retain) IBOutlet UIView* dialerView; @property (nonatomic, retain) IBOutlet UITextField* address; +@property (nonatomic, retain) IBOutlet UILabel* mDisplayName; @property (nonatomic, retain) IBOutlet UIButton* callShort; @property (nonatomic, retain) IBOutlet UIButton* callLarge; @property (nonatomic, retain) IBOutlet UILabel* status; diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index 2f3feda4d..e8a7f5a48 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -31,6 +31,7 @@ @implementation PhoneViewController @synthesize dialerView; +@synthesize mDisplayName; @synthesize address; @synthesize callShort; @synthesize callLarge; diff --git a/Classes/Utils/OrderedDictionary.h b/Classes/Utils/OrderedDictionary.h new file mode 100644 index 000000000..2a3ecaa9d --- /dev/null +++ b/Classes/Utils/OrderedDictionary.h @@ -0,0 +1,37 @@ +// +// OrderedDictionary.h +// OrderedDictionary +// +// Created by Matt Gallagher on 19/12/08. +// Copyright 2008 Matt Gallagher. All rights reserved. +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. Permission is granted to anyone to +// use this software for any purpose, including commercial applications, and to +// alter it and redistribute it freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source +// distribution. +// + +@interface OrderedDictionary : NSMutableDictionary +{ + NSMutableDictionary *dictionary; + NSMutableArray *array; +} + +- (void)insertObject:(id)anObject forKey:(id)aKey atIndex:(NSUInteger)anIndex; +// Added by Diorcet Yann +- (void)insertObject:(id)anObject forKey:(id)aKey selector:(SEL) sel; +// +- (id)keyAtIndex:(NSUInteger)anIndex; +- (NSEnumerator *)reverseKeyEnumerator; + +@end diff --git a/Classes/Utils/OrderedDictionary.m b/Classes/Utils/OrderedDictionary.m new file mode 100644 index 000000000..8678ed0dd --- /dev/null +++ b/Classes/Utils/OrderedDictionary.m @@ -0,0 +1,170 @@ +// +// OrderedDictionary.m +// OrderedDictionary +// +// Created by Matt Gallagher on 19/12/08. +// Copyright 2008 Matt Gallagher. All rights reserved. +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. Permission is granted to anyone to +// use this software for any purpose, including commercial applications, and to +// alter it and redistribute it freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source +// distribution. +// + +#import "OrderedDictionary.h" + +NSString *DescriptionForObject(NSObject *object, id locale, NSUInteger indent) +{ + NSString *objectString; + if ([object isKindOfClass:[NSString class]]) + { + objectString = (NSString *)[[object retain] autorelease]; + } + else if ([object respondsToSelector:@selector(descriptionWithLocale:indent:)]) + { + objectString = [(NSDictionary *)object descriptionWithLocale:locale indent:indent]; + } + else if ([object respondsToSelector:@selector(descriptionWithLocale:)]) + { + objectString = [(NSSet *)object descriptionWithLocale:locale]; + } + else + { + objectString = [object description]; + } + return objectString; +} + +@implementation OrderedDictionary + +- (id)init +{ + return [self initWithCapacity:0]; +} + +- (id)initWithCapacity:(NSUInteger)capacity +{ + self = [super init]; + if (self != nil) + { + dictionary = [[NSMutableDictionary alloc] initWithCapacity:capacity]; + array = [[NSMutableArray alloc] initWithCapacity:capacity]; + } + return self; +} + +- (void)dealloc +{ + [dictionary release]; + [array release]; + [super dealloc]; +} + +- (id)copy +{ + return [self mutableCopy]; +} + +- (void)setObject:(id)anObject forKey:(id)aKey +{ + if (![dictionary objectForKey:aKey]) + { + [array addObject:aKey]; + } + [dictionary setObject:anObject forKey:aKey]; +} + +- (void)removeObjectForKey:(id)aKey +{ + [dictionary removeObjectForKey:aKey]; + [array removeObject:aKey]; +} + +- (NSUInteger)count +{ + return [dictionary count]; +} + +- (id)objectForKey:(id)aKey +{ + return [dictionary objectForKey:aKey]; +} + +- (NSEnumerator *)keyEnumerator +{ + return [array objectEnumerator]; +} + +- (NSEnumerator *)reverseKeyEnumerator +{ + return [array reverseObjectEnumerator]; +} + + +// Added by Diorcet Yann +- (void)insertObject:(id)anObject forKey:(id)aKey selector:(SEL)comparator +{ + if ([dictionary objectForKey:aKey]) + { + [self removeObjectForKey:aKey]; + } + NSUInteger anIndex; + for(anIndex = 0; anIndex < [array count]; ++anIndex) { + NSComparisonResult result = (NSComparisonResult) [aKey performSelector:comparator withObject:[array objectAtIndex: anIndex]]; + if(result <= 0) { + break; + } + } + [array insertObject:aKey atIndex:anIndex]; + [dictionary setObject:anObject forKey:aKey]; +} +// + +- (void)insertObject:(id)anObject forKey:(id)aKey atIndex:(NSUInteger)anIndex +{ + if ([dictionary objectForKey:aKey]) + { + [self removeObjectForKey:aKey]; + } + [array insertObject:aKey atIndex:anIndex]; + [dictionary setObject:anObject forKey:aKey]; +} + +- (id)keyAtIndex:(NSUInteger)anIndex +{ + return [array objectAtIndex:anIndex]; +} + +- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level +{ + NSMutableString *indentString = [NSMutableString string]; + NSUInteger i, count = level; + for (i = 0; i < count; i++) + { + [indentString appendFormat:@" "]; + } + + NSMutableString *description = [NSMutableString string]; + [description appendFormat:@"%@{\n", indentString]; + for (NSObject *key in self) + { + [description appendFormat:@"%@ %@ = %@;\n", + indentString, + DescriptionForObject(key, locale, level), + DescriptionForObject([self objectForKey:key], locale, level)]; + } + [description appendFormat:@"%@}\n", indentString]; + return description; +} + +@end diff --git a/Classes/VideoViewController.m b/Classes/VideoViewController.m index f885a5513..2da07cf5c 100644 --- a/Classes/VideoViewController.m +++ b/Classes/VideoViewController.m @@ -190,9 +190,9 @@ NSTimer *callQualityRefresher; [self performSelectorOnMainThread:@selector(configureOrientation) withObject:nil waitUntilDone:YES]; - [mMute reset]; - [mMuteLandRight reset]; - [mMuteLandLeft reset]; + [mMute update]; + [mMuteLandRight update]; + [mMuteLandLeft update]; maxCall = linphone_core_get_max_calls([LinphoneManager getLc]); linphone_core_set_max_calls([LinphoneManager getLc], 1); } @@ -218,9 +218,9 @@ NSTimer *callQualityRefresher; - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { [self configureOrientation:self.interfaceOrientation]; - [mMute reset]; - [mMuteLandRight reset]; - [mMuteLandLeft reset]; + [mMute update]; + [mMuteLandRight update]; + [mMuteLandLeft update]; } - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { [mLandscapeLeft removeFromSuperview]; diff --git a/Resources/HP.png b/Resources/HP.png deleted file mode 100755 index b3527b7826a113a123c88cbca091afdf7d3cfeab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3113 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 diff --git a/Resources/HP_inverse.png b/Resources/HP_inverse.png deleted file mode 100755 index 983f799de12d072ef5dbee41f882b55f714abf74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6868 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 LNkvXXu0mjf$+!vn diff --git a/Resources/appel-entrant.png b/Resources/appel-entrant.png new file mode 100644 index 0000000000000000000000000000000000000000..2ce5c676eef8a680dc26f089a494d5d0780a6fb8 GIT binary patch literal 2326 zcmbVOX;c$g7Oo@^AQBAXf*@^mKyU<-sw8AXARC)a6c7b>iliWE2#HC=fMXK^>ZlO| z0^){Ip+{U$P#IbsjRFd4D~b!);)0x3#{pZxX2gXqRGj(Y=^s<))Twu0ecyMNckelG zeeCQ=GRcDk0022UN)nHK+1Sf-Bmw}AH2!G?W=z(HC+X*^Q}rtmEeZ(b>J$`=Rv~F< zJc`J(m$#xb0f3OIOi0ovNn`jjwTgy}U}y%F24e%j%rJunk)@-0Fa=FhW`o< zz|RjA^QM)j^5Z2DpM7Cg2vwoiYxs2f%9Sf=E15L4HjNJRc)Sq}1|twd1nROg^@t%b zQ|CRZAVGC9tx}^`sx!e6MI=SNLLWlKBK?$tN+Xqi5zf?oE)-TWx&hJ9VH!kNsYdep zh}P-j(f@|=RkSW4TZ7W$QJs2)R)(ENs`n@vtKFYF8UbR_@aJfi*r6a9618lF3eD6< zOG2pFADUb#=R+_Tf?*B|;xHgK7lwrqVlhu7=0vc?9Ec}`M>W326-ID^#5^{W%MKF3 za5&6mLKs!V7IH))5swiu%8ky{>5)tsI_g)6`Tfjg{3(|&)}n}BtxZs?Ge$cgR-x9b zbqcix6weI;rHD+KIbx3-&!=o9s8*SU$|JOD75K5feC1dCOQ0a8kRyhf>`!@f#V{*^ z!3_%HV$CGvF{q!p^8cr1bSxP9NOSy8vy5(G9XPW5()yV3Wq8m`Y+|(7Xf#CSy#N6F zh-is0!EiU_-SBW2!7<>07Kn));zBmSjexgqcS4OYu&7P2dl{pg@dgkRxVK>dltsdHBkkW9>@r! z6g2xe+qx%AG`H0F`3`(&OmUG1Q65Al+Dv{OWWhPp<%pz?_i47Vu{T_NdFe^g;}#Dn_YZa2kFVM99QQNd%E_a|DeV8SD$*Ic0D_<4*eZW1ctpO+z z0eDC6bSvR_@tBY}X3AxLWsl2t+(hcl@dDkX+XcjdH`$7KhdhyWj^9J)Ipa*OM?{O8 zS=FK9LIqB-W>)dEo+P4wgL~^HX3t*Ye6GL6I*envOnvCI)O^!0)x(eE!=I0fraMof z%o-v|nkKOq|1DedTw2=6?-k|3Z`7bLLEV^A1P$1rq-;>NKl?Mb5Q+Nl*mo)7-S#e-s zj3hk2uhO;d+Biji)8NKBhjYZ$-n+6LTDm5`+t*&TqxXfaq_vRYCyaMXKdr|F6;B5g-=f2-HpGP@5(}%l1rwsQa*X%`dI#ZoCuTQ$r{qDq> z&a}YIKj3_345+*2DYJ7)PPaX7?mQMo_PQ{uoz|J)TS~jH3p(?QsrO&E8t33np18el zE#jWR&+7!cz->UCFc|mR&fJ!YKW~TR*9i-qx?Ssp9YA-5-hKCy;2$WHx?V49PbjN; zfh=0HCeS%+OU*S>_|kbZ8tzkX(OJx)VMY19fnxvX*+e^(HtW9i)KX*O>8pzd0;4)3 zpTc>|A~%J{eV6d)vMt>LzTV#3d8KvN?Ry&z|0tT)7U?Pe_rq0HsmR?E{=R!eb1LYoRdwCb{6mWMV|6uhEPR!F)Yc^DVz+a4wd1f|m zSUlK%r)$GcYg-jX?=5~$CwM$sz4zNN9AAg2ix*j#=jbn1C<-xi* zvEAF|@{Yo!*{8=5?~7~_zt|oYtJcf>WU)zv`c?0(nv-(Tk<@?nRi|lBf8T<*duP(R z74(U&14UzG?s>z#r3I6hA8YI>+vYrl$uGQa3or7zoOLePVYv!_B&T})CObNQDBR6e z5!QOGH#8AAJAFOxr+ojyIKzHRWyrd%FG~&y-;8Y^w{z$6!&$heCm#2}9ZlaRmZqmH z0h2j9Vh)bKB>F}x&2WB4t~mIi4LDFsSzcc{s4jTjE(>R literal 0 HcmV?d00001 diff --git a/Resources/appel-manque.png b/Resources/appel-manque.png new file mode 100644 index 0000000000000000000000000000000000000000..426dee899e10d8d25d18dc2b064a452817b86f8b GIT binary patch literal 2666 zcmbVOX;c&E8lEidAc-ili9-NI85n_-%$e`~=6RlX`QG=OuR=CI z#>3Um6#xK_Sc!0<{mZbwRA)y3K&41(^6iGNS(I#Eq)#_zD~t%hQ|Z$XFjlL`Ko%kj zRqpC@NF)GY(ltrR=H!HUwoy&xkC_o1di2%T%&dgy<+RGKXy!&?069n4`_onbwg{w{B(0H%s5 zOd5@8Zzdj#LU_+r{XaD$+k+ubG{^rm%jA~511FY$wZ7f>Yj_ZyePWFE(HI&m2m}Df zhFBplDd$?+t2b|=dmb(L(Webq>aDu@nP8u-qjJa90^By_c^w8EFQ`XbvGMp|uNs4m zfI_1|r6=Iv%R8Z9TW9|}qv!y?&Vt!1ndMZr=za@@yQT*yA8^KTt6HP-&)oBHOpGEq zdYkpOLnziK4q;=nR?Lu~n`<|@3|}4{eAg#4s_bY6oB>Z?n*{8+EYOD#uVyVRvU$N=0KOCZ zi0L)Oxy>4PtHM=QepzrAANt!ZY;S{)Z%~xwY_RMUP<~M$&_Y*wV|5 zUD5X22^gfUfBg(|28ma9y+qTa zQMB&wfS#W?k?a~N;GQ76KM+G%4&2y(oLb05pD3s=A1p~s4w``)qXuQJ1f(?i6zbt| zr!8yK#n+Bg8>jh$0FEoK1})^qyV9>pKAqbv&lw#LF0KKiCB5$TIrBe+A+I#~_ zMpCeGk~VDdavT0g6@J-Z_hZ%((b#m2IIdqw3YqQ9j#?9*F#p{{50iS@x``!sqE_*KX|%^Ew=kE?jiK zwW#^y*{RD)e)_y3zT;?b@~YaxjsJQ%54zxLdm5OR>k>cBdM`23=;WE2T~WdNaXe=5_$3_V?)8K}V?*QLuLqqwk(qoAc7a+nvtpmMKTSR-%2q z;hHo&(dWLGVlAP01-iN?$0~9?PE1oGsM2o(meYWsRY8mj-j4CSkG*F`n|x3IwqZ6T z$m%Zl48zqvtRbFC>81qPt3Z2H9($8p8PNWK2BaT;-di^v-A?G2QE`$g(co#|{JQGo zehHA;Y`LDB2Xx~6#}@DpWODt8T*pyG4|mK~Ftv8HV7Vh|eTGfwS!uQItdM%+9qOCa zn}ShaKnHxJA7iD}Zo?fNbSRPaV5;J(gGU&_X_swhbiw}VF>SoP!e+fk;mJJ9_05=+ zXXCc^&y(WZulOB+cCMEz6lI;$ZPZ=@SWBpcq~;FsyyorwPJ04Cl67sR56JCIZ>{Cx zPLFupMwO?k-LbpiCA0kwop$c@o_186iy3jS&5-@by~%Yud`7OgKi#`T5`qh!O}K24 z^0s%E9y%MCeQe#TcuHYF_OGvxtc&>YP1kMj>yk^uTNSX;H8A6o8^yDBsnR~!{(!V1 zDZG2A^RnaIr62YDST`d$gcAKj>qfxPlT|U))h_#TxVX$(Jv#e<0j>|hRyoX>c|J=K z-7af(In>%B$Nn*NWOK=>!INiQH}HlD~W5pPRpb9qP;v*Y;>qnN1)0l1CK;a+O3|#qGe%x;$&=yu{DW zuN1hrY`Oce%YSok`dpo{t>G!PPc#6lIml`V>ZUF+g+yN@kf{|A)eSWKjz8Q rwvDp%#87SkjIxPX9h1l}i@SRgOrmPTc-tMe~I%e0kBIgk=e7 literal 0 HcmV?d00001 diff --git a/Resources/appel-sortant.png b/Resources/appel-sortant.png new file mode 100644 index 0000000000000000000000000000000000000000..645875ce1977113661b9d6d8192ffddf589b646b GIT binary patch literal 2320 zcmbVOX;c&E8lHr(N{~g-P$OedP#efh$S#3wY?e*P)u4!kWJn^}Oa=k3w>O|@P!vVn zz+1qj1yNZPYOx?H0#=W$6fH%)Dq>x5L#wDL+(E^Ae|Y-i&N*}Dd%t;}=Uu+{J?G1h ziwP$>c{u?9K#Yu##A9C;_HrHU008GS>E1V(K|(`iXo4XP&6JxEK&UjNB4DIWu0rAw zxiWjjIV1=GY|=DR87hm8;wcQe0QnduAWLV&*Z>d|l4X=D(h(F)MN}F+pYr6yNeZY@ z@+pg$(NMHejHopct4v73su-zaRl0(!q=W>6L0LRZK!>1mFiWS^n|WD$%6nZNwjSH2 zQNZ^QG@VcR5R@!B4ipeH7@tL(rP)S=7LS+>872jG9%(+~WUO|7?Pv^$MZ=3VX|O|)Yb6Fnh7QrAkrF-y z`xBtlD0vXffnb=;fY@}1#erdAm{`meiP>Q+F&p9v;c<=6aan<4rbr0UIV`3KhC^Xa zAcRpxEFoJY5^?EapwBsERr#7Glv)W(; z#R*I>TCULO$Lz7=`H-yyF=DwSJNOI`xFVc-C!VDsRU~Iw9>;FE z@n9?2?wQ|&B5(56o&reWC$M!9*plQM1Vwr35ob$#*FUu**MPQM!8{TUZ*}u5gMf{T zW)4pQCi}X3tRlumLn;QPBP7V-X^%tWHTD1yJrH50Jt?_&#>T-b&tkjR{!hr{rO+E)@tZLA7N(csK>th zL9^$~_)c2hZl|=Razq8VIgbL}2mIa+TBIAM3T#>dul1XI7_BC9qw^V)sYQ<~4!BNr1zDXQo%w!YCZC;divbu< za1Fa6uvg!4pz6F@@h)oXjJn36zS9J?lmy33`>>$X)sy1y(dOrP>?tsVxnH)9ttm?AZgo=Gy8jtsvAbmx)Y5J}I$ZnG zE`Rgi1YHx(*sgWA;@wWIBTh+OaJ5ib2UJzLEt^|vN#i#44)rW9FL3V0<*H{nn;J-+ zZ32FZ<-l5@-9VM*ciZJVHnsf`qFphBlXd}wl=f?zUDxK!J}7nNL1cmb;@ruVWVL-f zZZS?_kAnYF+gGfaeGy68P0gN48tQN>-d0;vO00TAdRw&b!MvKbOclPo<+4Lr$nfdn zJAY^FN=rVvnV8^t@}LZQP}*DGo7}P*UjwI*<}68H)0>{(^44pmXhP&}&mz1`whaP* zW@MI>HRVdyU$-y2=($%ov*a*aTPdsruRBu?h2C2h(Ya((=_6|7yc*{UYOVFl*Gox# zN1Y}PHt@@TIxySsTXVF<5!g;#_(K#v&fn>)6f4Z#$$7YZ^K-?Ts{FPFl#o=^a(BCG zqg%coi6of!#{Oadt~QpVs>B(+`~8N~F0zXI73qbbW>@NukHW2viOr18f!@Hmg%@62 zr8(72zdt>ZZd+OS%Si*g=P-5XXIM@wDytsJc=+3KMOWy^e9!KqLrI6P>i!*j+Z%r@ zJ+#B|4Agy#F6aSR5x%ppw~}*+_Xs(}o^q{#ZHWQCC?=M;d6~Q9t4-wJU09iy$sL0^ zg8Es_LzDb&t{~y8m4Cd|6@c0dvORR5si2rlHBauiF+w_6fS+*W_LgbUg?YCr%g%bm zR6R3hY=8HrI{V`Nwk@iJX;-hbtSl}JUf`GXc)yF*_C>tMoAc6Z2K)t2-YnGXPWZW{ z)!jK6ZFlXG1I`||+1gU~>fE>OoYwu&58Z(c!^)T5vhrpP^H*3izr^eO<@w=*G=XvJ zH{zYSca{Ok`?Tc~ipOT&u&tWC|cm?NKaz+53 z8j;O51w|KYy&|$??QMun(Gk`qa+1xiXfQu^Qq7ZO=i(`sEF^^c;jrAXa)wRU3$mEJ7u3^ z)_zr9Xg;!9JN=gfw0~@Bz8l4;d-P=LjRi|rF!=mN|At%de!H;x?82IdQ}%kcOfRAP RHepv3ATl&YazvDp`yW0pdJ+Ht literal 0 HcmV?d00001 diff --git a/Resources/clavier-01-106px.png b/Resources/clavier-01-106px.png deleted file mode 100644 index d3ca4b8131808bd05bc1046ace54e40796abe788..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^SwL*V!3HGzzUkKjDaPU;cPEB*=VV?2Ic!PZ?k)`f zL2$v|<&%LToCO|{#X#-XL734=V|E2lkiEpy*OmPit0cR;q}jhs;Xt7io-U3d6}R4A zcjRj_5OBD-aKaaZij-bQp11FGsiGQKhOPxTZL8 zUWs?*nBp+^Yp>SQ87;j)#h=_xx;0L^tPaz1Z$TgP6p+NKuf0}2OjGu;KmB6*$?c}b za(}=1y_4#v*frkzeph9VU89xsm0j!9E;3v(^5vhrVvl%(SNPKw*|)+#KQVZ^`njxg HN@xNAP*8aI diff --git a/Resources/clavier-01-108px.png b/Resources/clavier-01-108px.png deleted file mode 100644 index 9c84cb3dd17516ef124133470d37b0a38ea29189..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^IY4Z~!3HFoU&LDhDaPU;cPEB*=VV?2Ic!PZ?k)`f zL2$v|<&%LToCO|{#X#-XL734=V|E2lkiEpy*OmPit0cQ3*XPz3Uw}fVJY5_^DsH{K zevywmrx$gjWOYWoe9 z9vPfpHgUo0U2ge2JEfGB+8U#^Htb_(^Etr6Goyi1!hliOAc09Op`PQ~%obi@14d@G z1SX*D7p0&BEI#M+BeKt`bP0l+XkKr!96> diff --git a/Resources/clavier-01-160px.png b/Resources/clavier-01-160px.png deleted file mode 100644 index e30025f846465ac156847bb2ace59fee7b179693..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^3xL>$gAGVN%-$#pq!^2X+?^QKos)S9?E(tj@pN$vskrs_ z+H2mX0G@`6pFG|fSZq4h7~qz`BUE>wlyhn4_c?;I^mBLrejMqo$ryh7yX~=#j@u?P z*``jL%q`!U=czR^WSTmt&$uFgf$a$A zF-|t=3E%1*q$iwV=zna$IVXXI<2w6}+}WNJ#2#3k*PpC#l%4BK_|wKG=M#bcWbkzL Kb6Mw<&;$UMs&+^K diff --git a/Resources/clavier.png b/Resources/clavier.png deleted file mode 100755 index df1026b655661858a4dda7772a357b0acb4b9f08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4259 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 FV1ig{9@78- diff --git a/Resources/contact.png b/Resources/contact.png deleted file mode 100755 index 32a5aee963f290d5eb5d46ed99a964166ce7957f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4547 zcmV;!5j^gRP)1^@s6n?UPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipr5 z4Fd_CX>@2HM@dakSAh-}000plNkl9Go&=OuC3%3}_lABrJjU_L@J4>`z*0f}? zLi_-vK~||~t4p{BF$=sKVCNpB5mpySh_a0>Su|x?wxC{6&&pqP8~cf>rSn0C4;msB=O+Z^+ET)j>g zXB;baNh|82&+s_`B$%`9O8OD`Hi%xweJ&Wy6Q3$R}03b9FKm;bjOUdd{$s+#=X#hb{6a

^6IfG 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 diff --git a/Resources/contact_vide.png b/Resources/contact_vide.png deleted file mode 100755 index dda753a324a693083cce1cfd3dd85699f53f41ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2905 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 diff --git a/Resources/micro.png b/Resources/micro.png deleted file mode 100755 index 1eee9ceeffbef5ffa1afc011907576eaaf15aa57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5956 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 diff --git a/Resources/micro_inverse.png b/Resources/micro_inverse.png deleted file mode 100755 index b4cd9f58897b7c6429217d017148f0b8934ad067..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9434 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 Xq_tsbF7?j500000NkvXXu0mjfdiBS@ diff --git a/Resources/pause.png b/Resources/pause.png deleted file mode 100755 index 4875f41c2fff285e9134a4d25890dc6860feb736..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2708 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 B&$|Es diff --git a/Resources/quality-call-0.png b/Resources/quality-call-0.png new file mode 100644 index 0000000000000000000000000000000000000000..7bdaf40abfdaf40163cbe04212df8b2cd62b1340 GIT binary patch literal 2137 zcmaJ?c~Db#9)AfjfDlMwSws$>;f9cdDN#ES^YVJzx_ncK=xR&AfTP?{7Yz&-ePwyvo?< zFwEwyn*jj8uy?THv|nHCYiEE400j2yyI5^tr3m3D;w1t_9#;kf!F)*u46;SsOgIka z^7C`Y-~a&7!wC~O3QklcjVBQixH=3$DUxd001yzQlyZ65uma40GlgP0?#a0!94O?| zaY;T=q$nv9&Jyk@kiqc<(FweQY#x=53kn1Slr*h?2v%@Gr6@-%rzz>Ux4Ja#S$9pu zfo~y-Y&!1GqBv2pAX6fPK_3FigGcfufxct{*~^BP&;UUi#E4WGz zvD|)Lfd$KXGNDu_S3$>VEB&(tk@UT+SpIHI+JO<3Tq%)EAn96K2S!Ex zf2c_G9xYeI!GG2JKZWH9`BIn|2g@aUWjyWT1opaAQW{eRa}^RE9i9#aJ zl1M>jybl<~svWWIrm2 z!C?AOSR|@1C4>>O&Sgn>dquEVvCifH#iee@)mcF#)n;bFGT}a$A1afGz_%^agd5l5 zyP@7YE`Q@%C>wH#+G2>h#s1f#*RQnh(H-C0RvWxGJ}lO{U8c45(%l6O0HDU%tl$LY zbVk4QX*z^NLaz~5xWTn6rtQhCEBfX&HR{bYB-tLjwn-y_dW>s}Og;+$ei%2tKZ7s; zLyPu#2G0Xsy~|hs=mV|BDjX0QYvuE=O9+S~2&BQ?XbZ4-e-06w0Ob1Dk5@dl)9+%R z-_e*ZX8owvOumVIX`|;xLTVPXRMi^OP#Zs!F{e=VK$N+oopE4+yq@4KShVmhh34Ed+m%A~r^x~$NoOT)Zw<+57WR!&J3 z48Jtq6Q86>I-*bc-D+iKEVN&FMC#UYZn-^gTpff!a7t$SURd-vgw-ij!i8l)clZH!TuYkAG@7c{NHQwMPs87R@$uuH@JM720_a@m*m6gi z)bCtz_HRww96elk9k^X`SEYIiDFdk z>4l8RhQ2_LOP|r39dGlm8>iu?E8_;84KJSyb38m{_AtI_R21D5c!KAZ&YvIE+fz}t zWP826(xk6NwB6cLy{Q~u9rV-HGQ3x+rhDfh@Ebm%x)Cb+<8UmyY6>-0KT7_)KX`(T z$n~k5HR>HG&j$SkNAl3Pi_znyr9-XXUh6?y7hD-}aYK)6i!(Jl^~~0Y;4s>}RJj|O za+-c`7FX?9zBE@o=TmAl+Znt4AbGVx718d0=1R_-^*=sMRPZ8;Z{`SMrk0?tFwdA~ zdE$q6INWASynE=>*8?nO=%wYsTeogaS^VUfsj)WY!lhZA;NZ}YsYch+XmeY8f3dj| z|KLt=81Yxs1iZk literal 0 HcmV?d00001 diff --git a/Resources/quality-call-1.png b/Resources/quality-call-1.png new file mode 100644 index 0000000000000000000000000000000000000000..2cca9b39c0c54faf0cdc7506c73db121662fa7c1 GIT binary patch literal 2158 zcmaJ@dsGv57M}1-U}*v>0;Mnp5D}70cqAl%BqRhP1Te-5XX!Q}8Ay;kNCuK1@(@8l zuu;%fg-Tas(SwLet4J;Aa*&0}qu|l4ih#PJ^0a8_7S>Hv?EaxU=ggVk{hjZA_q+Fg ze@t0IT$G)Siwyt(cHC$--}t2%UpKTB0HAPJ?%|AqGZLAIY*nTrT9FzCm=a|Q407e7 zG?)*IB>K#Mz@Y$Oj+Y4%kwjiBU96N7MJ5bUCs!G>0U$J7rxJ;GzzCQEr^ysy_}TUj zJSdZd;kO6zAfAc^OJ&hHYIti-oIsqjLrjz4!#9DUI=YcS4kIE^C(lr5=(;fcYhJqX zY`P}l!PgLEM;QK%s6<`@$Wp3dFo*~d#1I7nDP$r!AdpI>`hors86rXcB(gt⩔0- z(;*0a`{0e$)RI&>pUrt&%NT{>r3j*;lSo>vmZ%LND%EKuGL1$varpZaj0l28uRugP zf@E>~LORN#-RWOMUYm`}Pv2k&!9;Q+%I!g_U5T#n6RA#J9F+r+Clp3j0 z1+umVfjp5|rZB~?@jM=#tI!}Kg&5|t!|+B1qD&^ClbHdmU=EEI3`Nk$(T9{aW7SN85>zxW0Nw|FT6qq9s z7uql`C$UC*m#lm&&>$x_+n@OaXsn$*FrBvBMGK_6dkD;8i@XZ6a~bDXH3MM5;IsfW zLG5{I#ewi+NEj&M-_=SzJ?;q2yL^S~dKNtst-BWY5&{ho zjGbeP_0DLs>&1?(2ewJ-WZl-uf6+C|+_j9ZVZuUp|3h#S-xjK3w zJcaL(^EG22c|XGzTX!h<{$LCr2cQ}0Yo6h77F!;=d~zmw!v-Yo%ow&heI8YvTgV>I zV+?FxG|%l^vvIS{kfFs}`4FC>^{ub!yD`&$>|U)tpjk+Bs+!x>mJw&OTwZ=@vi#+u z+s)+1?kyXR?Ca7|WMEfuTrsBhY6&>=``)0BZRRNmZ%Vey_HglDZrRkZo6p^trL%^P zbHYs($z!6Q62;3E$Y&ngHu?vAe7kltazA?XImhyO&2`}S3yavYY3siZB!oB^hV-$C z?qhnF{>e;cPV_mq1OG|#-%0JNMr93eVsym8=gi%YFj1+h0?ZBl*?LNMm}^J% zT%4Yl))U1`lLg&6>Zc-UC+(4e@VH)+yCc`lY$4^_Pew|NN#YBVMAT>f;?P<7Rd+b2hI%oduDO{!V z(cY=JOWo@i?S)Q9cKKe{Y+U$@Wk&I-b|BByUjKdm5kWlb8{6`dRLM=RO3%+n)>eFf z&E;})>Fy3L{cOwZ-(oMeXY4O2*EV3=td6wy&pH*lG?9NU$zU&dR~>yk7XQ%`?<5ZY zUYa~dddIEFFZy}`%JAdRiPQK}bHJtihd}Nx{|?E--R;3;bZ1vu&DgY!66et`FU_V* z?2IQg>~FZ?UJs;Nc?;~cjjmE#XZb?(&O*)|gXE$*iPDhc%)F5Tq;GR;^=?CtG+YT8 zDyT}Ie&w~MAQ|zy7_{ZWupj#L?a*J9%5>|)OZ;V3-EJS;Y;9b#6$_u#dvI`m`>na@ a3+_|?NO^-bWuTZL4m3*LMK-2{#bU-nKR$}o#%Pp+w)^e zlau0{97qlT062++d@=eBM_(U;EdXF#&-J;Yfj1(MA}N}UNUlr=16+kB4F*LjSvo9+ zWs1B_U2qft;K)je6p3| zOxYbH(P|T#4bAw3FKL zR1Ox)nZ~rsw$nbtKbrn0eLb)L(h2N{Zvuxas;#CZyVg7(Bi&gsU_42uG=7rY2Y%4Z zb--XtOw|WDOEH{Gc8OCMNr9y-kX*ymg1DaZvqA@G6#oFcupYy!l;7v3Ob^ySt5tYwf-?ZMn%8++2ov+J~d8TYFn1?K~Vp70fVb{#v1Wf1R& z8G)E*6h|$#A;R?#{_fbYIU!>j@N*IyfUfA-&kJ{uSj=h5!r_kz%da>NW1hN}coy!Q z!LeO*{fy;T;*58{gUZV|PJx^sX9_cIk6Ok!HsgkE#Xjb*XSw@1-@R;IMCugTm2PM$ zp;)+e6KF4p&FuvcZ{G@$Tkd)-_S+uo zzigDycHPvAi|yUmws5P9ac>lEgyR}fRS4W%5<7I@6joS_Yw&$`I$*v|(xil6J3p(P#tH99!#UYFn_Fl&=XT^9R=wXB#oGGU3<$noH zXBX7F`5MR>R^<(0y&W!@Zd8|jXg0OQ5Raq@)OwKd z{)sh$gc_-Bs1(Dt^em1N-VV_H0uI|=6=c%BZX>%q_4lf1&v*{tYcFQzkqK$TDr}Lj z(Sna#3qni}5Zc!rkt`kJCgZoon8$IuO9ft@K;$d*RT9fwJ64 z2fG7Iy|Sc>n5AMbxbVJg4loTku}2jyvlvpB_I~ zsGChvaO<4xt15lgcyUMl&-B-uKWlIgi)K&cuUtYR-i+&>Qn$aIv1?D`ui@fdZ*|GO zx<6C6^qP~ziBY@cxkqn`oWJmlXLZ^q6qGhq z9k(2OIBmD(pyYYclN-4g84&#~JDX>=O{?nnlS}yZMrdN}I zB1kcc*AM2#<3n$1Pc0xQ)e}rbOVze|XiGioad);e$Mp__XzN|o+gPyuL%TCO`#$gd ze!u7UJn!?)HtCBCsgy+&005|3jmm(3h4@P+#{vK$@yu6=ctFF{CalC=iPf4>1d!X@ z76j5d&6^MdVzzDD@-dPN07QnvXu?dowGyk_$uUPU9G}yJvjHGC-{&z~s}T&cAe$U6 zDP!vNFavVfq>K$YI#}mXB6f$S4n<1pijCH~YOC1B$j^gveG**2iC|{P=iKb_N_7)Yinycwb>jux{1pZi^Wk5KA(*v*xqd} z%s`4iDyVyP&9|+2XFjqzv5Yk0m%gPi0-+**4(~6u@Jf51jN(?I$ z${djj77Imcg?f&wa$9ShhzpzJ+J55ZJeM0C1*ZqktU^%7R>W3-x}DIIk|mC3c#*?7 z*>a)i`FgWl+cUh(a)rGH_k6h7@|xqFL~`b8YF0M`2RR{sxNV;*m3;;fJ(c!-QTwv%U9m=c(80 zQ$SK8F>m!d9YKQr)v2rB7G5W`$=3UIAmqQYs=CV+zH7z%tSqNY=bVjA%Qk ze~nau59YmVC$@j%)*oAWd1|~Xjdp~zvPJe?2I|ixS=1d9+XWf239|m?Lf48=IB08Q z)zuMRYWRC9oW~S2JTk{8-u5Xd_bKIJHgKGoWy-$Y z$==v>qQwNfLDv6psk#Y!4pl=0a@W_zgJO7%xtH90-vhk~7UeDvi%j+DUlwX2 z%XjS6g^uUF02Az{r9&#huMC07M-?fh8p;N6ODyVvQY|NYO}_(;tJ97SzP2axVf|e) zlQxea^#(3JCXQ36GbAuk*1{?yq2ke=DgC*;P}lGG`u{c&)Q7Wru4i>rhzoaqq@Sjj zm7n`MeT(g43bb)|=5U~W^+OG(Fs{5On0~aBxSP45$h0OF{BlA%#9wgc9@v*f`yfS@ zeHqxr1tMvttM%$7H)Xd!r)9-3Pm*bomy<^J|7UQTX;>fA=Cvt`bgIC6kDn|{zWk~ z6nMX;U|@3oIyH6rEI891v+FY;k_rv&R-Vq^&w;{YIinvmR?@pu{R<-z6D1GZQ<*rH zZa%1(ZVOy!V70QoPrTvs%^O+n|9)BG@Y(C1%GS^x`4;tdFpiSn61S+9NfGG4I#qI@ z96)W%p|{VD8RE`cSf}D512x|yze3Jc_38JG1c_-t>Y2Me=VPxqzv#Wzu!1Ts=zsgA z!ZrU$=%oE-`JqFpf`3ke5!M0=-8P(g;)TVnTP0o8xO-PnyQW@IMH^@?XXM7CH|dNU zOQD3SuG8_8_y1@AZ}@95?W8y~_ zuYim)V^R@Sg~gOy$?%Lz!Y!=+fc#LxiEy)w4=#=QwerPJIvelYR=+$`l);uw(Ers) z@t0BKgRM8gg76*DKB?ks-Log}!! sI>wRQGM(FZnOs)|{bfhiC~>eK0D9N6+23`utD?VCt-4rsOi>a1KY%9F{Qv*} literal 0 HcmV?d00001 diff --git a/Resources/registration_inprogress.png b/Resources/registration_inprogress.png new file mode 100644 index 0000000000000000000000000000000000000000..17c3dad7d80b3a05715b984221d45dd9e840658e GIT binary patch literal 664 zcmV;J0%!e+P)7xUd7sGuY$>+y;Umt(!bRUO`3d z!Vs_vLAuyo3cK+egbITopubfNh;jubbsY$@?e!b=E z)uQcop1NCrci`QS7_P$S5BqD1Zr`%ic{V&_umMGx-ed+sND7*;S)(eNPOWaNlj*tq z8)JICvXZCIq1T5j=Ux*{n=;b^*I~I)VUN6I@bg@FCd`0Ys9jq8ynJfv{BLG>yr38lz7tGPAUv z1IvKgZQ_{#NVOoEBBd}hNu4T)v>B|`xhlc3`rL%(9L;bRydyeGT+XR%+T?v2?L1iw zA*}`9K!BOL$WawQ>>Qkh$`b8uf>tYF?^{^i+vFUX5IJ@ca%T}Bs!LX)Hg+N)W|<{l zwI!1m#JmHd$2vI2xya_i1J16M1Q z65Ahd@&oP000*V1^@s6{^R5m00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2ipo2 z4HPx$pLt~f00PEIL_t(Y$F-GDPZL2H#(y*0Zjm;c7!Ci51Z@>qqkaN7a5r8|Og{l9 z6HiK{WCatWM{XQQJT=jSH{*!|=qHf0)L2CMqoPC%pi=1Wc-Y;x+m3EJt7D^KXaYXY^mesC z1R%pvq#na&+cWPUauE?J3{p(YSFQL-%Ou%!97|ZvL<=MIRzxI9BJ&UcYsffq((RHz zKoVeaw9A(r5s8r;c}35S(K>+TxnZ$9HyoHt8QLdzzr#;rhpW!WQw-c&2vE~hV}nxF z5kzT{ta;Xf%$Z$20>jLb9q%SP9xpFj(?&-#B4ctLq@M^CabT4zI|U9wy1Pn1kG zW*(_wuKQnwg2nVXq=y%gEv^H80&Ci^T@nQ-Yud2gHRalsGv9QGCRTkAwzQF+*GaQ* zs8|5Yb+PsbD7kh#BBd$cZDjqUZzvosKumQH+6h~O4NG^=bK&s^jEU7_7sXuq8UvFJ zB<&6MP89#C>K0PB(U%4r7SnR#u?6b+O`owd`r|l!qL4~y)zO!&nj0~pQP|w}?f(4h z^l>j%DfB`jd(Dq1Kt@`Tktk~~#~K~70su>1UvYbjR!q#RiU?MmoLrt*L+UYv9tFLX zZ*O0)^W{Bo#><;lRpx8|kf*){GfpuvU#iWxPp_YzjSz0{M{nyxZ|}$cy~W=5McS|4 zYT6+IU%9uWFu7wc#lyUppmT2tXke*h*pK*I5du1RxTbj9rWK7tuWaVJKg1 Q^Z)<=07*qoM6N<$f{rD0jsO4v diff --git a/Resources/startcall-gray.png b/Resources/startcall-gray.png deleted file mode 100644 index 360e7baa0f60715e52647ceeefa55b8f8a059816..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2111 zcmV-F2*CG=P)00004XF*Lt006O% z3;baP00001b5ch_0Itp)=>Px#AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy0%A)?L;(MXkIcUS000SaNLh0L01ejw01ejxLMWSf000L#Nkl+R_ukKlI^UxxY!4V8E-jq6Gy>qz%Bwv63J5-^F^lPd|Wx=MHmg}4a- z&?Mc=+pbu|zT4PxEQDxA_?q1w7x=BD)Nx4@#gXnC2mHaECZ>vMK_Z`5F8EK$$Cdxd zhXRK(nsZd6b#+Sc0anPy*}70eZ`k|nW2kG!i1&$e#R+1f2scD%-)<=ILxBug|CZb3 zJ<2D6-N7_chzBq*s-uskS#d^O=}KCZuu2#!KmY{=)qe#DP!Wczf5KWho#m_fp_p+* z4s=YgcM+;^J+&dN-!PBl9Ed5Mp?Bf{dq$C$kPASM&p-+$I%GpyF2oYHqs-qY*po-L zA_agMUu4uohZ#uAiC98ki`GSeJym42+1x}45Khtq^r&!J_?eti{YX>YEK?n(j#kI2 zS*oD9z+!QaB{%j8t|MKW@EGSO1PJGZ-Spq2VRCD%Uf)d(Pf>Hj^VCr>18!=i(G!51 zhTf;KhBt_ZMK616Nf2?#hB3hh@i4i@(f9#dT-p%>?46Bz&W&S2vG{&b%+Yg}ssv#X z%Jn7EE{EvMRlhiZeb=%hNYix;HHl@#-4_Qnq>f%FAZu}Ll;N;&$IA97uy;HDs%w5l zp0vAvP(#+Hx}L*|sMTaIrbz)C*gFFTssodyZ!Zn2hq3@$ks6`gCOu>nDFCoay{01X z@?ZgJC!K;b5y}GZgIvVE$?S8zRx3Rgf7fwDorO;^%%@o=gFfZCfe9m^lJ4Y| z$SsvMkZD}Z=`NhbPyk>ixO4x&GsuW|Y!8uoM|uX);% z_}<yvW6t$Wv1}!K$b9hI zgNrS7{pfqycdHYE{OITow?>ocoPL*f5Lm|aRf!%MG=3>Ji9ENH9f*#y8UI9M=s@`? zvt2gXifD%zvZSB1qBoJXm`C3pHFNb@0#v62PGGP$p6=S^wljz?gKgLDQ4Z3D|3gLx z(lOTYn%E%CFpAy+Sl5_WrAGh?6n9~r9x;R!uiNHt$(fYtSPbWTL<(*}4rUh9eW&($S6|NK-;%ahJWF?>1JCA!hX;CK*dFH!WUCB)i1v zX4DW5x*r{J;9~w+yVTLH74TRIC$y8ClH*2&S`C*5FqhVIIe-bm7w2m(T;D&eXJXf9 z*u-Hw*lY_Mm2Ub-2-La@xu}7VvQw`4WnYdOCs7;Va?G*yeS+OvdWdi1@CG*Ii!X@j z8eBwB%VnLG|E28o@0-=r2XX|Phb734P&bkVk;e$f#MBqp40u7z(;}A5j{-TQ{2+hh z|5`aJx2f%_-`x$!16)aL2pNu%7>%hI8P!=2S<|_$vbR)(U7B;n4dQs0nY~kZ2N3t= z;zK+keeY!GC8fw{=WIOgpDvR~s2_18MpV4Ve5HG1nfpu|x7?yERr2HvBXgyaO0~50000bbVXQnWMOn=I%9HWVRU5x zGB7bQEio`HGB8vzFgi6gIy5;eFfuwYFm0ffTmS$7C3HntbYx+4WjbwdWNBu305UK! pF)cALEiy1vF)%tcH99moD=;!TFfbhbE#LqE002ovPDHLkV1m&0&FKID diff --git a/Resources/stat_sys_signal_0.png b/Resources/stat_sys_signal_0.png deleted file mode 100644 index 0b7a04f44c498a89af7c15399c363fdfec2eb839..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 905 zcmV;419tq0P)P000>X1^@s6#OZ}&00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipu9 z3IiUJ%=f?m00Rk0L_t(Y$GuifOH@%9e$JqiE*uqRK*tc25gct6(?Sfx0u4eFO>hJi z)EvzZ5|RYn|!QW?ZEkg&h0=x$xe5?%V2~?ld!gpmyL{ z+~>UaJn!?q=Wq@qfI!4>Rf91yfQW%Hx+(z>u_yqzotJm_J7bh#vt7#C27}?p&z+qd ztwK=%kdTn@{$W`ec6~lPZfd%afGo?H_IPq06c-CRA?Z))fl;BQva*}|CJNfzewzdXIlF-uHiZ`R9h>eXE z^ZMS+h(c<)HM&r)hlg!LaaLzI9@!&>wHY7>HtKnfh?dT9$>&vBa5qsir zI8akl1Bb&QI8{~gtg{o76B9vAemOLRy88Nvjo0@i$VpaK7C7f{I-Mf0tGgR71_#4t zJw7&uo!#BAjgNRvhzOi>#KpxymSybi@1wu3Pn1E6)0Za2YQ^6Eeh?S-oai$oA`lS{ z0s&aeX2JdIM9*2wW<2ld35g35Q4~d#%wn;iwXF>a@$o^N(P$JIhU2=sy3o_xE4Yv? zEXy(&WAOX^Xl-jlOLMdM+3)wmX0u^yYwJ|*>*^}pjg4T81(k~t5v*40FSFU4;@{rJ zHKXxDH)C{kG=3i)!J3?W5C{aW3z72j^7|i`mcI1&^X!60eG@ fdabbk@$UKq2IqP)P000>X1^@s6#OZ}&0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz_en%SRCwClR?TX{KoFk9C?X;X3aKp~ z#Dj{0C-ETo20n$)&=>I5m*~}#FW{-*DIkc7hzC!t6coJrZ}(f+u!#nZu|0HQ9rBr( zZ|2+C-6*HiiGF*i^an%3PqkXDEf$Nn7?76bKIEJl96 z-xI-Zx1-f+Rc5xu9-mB-NF<^MgF$3Khr{8n;F(N@(&;qKW;2>jr?g(Lb&FhBd?pp2 z_l{I5#r;7xnM_D-C{2`zD!dE?g$m(tn8(9>IEhdJWR4_?qIe?N@AurIn(cP$og|;n zQ#PCB+K(=}5wXBX0Az+?T+I3sCMT_mHNk8)n=~4Y zxD^J;kZ3w>;pF|j-BOl`8A)F$-np{`Vn9Nl_xizt-nD300000NkvXXu0mjf_UI0I diff --git a/Resources/stat_sys_signal_2.png b/Resources/stat_sys_signal_2.png deleted file mode 100644 index fd543636c9d5c71f3e3557e6552b104b1cfa3e11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 595 zcmV-Z0<8UsP)P000>X1^@s6#OZ}&0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz^+`lQRCwClR=sKhK@i?MPq7eDP`H?2 zAr>muVj-lqxu@_M(pcK%CDK~?0#*S*2nZq~Vquj?K*833v){rTdzafJ=b0247zaOg z=bM?GojvV*KC|Bzo&A9r_^H)u_siw-@pL*>t`fPfzogUYhhDGuY?CAsi8cq#WHQOZ z;cy^={eI8Z>ve_OHvfBLlf>h3Ga8K|0(LweFLIvG=UFb7WApi(&1N&U*=$Tlxp4Tr zR6;M6Y&I+QgKRpTGP$7)N)cHE5jaH^VzHR;2faE8RRLs55>3+rksJ;OVUf*lw+l{E zDwSBFP!P4BOeT&@V3nEp5p)qEFBXezI2`^g6M%lk3mr0VeX*CEe_Jj;B;*i#+$1O$ zFv`rHUEA$esm*4S_4|Ec34;UDuP_G*G6B1n*6Ve#5SB1R4W+2PFu7bhoe8wnYO(Qn zEG%K6P)ICaBGTA0R4r_&K&x7)Qhdtsx|NR0HsVBm?t zmt1ZQ7b=s^M~qwWvSRG4R;#zgVsU4mNwr#Sl*{EO!!XQiyz#tL@BAt> h9GU!!PofV21_1LdQ+v_>@umO(002ovPDHLkV1g|S2jTz# diff --git a/Resources/stat_sys_signal_3.png b/Resources/stat_sys_signal_3.png deleted file mode 100644 index 6c4873af3bdf0566ff9b294011217c0fa8cb1feb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 594 zcmV-Y0P000>X1^@s6#OZ}&0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz^hrcPRCwClR=a8fQ4pP7SFsRLP}rDg zA(qy`LI`4I<5&0v7HKT)QuqsLt^5J82na&JMl8g_Dv^MKt#7mE!Yp^!?D|-fA{WNN zVeXuJ&g{-z<#0IAZ!eYpU}^Zt=krgq+3aP%-#^~uDF>K3`s zd_yW>*RE75CH4bsG#ZioKxs@7EW9ifg$kiiNYsPf9E4Q>m?MayD4syJ+pX|mvtF;g zgH)?kDi({>>2#>kXjquQ+nJ~g0`zmOP$-Da@EijZm?IMeFBvb~KX~kAnNG@e?F_Sn zKrUuxk!!VDIa;k&qh7BkJjdk4F_sHv&pX+ZQmG^o;W=h!0s|8mGdXHJC)VqA8V-lT zbIj-Si9~oe5PRe0JPVU@xh#V4ZUx<#xHcY7ihOE0NuIDyF}d-G$#c+rgzaO+e&SOx zfS?BV

    >;*CclSnz3h^EojTP9~ES2n3E^2~{2|tyW6}+wHbF8qSRk1_LqX`~AMC zB}=OSF_B1o#A2~~TsS}Je#yekipy(0pMOrL(+5+oTrOA1X0xxFrs=o1;|=-0j8~yz gVe&6NiM|CG00U?;Z&CX87ytkO07*qoM6N<$f^ggiLjV8( diff --git a/Resources/stat_sys_signal_4.png b/Resources/stat_sys_signal_4.png deleted file mode 100644 index a3320cbb4fd216a1215364d7a59856dee0e1fd32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 532 zcmV+v0_**WP)P000>X1^@s6#OZ}&0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzwn;=mRCwCFRy~WtKoFh81gu0sA*WYa zTZ@QrSlaj_g01Z}Dedkz2-jMPz14vzTy1T2CkG0)YW%o;3mev$Xk4QUlOd1Eyq%Ao zjdna9>CsDj8cD5Ids{3PABV%C9EVd~*S~YQ-1}%W`og<`M>?JEG0@6nGGvmaFCIxMm9mn_Bz8di{a(qrZQE3>R%tvQQ@7it^?Gf2k>P=qu~gA+w^No% zrNSLT!Ez&6p2Ry z_NY>?*ZIfL0=pE6A;4QszFcHKK`03T)$tNWg0?4=Ei7p#?D$Av&lhdRfiV~k4}+y?eBeI7Zt<& zI%{G7SPAQzsMr|^+6`j`V;)h!K6g7l|Bu_u;Q4)Ed77%D72pcxAN%qFTem% Wt1S+j0li270000;u=vBoS#-wo>-L1;Fyx1 zl&avFo0y&&l$w}QS$HzlhJk@uDKjLZB*NFnDmgz_FA=0huOhbqsGEVo#=fE;F*!T6 zL?J0PJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRzL%C zQ%e#RDspr3imfVamB8j&0ofp7eI*63l9Fs&C5WRUd;=7m^NUgyO!W+OlMT!a6wD0u z42@09&CPWbj0_A7^bL&k4UKdS&8>`$tPBhkpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pF zzr4I$uiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMw zS&*t9lv*Mup|Ns9tG}vrp^yfdj z$e)id^$*AMO<3sTu({#Ki*x?H%eL*YZ`@XRMb%~kJBNbX1jnt$PbRmfL_Rk#a+<@t z$T7{x(AeO~jyq{7I&Y_0o>4!Rb@|*xz$yt+|W7Bxe%b&xVN_c*7u7lDuQJ-o1BeH*q*RW{ISW* zQYMFFes~8WVY%b&B3mxmJ<3t!d%A+@D0OjrC>SYc8NM z>jp!@5v%^1rF=>rSpqjo+{+EZzoaXv@`W5dWcS(g%F3&+R?q$E!7iGmwrSEUpEA2A zhO-v5p6@7ciGNc1v&_nFihP59!~KK5uUKfVcMQp3_#~0^_}mXevH5rFb^r5zGkK`6 TO5Y|JRB?E^`njxgN@xNA@EMY3 literal 0 HcmV?d00001 diff --git a/Resources/status_disconnected.png b/Resources/status_disconnected.png new file mode 100644 index 0000000000000000000000000000000000000000..11455fb1be6f54561b931b76a4f9af283bc793ff GIT binary patch literal 575 zcmV-F0>J%=P)u)u8arSJ zBp}tnecTvQ4GxO%n5<1U*zZW8U3*Z94C4l1j=mg*nz&(J6 z5Q3%uQEKdVyZ6K4@QZV9YWClch`R450Ouiu$LPaxv)yh>X8x(F)2gaa*LCkwRjBF| zz^}vMP_{B!uh$jjCKq;_(CCCq#cAlCjWQ2H$bnpyO}me}5yQ7o;?O}bar zmd(tC0BAZA0ejjFW^Mv8GgP$+YGx2seF4uHmTLtyoIRO`@Y)-fT9Ns-AVnBDG^SF^hB#nfWY) zP&oiN9*=*DqWBHqld87r?~+eMaL&Pdk1WeR&t|i)FQ$LFT)rWqZ_GUHj)91z08e?I zpO{R29dJ%qke!KeTL N002ovPDHLkV1mzk{ptV! literal 0 HcmV?d00001 diff --git a/Resources/status_error.png b/Resources/status_error.png new file mode 100644 index 0000000000000000000000000000000000000000..e7617832b1d8783c5dfbfe99d72fda0648d85731 GIT binary patch literal 1488 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9Y!N$PAxIFeuK9D0>;u=vBoS#-wo>-L1;Fyx1 zl&avFo0y&&l$w}QS$HzlhJk@uDKjLZB*NFnDmgz_FA=0huOhbqsGEVo#=fE;F*!T6 zL?J0PJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRzL%C zQ%e#RDspr3imfVamB8j&0ofp7eI*63l9Fs&C5WRUd;=7m^NUgyO!W+OlMT!a6wD0u z42@09&CPWbj0_A7^bL&k4UKdS&8>`$tPBhkpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pF zzr4I$uiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMw zS&*t9lvT3&BOEG(d2Tf!ehn>g_2qa446+ba3~y$=HcmaxYh8KkNL2@+=N@z4uAR@ z4{|6pI0WhBOG?x=Ke23>A>0w^FzX$Yp|-$h#*I7z%q#*DjG^HSZ>@REzA|0-As_HG zAveF_NWMZE^P~L=jq4pAafgVdh)uQ+kiM|ZYrz9SYXxbA28o4o9{-LWFnBJ{d}ObW z!xj<*e-_)y(Kp&-5riVD;CADn_OPS2lAVCPM*}6M}O;w6m|T(NL1Tz;ZNzTfWL+5&t3= zD}~(~1liT+KAHSI=lm_D8%-NbW;_Ui_j06dLWm{u7&d_r*5jIxF5kE^50jm{+zKSEyYS+BruvuCKo|YGL(JOi%1E!GMvJ9;A5`&k^RW)5F;D%Zt=!EC{@ zcODZ1#Z)uD9WU6%`rsmSN_*t0u(V5If8QT<>63bNFn;B`$=UL$EUcdnFP-<%$4v3% zw`Dq9OXg@a{Isw=?%W}>IyGJGVYlH{e(tg*jR}gP`xE}YKQ~v-XO4!+mh-PH|0@*V zVA9@L^v-5dJ-bP0l+XkK Dz#0)Q literal 0 HcmV?d00001 diff --git a/Resources/status_gray.png b/Resources/status_gray.png deleted file mode 100644 index b4f871f3eb278503e10417f466b765eb306a1c52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 948 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoZ!2%>hUg^vLQY`6?zK#qG8~eHcB(ehejKx9j zP7LeL$-D$|6p}rHd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_HU8X#UUXIG#NP=YDR z+ueoXe|!I#{XiaPfk$L9(Aw)D%;=;sy8@_Ut*47)h{frtlf6Ac0ws>uKRG`&swA`a|spd8=2<1^;G$UKmj-eDtum#aHo5 zZ#<)(&0U(w*_oFAA^Sn(gUp3%mv<>`o80j*(aHvAE7S5ufiM6J<$&Bo})T^Y0R zKz{H2wN-`@D*lU_DwgWqGSMLJDul!T=>`b4r|Meg$BLnMQab(IS8_5opzbn!soE9 zsh@>m(qjF|$F0JwUvKFMz2;_a;Qdg$@R!Piq%Z3y8K#==_)UL4U3 zJ2b)1y5UZ>O`XW*nGy9`oZ^m!?&8u6fKJS9W6WXOLvkP z+=b@;EYjvKbPeV{x!NoArg*Yh|A$L&?yE6KovLj&t+~Es(aLA*?RGw&pe5_|J-~e@ zubWxA=d)Ui)ixqGS=LR@XnS_a>Auw2&oAdD-(Hj6;q|GZe9gCdg z|NlvdiszCG5u9NA>7+w?X~mY~{)hj(TD6hs?POqTRxNRjC`m~yNwrEYN(E93Mh1pP zx(0^2h87`)##Sb#Rt6^828LD!2EIE?gi$o)=BH$)Rl+qGScVuHSs7YdnOZ_LbUoCW Q0Mx+X>FVdQ&MBb@00)?icK`qY diff --git a/Resources/status_green.png b/Resources/status_green.png deleted file mode 100644 index 1a39a42427823dbb36531709ed9ba198ffddaed8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1242 zcmV<01SR{4P)P000*V1^@s6{^R5m00001b5ch_0Itp) z=>Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RV1QibqBj~v8#{d8XY)M2xR7l6Q zm0N67RTPH5z0XW%&RhxtH56hLm=c3+fzm58nxa7^YP_YGATer8z<41|cu@jAn3!Oq zi4aAM2|l1iKut{K0U{Dhi__^Kw9^VsTPQSu6bg1O=X5S-`!G|O0)^D*dO9a(o&Vcw z?X~|6|5G$}cxQ|~+x|=8hBkD~?rc(swJ9>YfUS3gyn4d#t#H-^<~qvf`J9y{rA7Bl zi<+I6`;G1k(PY=}gCm_szo-tU13|}pq+FxmWd+lKlqR*OC$2;xmUigRmDp!BPotzx z7ap5idU0tkl2!~On;>DuFjSl?_GH2z()$!t0OGm?`&z2vL$`!H6m-tXc8Fa-om+Zv zNe{a8plfbi(!<}GVGJvdkxh`a5+t*6H&A(V55!l6Z`UA!4!tgG@gs1zT@>Mxo@2Vr zeZY<9kk>ZlggsS!Ih{GB8zg2VRBTbgiY+y)__M&w8wlBKR{S;&2~ZpKPPfZU1ehtH zt5}=*=Dw=)zusx1n|7m}o8x*+q23ozbzM~aVQJQiwkmVr8pI#c_X5uY-(7VXtGXW` zHL0;u2!GhM2Bo$D_8dv{xb4Z>{R>G*e^{^20aW+D0_2veTC0hN#8dh< z0Exwm`Nh092JnaV`uZcz`zFh3sWpFAO1)9A7pogWuEi2qlG`lf06?JK^%NFIG@I!2 zx9eZ~596H-sIAuA0b>6cN1|Sl2ugu-!Fomjlu+yQ2@=679Im~Stw>30b3rwY62%Mw z#RWODZ)o?_+j`V5*d9FUDH&JI67wK1kUyC7Byd52dr8M#Q}VLkj$ak)CIa|F&TVOr z9<#F9i~f)v^SA3O3qBtkJBw051h6@jxf~#qO>RbTykI<=8@usLFjg-B&iso9As#KT zmaz_;l~S-L-@6S>yPLFNJtIQn(*XiO$NZdDLDh=$ z04t(61Y$9OQ2ZoqG2?p#rzP5=;st}709vZzL#8kql;R^`6qv3AZ==LPyUbkjhjgW+ zJW0-R$KsL{)((K!6@4wJVn7KiyImeyhN%?m-I^DtbZ`9lRC6;xxSC{Jt+C!p+h-xf z>p&~q@}Lf*)R$6-%EL8ge?!>eQ-Y28mhEh*PxV~0=Vy-l-tjrgKk(@l_?+cG-0P}Z zQ|2ujx^a@s;-WHX+2#wSG@*$BLnS-I)uaIeA!nl!Vke5(K(Cdy*Bx0pGAs&3HvPGJ zolh_S(5F`v&2yFyU(HH= zw%$M2QTb_^UjA^O*-f7rq1Wg-6E(Vy_nSTaqn0^>w9+V1BA`^|+;?vNcMJH8QRCg# z0I_jaf2+6eIR>q> z3wzC;%D+;Bb3l1P*%9(0$~q$~t)p}x5!thn>_i&>0H*oIo`bXH<^TWy07*qoM6N<$ Eg5;A+jsO4v diff --git a/Resources/status_inprogress.png b/Resources/status_inprogress.png new file mode 100644 index 0000000000000000000000000000000000000000..d2fe9da56d4495847cb9fa90cf4674c411e0d388 GIT binary patch literal 684 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