From 15d394318f2d8297342b2a8e7b835a075c8b41da Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Mon, 25 Jun 2012 17:57:50 +0200 Subject: [PATCH] Split main view in UICompositeViewController --- Classes/ChatViewController.h | 6 +- Classes/ChatViewController.m | 6 + Classes/ChatViewController.xib | 21 +- Classes/ContactsViewController.m | 4 + Classes/DialerViewController.m | 4 + Classes/HistoryViewController.m | 4 + Classes/InCallViewController.m | 4 + Classes/IncomingCallViewController.m | 4 + Classes/LinphoneUI/UICallBar.m | 4 + Classes/LinphoneUI/UIChatCell.h | 2 + Classes/LinphoneUI/UIChatCell.m | 4 + Classes/LinphoneUI/UIChatCell.xib | 16 +- .../LinphoneUI/UICompositeViewController.h | 38 ++ .../LinphoneUI/UICompositeViewController.m | 263 ++++++++- .../LinphoneUI/UICompositeViewController.xib | 45 +- Classes/LinphoneUI/UIMainBar.m | 11 +- Classes/LinphoneUI/UIStateBar.m | 9 +- Classes/PhoneMainView.h | 39 +- Classes/PhoneMainView.m | 317 +++-------- Classes/PhoneMainView.xib | 521 +++--------------- Classes/SettingsViewController.m | 4 + Resources/avatar-inconnu.png | Bin 0 -> 18862 bytes Resources/avatar-small.png | Bin 0 -> 9001 bytes Resources/champ-titre-incoming.png | Bin 8593 -> 13492 bytes linphone.xcodeproj/project.pbxproj | 12 + 25 files changed, 615 insertions(+), 723 deletions(-) create mode 100644 Resources/avatar-inconnu.png create mode 100644 Resources/avatar-small.png diff --git a/Classes/ChatViewController.h b/Classes/ChatViewController.h index abc40aed9..3b30aa446 100644 --- a/Classes/ChatViewController.h +++ b/Classes/ChatViewController.h @@ -19,10 +19,14 @@ #import +#import "ChatTableViewController.h" + @interface ChatViewController : UIViewController { - + ChatTableViewController *tableController; } +@property (nonatomic, retain) IBOutlet ChatTableViewController* tableController; + - (IBAction)onNew:(id) event; - (IBAction)onEdit:(id) event; diff --git a/Classes/ChatViewController.m b/Classes/ChatViewController.m index bb6c94fae..dd8f609d1 100644 --- a/Classes/ChatViewController.m +++ b/Classes/ChatViewController.m @@ -21,6 +21,12 @@ @implementation ChatViewController +@synthesize tableController; + +- (id)init { + return [super initWithNibName:@"ChatViewController" bundle:[NSBundle mainBundle]]; +} + - (IBAction)onNew: (id) event { } diff --git a/Classes/ChatViewController.xib b/Classes/ChatViewController.xib index 6e6ce99bd..e3944cd49 100644 --- a/Classes/ChatViewController.xib +++ b/Classes/ChatViewController.xib @@ -189,6 +189,14 @@ 14 + + + tableController + + + + 18 + view @@ -315,7 +323,7 @@ - 17 + 18 @@ -344,6 +352,17 @@ id + + tableController + ChatTableViewController + + + tableController + + tableController + ChatTableViewController + + IBProjectSource ./Classes/ChatViewController.h diff --git a/Classes/ContactsViewController.m b/Classes/ContactsViewController.m index 2512f2e1c..a946c277b 100644 --- a/Classes/ContactsViewController.m +++ b/Classes/ContactsViewController.m @@ -35,6 +35,10 @@ typedef enum _HistoryView { History_MAX } HistoryView; +- (id)init { + return [super initWithNibName:@"ContactsViewController" bundle:[NSBundle mainBundle]]; +} + - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self.tableView reloadData]; diff --git a/Classes/DialerViewController.m b/Classes/DialerViewController.m index e9e7f6a5d..22247ba79 100644 --- a/Classes/DialerViewController.m +++ b/Classes/DialerViewController.m @@ -48,6 +48,10 @@ @synthesize zeroButton; @synthesize hashButton; +- (id)init { + return [super initWithNibName:@"DialerViewController" bundle:[NSBundle mainBundle]]; +} + - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; //TODO diff --git a/Classes/HistoryViewController.m b/Classes/HistoryViewController.m index 9a4628b61..0a1f8c4e8 100644 --- a/Classes/HistoryViewController.m +++ b/Classes/HistoryViewController.m @@ -34,6 +34,10 @@ typedef enum _HistoryView { History_MAX } HistoryView; +- (id)init { + return [super initWithNibName:@"HistoryViewController" bundle:[NSBundle mainBundle]]; +} + - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self.tableView reloadData]; diff --git a/Classes/InCallViewController.m b/Classes/InCallViewController.m index 310c3e0ee..4b39572f3 100644 --- a/Classes/InCallViewController.m +++ b/Classes/InCallViewController.m @@ -48,6 +48,10 @@ const NSInteger SECURE_BUTTON_TAG=5; @synthesize testVideoView; #endif +- (id)init { + return [super initWithNibName:@"InCallViewController" bundle:[NSBundle mainBundle]]; +} + + (bool)isInConference:(LinphoneCall*) call { if (!call) return false; diff --git a/Classes/IncomingCallViewController.m b/Classes/IncomingCallViewController.m index 69fc66e79..0e8a2acb3 100644 --- a/Classes/IncomingCallViewController.m +++ b/Classes/IncomingCallViewController.m @@ -23,6 +23,10 @@ @synthesize addressLabel; +- (id)init { + return [super initWithNibName:@"IncomingCallViewController" bundle:[NSBundle mainBundle]]; +} + - (IBAction)onAcceptClick:(id) event { } diff --git a/Classes/LinphoneUI/UICallBar.m b/Classes/LinphoneUI/UICallBar.m index fe0dc3bc0..59cc5417c 100644 --- a/Classes/LinphoneUI/UICallBar.m +++ b/Classes/LinphoneUI/UICallBar.m @@ -30,6 +30,10 @@ @synthesize microButton; @synthesize speakerButton; +- (id)init { + return [super initWithNibName:@"UICallBar" bundle:[NSBundle mainBundle]]; +} + - (void)viewDidLoad { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callUpdate:) name:@"LinphoneCallUpdate" object:nil]; } diff --git a/Classes/LinphoneUI/UIChatCell.h b/Classes/LinphoneUI/UIChatCell.h index a0581bfa0..6d10e6374 100644 --- a/Classes/LinphoneUI/UIChatCell.h +++ b/Classes/LinphoneUI/UIChatCell.h @@ -20,10 +20,12 @@ #import @interface UIChatCell : UITableViewCell { + UIImageView *avatarView; UILabel *displayNameLabel; UILabel *chatContentLabel; } +@property (nonatomic, retain) IBOutlet UIImageView *avatarView; @property (nonatomic, retain) IBOutlet UILabel* displayNameLabel; @property (nonatomic, retain) IBOutlet UILabel* chatContentLabel; diff --git a/Classes/LinphoneUI/UIChatCell.m b/Classes/LinphoneUI/UIChatCell.m index 414584644..ae8693e42 100644 --- a/Classes/LinphoneUI/UIChatCell.m +++ b/Classes/LinphoneUI/UIChatCell.m @@ -21,6 +21,7 @@ @implementation UIChatCell +@synthesize avatarView; @synthesize displayNameLabel; @synthesize chatContentLabel; @@ -42,6 +43,9 @@ } - (void)update{ + + [avatarView setImage:[UIImage imageNamed:@"avatar-small.png"]]; + // // Adapt size // diff --git a/Classes/LinphoneUI/UIChatCell.xib b/Classes/LinphoneUI/UIChatCell.xib index 38bed9633..dcdc7cd9d 100644 --- a/Classes/LinphoneUI/UIChatCell.xib +++ b/Classes/LinphoneUI/UIChatCell.xib @@ -123,7 +123,6 @@ {{276, 0}, {44, 44}} - _NS:9 NO IBCocoaTouchFramework @@ -198,6 +197,14 @@ 24 + + + avatarView + + + + 25 + onDetails: @@ -281,7 +288,7 @@ - 24 + 25 @@ -300,10 +307,15 @@ + UIImageView UILabel UILabel + + avatarView + UIImageView + chatContentLabel UILabel diff --git a/Classes/LinphoneUI/UICompositeViewController.h b/Classes/LinphoneUI/UICompositeViewController.h index 71d7d97d3..c684228e0 100644 --- a/Classes/LinphoneUI/UICompositeViewController.h +++ b/Classes/LinphoneUI/UICompositeViewController.h @@ -18,9 +18,47 @@ */ #import +#import "LinphoneManager.h" + +@interface UICompositeViewDescription: NSObject{ +@public + NSString *content; + NSString *stateBar; + BOOL stateBarEnabled; + NSString *tabBar; + BOOL tabBarEnabled; + BOOL fullscreen; +} +- (id)copy; +- (id)init:(NSString *)content stateBar:(NSString*)stateBar + stateBarEnabled:(BOOL) stateBarEnabled + tabBar:(NSString*)tabBar + tabBarEnabled:(BOOL) tabBarEnabled + fullscreen:(BOOL) fullscreen; +@end @interface UICompositeViewController : UIViewController { + @private + UIView *stateBarView; + UIViewController *stateBarViewController; + UIView *contentView; + UIViewController *contentViewController; + UIView *tabBarView; + UIViewController *tabBarViewController; + NSMutableDictionary *viewControllerCache; + + UICompositeViewDescription *currentViewDescription; } +@property (nonatomic, retain) IBOutlet UIView* stateBarView; +@property (nonatomic, retain) IBOutlet UIView* contentView; +@property (nonatomic, retain) IBOutlet UIView* tabBarView; + +- (void) changeView:(UICompositeViewDescription *)description; +- (void) setFullScreen:(BOOL) enabled; +- (void) setToolBarHidden:(BOOL) hidden; + +- (UIViewController *) getCurrentViewController; + @end diff --git a/Classes/LinphoneUI/UICompositeViewController.m b/Classes/LinphoneUI/UICompositeViewController.m index 9472919b8..895f0f06a 100644 --- a/Classes/LinphoneUI/UICompositeViewController.m +++ b/Classes/LinphoneUI/UICompositeViewController.m @@ -19,6 +19,267 @@ #import "UICompositeViewController.h" -@implementation UICompositeViewController +#import + +@implementation UICompositeViewDescription + +- (id)copy { + UICompositeViewDescription *copy = [UICompositeViewDescription alloc]; + copy->content = self->content; + copy->tabBar = self->tabBar; + copy->tabBarEnabled = self->tabBarEnabled; + copy->stateBarEnabled = self->stateBarEnabled; + copy->fullscreen = self->fullscreen; + return copy; +} + +- (id)init:(NSString *)acontent stateBar:(NSString*)astateBar + stateBarEnabled:(BOOL) astateBarEnabled + tabBar:(NSString*)atabBar + tabBarEnabled:(BOOL) atabBarEnabled + fullscreen:(BOOL) afullscreen { + self->content = acontent; + self->stateBar = astateBar; + self->stateBarEnabled = astateBarEnabled; + self->tabBar = atabBar; + self->tabBarEnabled = atabBarEnabled; + self->fullscreen = afullscreen; + + return self; +} + +@end + +@implementation UICompositeViewController + +@synthesize stateBarView; +@synthesize contentView; +@synthesize tabBarView; + + +- (void)myInit { + self->viewControllerCache = [[NSMutableDictionary alloc] init]; +} + +- (id)init{ + self = [super init]; + if (self) { + [self myInit]; + } + return self; +} + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + [self myInit]; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (self) { + [self myInit]; + } + return self; +} + +- (void)dealloc { + [contentView release]; + [stateBarView release]; + [tabBarView release]; + [viewControllerCache removeAllObjects]; + [currentViewDescription dealloc]; + [super dealloc]; +} + ++ (void)addSubView:(UIViewController*)controller view:(UIView*)view { + if(controller != nil) { + if ([[UIDevice currentDevice].systemVersion doubleValue] < 5.0) { + [controller viewWillAppear:NO]; + } + [view addSubview: controller.view]; + if ([[UIDevice currentDevice].systemVersion doubleValue] < 5.0) { + [controller viewDidAppear:NO]; + } + } +} + ++ (void)removeSubView:(UIViewController*)controller { + if(controller != nil) { + if ([[UIDevice currentDevice].systemVersion doubleValue] < 5.0) { + [controller viewWillDisappear:NO]; + } + [controller.view removeFromSuperview]; + if ([[UIDevice currentDevice].systemVersion doubleValue] < 5.0) { + [controller viewDidDisappear:NO]; + } + } +} + +- (UIViewController*)getCachedController:(NSString*)name { + UIViewController *controller = nil; + if(name != nil) { + controller = [viewControllerCache objectForKey:name]; + if(controller == nil) { + controller = [[NSClassFromString(name) alloc] init]; + [viewControllerCache setValue:controller forKey:name]; + } + } + return controller; +} + +- (void)update: (UICompositeViewDescription*) description tabBar:(NSNumber*)tabBar fullscreen:(NSNumber*)fullscreen { + + // Copy view description + UICompositeViewDescription *oldViewDescription = (currentViewDescription != nil)? [currentViewDescription copy]: nil; + + if(description != nil) { + currentViewDescription = description; + + // Animate only with a previous screen + if(oldViewDescription != nil) { + CATransition* trans = [CATransition animation]; + [trans setType:kCATransitionPush]; + [trans setDuration:0.35]; + [trans setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; + [trans setSubtype:kCATransitionFromRight]; + [contentView.layer addAnimation:trans forKey:@"Transition"]; + if((oldViewDescription->stateBarEnabled == true && currentViewDescription->stateBarEnabled == false) || + (oldViewDescription->stateBarEnabled == false && currentViewDescription->stateBarEnabled == true)) { + [stateBarView.layer addAnimation:trans forKey:@"Transition"]; + } + if(oldViewDescription->tabBar != currentViewDescription->tabBar) { + [tabBarView.layer addAnimation:trans forKey:@"Transition"]; + } + } + + if(contentViewController != nil) { + [UICompositeViewController removeSubView: contentViewController]; + } + if(tabBarViewController != nil) { + [UICompositeViewController removeSubView: tabBarViewController]; + } + if(stateBarViewController != nil) { + [UICompositeViewController removeSubView: stateBarViewController]; + } + + stateBarViewController = [self getCachedController:description->stateBar]; + contentViewController = [self getCachedController:description->content]; + tabBarViewController = [self getCachedController:description->tabBar]; + } + + if(currentViewDescription == nil) { + return; + } + + if(tabBar != nil) { + currentViewDescription->tabBarEnabled = [tabBar boolValue]; + } + + if(fullscreen != nil) { + currentViewDescription->fullscreen = [fullscreen boolValue]; + [[UIApplication sharedApplication] setStatusBarHidden:currentViewDescription->fullscreen withAnimation:UIStatusBarAnimationSlide ]; + } else { + [[UIApplication sharedApplication] setStatusBarHidden:currentViewDescription->fullscreen withAnimation:UIStatusBarAnimationNone]; + } + + // Start animation + if(tabBar != nil || fullscreen != nil) { + [UIView beginAnimations:@"resize" context:nil]; + [UIView setAnimationDuration:0.35]; + [UIView setAnimationBeginsFromCurrentState:TRUE]; + } + + UIView *innerView = contentViewController.view; + + CGRect contentFrame = contentView.frame; + + // Resize StateBar + CGRect stateBarFrame = stateBarView.frame; + if(currentViewDescription->fullscreen) + stateBarFrame.origin.y = -20; + else + stateBarFrame.origin.y = 0; + + if(stateBarViewController != nil && currentViewDescription->stateBarEnabled) { + stateBarView.hidden = false; + [stateBarView setFrame: stateBarFrame]; + contentFrame.origin.y = stateBarFrame.size.height + stateBarFrame.origin.y; + } else { + stateBarView.hidden = true; + contentFrame.origin.y = stateBarFrame.origin.y; + } + + // Resize TabBar + CGRect tabFrame = tabBarView.frame; + if(tabBarViewController != nil && currentViewDescription->tabBarEnabled) { + tabBarView.hidden = false; + tabFrame.origin.y = [[UIScreen mainScreen] bounds].size.height - 20; + tabFrame.origin.x = [[UIScreen mainScreen] bounds].size.width; + tabFrame.size.height = tabBarViewController.view.frame.size.height; + tabFrame.size.width = tabBarViewController.view.frame.size.width; + tabFrame.origin.y -= tabFrame.size.height; + tabFrame.origin.x -= tabFrame.size.width; + contentFrame.size.height = tabFrame.origin.y - contentFrame.origin.y; + for (UIView *view in tabBarViewController.view.subviews) { + if(view.tag == -1) { + contentFrame.size.height += view.frame.origin.y; + break; + } + } + } else { + tabBarView.hidden = true; + contentFrame.size.height = tabFrame.origin.y + tabFrame.size.height; + if(currentViewDescription->fullscreen) + contentFrame.size.height += 20; + tabFrame.origin.y = [[UIScreen mainScreen] bounds].size.height - 20; + } + + // Resize innerView + CGRect innerContentFrame = innerView.frame; + innerContentFrame.size = contentFrame.size; + + + // Set frames + [contentView setFrame: contentFrame]; + [innerView setFrame: innerContentFrame]; + [tabBarView setFrame: tabFrame]; + + // Commit animation + if(tabBar != nil || fullscreen != nil) { + [UIView commitAnimations]; + } + + // Change view + if(description != nil) { + [UICompositeViewController addSubView: contentViewController view:contentView]; + [UICompositeViewController addSubView: tabBarViewController view:tabBarView]; + [UICompositeViewController addSubView: stateBarViewController view:stateBarView]; + } + + // Dealloc old view description + if(oldViewDescription != nil) { + [oldViewDescription dealloc]; + } +} + +- (void) changeView:(UICompositeViewDescription *)description { + [self view]; // Force view load + [self update:description tabBar:nil fullscreen:nil]; +} + +- (void) setFullScreen:(BOOL) enabled { + [self update:nil tabBar:nil fullscreen:[NSNumber numberWithBool:enabled]]; +} + +- (void) setToolBarHidden:(BOOL) hidden { + [self update:nil tabBar:[NSNumber numberWithBool:!hidden] fullscreen:nil]; +} + +- (UIViewController *) getCurrentViewController { + return contentViewController; +} @end diff --git a/Classes/LinphoneUI/UICompositeViewController.xib b/Classes/LinphoneUI/UICompositeViewController.xib index 4546f97b3..15ca250eb 100644 --- a/Classes/LinphoneUI/UICompositeViewController.xib +++ b/Classes/LinphoneUI/UICompositeViewController.xib @@ -98,6 +98,30 @@ 3 + + + contentView + + + + 17 + + + + stateBarView + + + + 18 + + + + tabBarView + + + + 19 + @@ -162,13 +186,32 @@ - 16 + 19 UICompositeViewController UIViewController + + UIView + UIView + UIView + + + + contentView + UIView + + + stateBarView + UIView + + + tabBarView + UIView + + IBProjectSource ./Classes/UICompositeViewController.h diff --git a/Classes/LinphoneUI/UIMainBar.m b/Classes/LinphoneUI/UIMainBar.m index 32f84cbe1..c7bd8aa41 100644 --- a/Classes/LinphoneUI/UIMainBar.m +++ b/Classes/LinphoneUI/UIMainBar.m @@ -28,12 +28,21 @@ @synthesize settingsButton; @synthesize chatButton; +- (id)init { + return [super initWithNibName:@"UIMainBar" bundle:[NSBundle mainBundle]]; +} + - (void)viewDidLoad { - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveLinphoneMainViewChangeEvent:) name:@"LinphoneMainViewChange" object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveLinphoneMainViewChangeEvent:) name:@"LinphoneMainViewChange" object:nil]; + [self update:[[LinphoneManager instance] currentView]]; } - (void)receiveLinphoneMainViewChangeEvent: (NSNotification*) notif { PhoneView view = [[notif.userInfo objectForKey: @"view"] intValue]; + [self update:view]; +} + +- (void)update:(PhoneView) view { if(view == PhoneView_History) { historyButton.selected = TRUE; } else { diff --git a/Classes/LinphoneUI/UIStateBar.m b/Classes/LinphoneUI/UIStateBar.m index 524f1366f..2600765b6 100644 --- a/Classes/LinphoneUI/UIStateBar.m +++ b/Classes/LinphoneUI/UIStateBar.m @@ -30,6 +30,10 @@ NSTimer *callQualityTimer; +- (id)init { + return [super initWithNibName:@"UIStateBar" bundle:[NSBundle mainBundle]]; +} + - (void)viewDidLoad { [super viewDidLoad]; @@ -45,7 +49,10 @@ NSTimer *callQualityTimer; repeats:YES]; // Update to default state - [self proxyConfigUpdate: NULL]; + LinphoneProxyConfig* config = NULL; + if([LinphoneManager isLcReady]) + linphone_core_get_default_proxy([LinphoneManager getLc], &config); + [self proxyConfigUpdate: config]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { diff --git a/Classes/PhoneMainView.h b/Classes/PhoneMainView.h index c02e8ed8d..c9951908b 100644 --- a/Classes/PhoneMainView.h +++ b/Classes/PhoneMainView.h @@ -21,48 +21,21 @@ #import "LinphoneManager.h" #import "CallDelegate.h" - -@interface ViewsDescription: NSObject{ -@public - UIViewController *content; - UIViewController *tabBar; - bool tabBarEnabled; - bool statusEnabled; - bool fullscreen; - PhoneView viewId; -} --(id) copy; -@end +#import "UICompositeViewController.h" @interface PhoneMainView : UIViewController { - UIView *stateBarView; - UIView *contentView; - UIView *tabBarView; + UICompositeViewController *mainViewController; + UICompositeViewController *modalViewController; @private NSMutableDictionary *viewDescriptions; - NSArray *views; - - UIViewController *stateBarController; - - UIViewController *callTabBarController; - UIViewController *mainTabBarController; - UIViewController *incomingCallTabBarController; - ViewsDescription *currentViewDescription; + PhoneView currentPhoneView; UIActionSheet *incomingCallActionSheet; UIActionSheet *batteryActionSheet; } -@property (nonatomic, retain) IBOutlet UIView* stateBarView; -@property (nonatomic, retain) IBOutlet UIView* contentView; -@property (nonatomic, retain) IBOutlet UIView* tabBarView; +@property (nonatomic, retain) IBOutlet UICompositeViewController *mainViewController; +@property (nonatomic, retain) IBOutlet UICompositeViewController *modalViewController; -@property (nonatomic, retain) IBOutlet UIViewController* stateBarController; - -@property (nonatomic, retain) IBOutlet UIViewController* callTabBarController; -@property (nonatomic, retain) IBOutlet UIViewController* mainTabBarController; -@property (nonatomic, retain) IBOutlet UIViewController* incomingCallTabBarController; - --(void) changeView: (NSNotification*) notif; @end diff --git a/Classes/PhoneMainView.m b/Classes/PhoneMainView.m index 93a8736e8..e286a2786 100644 --- a/Classes/PhoneMainView.m +++ b/Classes/PhoneMainView.m @@ -30,313 +30,163 @@ #import "AbstractCall.h" -@implementation ViewsDescription - -- (id)copy { - ViewsDescription *copy = [ViewsDescription alloc]; - copy->content = self->content; - copy->tabBar = self->tabBar; - copy->tabBarEnabled = self->tabBarEnabled; - copy->statusEnabled = self->statusEnabled; - copy->fullscreen = self->fullscreen; - copy->viewId = self->viewId; - return copy; -} -@end - @implementation PhoneMainView -@synthesize stateBarView; -@synthesize contentView; -@synthesize tabBarView; +@synthesize mainViewController; +@synthesize modalViewController; -@synthesize stateBarController; - -@synthesize callTabBarController; -@synthesize mainTabBarController; -@synthesize incomingCallTabBarController; - -+ (void)addSubView:(UIViewController*)controller view:(UIView*)view { - if ([[UIDevice currentDevice].systemVersion doubleValue] < 5.0) { - [controller viewWillAppear:NO]; - } - [view addSubview: controller.view]; - if ([[UIDevice currentDevice].systemVersion doubleValue] < 5.0) { - [controller viewDidAppear:NO]; - } +- (void)myInit { + self->currentPhoneView = -1; } -+ (void)removeSubView:(UIViewController*)controller { - if ([[UIDevice currentDevice].systemVersion doubleValue] < 5.0) { - [controller viewWillDisappear:NO]; - } - [controller.view removeFromSuperview]; - if ([[UIDevice currentDevice].systemVersion doubleValue] < 5.0) { - [controller viewDidDisappear:NO]; +- (id)init { + self = [super init]; + if (self) { + [self myInit]; } + return self; } +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + [self myInit]; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (self) { + [self myInit]; + } + return self; +} + - (void)changeView: (NSNotification*) notif { NSNumber *viewId = [notif.userInfo objectForKey: @"view"]; NSNumber *tabBar = [notif.userInfo objectForKey: @"tabBar"]; NSNumber *fullscreen = [notif.userInfo objectForKey: @"fullscreen"]; - // Copy view description - ViewsDescription *oldViewDescription = (currentViewDescription != nil)? [currentViewDescription copy]: nil; - // Check view change if(viewId != nil) { PhoneView view = [viewId intValue]; - ViewsDescription* description = [viewDescriptions objectForKey:[NSNumber numberWithInt: view]]; + UICompositeViewDescription* description = [viewDescriptions objectForKey:[NSNumber numberWithInt: view]]; if(description == nil) return; - description->viewId = view; // Auto-set viewId - if(currentViewDescription == nil || description->viewId != currentViewDescription->viewId) { - if(currentViewDescription != nil) - [currentViewDescription dealloc]; - currentViewDescription = [description copy]; - } else { - viewId = nil; - } - } - - if(currentViewDescription == nil) { - return; + if(view != currentPhoneView) { + [mainViewController changeView:description]; + currentPhoneView = view; + } } if(tabBar != nil) { - currentViewDescription->tabBarEnabled = [tabBar boolValue]; + [mainViewController setToolBarHidden:![tabBar boolValue]]; } if(fullscreen != nil) { - currentViewDescription->fullscreen = [fullscreen boolValue]; - [[UIApplication sharedApplication] setStatusBarHidden:currentViewDescription->fullscreen withAnimation:UIStatusBarAnimationSlide ]; - } else { - [[UIApplication sharedApplication] setStatusBarHidden:currentViewDescription->fullscreen withAnimation:UIStatusBarAnimationNone]; - } - - // View Transitions - if(viewId != nil) { - if(oldViewDescription != nil) { - CATransition* trans = [CATransition animation]; - [trans setType:kCATransitionPush]; - [trans setDuration:0.35]; - [trans setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; - [trans setSubtype:kCATransitionFromRight]; - [contentView.layer addAnimation:trans forKey:@"Transition"]; - if((oldViewDescription->statusEnabled == true && currentViewDescription->statusEnabled == false) || - (oldViewDescription->statusEnabled == false && currentViewDescription->statusEnabled == true)) { - [stateBarView.layer addAnimation:trans forKey:@"Transition"]; - } - if(oldViewDescription->tabBar != currentViewDescription->tabBar) { - [tabBarView.layer addAnimation:trans forKey:@"Transition"]; - } - [PhoneMainView removeSubView: oldViewDescription->content]; - [PhoneMainView removeSubView: oldViewDescription->tabBar]; - } - } - - // Start animation - if(tabBar != nil || fullscreen != nil) { - [UIView beginAnimations:@"resize" context:nil]; - [UIView setAnimationDuration:0.35]; - [UIView setAnimationBeginsFromCurrentState:TRUE]; - } - - UIView *innerView = currentViewDescription->content.view; - - CGRect contentFrame = contentView.frame; - - // Resize StateBar - CGRect stateBarFrame = stateBarView.frame; - if(currentViewDescription->fullscreen) - stateBarFrame.origin.y = -20; - else - stateBarFrame.origin.y = 0; - - if(currentViewDescription->statusEnabled) { - stateBarView.hidden = false; - [stateBarView setFrame: stateBarFrame]; - contentFrame.origin.y = stateBarFrame.size.height + stateBarFrame.origin.y; - } else { - stateBarView.hidden = true; - contentFrame.origin.y = stateBarFrame.origin.y; - } - - // Resize TabBar - CGRect tabFrame = tabBarView.frame; - if(currentViewDescription->tabBar != nil && currentViewDescription->tabBarEnabled) { - tabFrame.origin.y = [[UIScreen mainScreen] bounds].size.height - 20; - tabFrame.origin.x = [[UIScreen mainScreen] bounds].size.width; - tabFrame.size.height = currentViewDescription->tabBar.view.frame.size.height; - tabFrame.size.width = currentViewDescription->tabBar.view.frame.size.width; - tabFrame.origin.y -= tabFrame.size.height; - tabFrame.origin.x -= tabFrame.size.width; - contentFrame.size.height = tabFrame.origin.y - contentFrame.origin.y; - for (UIView *view in currentViewDescription->tabBar.view.subviews) { - if(view.tag == -1) { - contentFrame.size.height += view.frame.origin.y; - break; - } - } - } else { - contentFrame.size.height = tabFrame.origin.y + tabFrame.size.height; - if(currentViewDescription->fullscreen) - contentFrame.size.height += 20; - tabFrame.origin.y = [[UIScreen mainScreen] bounds].size.height - 20; - } - - // Resize innerView - CGRect innerContentFrame = innerView.frame; - innerContentFrame.size = contentFrame.size; - - - // Set frames - [contentView setFrame: contentFrame]; - [innerView setFrame: innerContentFrame]; - [tabBarView setFrame: tabFrame]; - - // Commit animation - if(tabBar != nil || fullscreen != nil) { - [UIView commitAnimations]; - } - - // Change view - if(viewId != nil) { - [PhoneMainView addSubView: currentViewDescription->content view:contentView]; - [PhoneMainView addSubView: currentViewDescription->tabBar view:tabBarView]; + [mainViewController setFullScreen:[fullscreen boolValue]]; } // Call abstractCall NSDictionary *dict = [notif.userInfo objectForKey: @"args"]; if(dict != nil) - [AbstractCall call:currentViewDescription->content dict:dict]; - - // Dealloc old view description - if(oldViewDescription != nil) { - [oldViewDescription dealloc]; - } + [AbstractCall call:[mainViewController getCurrentViewController] dict:dict]; } - (void)viewDidLoad { [super viewDidLoad]; - UIView *dumb; + + [[self view] addSubview: mainViewController.view]; // Init view descriptions viewDescriptions = [[NSMutableDictionary alloc] init]; - // Load Bars - dumb = mainTabBarController.view; - - // Status Bar - [stateBarView addSubview: stateBarController.view]; - // // Main View // - DialerViewController* myDialerViewController = [[DialerViewController alloc] - initWithNibName:@"DialerViewController" - bundle:[NSBundle mainBundle]]; - //[myPhoneViewController loadView]; - ViewsDescription *dialerDescription = [ViewsDescription alloc]; - dialerDescription->content = myDialerViewController; - dialerDescription->tabBar = mainTabBarController; - dialerDescription->statusEnabled = true; - dialerDescription->fullscreen = false; + UICompositeViewDescription *dialerDescription = [UICompositeViewDescription alloc]; + dialerDescription->content = @"DialerViewController"; + dialerDescription->tabBar = @"UIMainBar"; dialerDescription->tabBarEnabled = true; + dialerDescription->stateBar = @"UIStateBar"; + dialerDescription->stateBarEnabled = true; + dialerDescription->fullscreen = false; [viewDescriptions setObject:dialerDescription forKey:[NSNumber numberWithInt: PhoneView_Dialer]]; // // Contacts View // - ContactsViewController* myContactsController = [[ContactsViewController alloc] - initWithNibName:@"ContactsViewController" - bundle:[NSBundle mainBundle]]; - //[myContactsController loadView]; - ViewsDescription *contactsDescription = [ViewsDescription alloc]; - contactsDescription->content = myContactsController; - contactsDescription->tabBar = mainTabBarController; - contactsDescription->statusEnabled = false; - contactsDescription->fullscreen = false; + UICompositeViewDescription *contactsDescription = [UICompositeViewDescription alloc]; + contactsDescription->content = @"ContactsViewController"; + contactsDescription->tabBar = @"UIMainBar"; contactsDescription->tabBarEnabled = true; + contactsDescription->stateBar = nil; + contactsDescription->stateBarEnabled = false; + contactsDescription->fullscreen = false; [viewDescriptions setObject:contactsDescription forKey:[NSNumber numberWithInt: PhoneView_Contacts]]; // // Call History View // - HistoryViewController* myHistoryController = [[HistoryViewController alloc] - initWithNibName:@"HistoryViewController" - bundle:[NSBundle mainBundle]]; - //[myHistoryController loadView]; - ViewsDescription *historyDescription = [ViewsDescription alloc]; - historyDescription->content = myHistoryController; - historyDescription->tabBar = mainTabBarController; - historyDescription->statusEnabled = false; - historyDescription->fullscreen = false; + UICompositeViewDescription *historyDescription = [UICompositeViewDescription alloc]; + historyDescription->content = @"HistoryViewController"; + historyDescription->tabBar = @"UIMainBar"; historyDescription->tabBarEnabled = true; + historyDescription->stateBar = nil; + historyDescription->stateBarEnabled = false; + historyDescription->fullscreen = false; [viewDescriptions setObject:historyDescription forKey:[NSNumber numberWithInt: PhoneView_History]]; // // IncomingCall View // - IncomingCallViewController* myIncomingCallController = [[IncomingCallViewController alloc] - initWithNibName:@"IncomingCallViewController" - bundle:[NSBundle mainBundle]]; - //[myChatViewController loadView]; - ViewsDescription *incomingCallDescription = [ViewsDescription alloc]; - incomingCallDescription->content = myIncomingCallController; - incomingCallDescription->tabBar = mainTabBarController; - incomingCallDescription->statusEnabled = true; + UICompositeViewDescription *incomingCallDescription = [UICompositeViewDescription alloc]; + incomingCallDescription->content = @"IncomingCallViewController"; + incomingCallDescription->tabBar = nil; + incomingCallDescription->tabBarEnabled = false; + incomingCallDescription->stateBar = @"UIStateBar"; + incomingCallDescription->stateBarEnabled = true; incomingCallDescription->fullscreen = false; - incomingCallDescription->tabBarEnabled = true; - [viewDescriptions setObject:incomingCallDescription forKey:[NSNumber numberWithInt: PhoneView_Chat]]; + [viewDescriptions setObject:incomingCallDescription forKey:[NSNumber numberWithInt: PhoneView_IncomingCall]]; // // InCall View // - InCallViewController* myInCallController = [[InCallViewController alloc] - initWithNibName:@"InCallViewController" - bundle:[NSBundle mainBundle]]; - //[myInCallController loadView]; - ViewsDescription *inCallDescription = [ViewsDescription alloc]; - inCallDescription->content = myInCallController; - inCallDescription->tabBar = nil; - inCallDescription->statusEnabled = true; + UICompositeViewDescription *inCallDescription = [UICompositeViewDescription alloc]; + inCallDescription->content = @"InCallViewController"; + inCallDescription->tabBar = @"UICallBar"; + inCallDescription->tabBarEnabled = true; + inCallDescription->stateBar = @"UIStateBar"; + inCallDescription->stateBarEnabled = true; inCallDescription->fullscreen = false; - inCallDescription->tabBarEnabled = false; [viewDescriptions setObject:inCallDescription forKey:[NSNumber numberWithInt: PhoneView_InCall]]; // // Settings View // - SettingsViewController* mySettingsViewController = [[SettingsViewController alloc] - initWithNibName:@"SettingsViewController" - bundle:[NSBundle mainBundle]]; - //[mySettingsViewController loadView]; - ViewsDescription *settingsDescription = [ViewsDescription alloc]; - settingsDescription->content = mySettingsViewController; - settingsDescription->tabBar = mainTabBarController; - settingsDescription->statusEnabled = false; - settingsDescription->fullscreen = false; + UICompositeViewDescription *settingsDescription = [UICompositeViewDescription alloc]; + settingsDescription->content = @"SettingsViewController"; + settingsDescription->tabBar = @"UIMainBar"; settingsDescription->tabBarEnabled = true; + settingsDescription->stateBar = nil; + settingsDescription->stateBarEnabled = false; + settingsDescription->fullscreen = false; [viewDescriptions setObject:settingsDescription forKey:[NSNumber numberWithInt: PhoneView_Settings]]; // // Chat View // - ChatViewController* myChatViewController = [[ChatViewController alloc] - initWithNibName:@"ChatViewController" - bundle:[NSBundle mainBundle]]; - //[myChatViewController loadView]; - ViewsDescription *chatDescription = [ViewsDescription alloc]; - chatDescription->content = myChatViewController; - chatDescription->tabBar = mainTabBarController; - chatDescription->statusEnabled = false; - chatDescription->fullscreen = false; + UICompositeViewDescription *chatDescription = [UICompositeViewDescription alloc]; + chatDescription->content = @"ChatViewController"; + chatDescription->tabBar = @"UIMainBar"; chatDescription->tabBarEnabled = true; + chatDescription->stateBar = nil; + chatDescription->stateBarEnabled = false; + chatDescription->fullscreen = false; [viewDescriptions setObject:chatDescription forKey:[NSNumber numberWithInt: PhoneView_Chat]]; // Set observers @@ -395,7 +245,7 @@ } } -- (void)callUpdate: (NSNotification*) notif { +- (void)callUpdate:(NSNotification*) notif { LinphoneCall *call = [[notif.userInfo objectForKey: @"call"] pointerValue]; LinphoneCallState state = [[notif.userInfo objectForKey: @"state"] intValue]; NSString *message = [notif.userInfo objectForKey: @"message"]; @@ -521,6 +371,7 @@ - (void)displayIncomingCall:(LinphoneCall*) call{ +#if 0 const char* userNameChars=linphone_address_get_username(linphone_call_get_remote_address(call)); NSString* userName = userNameChars?[[[NSString alloc] initWithUTF8String:userNameChars] autorelease]:NSLocalizedString(@"Unknown",nil); const char* displayNameChars = linphone_address_get_display_name(linphone_call_get_remote_address(call)); @@ -567,6 +418,10 @@ } [incomingCallActionSheet release]; } +#endif + //UICompositeViewController *controller = [[UICompositeViewController alloc] initWithNibName:@"UICompositeViewController" bundle:[NSBundle mainBundle]]; + [modalViewController changeView:[viewDescriptions objectForKey:[NSNumber numberWithInt:PhoneView_IncomingCall]]]; + [self presentModalViewController:modalViewController animated:false]; } - (void)batteryLevelChanged: (NSNotification*) notif { @@ -637,10 +492,8 @@ - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; + [viewDescriptions removeAllObjects]; [viewDescriptions release]; - [stateBarView release]; - [stateBarController release]; - [mainTabBarController release]; [super dealloc]; } diff --git a/Classes/PhoneMainView.xib b/Classes/PhoneMainView.xib index f1857e52a..0976956ee 100644 --- a/Classes/PhoneMainView.xib +++ b/Classes/PhoneMainView.xib @@ -38,53 +38,10 @@ 292 - - YES - - - 314 - {{0, 23}, {320, 380}} - - - - _NS:9 - YES - IBCocoaTouchFramework - - - - 274 - {320, 23} - - - - _NS:9 - - 3 - MQA - - YES - IBCocoaTouchFramework - - - - 280 - {{0, 400}, {320, 60}} - - - _NS:9 - - 3 - MCAwAA - - YES - IBCocoaTouchFramework - - {320, 460} - + _NS:9 3 @@ -132,7 +89,10 @@ IBCocoaTouchFramework 0 0 - + + 3 + MQA + 1 MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA @@ -165,6 +125,7 @@ {{192, 0}, {128, 72}} + _NS:9 NO @@ -236,9 +197,9 @@ NO IBCocoaTouchFramework - + NO - UIMainBar + UICompositeViewController 1 @@ -247,20 +208,9 @@ IBCocoaTouchFramework NO - + NO - UICallBar - - - 1 - 1 - - IBCocoaTouchFramework - NO - - - NO - UIStateBar + UICompositeViewController 1 @@ -283,51 +233,19 @@ - tabBarView + mainViewController - + - 160 + 209 - mainTabBarController + modalViewController - + - 192 - - - - callTabBarController - - - - 196 - - - - stateBarController - - - - 201 - - - - stateBarView - - - - 202 - - - - contentView - - - - 159 + 211 @@ -388,31 +306,10 @@ YES - - - root - - 135 - - - YES - - - tabBar - - - 53 - - - YES - - - content - 169 @@ -420,28 +317,16 @@ mask - 175 - - - stateBar + 208 + + + mainViewController - 178 - + 210 + - mainTabBarController - - - 190 - - - stateBarController - - - 194 - - - callTabBarController + modalViewController @@ -460,17 +345,12 @@ 131.IBUIButtonInspectorSelectedStateConfigurationMetadataKey 133.IBPluginDependency 133.IBUIButtonInspectorSelectedStateConfigurationMetadataKey - 135.IBPluginDependency 152.IBPluginDependency 169.IBPluginDependency - 175.IBPluginDependency - 178.CustomClassName - 178.IBPluginDependency - 190.CustomClassName - 190.IBPluginDependency - 194.CustomClassName - 194.IBPluginDependency - 53.IBPluginDependency + 208.CustomClassName + 208.IBPluginDependency + 210.CustomClassName + 210.IBPluginDependency YES @@ -487,14 +367,9 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UICompositeViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIMainBar - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIStateBar - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UICallBar - com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UICompositeViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -510,7 +385,7 @@ - 207 + 211 @@ -522,21 +397,53 @@ YES YES - callTabBarController + mainViewController + modalViewController + + + YES + UICompositeViewController + UICompositeViewController + + + + YES + + YES + mainViewController + modalViewController + + + YES + + mainViewController + UICompositeViewController + + + modalViewController + UICompositeViewController + + + + + IBProjectSource + ./Classes/PhoneMainView.h + + + + UICompositeViewController + UIViewController + + YES + + YES contentView - incomingCallTabBarController - mainTabBarController - stateBarController stateBarView tabBarView YES - UIViewController UIView - UIViewController - UIViewController - UIViewController UIView UIView @@ -545,36 +452,16 @@ YES YES - callTabBarController contentView - incomingCallTabBarController - mainTabBarController - stateBarController stateBarView tabBarView YES - - callTabBarController - UIViewController - contentView UIView - - incomingCallTabBarController - UIViewController - - - mainTabBarController - UIViewController - - - stateBarController - UIViewController - stateBarView UIView @@ -587,273 +474,7 @@ IBProjectSource - ./Classes/PhoneMainView.h - - - - 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/UICallBar.h - - - - 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 - - YES - callQualityImage - registrationStateImage - registrationStateLabel - - - YES - UIImageView - UIImageView - UILabel - - - - YES - - YES - callQualityImage - registrationStateImage - registrationStateLabel - - - YES - - callQualityImage - UIImageView - - - registrationStateImage - UIImageView - - - registrationStateLabel - UILabel - - - - - IBProjectSource - ./Classes/UIStateBar.h - - - - UIToggleButton - UIButton - - IBProjectSource - ./Classes/UIToggleButton.h - - - - UIVideoButton - UIToggleButton - - videoUpdateIndicator - UIActivityIndicatorView - - - videoUpdateIndicator - - videoUpdateIndicator - UIActivityIndicatorView - - - - IBProjectSource - ./Classes/UIVideoButton.h + ./Classes/UICompositeViewController.h diff --git a/Classes/SettingsViewController.m b/Classes/SettingsViewController.m index 8b4a8da4a..099c208c1 100644 --- a/Classes/SettingsViewController.m +++ b/Classes/SettingsViewController.m @@ -25,6 +25,10 @@ @synthesize settingsController; @synthesize navigationController; +- (id)init { + return [super initWithNibName:@"SettingsViewController" bundle:[NSBundle mainBundle]]; +} + - (void)viewDidLoad { settingsController.delegate = [LinphoneManager instance]; settingsController.settingsReaderDelegate = self; diff --git a/Resources/avatar-inconnu.png b/Resources/avatar-inconnu.png new file mode 100644 index 0000000000000000000000000000000000000000..1d1a7f705c68d5d057670c33bf940419752f7cf1 GIT binary patch literal 18862 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 EU(80DIRF3v literal 0 HcmV?d00001 diff --git a/Resources/avatar-small.png b/Resources/avatar-small.png new file mode 100644 index 0000000000000000000000000000000000000000..143da15124b4ce77cab932c6eb6d2ff2a9807ac0 GIT binary patch literal 9001 zcmbVyWmr`2`Yzo$wA9du)DS~UclUtA5JTwDL)XyVC@C#144|k;OLt0_G?G#xpa=Kf zzkSY!|MmZH*0t8P-sfHSb3eV-mlda{qe@KhhyV=@jaXex$>8B0@%O^RK|@1d$jv@| z5a;%DrKro0OBrGB(CdLaC5(Ehf2nq>+g!n*WlEOlgf`Y*R9IOx4JnbDM z4U|;=W9vbZVRb?v+$9ABe0_cSeTDhmJRJo<5)u-BIfR7x9uRz9{;micKR#D4wtpCu zU|x2f&h7|jH&@_aMjKl_fq^_s)Ls4wtN^W-E zE-+Vwx{?g*!xMgcXM0IOkhmZSBqky#CL{{wG}p zF(FYEF(Dywu&4wGqzn=l7JN`u0LzOhC@4q>sr;j>?&^iGakYc}W7qk?t`JBF1Qr%j z{$F(^6+K}#2sck7H#hh{9iZprhH&$8a&reN8j1q7ZS0&~|H^;M^Y3VtV4luCFnbkG zHy7Z)@+;~5KiC%*5dtfUh>8dc|2uARMUaS!khrL*_(LX)-tUZTr2Kf-zJ|dP>p>ey21doGy!FGopG^C*;=WQeFv`z?V)1&2zGnL`*`@T#3>BbVvtVIPB6XB-4^go5krwpH1a7lg z!`w81HbC_o*duawXv6%MAA2IMGA_7nkGE|jJ>;4Vlm#-au;N}Ew_rehfAzn1d!wLJA92Ap8c{ zEy~JrCeHiJ-ZcCgqNb=RuXV!n*mgqb>YkzI^0F-V2zA!fCGz){^_1TjDpP9|xA&bPta|%GV4lwKmyU$s}$O4z3R!+A9w69a~$qqclvL zCcrZvtw#%bwW5J3PZX7bs^5r$aQjtIRy#eu7`whIFQTLj!X+=1TN2OF78*RBS%|tH zclFe1H)}Pw@`~1LzLKC_@JWrGdRzL$?suao-okGz4M68=I0jR>z3+rwr=f(Zyx3?9 z)+E}rZPJJ3+G8q(+f!P_;7`>WZOvKF*Xo!tkzdc7=a5*!xrHs%H1Yn1&xcI|`}+o~ zw$4KQoSU1Cc%upuyA#BdJ7guaElLh!5c z5XMh&>TS*qrb_x8)C+VQ4Uk?woPhbK-b;B4$1aE(6$QMu`|0?vh>O2#p>K5Dh&S5qR$JdtmI-*FUR#bxSW(TCx9;j@Q}kGXrmod-4c z%HNJzms4X2Rqy6?V%WzJ2{`!f!20A(5H2YBQ%gEGUtR9dYD6XNC7Y?Uzm(bxL>l*F z%S!UEMz2j0&%N94!b26yVIHz)@f6)=&Q3MO(YKv*c}I%VVbI}Ox>~U;V#ZgJdEENX z`wcQ0CH=f(WVqx|z2AVx`wogfY7{{Z-4zVgJ$4cuGPi!Ad2d{6M)0`zfdI>a;{{H& zq^cCo4Sc6{BC7oFI9INT6qGTlY3(XyF{=IU9>Kfqd4AiZdvO?Imr6HtnK0n|{pK|M zu@ML*jK4TqR6CTM&EMeiwUFNwRj+Tzc3#AaxluV)T#S8$Kh8AbV}|tn#4JAHcm*&6 zCmGY#2UQvtE1p_EDJJDtjR&Vl^L}q^%>L2ZE=>;>8IViiyVQ{KQ)j8RVA_b+%MVY# znhTLnqNIQKhV8N2q4WoaAk&I^Uc&L)L-!MaSd0+Sl4LjyfQosjSx!mRlH9 z5YQD7BS$8p_A25V={N^rZbVlES*zbERIOVMsL%S+zs<(4UE6cXaCOoblS! zYLWX%RYgwcD*z>#mB_7V-7h)m=HJP4cT6^7N>LU$krxarxQ6q1XP7^3wqE@7_Vy>A z zXDBXKJVAKy@x9yH=K&|DqOrD#o)%lIoVKG%o z*|iJcmE$@84!ZwViJ8|%r&0idGn{qa)VwSk;zkO3XXBBnSEZo_DI2*xJE}>Md;9&o zBBhV)%YnEq-$4P~HLZ4=yvR@<<}mq(o;j$aJ(m>YCq4=|BooPZyun@x4I_Ic50>?a zT5gW9Ko8GLrtmwN4a4tWSz#8Jxslt*OE@9z#V3;jkG0uic7Xh8ij4G2o^^W(STTPU zzK(i!-If0spIyCij{&FnR*#Vb^<&aj5;qE)kX1vn9};IEX1)SgefMXl@&z#|^INLS zl*$Tcp$+{RN*BYhH`nHC^CRcR9x2hilc*`qk2u3dKX^Xk5<-AqYzF=DhtF5;)n9y+ z&C6-j|Ds^VPg5!iaUeC};kH52nJ4)odKqkM zx8{ZPaCrF%E!&g9ykE(loT(}T4tlpjUAblKtUt{BD)3bpo%58Edo(R6@e;M3&SKJy zA%kM)Va{=b^{UAX?3{ZMNLIrH1~;7j$I$(SpWNr9=bw#PqdR>_U*%2~{PkRfzy`#Q zr8Pp0ZELUEOi98Jo@o~%%H_(y7S%iODlIG)52Y7QVX{4p@a0=GSTVl3cqd}Al*{C6 zJXdoPeA0GSPB`YI$i9!4jQ@`AA~r8-mhIzN_X-QF{o=kugb6H|#^Z5dR5dt8?8=d} zf4+Op6{?;8T|XdJOtUOox}pE=KISb$DG%t`GBOb>Hnuo{R*&NPRRBKhGA95-Fs=*B zAYwi5Z4RydsDcD2$hWxQ`;lV~{%l4yCp9}W`&5&2YhFQa%CQ+>+RZx&L-8FGa5k{GjyiZbwxTPKPrji7#;T5qVZIQ6Kof! zKVy6@v{)8?UX@oze$Y}rLFxT8F=79WA5)OA6C+VWSGd^SdOb@AT@+`%|EAdPE04RL z!K=&ht~GJLrPfsy?WEQ#&SQ?`zPLaV(i!Dje!8#v9|*&6tU*5=WVRpE{#a~hj9jaU z`?QSr)a?`#+J-Kg^F2>&Nq#rkP_x3rM)~*A!YcpjVMlWB)0>y8O>clc>Dff?lK_pL zt$h-vJ9m|}$p~a2Ed5Eh>`La2K@A(Ev*~&jveq-TFC0_8uT41D+RVJt|JnCXxdE+d zOehlm9$T}L-ZwMy^DMb3#*-%b_nXZW&XN^cG)8Wb_%-xmZj8==pA9YTlXcmi#)I%O zqgAzghy4Js>}PUMtD*P$w)DldJe>`8*0zb8iwEYq#>KYAk3C5iTvExyy`6jXjKivV zj0zjY^Lz6^^#L^+(O#XNBs37x(GFB5tEh-2ulo7>jB_@e!f&D*4~OUA&@OY@@BwgC)o7 zgDIM2lQ9~Fx7!j~+&6?6eNAS;yp(>8O|$Jv&&Hqah|~5tU}mt7QgmaocR5Ypn`7Yg z$wjb&UTT|u^dBHik)Xfbh(k8ag5)~KM)x+~&tA%l2i=`Ar7-_a)@7FE{?TKQ5WnDa zji)?L!Lf_QyGlyfq9yT#py~V113|qw7ABQJDjCy}i@P5Lb!$Hx0<3@9_Q`-9l@hsj zX`O4MHHK&}6gfmKle1Ks4|~K|er8~6&frvX2aFZ{I2Y&`vlM-V`MsA}_w3uvw0vbx zdxfWH#r>3bcj9AVIx6lOZhakn4T`|+&)-YWVqa>S(s2GlsPl;NA_m&6s%65xQnwkh z9Eqp1RU5(mfZ(ZvYXe5VrwSUj&pF>WJ4>kges!cB4-C4zTp(92%oNM*l%LWc9neE+ zs7yJ3hu7rL(Wv8E*H=|6{|Qx>r@ zGBw&h{#C4isb_XE`R=NF;xz@2M-w~l=5SU~IC^E!?>pyWiiW03xhokj#a@2}Wy$67 z%gzfaG?iBYc=Lyct1D8*{L~e5gDg!t+07?Ymqr5M(wKsNw@dUg3yFA4s2)zXUqG&3dioa) zU1dzA>bjiQ_LlrKf|M&F`g%8%=NI|aL~GJU?ubfCX)}*C@SDlPy`vZn4jI+xf)uou zr2&m)8ZWN5?bknSy9pFjYbm3fd6);{D2C2i^XSv;kJ1r@qZSGd1J$^!W-#wk+Lk^= z{J~y7UJl)?3=@C4nlSKQLwT{3&zS;%K^$C()L@?}{5f|^csFsHuAuxz0}mg|88hlC zH&tQ6y}iFqrr_*_i`A>@RZIRn%X-Nu>cgd zKr`hGwa}I=+s7>A;78{&CmKzIbLCNP%@Tv^Js3kaU6(!SLKc3|DAMY&qqy=fG%csnMPpX8QACe) z3=cA9nA;j#rTK1(HeVyOzD)WN#pseS6qeCbe!T%YgV0nZC>qapRoz0{?FTR8?@DgI zW}-%ZDt-x`E08YQczrzdZEsF$&aI1pg7@m+0Q+NOgGBKC%7?X10o~9>sVPb3olb=l zgjg~n&7y(~Ri0p8A|* zLcX->?f2M$Sqxzl!lro|DGC2$-o_g2#+qIcGv20^fRl)yvlvsRgs^YOZnBJ5Z4lno zwKl@wMW`V1ymYSGc2cb^AqquHd1~#-EB);y3blhp36`ierwr@0Z5CJ{)3md}^7Rv| zOr9a>e%jUd?Zn&2mi} z{akE1LY)a>TlD-t#e&rRssizre-h4w9cg0WXT?1XZ(ZYvPL^Bqc+nI3Wkak{6a|jY zNzr*1-y(ok>OB}(ygSxXK|y-7QK{@%@z_3^>;%uO4)Ta>ySQg1t*hOZ{@A8?^k;T< zH`2<4MY}EZFw~O~FCou0$w|> zNLi_qtZxrf{Ji^Jt5h>r^+Ln5Xdt-pPdmpxHoL@!$8(r3qmN(ftf;jeqaxYfI%1H+%;cWG&!vyDR zH8^qGu!oBBQ_k5pgY4e7V=>b$Qy>?Y`=ou@*ZCphW*i^YP2OkF8)uAST}<>OH@^mA zTfXd6$ns7&LaXL>akZ{VP!{7FSTb3N#aM_Hl7w9!tG4m>P4*6>0z!;L3Ci^~@VcI$ z%y~)2DF@T$S3l{yyw{VPMklcIIA4*{tL9U|jJ-u_@s4yO_O@9_31t8p?=MHi29P_@!|PEwgOIBh$5a&8fYw^QcP=x=#-xddpneE_FQOJW!QsCV~ViVFC_S zT-1+s&0}4jElKs3LI(hGy$#$eCIX2+N}+m>x|VTx@Cof3CSW+#&H3E4AE%BF2X zL6H-)x6eOV7ydr<$5SVwc5r;0`y?kp`8vQli>7)xIi+uefG!4GNH@`?J0pOIdL^_X z^p2!3#It^=_r;q4H_t;TcLOeAz^2i&Y@D<$0(}1&2lg7(bSVi5*97FV8x4!(O!iN> zKdM}`XKLHjY|R&>pWo)w&m9XyV81A#P7F`8<(#ZBI){i9Cpqv_FNBQttfPW>TeyrD zYcOr0B4zc|hnxw*Rth27L{jc$v)!KuF*w~M2?=YF*xx(TP)H?SxMtG^;>Mo02!k33 z4dXx+^`*Pjm=h#u9RH@}RalI`(4`A|3Mu;@By*RG&TD&@``er#2O{UqTf{)kW29Q_ zMjZ7AjoOMKC|bpz_u%8LT|@S-fko9a&9?QQC)!QEznRdN6GJ|;qutp5ZfHz)zHfnQ zVDd3Qh9cvxgcPvfFV#QJFB!Y!fSC+Gc^lb|TRKE};NZ)j|W1{%D zcie%+eex@`l)L0--Z}3?QyX<<(4P`Ar7$2q=kK%MWgv3aN9u{3MNtMdkYXd=cXIx# zhbzZpS=SDZ4vyDXh;+@9=0M-T&u(kGqk(Qu3$;99?_dMF%Gt^KJAZm~-Cu$_-3*3f^|N;r%FWnD65lHixXMpdZySsU zdG_|Cd^rZ~TM_=ak%!i@M+3jMo@~M*l<9F`>&3>8MDF|@y@BjKQaY9lPD?efrR*N7 zgSM*gIY3m9Om1L}kH^Wr*`%!ZnKrb!$S_k`REH*vIg37!E8l z3(dY_QH_=W2=kojXWOOqi#R<6cw=h?jHyWgz|bL77&$5|4W)m?fdR#2L~YRZ7!Y{N z3+ijlrjkjyQh-q;@Ocj{Jov}fNJ21D7%ve?tcFj&VO8ST`)R<;g%E}A4aKCL@5Gx& z{z9P_qrwJlFx!X~vIRE|xW3AS)4-voP_`b;nK0s7eEN_sj_3e<(s{BH;5{`#FP8b& z@5J;kt-5Kz6PREp0eyUWi*6o#I8qG$agnbyd{_xJNm0ZtAXMbO{AR7slYZq48{1=~{ST#UK8Bac`Ve*$|S04<$0!?)4j3lzeUl}KO`Mcb+|p~I zpi_vkXoaB|oEv<5evbL^V(|TB6kKI?f1>yXuKbR{Ai&Emc=XgNQXV;R z67gf~#|0oa#r+XhBz2bpBG(3 z@+qW>Y{TRS>!1U@x8Z`GOa?bioYNDHG%>s_sb`i|hm{M_ITTO_dM@3^R_lyX=pU#5buk^Op4K&mCP|leH>tzu+_z(%T*aIO){7OqiYL<-RmUb*WVM zjkF}ZW8 zdlyb$r^?ieT_fPRm?Guy%@LLOBV7?|beB30hv2QoH%lSAD^K%fLP0gWgKB{{A+fz^@HK19x9B%TokFF;vmVd8&V^VI4(l4zG%Li5pVkQi@0|6 zk3`_s+WVlN+`L3FW|k4d(DwO-Fw?-#r*}7C>7@XnfOf~X=(D*76CwmJSJbZo7WMK~ zcTkIOee{k)S-}AIRPlN4`J&by1ifQ(fh%=D1xrHs>o{pR+Jse!#{)p= zrrWmbP2hRlI$*-CS$><{_DRw4LbMbYde{rOIB;-!V_6tD*nJ%Qs0yj`gUF7YScJIy z@KX&bJ)KPfCK!!dK>mGTZ zAo$%Co|Pshh^SF?z9@W{dmgC})28dscv%GZJA3VtNSYiUO>Rt5G#{e5q*DZ$>;VWm%Bvcfj}thpi+1wv5&oIDWm+wS$9FJ2g07f;m-OkDd)708*ZZFfi%x zSOe^6qx5N+cqqa75^?M(bo0}io!0>etZ;XumI=0xTCavkDv?$XFO?ahE|K`}VzSI1 z_Qcc}^$I&}rm$tvrw8qrhP&Cr{YIC+Y8`7MS_)V*P9iXQ_uIdc?rlo?a=Jsi3* zdEhMIDbfkt=X6+rJb|OVV-SMK!$f@>Z;rVEzyURm;;ITugD#3&;mL$HX`t(g7vR`&=1ewvSUvOUfe&AI-yTb`JXLWnUBtjSdV8X9K^LsCF9(AY z%etcylRoEESxVma*G6e3#9z) zv$zHEzIx@$ud9*q7BP4OU@S@Xu5J}49gI6qK*nd4M_oDRG&UwNGxp6U@nYEYd!+Q+ zk0xxvEJSn2WX@*@Y2rck$gaNrIoHlw(m@svCqc9W9W?@a@+!Ct@M~T`P zQ@;y1smKw-T9CP%+hJBRTB8~z*01ZnnsUekz~R#7Q73MpulXwSdRb`j*4n%hT3@sj zeM)mI8s4E+LcIc};;_ufIykbQWdhF=o$?p_+lkkLZj_sk)}4Gn5XguvzWK|3mg!PP z->CeQ(-lKm=fKYb8{1%F#ku>B4dd!S8JQa4EJ+{3A#|z z9ysy{zQ?$*>u2G!Ruxwg$H_X)K?BDnLU@2JWkC1`938{>>G7#6>PTBEmNU~lY*XN5 zIqA#$SDS`vWOW#1N8V_12@a_(bigt28?cY=!jWqsaN>ZYVVTM;+2%VNc(GBzwfOf9z&cMo-`wYe>$uVwa~!`iWq(+ zDrV5Bl9pUoy4@3LvW4w)gtR(Q3`tnSC2QVjVm6UbO9@7OqcjR4D7ob=dObRG75Ji~ g0~t5j6pGI13iCkUto``#?+Ti_vW`-n0yO;p0JuR@w*UYD literal 0 HcmV?d00001 diff --git a/Resources/champ-titre-incoming.png b/Resources/champ-titre-incoming.png index 109575547e1847608b04d318f97c664d3b4b9d67..205064389172550cbd4a7afef8f7169425ec6ca0 100644 GIT binary patch literal 13492 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 literal 8593 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 ABme*a diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index e45e8ef95..21854c92d 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -187,6 +187,10 @@ D31B4B22159876C0002E6C72 /* UICompositeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D31B4B1F159876C0002E6C72 /* UICompositeViewController.m */; }; D31B4B23159876C0002E6C72 /* UICompositeViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = D31B4B20159876C0002E6C72 /* UICompositeViewController.xib */; }; D31B4B24159876C0002E6C72 /* UICompositeViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = D31B4B20159876C0002E6C72 /* UICompositeViewController.xib */; }; + D31B4B281598A390002E6C72 /* avatar-inconnu.png in Resources */ = {isa = PBXBuildFile; fileRef = D31B4B261598A390002E6C72 /* avatar-inconnu.png */; }; + D31B4B291598A390002E6C72 /* avatar-inconnu.png in Resources */ = {isa = PBXBuildFile; fileRef = D31B4B261598A390002E6C72 /* avatar-inconnu.png */; }; + D31B4B2A1598A390002E6C72 /* avatar-small.png in Resources */ = {isa = PBXBuildFile; fileRef = D31B4B271598A390002E6C72 /* avatar-small.png */; }; + D31B4B2B1598A390002E6C72 /* avatar-small.png in Resources */ = {isa = PBXBuildFile; fileRef = D31B4B271598A390002E6C72 /* avatar-small.png */; }; D31C9C8A158A179A00756B45 /* fond-detail-numero.png in Resources */ = {isa = PBXBuildFile; fileRef = D31C9C89158A179A00756B45 /* fond-detail-numero.png */; }; D31C9C8B158A179A00756B45 /* fond-detail-numero.png in Resources */ = {isa = PBXBuildFile; fileRef = D31C9C89158A179A00756B45 /* fond-detail-numero.png */; }; D31C9C90158A1C1000756B45 /* appel-entrant.png in Resources */ = {isa = PBXBuildFile; fileRef = D31C9C8D158A1C1000756B45 /* appel-entrant.png */; }; @@ -884,6 +888,8 @@ D31B4B1E159876C0002E6C72 /* UICompositeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UICompositeViewController.h; sourceTree = ""; }; D31B4B1F159876C0002E6C72 /* UICompositeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UICompositeViewController.m; sourceTree = ""; }; D31B4B20159876C0002E6C72 /* UICompositeViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UICompositeViewController.xib; sourceTree = ""; }; + D31B4B261598A390002E6C72 /* avatar-inconnu.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "avatar-inconnu.png"; path = "Resources/avatar-inconnu.png"; sourceTree = ""; }; + D31B4B271598A390002E6C72 /* avatar-small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "avatar-small.png"; path = "Resources/avatar-small.png"; sourceTree = ""; }; D31C9C89158A179A00756B45 /* fond-detail-numero.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "fond-detail-numero.png"; path = "Resources/fond-detail-numero.png"; sourceTree = ""; }; D31C9C8D158A1C1000756B45 /* appel-entrant.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "appel-entrant.png"; path = "Resources/appel-entrant.png"; sourceTree = ""; }; D31C9C8E158A1C1000756B45 /* appel-manque.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "appel-manque.png"; path = "Resources/appel-manque.png"; sourceTree = ""; }; @@ -1746,6 +1752,8 @@ D3ED3E7015861ABD006C0DE4 /* appeler-actif.png */, D35E758C15934F360066B1C1 /* appeler-disabled.png */, D3ED3E7115861ABD006C0DE4 /* appeler-over.png */, + D31B4B261598A390002E6C72 /* avatar-inconnu.png */, + D31B4B271598A390002E6C72 /* avatar-small.png */, D3ED3E7615861B1B006C0DE4 /* backspace-actif.png */, D35E758815932DE60066B1C1 /* backspace-disabled.png */, D3ED3E7715861B1B006C0DE4 /* backspace-over.png */, @@ -2217,6 +2225,8 @@ D3F26BF915986DAD005F9CAB /* ok-edit-list-history-over.png in Resources */, D3F26BFC15987083005F9CAB /* champ-titre-incoming.png in Resources */, D31B4B23159876C0002E6C72 /* UICompositeViewController.xib in Resources */, + D31B4B281598A390002E6C72 /* avatar-inconnu.png in Resources */, + D31B4B2A1598A390002E6C72 /* avatar-small.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2387,6 +2397,8 @@ D3F26BFA15986DAD005F9CAB /* ok-edit-list-history-over.png in Resources */, D3F26BFD15987083005F9CAB /* champ-titre-incoming.png in Resources */, D31B4B24159876C0002E6C72 /* UICompositeViewController.xib in Resources */, + D31B4B291598A390002E6C72 /* avatar-inconnu.png in Resources */, + D31B4B2B1598A390002E6C72 /* avatar-small.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; };