From 8e1fdcb62701d08ca01ca025adf44dad7d72520a Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Thu, 3 Nov 2011 11:30:32 +0100 Subject: [PATCH 01/11] Fix various Xcode warnings --- Classes/LinphoneUI/UIBluetoothButton.m | 4 ++-- Classes/LinphoneUI/UISpeakerButton.m | 2 +- Classes/LinphoneUI/UIToggleButton.h | 1 + Classes/LinphoneUI/UIToggleButton.m | 14 ++++++++++++++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Classes/LinphoneUI/UIBluetoothButton.m b/Classes/LinphoneUI/UIBluetoothButton.m index 539422c2c..4f3248a39 100644 --- a/Classes/LinphoneUI/UIBluetoothButton.m +++ b/Classes/LinphoneUI/UIBluetoothButton.m @@ -23,14 +23,14 @@ @implementation UIBluetoothButton #define check_auresult(au,method) \ -if (au!=0) ms_error("UIBluetoothButton error for %s: ret=%i",method,au) +if (au!=0) ms_error("UIBluetoothButton error for %s: ret=%ld",method,au) -(void) onOn { //redirect audio to bluetooth UInt32 size = sizeof(CFStringRef); CFStringRef route="HeadsetBT"; - OSStatus result = AudioSessionSetProperty(kAudioSessionProperty_AudioRoute, &size, &route); + OSStatus result = AudioSessionSetProperty(kAudioSessionProperty_AudioRoute, size, &route); check_auresult(result,"set kAudioSessionProperty_AudioRoute HeadsetBT"); int allowBluetoothInput = 1; diff --git a/Classes/LinphoneUI/UISpeakerButton.m b/Classes/LinphoneUI/UISpeakerButton.m index a513d67ce..717025e00 100644 --- a/Classes/LinphoneUI/UISpeakerButton.m +++ b/Classes/LinphoneUI/UISpeakerButton.m @@ -40,7 +40,7 @@ static void audioRouteChangeListenerCallback ( AudioSessionInitialize(NULL, NULL, NULL, NULL); OSStatus lStatus = AudioSessionAddPropertyListener(routeChangeID, audioRouteChangeListenerCallback, self); if (lStatus) { - ms_error ("cannot register route change handler [%i]",lStatus); + ms_error ("cannot register route change handler [%ld]",lStatus); } } diff --git a/Classes/LinphoneUI/UIToggleButton.h b/Classes/LinphoneUI/UIToggleButton.h index bd960cee2..61ba8aba7 100644 --- a/Classes/LinphoneUI/UIToggleButton.h +++ b/Classes/LinphoneUI/UIToggleButton.h @@ -24,6 +24,7 @@ -(void) onOff; -(bool) isInitialStateOn; @end + @interface UIToggleButton : UIButton { @private UIImage* mOnImage; diff --git a/Classes/LinphoneUI/UIToggleButton.m b/Classes/LinphoneUI/UIToggleButton.m index 0f5a81e07..5961a46c1 100644 --- a/Classes/LinphoneUI/UIToggleButton.m +++ b/Classes/LinphoneUI/UIToggleButton.m @@ -69,5 +69,19 @@ [mOffImage release]; } +-(void) onOn { + [NSException raise:NSInternalInconsistencyException + format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]; +} +-(void) onOff { + [NSException raise:NSInternalInconsistencyException + format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]; +} +-(bool) isInitialStateOn { + [NSException raise:NSInternalInconsistencyException + format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]; + return false; +} + @end From 8c8843d035e215f558cd0daac6f40e58655cda1b Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Thu, 3 Nov 2011 12:08:47 +0100 Subject: [PATCH 02/11] First multicall working version --- Classes/AdvancedPhoneViewController.m | 20 +- Classes/CallDelegate.h | 27 ++ Classes/CallDelegate.m | 20 + Classes/IncallViewController.h | 8 +- Classes/IncallViewController.m | 196 +++++++- Classes/IncallViewController.xib | 142 +++++- Classes/LinphoneAppDelegate.m | 1 + Classes/LinphoneUI/LinphoneManager.m | 31 +- Classes/LinphoneUI/LinphoneUIDelegates.h | 8 +- Classes/PhoneViewController.h | 7 +- Classes/PhoneViewController.m | 52 +- Classes/PhoneViewController.xib | 523 +++++++------------- PhoneMainView.xib | 581 +++-------------------- linphone.xcodeproj/project.pbxproj | 33 +- linphonerc | 2 +- 15 files changed, 687 insertions(+), 964 deletions(-) create mode 100644 Classes/CallDelegate.h create mode 100644 Classes/CallDelegate.m diff --git a/Classes/AdvancedPhoneViewController.m b/Classes/AdvancedPhoneViewController.m index d4b3a0392..1328e5ad3 100644 --- a/Classes/AdvancedPhoneViewController.m +++ b/Classes/AdvancedPhoneViewController.m @@ -18,7 +18,7 @@ */ #import "AdvancedPhoneViewController.h" - +#import "IncallViewController.h" @implementation AdvancedPhoneViewController @@ -38,29 +38,29 @@ withDisplayName:displayName]; } --(void) displayCallInProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { +-(void) displayCall: (LinphoneCall*) call InProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { /*[super displayCallInProgressFromUI:viewCtrl forUser:username withDisplayName:displayName];*/ [self presentModalViewController:mIncallViewController animated:true]; - [mIncallViewController displayCallInProgressFromUI:viewCtrl + [mIncallViewController displayCall:call InProgressFromUI:viewCtrl forUser:username withDisplayName:displayName]; } --(void) displayIncallFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - - if (linphone_call_get_dir(currentCall)==LinphoneCallIncoming){ - [self presentModalViewController:mIncallViewController animated:true]; - } - [super displayIncallFromUI:viewCtrl +-(void) displayInCall: (LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { + if (linphone_call_get_dir(call)==LinphoneCallIncoming){ + [self presentModalViewController:mIncallViewController animated:true]; + } + + [super displayInCall:call FromUI:viewCtrl forUser:username withDisplayName:displayName]; - [mIncallViewController displayIncallFromUI:viewCtrl + [mIncallViewController displayInCall:call FromUI:viewCtrl forUser:username withDisplayName:displayName]; diff --git a/Classes/CallDelegate.h b/Classes/CallDelegate.h new file mode 100644 index 000000000..02b69b026 --- /dev/null +++ b/Classes/CallDelegate.h @@ -0,0 +1,27 @@ +// +// CallDelegate.h +// linphone +// +// Created by Pierre-Eric Pelloux-Prayer on 03/11/11. +// Copyright (c) 2011 __MyCompanyName__. All rights reserved. +// + +#import +#include "linphonecore.h" + + +@protocol UIActionSheetCustomDelegate +- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex withUserDatas:(void*) datas; +@end + + +@interface CallDelegate : NSObject { + + LinphoneCall* call; + id delegate; +} + +@property (nonatomic) LinphoneCall* call; +@property (nonatomic, retain) id delegate; + +@end diff --git a/Classes/CallDelegate.m b/Classes/CallDelegate.m new file mode 100644 index 000000000..6ae87a25c --- /dev/null +++ b/Classes/CallDelegate.m @@ -0,0 +1,20 @@ +// +// CallDelegate.m +// linphone +// +// Created by Pierre-Eric Pelloux-Prayer on 03/11/11. +// Copyright (c) 2011 __MyCompanyName__. All rights reserved. +// + +#import "CallDelegate.h" + +@implementation CallDelegate + +@synthesize call; +@synthesize delegate; + +-(void) actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { + [delegate actionSheet:actionSheet clickedButtonAtIndex:buttonIndex withUserDatas:call]; +} + +@end diff --git a/Classes/IncallViewController.h b/Classes/IncallViewController.h index fd783733e..9635700c1 100644 --- a/Classes/IncallViewController.h +++ b/Classes/IncallViewController.h @@ -23,7 +23,7 @@ #include "UILinphone.h" -@interface IncallViewController : UIViewController { +@interface IncallViewController : UIViewController { UIView* controlSubView; @@ -38,6 +38,7 @@ UIPauseResumeButton* pause; UISpeakerButton* speaker; UIButton* contacts; + UITableView* callTableView; //key pad @@ -57,6 +58,10 @@ UIDigitButton* hash; UIHangUpButton* endPad; UIButton* close; + + bool dismissed; + + NSTimer *durationRefreasher; ABPeoplePickerNavigationController* myPeoplePickerController; } @@ -78,6 +83,7 @@ @property (nonatomic, retain) IBOutlet UIButton* pause; @property (nonatomic, retain) IBOutlet UIButton* speaker; @property (nonatomic, retain) IBOutlet UIButton* contacts; +@property (nonatomic, retain) IBOutlet UITableView* callTableView; @property (nonatomic, retain) IBOutlet UIButton* one; diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index c3a7464e9..5af0c2f89 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -19,8 +19,8 @@ #import "IncallViewController.h" #import #import "linphonecore.h" - - +#include "LinphoneManager.h" +#include "private.h" @implementation IncallViewController @@ -39,6 +39,7 @@ @synthesize dialer; @synthesize speaker; @synthesize contacts; +@synthesize callTableView; @synthesize one; @synthesize two; @@ -71,7 +72,9 @@ [super viewDidLoad]; //Controls [mute initWithOnImage:[UIImage imageNamed:@"mic_muted.png"] offImage:[UIImage imageNamed:@"mic_active.png"] ]; - [pause initWithOnImage:[UIImage imageNamed:@"resumecall.png"] offImage:[UIImage imageNamed:@"pausecall.png"] ]; + UIImage* rc = [UIImage imageNamed:@"resumecall.png"]; + UIImage* pc = [UIImage imageNamed:@"pausecall.png"]; + [pause initWithOnImage:rc offImage:pc ]; [speaker initWithOnImage:[UIImage imageNamed:@"Speaker-32-on.png"] offImage:[UIImage imageNamed:@"Speaker-32-off.png"] ]; @@ -92,8 +95,29 @@ } +-(void)updateCallsDurations { + [callTableView reloadData]; +} +-(void)viewDidAppear:(BOOL)animated { + if (dismissed) { + [self dismissModalViewControllerAnimated:true]; + } else { + [self updateCallsDurations]; + durationRefreasher = [NSTimer scheduledTimerWithTimeInterval:1 + target:self + selector:@selector(updateCallsDurations) + userInfo:nil + repeats:YES]; + } +} +- (void) viewDidDisappear:(BOOL)animated { + if (durationRefreasher != nil) { + [durationRefreasher invalidate]; + durationRefreasher=nil; + } +} - (void)viewDidUnload { @@ -102,13 +126,15 @@ -(void) displayStatus:(NSString*) message; { [status setText:message]; + + [callTableView reloadData]; } -(void) displayPad:(bool) enable { [controlSubView setHidden:enable]; [padSubView setHidden:!enable]; } --(void) displayCallInProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { +-(void) displayCall:(LinphoneCall*) call InProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { //restaure view [self displayPad:false]; @@ -120,18 +146,31 @@ [peerNumber setText:@""]; } [callDuration setText:@"Calling"]; + dismissed = false; + + [callTableView reloadData]; } --(void) displayIncallFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { +-(void) displayIncomingCall:(LinphoneCall *)call NotificationFromUI:(UIViewController *)viewCtrl forUser:(NSString *)username withDisplayName:(NSString *)displayName { + +} + +-(void) displayInCall:(LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { [callDuration start]; + dismissed = false; + [callTableView reloadData]; } -(void) displayDialerFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { [callDuration stop]; [self dismissModalViewControllerAnimated:true]; + dismissed = true; + [callTableView reloadData]; } -(void) updateUIFromLinphoneState:(UIViewController *)viewCtrl { [mute reset]; [pause reset]; + + [callTableView reloadData]; } - (IBAction)doAction:(id)sender { @@ -177,5 +216,152 @@ [super dealloc]; } +bool isInConference(LinphoneCall* call) { + return linphone_call_get_current_params(call)->in_conference; +} + +int callCount(LinphoneCore* lc) { + int count = 0; + const MSList* calls = linphone_core_get_calls(lc); + + while (calls != 0) { + if (!isInConference((LinphoneCall*)calls->data)) { + count++; + } + calls = calls->next; + } + return count; +} + +-(LinphoneCall*) retrieveCallAtIndex: (NSInteger) index inConference:(bool) conf{ + const MSList* calls = linphone_core_get_calls([LinphoneManager getLc]); + + while (calls != 0 && index > 0) { + if (isInConference((LinphoneCall*)calls->data) == conf) { + index--; + } + calls = calls->next; + } + + if (calls == 0) { + ms_error("Cannot find call with index %d (in conf: %d)", index, conf); + return nil; + } else { + return (LinphoneCall*)calls->data; + } +} + + + +- (void) updateCell:(UITableViewCell*)cell withCall:(LinphoneCall*) call conferenceActive:(bool)confActive{ + if (call == NULL) { + ms_error("UpdateCell called with null call"); + [cell.textLabel setText:@"BUG IN APP - call is null"]; + return; + } + const LinphoneAddress* addr = linphone_call_get_remote_address(call); + if (addr) { + NSMutableString* mss = [[NSMutableString alloc] init]; + + const char* n = linphone_address_get_display_name(addr); + if (n) + [mss appendFormat:@"%s", n, nil]; + else + [mss appendFormat:@"%s", linphone_address_get_username(addr), nil]; + [cell.textLabel setText:mss]; + } else + [cell.textLabel setText:@"plop"]; + + NSMutableString* ms = [[NSMutableString alloc] init ]; + if (linphone_call_get_state(call) == LinphoneCallStreamsRunning) { + int duration = linphone_call_get_duration(call); + if (duration >= 60) + [ms appendFormat:@"%02i:%02i", (duration/60), duration - 60*(duration/60), nil]; + else + [ms appendFormat:@"%02i sec", duration, nil]; + } else { + [ms appendFormat:@"%s", linphone_call_state_to_string(linphone_call_get_state(call)), nil]; + } + [cell.detailTextLabel setText:ms]; + + if (linphone_core_get_current_call([LinphoneManager getLc]) == call) + cell.accessoryType = UITableViewCellAccessoryCheckmark; + else if (confActive && isInConference(call)) + cell.accessoryType = UITableViewCellAccessoryCheckmark; + else + cell.accessoryType = UITableViewCellAccessoryNone; +} + + +// UITableViewDataSource (required) +- (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + UITableViewCell *cell = [callTableView dequeueReusableCellWithIdentifier:@"MyIdentifier"]; + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MyIdentifier"] autorelease]; + cell.selectionStyle = UITableViewCellSelectionStyleNone; + } + + ms_message("pouet"); + + LinphoneCore* lc = [LinphoneManager getLc]; + if (indexPath.section == 0 && linphone_core_get_conference_size(lc) > 0) + [self updateCell:cell withCall: [self retrieveCallAtIndex:indexPath.row inConference:true] conferenceActive:linphone_core_is_in_conference(lc)]; + else + [self updateCell:cell withCall: [self retrieveCallAtIndex:indexPath.row inConference:false] + conferenceActive:linphone_core_is_in_conference(lc)]; + + + /*NSString *path = [[NSBundle mainBundle] pathForResource:[item objectForKey:@"imageKey"] ofType:@"png"]; + UIImage *theImage = [UIImage imageWithContentsOfFile:path]; + cell.imageView.image = theImage;*/ + return cell; +} + + +// UITableViewDataSource (required) +- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +{ + LinphoneCore* lc = [LinphoneManager getLc]; + + if (section == 0 && linphone_core_get_conference_size(lc) > 0) + return linphone_core_get_conference_size(lc) - linphone_core_is_in_conference(lc); + + return callCount(lc); +} + +// UITableViewDataSource +- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { + LinphoneCore* lc = [LinphoneManager getLc]; + int count = 0; + + if (callCount(lc) > 0) + count++; + + if (linphone_core_get_conference_size([LinphoneManager getLc]) > 0) + count ++; + + return count; +} + +// UITableViewDataSource +//- (NSArray*) sectionIndexTitlesForTableView:(UITableView *)tableView { +// return [NSArray arrayWithObjects:@"Conf", @"Calls", nil ]; +//} + +// UITableViewDataSource +- (NSString*) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section +{ + if (section == 0 && linphone_core_get_conference_size([LinphoneManager getLc]) > 0) + return @"CONF"; + else + return @"CALLS"; +} + +// UITableViewDataSource +- (NSString*) tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section +{ + return nil; +} + @end diff --git a/Classes/IncallViewController.xib b/Classes/IncallViewController.xib index a2b4e804e..b1930ec64 100644 --- a/Classes/IncallViewController.xib +++ b/Classes/IncallViewController.xib @@ -12,6 +12,7 @@ YES + IBUITableView IBUIViewController IBUIButton IBUIView @@ -42,9 +43,89 @@ 274 YES + + + 274 + {320, 182} + + + _NS:418 + + 10 + + 549453824 + {512, 1} + + YES + + YES + + + + TU0AKgAACAjFzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ +y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ +y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ +y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ +y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/wANAQAAAwAAAAECAAAAAQEAAwAAAAEAAQAAAQIAAwAAAAQAAAiqAQMAAwAA +AAEAAQAAAQYAAwAAAAEAAgAAAREABAAAAAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEABAAAARYAAwAA +AAEAAQAAARcABAAAAAEAAAgAARwAAwAAAAEAAQAAAVIAAwAAAAEAAQAAAVMAAwAAAAQAAAiyAAAAAAAI +AAgACAAIAAEAAQABAAE + + + + + + 3 + MCAwAA + + + groupTableViewBackgroundColor + + YES + IBCocoaTouchFramework + YES + NO + 1 + 2 + 0 + YES + 44 + 10 + 10 + - 292 + -2147483356 {320, 55} @@ -74,7 +155,7 @@ - 292 + -2147483356 {{31, 63}, {61, 21}} @@ -93,11 +174,11 @@ - 292 + -2147483356 {{239, 63}, {65, 21}} - + NO YES NO @@ -112,7 +193,7 @@ - 292 + -2147483356 {{31, 347}, {258, 21}} @@ -180,7 +261,7 @@ {{170, 266}, {72, 37}} - + NO NO IBCocoaTouchFramework @@ -531,7 +612,7 @@ {{0, 121}, {82, 52}} - + NO NO IBCocoaTouchFramework @@ -559,7 +640,7 @@ {{6, 261}, {258, 52}} - + NO NO IBCocoaTouchFramework @@ -582,7 +663,7 @@ {{90, 115}, {82, 52}} - + NO NO IBCocoaTouchFramework @@ -632,7 +713,7 @@ {{181, 61}, {82, 52}} - + NO NO IBCocoaTouchFramework @@ -905,6 +986,14 @@ 105 + + + callTableView + + + + 109 + doAction: @@ -932,6 +1021,22 @@ 101 + + + dataSource + + + + 107 + + + + delegate + + + + 108 + @@ -975,6 +1080,7 @@ + @@ -1160,6 +1266,11 @@ pauseresume + + 106 + + + @@ -1173,6 +1284,7 @@ 10.IBPluginDependency 104.CustomClassName 104.IBPluginDependency + 106.IBPluginDependency 11.IBPluginDependency 12.CustomClassName 12.IBPluginDependency @@ -1227,6 +1339,7 @@ UIPauseResumeButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDuration com.apple.InterfaceBuilder.IBCocoaTouchPlugin UISpeakerButton @@ -1283,7 +1396,7 @@ - 105 + 109 @@ -1307,6 +1420,7 @@ YES callDuration + callTableView close contacts controlSubView @@ -1336,6 +1450,7 @@ YES UILabel + UITableView UIButton UIButton UIView @@ -1368,6 +1483,7 @@ YES callDuration + callTableView close contacts controlSubView @@ -1400,6 +1516,10 @@ callDuration UILabel + + callTableView + UITableView + close UIButton diff --git a/Classes/LinphoneAppDelegate.m b/Classes/LinphoneAppDelegate.m index 5344f5f50..736d06e16 100644 --- a/Classes/LinphoneAppDelegate.m +++ b/Classes/LinphoneAppDelegate.m @@ -24,6 +24,7 @@ #import "ConsoleViewController.h" #import "MoreViewController.h" +#include "CallHistoryTableViewController.h" #include "LinphoneManager.h" diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index fed0660d9..0b02bf203 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -113,31 +113,36 @@ extern void libmssilk_init(); } return; } --(void) onCall:(LinphoneCall*) currentCall StateChanged: (LinphoneCallState) new_state withMessage: (const char *) message { - const char* lUserNameChars=linphone_address_get_username(linphone_call_get_remote_address(currentCall)); +-(void) onCall:(LinphoneCall*) call StateChanged: (LinphoneCallState) new_state withMessage: (const char *) message { + const char* lUserNameChars=linphone_address_get_username(linphone_call_get_remote_address(call)); NSString* lUserName = lUserNameChars?[[NSString alloc] initWithCString:lUserNameChars]:NSLocalizedString(@"Unknown",nil); if (new_state == LinphoneCallIncomingReceived) { - [self updateCallWithAddressBookData:currentCall]; // display name is updated + [self updateCallWithAddressBookData:call]; // display name is updated } - const char* lDisplayNameChars = linphone_address_get_display_name(linphone_call_get_remote_address(currentCall)); + const char* lDisplayNameChars = linphone_address_get_display_name(linphone_call_get_remote_address(call)); NSString* lDisplayName = lDisplayNameChars?[[NSString alloc] initWithCString:lDisplayNameChars]:@""; + + bool canHideInCallView = (linphone_core_get_calls([LinphoneManager getLc]) == NULL); switch (new_state) { case LinphoneCallIncomingReceived: - [callDelegate displayIncomingCallNotigicationFromUI:mCurrentViewController + [callDelegate displayIncomingCall:call + NotificationFromUI:mCurrentViewController forUser:lUserName withDisplayName:lDisplayName]; break; case LinphoneCallOutgoingInit: - [callDelegate displayCallInProgressFromUI:mCurrentViewController + [callDelegate displayCall:call + InProgressFromUI:mCurrentViewController forUser:lUserName withDisplayName:lDisplayName]; break; case LinphoneCallConnected: - [callDelegate displayIncallFromUI:mCurrentViewController + [callDelegate displayInCall: call + FromUI:mCurrentViewController forUser:lUserName withDisplayName:lDisplayName]; break; @@ -170,15 +175,19 @@ extern void libmssilk_init(); cancelButtonTitle:NSLocalizedString(@"Dismiss",nil) otherButtonTitles:nil]; [error show]; - [callDelegate displayDialerFromUI:mCurrentViewController + if (canHideInCallView) { + [callDelegate displayDialerFromUI:mCurrentViewController forUser:@"" withDisplayName:@""]; + } break; } - case LinphoneCallEnd: - [callDelegate displayDialerFromUI:mCurrentViewController + case LinphoneCallEnd: + if (canHideInCallView) { + [callDelegate displayDialerFromUI:mCurrentViewController forUser:@"" withDisplayName:@""]; + } break; default: break; @@ -437,7 +446,7 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach const char* password = [accountPassword cStringUsingEncoding:[NSString defaultCStringEncoding]]; NSString* proxyAddress = [[NSUserDefaults standardUserDefaults] stringForKey:@"proxy_preference"]; - if ((!proxyAddress | [proxyAddress length] <1 ) && domain) { + if ((!proxyAddress || [proxyAddress length] <1 ) && domain) { proxyAddress = [NSString stringWithFormat:@"sip:%@",domain] ; } else { proxyAddress = [NSString stringWithFormat:@"sip:%@",proxyAddress] ; diff --git a/Classes/LinphoneUI/LinphoneUIDelegates.h b/Classes/LinphoneUI/LinphoneUIDelegates.h index 081139167..a6ced61e7 100644 --- a/Classes/LinphoneUI/LinphoneUIDelegates.h +++ b/Classes/LinphoneUI/LinphoneUIDelegates.h @@ -17,14 +17,14 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #import - +#include "linphonecore.h" @protocol LinphoneUICallDelegate // UI changes -(void) displayDialerFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName; --(void) displayCallInProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName; --(void) displayIncomingCallNotigicationFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName; --(void) displayIncallFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName; +-(void) displayCall: (LinphoneCall*) call InProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName; +-(void) displayIncomingCall: (LinphoneCall*) call NotificationFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName; +-(void) displayInCall: (LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName; -(void) updateUIFromLinphoneState:(UIViewController*) viewCtrl; //status reporting -(void) displayStatus:(NSString*) message; diff --git a/Classes/PhoneViewController.h b/Classes/PhoneViewController.h index 886df2a97..07df3c9b5 100644 --- a/Classes/PhoneViewController.h +++ b/Classes/PhoneViewController.h @@ -20,12 +20,13 @@ #import #import "linphonecore.h" #import "UILinphone.h" +#import "CallDelegate.h" @class IncallViewController; @class FirstLoginViewController; -@interface PhoneViewController : UIViewController { +@interface PhoneViewController : UIViewController { @private //UI definition @@ -41,7 +42,7 @@ UILabel* peerLabel; - UICallButton* call; + UICallButton* __call; UIHangUpButton* hangup; UILabel* status; @@ -70,7 +71,7 @@ } @property (nonatomic, retain) IBOutlet UIView* dialerView; @property (nonatomic, retain) IBOutlet UITextField* address; -@property (nonatomic, retain) IBOutlet UIButton* call; +@property (nonatomic, retain) IBOutlet UIButton* __call; @property (nonatomic, retain) IBOutlet UIButton* hangup; @property (nonatomic, retain) IBOutlet UILabel* status; @property (nonatomic, retain) IBOutlet UIEraseButton* erase; diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index 6b49a18f0..f460f34db 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -22,13 +22,14 @@ #import #import #import "LinphoneManager.h" +#include "FirstLoginViewController.h" @implementation PhoneViewController @synthesize dialerView ; @synthesize address ; -@synthesize call; +@synthesize __call; @synthesize hangup; @synthesize status; @synthesize erase; @@ -69,21 +70,6 @@ } - - - - -/* - // 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]) { - } - - return self; - } - */ - - - (void)viewDidAppear:(BOOL)animated { [[UIApplication sharedApplication] setIdleTimerDisabled:true]; [mute reset]; @@ -117,7 +103,7 @@ [nine initWithNumber:'9' addressField:address ]; [star initWithNumber:'*' addressField:address ]; [hash initWithNumber:'#' addressField:address ]; - [call initWithAddress:address withDisplayName:mDisplayName]; + [__call initWithAddress:address withDisplayName:mDisplayName]; [mute initWithOnImage:[UIImage imageNamed:@"mic_muted.png"] offImage:[UIImage imageNamed:@"mic_active.png"] ]; [speaker initWithOnImage:[UIImage imageNamed:@"Speaker-32-on.png"] offImage:[UIImage imageNamed:@"Speaker-32-off.png"] ]; [erase initWithAddressField:address]; @@ -178,7 +164,7 @@ [incallView setHidden:true]; [dialerView setHidden:false]; - [call setEnabled:true]; + [__call setEnabled:true]; [hangup setEnabled:false]; [callDuration stop]; @@ -194,7 +180,7 @@ [myTabBarController setSelectedIndex:DIALER_TAB_INDEX]; } --(void) displayIncalViewforUser:(NSString*) username withDisplayName:(NSString*) displayName { +-(void) displayInCall: (LinphoneCall*) call ViewforUser:(NSString*) username withDisplayName:(NSString*) displayName { UIDevice *device = [UIDevice currentDevice]; device.proximityMonitoringEnabled = YES; if (device.proximityMonitoringEnabled == YES) { @@ -211,20 +197,20 @@ [incallView setHidden:false]; [dialerView setHidden:true]; } --(void) displayCallInProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - [self displayIncalViewforUser:username +-(void) displayCall:(LinphoneCall*) call InProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { + [self displayInCall: call ViewforUser:username withDisplayName:displayName]; - [call setEnabled:false]; + [__call setEnabled:false]; [callDuration setText:NSLocalizedString(@"Calling...",nil)]; if ([speaker isOn]) [speaker toggle] ; //preset to off } --(void) displayIncallFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { +-(void) displayInCall:(LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { [callDuration start]; [callDuration setHidden:false]; if (linphone_call_get_dir(linphone_core_get_current_call([LinphoneManager getLc])) == LinphoneCallIncoming) { - [self displayIncalViewforUser:username + [self displayInCall: call ViewforUser:username withDisplayName:displayName]; if ([speaker isOn]) [speaker toggle] ; //preset to off; } @@ -239,7 +225,7 @@ } --(void) displayIncomingCallNotigicationFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { +-(void) displayIncomingCall:(LinphoneCall*) call NotificationFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)] && [UIApplication sharedApplication].applicationState == UIApplicationStateBackground) { @@ -255,22 +241,28 @@ [[UIApplication sharedApplication] presentLocalNotificationNow:notif]; } } else { + CallDelegate* cd = [[CallDelegate alloc] init]; + cd.delegate = self; + cd.call = call; + mIncomingCallActionSheet = [[UIActionSheet alloc] initWithTitle:[NSString stringWithFormat:NSLocalizedString(@" %@ is calling you",nil),[displayName length]>0?displayName:username] - delegate:self + delegate:cd cancelButtonTitle:NSLocalizedString(@"Decline",nil) destructiveButtonTitle:NSLocalizedString(@"Answer",nil) otherButtonTitles:nil]; + mIncomingCallActionSheet.actionSheetStyle = UIActionSheetStyleDefault; [mIncomingCallActionSheet showInView:self.view]; [mIncomingCallActionSheet release]; } } -- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { +- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex withUserDatas:(void *)datas{ + LinphoneCall* call = (LinphoneCall*)datas; if (buttonIndex == 0 ) { - linphone_core_accept_call([LinphoneManager getLc],linphone_core_get_current_call([LinphoneManager getLc])); + linphone_core_accept_call([LinphoneManager getLc],call); } else { - linphone_core_terminate_call ([LinphoneManager getLc],linphone_core_get_current_call([LinphoneManager getLc])); + linphone_core_terminate_call ([LinphoneManager getLc], call); } mIncomingCallActionSheet = nil; } @@ -284,7 +276,7 @@ [mute dealloc]; [speaker dealloc]; [peerLabel dealloc]; - [call dealloc]; + [__call dealloc]; [hangup dealloc]; [status dealloc]; [one dealloc]; diff --git a/Classes/PhoneViewController.xib b/Classes/PhoneViewController.xib index 2150c0314..9e854ae94 100644 --- a/Classes/PhoneViewController.xib +++ b/Classes/PhoneViewController.xib @@ -2,30 +2,30 @@ 784 - 10J567 - 823 - 1038.35 - 462.00 + 11C74 + 1938 + 1138.23 + 567.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 + 933 - + YES - + IBUITextField + IBUIViewController + IBUIButton + IBUIView + IBUILabel + IBProxyObject YES com.apple.InterfaceBuilder.IBCocoaTouchPlugin - YES - - YES - - - YES - + PluginDependencyRecalculationVersion + YES @@ -53,6 +53,7 @@ 292 {320, 40} + NO YES NO @@ -66,12 +67,22 @@ 1 10 1 + + 1 + 17 + + + Helvetica + 17 + 16 + 292 {{98, 38}, {124, 21}} + NO YES NO @@ -82,22 +93,20 @@ 1 10 1 + + 292 {{239, 14}, {72, 37}} + NO NO IBCocoaTouchFramework 0 0 - - Helvetica-Bold - 15 - 16 - 3 MQA @@ -114,18 +123,29 @@ NSImage Speaker-32-off.png + + Helvetica-Bold + Helvetica + 2 + 15 + + + Helvetica-Bold + 15 + 16 + 292 {{0, 14}, {72, 37}} + NO NO IBCocoaTouchFramework 0 0 - 1 @@ -136,10 +156,13 @@ NSImage mic_active.png + + {320, 65} + 1 MC45MDE5NjA3OSAwLjkwMTk2MDc5IDAuOTAxOTYwNzkAA @@ -157,11 +180,11 @@ 292 {{254, 0}, {66, 65}} + NO IBCocoaTouchFramework 0 0 - <- @@ -173,12 +196,15 @@ NSImage clavier-01-106px.png + + 292 {{5, 0}, {255, 66}} + NO NO IBCocoaTouchFramework @@ -192,11 +218,6 @@ 2 - - Helvetica - 36 - 16 - YES 15 @@ -205,10 +226,22 @@ IBCocoaTouchFramework 1 + + Helvetica + Helvetica + 0 + 36 + + + Helvetica + 36 + 16 + {320, 65} + 1 MC45MDE5NjA3OSAwLjkwMTk2MDc5IDAuOTAxOTYwNzkAA @@ -220,12 +253,12 @@ 292 {{0, 328}, {160, 66}} + NO NO IBCocoaTouchFramework 0 0 - 1 @@ -240,12 +273,15 @@ NSImage clavier-01-160px.png + + 292 {{9, 390}, {304, 21}} + NO YES NO @@ -255,18 +291,20 @@ 1 10 + + 292 {{213, 64}, {107, 66}} + NO NO IBCocoaTouchFramework 0 0 - 3 @@ -275,18 +313,20 @@ + + 292 {{0, 130}, {107, 66}} + NO NO IBCocoaTouchFramework 0 0 - 4 @@ -295,18 +335,20 @@ + + 292 {{107, 130}, {106, 66}} + NO NO IBCocoaTouchFramework 0 0 - 5 @@ -318,18 +360,20 @@ NSImage clavier-01-108px.png + + 292 {{213, 130}, {107, 66}} + NO NO IBCocoaTouchFramework 0 0 - 6 @@ -338,18 +382,20 @@ + + 292 {{0, 196}, {107, 66}} + NO NO IBCocoaTouchFramework 0 0 - 7 @@ -358,18 +404,20 @@ + + 292 {{213, 196}, {107, 66}} + NO NO IBCocoaTouchFramework 0 0 - 9 @@ -378,18 +426,20 @@ + + 292 {{107, 64}, {106, 66}} + NO NO IBCocoaTouchFramework 0 0 - 2 @@ -398,12 +448,15 @@ + + 292 {{0, 64}, {107, 66}} + 1 MC40MDAwMDAwMSAxIDEgMAA @@ -413,7 +466,6 @@ IBCocoaTouchFramework 0 0 - 1 @@ -422,18 +474,20 @@ + + 292 {{0, 262}, {107, 66}} + NO NO IBCocoaTouchFramework 0 0 - * @@ -442,18 +496,20 @@ + + 292 {{107, 262}, {106, 66}} + NO NO IBCocoaTouchFramework 0 0 - 0+ @@ -462,18 +518,20 @@ + + 292 {{213, 262}, {107, 66}} + NO NO IBCocoaTouchFramework 0 0 - # @@ -482,18 +540,20 @@ + + 292 {{107, 196}, {106, 66}} + NO NO IBCocoaTouchFramework 0 0 - 8 @@ -502,19 +562,21 @@ + + 292 {{160, 328}, {160, 66}} + NO NO IBCocoaTouchFramework NO 0 0 - 1 @@ -526,10 +588,13 @@ stopcall-red.png + + - {320, 460} + {{0, 20}, {320, 460}} + 1 MC45MDE5NjA3OSAwLjkwMTk2MDc5IDAuOTAxOTYwNzkAA @@ -539,6 +604,7 @@ + 1 1 IBCocoaTouchFramework @@ -556,14 +622,6 @@ 12 - - - call - - - - 13 - status @@ -572,14 +630,6 @@ 15 - - - delegate - - - - 19 - view @@ -684,15 +734,6 @@ 54 - - - doKeyPad: - - - 1 - - 92 - hangup @@ -757,13 +798,40 @@ 158 + + + __call + + + + 159 + + + + delegate + + + + 19 + + + + doKeyPad: + + + 1 + + 92 + YES 0 - + + YES + @@ -956,33 +1024,27 @@ YES -1.CustomClassName + -1.IBPluginDependency -2.CustomClassName - 1.IBEditorWindowLastContentRect + -2.IBPluginDependency 1.IBPluginDependency 1.IBUserGuides 107.CustomClassName 107.IBPluginDependency - 114.IBEditorWindowLastContentRect 114.IBPluginDependency 114.IBUserGuides - 114.IBViewBoundsToFrameTransform 115.IBPluginDependency 116.CustomClassName 116.IBPluginDependency - 116.IBViewBoundsToFrameTransform 117.CustomClassName 117.IBPluginDependency - 117.IBViewBoundsToFrameTransform 118.CustomClassName 118.IBPluginDependency - 118.IBViewBoundsToFrameTransform 150.CustomClassName 150.IBPluginDependency - 150.IBViewBoundsToFrameTransform 157.IBPluginDependency 29.CustomClassName 29.IBPluginDependency - 29.IBViewBoundsToFrameTransform 30.CustomClassName 30.IBPluginDependency 31.CustomClassName @@ -997,14 +1059,11 @@ 36.IBPluginDependency 37.CustomClassName 37.IBPluginDependency - 37.IBViewBoundsToFrameTransform 38.CustomClassName 38.IBPluginDependency - 38.IBViewBoundsToFrameTransform 39.CustomClassName 39.IBPluginDependency 4.IBPluginDependency - 4.IBViewBoundsToFrameTransform 40.CustomClassName 40.IBPluginDependency 41.CustomClassName @@ -1012,14 +1071,14 @@ 5.CustomClassName 5.IBPluginDependency 7.IBPluginDependency - 80.IBEditorWindowLastContentRect 80.IBPluginDependency YES PhoneViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder - {{581, 299}, {320, 460}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin YES @@ -1036,7 +1095,6 @@ UIHangUpButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - {{32, 282}, {320, 90}} com.apple.InterfaceBuilder.IBCocoaTouchPlugin YES @@ -1046,34 +1104,18 @@ 1 - com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDuration com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCxAAAwoIAAA - UISpeakerButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDcQAAwpIAAA - UIMuteButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAwpIAAA - UIEraseButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUNxAAAAAAAAA - com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDigitButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDVQAAwxsAAA - UIDigitButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDigitButton @@ -1088,18 +1130,11 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDigitButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABC1gAAwxsAAA - - UIDigitButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAwxsAAA - + UIDigitButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDigitButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIDigitButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDigitButton @@ -1107,27 +1142,22 @@ UICallButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - {{60, 553}, {320, 480}} com.apple.InterfaceBuilder.IBCocoaTouchPlugin YES - - YES - + YES - - YES - + - 158 + 159 @@ -1150,9 +1180,9 @@ YES YES + __call address back - call callDuration dialerView eight @@ -1178,8 +1208,8 @@ YES - UITextField UIButton + UITextField UIButton UILabel UIView @@ -1209,9 +1239,9 @@ YES YES + __call address back - call callDuration dialerView eight @@ -1237,6 +1267,10 @@ YES + + __call + UIButton + address UITextField @@ -1245,10 +1279,6 @@ back UIButton - - call - UIButton - callDuration UILabel @@ -1341,15 +1371,7 @@ IBProjectSource - Classes/PhoneViewController.h - - - - PhoneViewController - UIViewController - - IBUserSource - + ./Classes/PhoneViewController.h @@ -1357,7 +1379,7 @@ UIButton IBProjectSource - Classes/LinphoneUI/UICallButton.h + ./Classes/UICallButton.h @@ -1365,7 +1387,7 @@ UIButton IBProjectSource - Classes/LinphoneUI/UIDigitButton.h + ./Classes/UIDigitButton.h @@ -1373,7 +1395,7 @@ UILabel IBProjectSource - Classes/LinphoneUI/UIDuration.h + ./Classes/UIDuration.h @@ -1381,7 +1403,7 @@ UIButton IBProjectSource - Classes/LinphoneUI/UIEraseButton.h + ./Classes/UIEraseButton.h @@ -1389,7 +1411,7 @@ UIButton IBProjectSource - Classes/LinphoneUI/UIHangUpButton.h + ./Classes/UIHangUpButton.h @@ -1397,7 +1419,7 @@ UIToggleButton IBProjectSource - Classes/LinphoneUI/UIMuteButton.h + ./Classes/UIMuteButton.h @@ -1405,233 +1427,15 @@ UIToggleButton IBProjectSource - Classes/LinphoneUI/UISpeakerButton.h + ./Classes/UISpeakerButton.h UIToggleButton UIButton - - mActionHandler - id - - - mActionHandler - - mActionHandler - id - - IBProjectSource - Classes/LinphoneUI/UIToggleButton.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UITabBarController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UITextField - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h + ./Classes/UIToggleButton.h @@ -1644,14 +1448,13 @@ com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 YES - ../linphone.xcodeproj 3 YES @@ -1671,11 +1474,11 @@ {106, 60} {108, 60} {160, 60} - {32, 32} + {20, 20} {60, 52} {62, 54} - 132 + 933 diff --git a/PhoneMainView.xib b/PhoneMainView.xib index dadf43e09..27580eb6f 100644 --- a/PhoneMainView.xib +++ b/PhoneMainView.xib @@ -2,30 +2,31 @@ 784 - 10D573 - 762 - 1038.29 - 460.00 + 11C74 + 1938 + 1138.23 + 567.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 87 + 933 - + YES - + IBProxyObject + IBUITabBarItem + IBUIViewController + IBUICustomObject + IBUITabBarController + IBUIWindow + IBUITabBar YES com.apple.InterfaceBuilder.IBCocoaTouchPlugin - YES - - YES - - - YES - + PluginDependencyRecalculationVersion + YES @@ -41,10 +42,12 @@ IBCocoaTouchFramework - + 1316 {320, 480} + + 1 MSAxIDEAA @@ -58,24 +61,25 @@ + 1 1 IBCocoaTouchFramework NO - - History - - History + + + Dialer NSImage - history-orange.png + dialer-orange.png IBCocoaTouchFramework - + PhoneViewController + 1 1 IBCocoaTouchFramework @@ -83,34 +87,34 @@ YES - - - - Dialer + + History + + History NSImage - dialer-orange.png + history-orange.png IBCocoaTouchFramework - - PhoneViewController + 1 1 IBCocoaTouchFramework NO + IBCocoaTouchFramework - 5 + 1 1 IBCocoaTouchFramework @@ -120,12 +124,12 @@ IBCocoaTouchFramework - 0 + 1 1 IBCocoaTouchFramework @@ -133,9 +137,11 @@ - + 266 - {{129, 330}, {163, 49}} + {{0, 431}, {320, 49}} + + 3 MCAwAA @@ -178,7 +184,9 @@ YES 0 - + + YES + @@ -289,52 +297,52 @@ YES -1.CustomClassName + -1.IBPluginDependency -2.CustomClassName + -2.IBPluginDependency 11.IBPluginDependency 12.IBPluginDependency 2.IBAttributePlaceholdersKey - 2.IBEditorWindowLastContentRect 2.IBPluginDependency - 2.UIWindow.visibleAtLaunch 38.CustomClassName - 38.IBEditorWindowLastContentRect 38.IBPluginDependency + 39.IBPluginDependency 4.CustomClassName 4.IBPluginDependency 41.CustomClassName 41.IBPluginDependency + 42.IBPluginDependency 43.CustomClassName 43.IBPluginDependency - 8.IBEditorWindowLastContentRect + 44.IBPluginDependency 8.IBPluginDependency 9.IBPluginDependency YES UIApplication + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin YES - - YES - + - {{190, 156}, {320, 480}} com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - PhoneViewController - {{343, 544}, {320, 480}} + AdvancedPhoneViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin linphoneAppDelegate com.apple.InterfaceBuilder.IBCocoaTouchPlugin CallHistoryTableViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin MoreViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin - {{623, 298}, {320, 480}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -342,490 +350,18 @@ YES - - YES - + YES - - YES - + 47 - - - YES - - CallHistoryTableViewController - GenericTabViewController - - doAction: - id - - - clear - UIButton - - - IBProjectSource - Classes/CallHistoryTableViewController.h - - - - GenericTabViewController - UITableViewController - - YES - - YES - header - linphoneDelegate - phoneControllerDelegate - - - YES - UIView - id - id - - - - IBProjectSource - Classes/GenericTabViewController.h - - - - MoreViewController - UITableViewController - - YES - - YES - console - credit - creditText - web - - - YES - UITableViewCell - UITableViewCell - UITextView - UITableViewCell - - - - IBProjectSource - Classes/MoreViewController.h - - - - PhoneViewController - UIViewController - - YES - - YES - doAction: - doKeyPad: - doKeyPadUp: - - - YES - id - id - id - - - - YES - - YES - address - back - call - callDuration - eight - five - four - hangup - hash - incallView - mute - nine - one - peerLabel - seven - six - speaker - star - status - three - two - zero - - - YES - UITextField - UIButton - UIButton - UILabel - UIButton - UIButton - UIButton - UIButton - UIButton - UIView - UIButton - UIButton - UIButton - UILabel - UIButton - UIButton - UIButton - UIButton - UILabel - UIButton - UIButton - UIButton - - - - IBProjectSource - Classes/PhoneViewController.h - - - - linphoneAppDelegate - NSObject - - YES - - YES - myPeoplePickerController - myPhoneViewController - myTabBarController - window - - - YES - ABPeoplePickerNavigationController - PhoneViewController - UITabBarController - UIWindow - - - - IBProjectSource - Classes/linphoneAppDelegate.h - - - - - YES - - ABPeoplePickerNavigationController - UINavigationController - - IBFrameworkSource - AddressBookUI.framework/Headers/ABPeoplePickerNavigationController.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSNetServices.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSPort.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSStream.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSXMLParser.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIApplication - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIApplication.h - - - - UIBarItem - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIBarItem.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UINavigationController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIResponder - NSObject - - - - UIScrollView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIScrollView.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UITabBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITabBar.h - - - - UITabBarController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UITabBarItem - UIBarItem - - IBFrameworkSource - UIKit.framework/Headers/UITabBarItem.h - - - - UITableViewCell - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITableViewCell.h - - - - UITableViewController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITableViewController.h - - - - UITextField - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UITextView - UIScrollView - - IBFrameworkSource - UIKit.framework/Headers/UITextView.h - - - - UIView - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - - - UIViewController - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - UIWindow - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIWindow.h - - - - + 0 IBCocoaTouchFramework @@ -834,14 +370,13 @@ com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 YES - linphone.xcodeproj 3 YES @@ -856,6 +391,6 @@ {25, 23} - 87 + 933 diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index a61d67707..e7cd1110c 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -83,8 +83,13 @@ 22F254811073D99800AC9B3F /* ringback.wav in Resources */ = {isa = PBXBuildFile; fileRef = 22F254801073D99800AC9B3F /* ringback.wav */; }; 22F51EF6107FA66500F98953 /* untitled.plist in Resources */ = {isa = PBXBuildFile; fileRef = 22F51EF5107FA66500F98953 /* untitled.plist */; }; 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; + 346A75C714619F1D005C9D07 /* AdvancedPhoneViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 346A75C614619F1D005C9D07 /* AdvancedPhoneViewController.m */; }; + 346A75C814619F73005C9D07 /* IncallViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 222A483212F7176F0075F07F /* IncallViewController.m */; }; + 346A75CB14628DC6005C9D07 /* pausecall.png in Resources */ = {isa = PBXBuildFile; fileRef = 346A75C914628DC6005C9D07 /* pausecall.png */; }; + 346A75CC14628DC6005C9D07 /* resumecall.png in Resources */ = {isa = PBXBuildFile; fileRef = 346A75CA14628DC6005C9D07 /* resumecall.png */; }; + 346A75CF14628F02005C9D07 /* UIPauseResumeButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 346A75CE14628F02005C9D07 /* UIPauseResumeButton.m */; }; + 346A75D21462A786005C9D07 /* CallDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 346A75D11462A786005C9D07 /* CallDelegate.m */; }; 70571E1A13FABCB000CDD3C2 /* rootca.pem in Resources */ = {isa = PBXBuildFile; fileRef = 70571E1913FABCB000CDD3C2 /* rootca.pem */; }; - F0A486D91404FE53009EC0BE /* libsrtp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F0A486D71404FE53009EC0BE /* libsrtp.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -403,9 +408,16 @@ 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* linphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linphone_Prefix.pch; sourceTree = ""; }; + 346A75C514619F1D005C9D07 /* AdvancedPhoneViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AdvancedPhoneViewController.h; sourceTree = ""; }; + 346A75C614619F1D005C9D07 /* AdvancedPhoneViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AdvancedPhoneViewController.m; sourceTree = ""; }; + 346A75C914628DC6005C9D07 /* pausecall.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = pausecall.png; path = submodules/linphone/pixmaps/pausecall.png; sourceTree = ""; }; + 346A75CA14628DC6005C9D07 /* resumecall.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = resumecall.png; path = submodules/linphone/pixmaps/resumecall.png; sourceTree = ""; }; + 346A75CD14628F02005C9D07 /* UIPauseResumeButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIPauseResumeButton.h; sourceTree = ""; }; + 346A75CE14628F02005C9D07 /* UIPauseResumeButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIPauseResumeButton.m; sourceTree = ""; }; + 346A75D01462A786005C9D07 /* CallDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CallDelegate.h; sourceTree = ""; }; + 346A75D11462A786005C9D07 /* CallDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CallDelegate.m; sourceTree = ""; }; 70571E1913FABCB000CDD3C2 /* rootca.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = rootca.pem; path = Resources/rootca.pem; sourceTree = ""; }; 8D1107310486CEB800E47090 /* linphone-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "linphone-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; - F0A486D71404FE53009EC0BE /* libsrtp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsrtp.a; path = "liblinphone-sdk/apple-darwin/lib/libsrtp.a"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -437,7 +449,6 @@ 22D1B68112A3E0BE001AE361 /* libresolv.dylib in Frameworks */, 226F2ED71344B0EF00F6EF27 /* libopencore-amrnb.a in Frameworks */, 226F2ED81344B0EF00F6EF27 /* libmsamr.a in Frameworks */, - F0A486D91404FE53009EC0BE /* libsrtp.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -447,8 +458,8 @@ 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( - 22F9D6B51463EBDC00C6FEAF /* AdvancedPhoneViewController.m */, - 22F9D6B61463EBDC00C6FEAF /* AdvancedPhoneViewController.h */, + 346A75C514619F1D005C9D07 /* AdvancedPhoneViewController.h */, + 346A75C614619F1D005C9D07 /* AdvancedPhoneViewController.m */, 2214EB7012F84668002A5394 /* LinphoneUI */, 2218A92212FBE1340088A667 /* FirstLoginViewController.h */, 2218A92312FBE1340088A667 /* FirstLoginViewController.m */, @@ -474,6 +485,8 @@ 227BCDC110D4004600FBFD76 /* CallHistoryTableViewController.xib */, 2242D9C710D691F900E9963F /* GenericTabViewController.h */, 2242D9C810D691F900E9963F /* GenericTabViewController.m */, + 346A75D01462A786005C9D07 /* CallDelegate.h */, + 346A75D11462A786005C9D07 /* CallDelegate.m */, ); path = Classes; sourceTree = ""; @@ -677,6 +690,8 @@ 2214EB7012F84668002A5394 /* LinphoneUI */ = { isa = PBXGroup; children = ( + 346A75CD14628F02005C9D07 /* UIPauseResumeButton.h */, + 346A75CE14628F02005C9D07 /* UIPauseResumeButton.m */, 2248E90C12F7E4CF00220D9C /* UIDigitButton.h */, 2248E90D12F7E4CF00220D9C /* UIDigitButton.m */, 2248E99D12F801C200220D9C /* LinphoneManager.h */, @@ -847,6 +862,8 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( + 346A75C914628DC6005C9D07 /* pausecall.png */, + 346A75CA14628DC6005C9D07 /* resumecall.png */, 70571E1913FABCB000CDD3C2 /* rootca.pem */, 22E19E47138A67A000FBFE87 /* missed_call.png */, 228B19AE130290C500F154D3 /* iTunesArtwork */, @@ -996,6 +1013,8 @@ 2214783D1386A2030020F8B8 /* Localizable.strings in Resources */, 22E19E48138A67A000FBFE87 /* missed_call.png in Resources */, 70571E1A13FABCB000CDD3C2 /* rootca.pem in Resources */, + 346A75CB14628DC6005C9D07 /* pausecall.png in Resources */, + 346A75CC14628DC6005C9D07 /* resumecall.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1026,6 +1045,10 @@ 22C755601317E59C007BC101 /* UIBluetoothButton.m in Sources */, 22BB1A69132FF16A005CD7AA /* UIEraseButton.m in Sources */, 223963171393CFAF001DE689 /* FastAddressBook.m in Sources */, + 346A75C714619F1D005C9D07 /* AdvancedPhoneViewController.m in Sources */, + 346A75C814619F73005C9D07 /* IncallViewController.m in Sources */, + 346A75CF14628F02005C9D07 /* UIPauseResumeButton.m in Sources */, + 346A75D21462A786005C9D07 /* CallDelegate.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/linphonerc b/linphonerc index 6f894b055..d5fc9446b 100644 --- a/linphonerc +++ b/linphonerc @@ -31,4 +31,4 @@ echocancellation=0 [misc] history_max_size=30 -max_calls=1 +max_calls=10 From c5de6fff07acccc27a6e57cba918d11e7f93eec8 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Thu, 3 Nov 2011 16:49:44 +0100 Subject: [PATCH 03/11] Conference begins to work --- Classes/IncallViewController.h | 5 + Classes/IncallViewController.m | 101 ++- Classes/IncallViewController.xib | 1022 ++++++++++++++++------------- Classes/LinphoneUI/UICallButton.m | 2 +- Classes/PhoneViewController.m | 2 +- 5 files changed, 663 insertions(+), 469 deletions(-) diff --git a/Classes/IncallViewController.h b/Classes/IncallViewController.h index 9635700c1..9f5b6e613 100644 --- a/Classes/IncallViewController.h +++ b/Classes/IncallViewController.h @@ -39,6 +39,7 @@ UISpeakerButton* speaker; UIButton* contacts; UITableView* callTableView; + UIButton* addCall, *mergeCalls; //key pad @@ -64,6 +65,8 @@ NSTimer *durationRefreasher; ABPeoplePickerNavigationController* myPeoplePickerController; + + UITableViewCell* selectedCell; } -(void)displayStatus:(NSString*) message; @@ -84,6 +87,8 @@ @property (nonatomic, retain) IBOutlet UIButton* speaker; @property (nonatomic, retain) IBOutlet UIButton* contacts; @property (nonatomic, retain) IBOutlet UITableView* callTableView; +@property (nonatomic, retain) IBOutlet UIButton* addCall; +@property (nonatomic, retain) IBOutlet UIButton* mergeCalls; @property (nonatomic, retain) IBOutlet UIButton* one; diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index 5af0c2f89..5e46d5aad 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -40,6 +40,8 @@ @synthesize speaker; @synthesize contacts; @synthesize callTableView; +@synthesize addCall; +@synthesize mergeCalls; @synthesize one; @synthesize two; @@ -67,6 +69,23 @@ */ +bool isInConference(LinphoneCall* call) { + return linphone_call_get_current_params(call)->in_conference; +} + +int callCount(LinphoneCore* lc) { + int count = 0; + const MSList* calls = linphone_core_get_calls(lc); + + while (calls != 0) { + if (!isInConference((LinphoneCall*)calls->data)) { + count++; + } + calls = calls->next; + } + return count; +} + // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; @@ -91,8 +110,28 @@ [nine initWithNumber:'9']; [star initWithNumber:'*']; [hash initWithNumber:'#']; - - + + [addCall addTarget:self action:@selector(addCallPressed) forControlEvents:UIControlEventTouchDown]; + [mergeCalls addTarget:self action:@selector(mergeCallsPressed) forControlEvents:UIControlEventTouchDown]; + + [mergeCalls setHidden:YES]; +} + +-(void) addCallPressed { + [self dismissModalViewControllerAnimated:true]; +} + +-(void) mergeCallsPressed { + LinphoneCore* lc = [LinphoneManager getLc]; + const MSList* calls = linphone_core_get_calls(lc); + + while (calls != 0) { + LinphoneCall* call = (LinphoneCall*)calls->data; + if (!isInConference(call)) { + linphone_core_add_to_conference(lc, call); + } + calls = calls->next; + } } -(void)updateCallsDurations { @@ -109,6 +148,7 @@ selector:@selector(updateCallsDurations) userInfo:nil repeats:YES]; + selectedCell = nil; } } @@ -116,6 +156,7 @@ if (durationRefreasher != nil) { [durationRefreasher invalidate]; durationRefreasher=nil; + selectedCell = nil; } } @@ -156,9 +197,8 @@ } -(void) displayInCall:(LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - [callDuration start]; dismissed = false; - [callTableView reloadData]; + [callTableView reloadData]; } -(void) displayDialerFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { [callDuration stop]; @@ -170,6 +210,14 @@ [mute reset]; [pause reset]; + if (callCount([LinphoneManager getLc]) > 1) { + [pause setHidden:YES]; + [mergeCalls setHidden:NO]; + } else { + [pause setHidden:NO]; + [mergeCalls setHidden:YES]; + } + [callTableView reloadData]; } @@ -216,23 +264,6 @@ [super dealloc]; } -bool isInConference(LinphoneCall* call) { - return linphone_call_get_current_params(call)->in_conference; -} - -int callCount(LinphoneCore* lc) { - int count = 0; - const MSList* calls = linphone_core_get_calls(lc); - - while (calls != 0) { - if (!isInConference((LinphoneCall*)calls->data)) { - count++; - } - calls = calls->next; - } - return count; -} - -(LinphoneCall*) retrieveCallAtIndex: (NSInteger) index inConference:(bool) conf{ const MSList* calls = linphone_core_get_calls([LinphoneManager getLc]); @@ -284,12 +315,19 @@ int callCount(LinphoneCore* lc) { } [cell.detailTextLabel setText:ms]; + if (linphone_core_get_current_call([LinphoneManager getLc]) == call) - cell.accessoryType = UITableViewCellAccessoryCheckmark; + cell.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.5]; else if (confActive && isInConference(call)) + cell.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.5]; + else + cell.backgroundColor = [UIColor colorWithRed:1 green:0.5 blue:0 alpha:0.5]; + + + /*if (cell == selectedCell) cell.accessoryType = UITableViewCellAccessoryCheckmark; else - cell.accessoryType = UITableViewCellAccessoryNone; + cell.accessoryType = UITableViewCellAccessoryNone;*/ } @@ -301,8 +339,6 @@ int callCount(LinphoneCore* lc) { cell.selectionStyle = UITableViewCellSelectionStyleNone; } - ms_message("pouet"); - LinphoneCore* lc = [LinphoneManager getLc]; if (indexPath.section == 0 && linphone_core_get_conference_size(lc) > 0) [self updateCell:cell withCall: [self retrieveCallAtIndex:indexPath.row inConference:true] conferenceActive:linphone_core_is_in_conference(lc)]; @@ -363,5 +399,20 @@ int callCount(LinphoneCore* lc) { return nil; } +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + //selectedCell = [tableView cellForRowAtIndexPath:indexPath]; + + bool inConf = (indexPath.section == 0 && linphone_core_get_conference_size([LinphoneManager getLc]) > 0); + + if (inConf) { + linphone_core_enter_conference([LinphoneManager getLc]); + } else { + LinphoneCall* call = [self retrieveCallAtIndex:indexPath.row inConference:NO]; + linphone_core_resume_call([LinphoneManager getLc], call); + } + + [self updateUIFromLinphoneState: nil]; +} @end diff --git a/Classes/IncallViewController.xib b/Classes/IncallViewController.xib index b1930ec64..56393e2cd 100644 --- a/Classes/IncallViewController.xib +++ b/Classes/IncallViewController.xib @@ -12,9 +12,9 @@ YES - IBUITableView - IBUIViewController IBUIButton + IBUIViewController + IBUITableView IBUIView IBUILabel IBProxyObject @@ -49,6 +49,7 @@ {320, 182} + _NS:418 10 @@ -178,7 +179,7 @@ AAgACAAIAAEAAQABAAE {{239, 63}, {65, 21}} - + NO YES NO @@ -210,6 +211,289 @@ AAgACAAIAAEAAQABAAE + + + 292 + + YES + + + 292 + {{0, 68}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Mute + + 3 + MQA + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + 3 + MC41AA + + + NSImage + mic_active.png + + + + NSImage + mic_muted.png + + + + 2 + 2 + + + Helvetica-Bold + 18 + 16 + + + + + 292 + {{0, 122}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Add call + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + + NSImage + startcall-green.png + + + + + + + + + 292 + {{94, 133}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Pau. Res. + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + + NSImage + pausecall.png + + + + + 2 + 10 + + + Helvetica-Bold + 10 + 16 + + + + + 292 + {{90, 122}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Merge + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + + + + 2 + 17 + + + Helvetica-Bold + 17 + 16 + + + + + 292 + {{6, 261}, {258, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + stopcall-red.png + + + Helvetica-Bold + Helvetica + 2 + 15 + + + Helvetica-Bold + 15 + 16 + + + + + 292 + {{181, 122}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Cont + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + NSImage + contact-orange.png + + + + + + + 292 + {{91, 68}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + DTMF + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + NSImage + dialer-orange.png + + + + + + + 292 + {{181, 68}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Spk + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + NSImage + Speaker-32-off.png + + + + + + {{25, 110}, {270, 317}} + + + + + 3 + MSAwAA + + 2 + + + NO + NO + IBCocoaTouchFramework + -2147483356 @@ -227,33 +511,15 @@ AAgACAAIAAEAAQABAAE IBCocoaTouchFramework 0 0 - - 3 - MQA - + 1 MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - 3 - MC41AA - - - NSImage - stopcall-red.png - - - Helvetica-Bold - Helvetica - 2 - 15 - - - Helvetica-Bold - 15 - 16 - + + + + @@ -261,7 +527,7 @@ AAgACAAIAAEAAQABAAE {{170, 266}, {72, 37}} - + NO NO IBCocoaTouchFramework @@ -276,7 +542,7 @@ AAgACAAIAAEAAQABAAE - + @@ -299,7 +565,7 @@ AAgACAAIAAEAAQABAAE - + @@ -322,7 +588,7 @@ AAgACAAIAAEAAQABAAE - + @@ -345,7 +611,7 @@ AAgACAAIAAEAAQABAAE - + @@ -368,7 +634,7 @@ AAgACAAIAAEAAQABAAE - + @@ -391,7 +657,7 @@ AAgACAAIAAEAAQABAAE - + @@ -414,7 +680,7 @@ AAgACAAIAAEAAQABAAE - + @@ -437,7 +703,7 @@ AAgACAAIAAEAAQABAAE - + @@ -460,7 +726,7 @@ AAgACAAIAAEAAQABAAE - + @@ -483,7 +749,7 @@ AAgACAAIAAEAAQABAAE - + @@ -506,7 +772,7 @@ AAgACAAIAAEAAQABAAE - + @@ -529,7 +795,7 @@ AAgACAAIAAEAAQABAAE - + @@ -552,191 +818,13 @@ AAgACAAIAAEAAQABAAE - + {{25, 110}, {270, 317}} - - 3 - MSAwAA - - 2 - - - NO - NO - IBCocoaTouchFramework - - - - 292 - - YES - - - 292 - {{0, 61}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - mic_active.png - - - - NSImage - mic_muted.png - - - - - - - - 292 - {{0, 121}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - NSImage - pausecall.png - - - - - - - - - 292 - {{6, 261}, {258, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - - 292 - {{90, 115}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - contact-orange.png - - - - - - - 292 - {{93, 61}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - dialer-orange.png - - - - - - - 292 - {{181, 61}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - Speaker-32-off.png - - - - - - {{25, 110}, {270, 317}} - - - 3 MSAwAA @@ -750,7 +838,7 @@ AAgACAAIAAEAAQABAAE {{0, 20}, {320, 460}} - + 1 MC44MDAwMDAwMTE5IDAuODAwMDAwMDExOSAwLjgwMDAwMDAxMTkAA @@ -778,158 +866,6 @@ AAgACAAIAAEAAQABAAE 23 - - - controlSubView - - - - 44 - - - - padSubView - - - - 45 - - - - dialer - - - - 49 - - - - close - - - - 51 - - - - one - - - - 54 - - - - zero - - - - 55 - - - - star - - - - 56 - - - - hash - - - - 57 - - - - nine - - - - 58 - - - - two - - - - 59 - - - - three - - - - 60 - - - - four - - - - 67 - - - - five - - - - 69 - - - - six - - - - 71 - - - - seven - - - - 73 - - - - eight - - - - 75 - - - - mute - - - - 80 - - - - speaker - - - - 82 - - - - contacts - - - - 84 - peerName @@ -964,11 +900,43 @@ AAgACAAIAAEAAQABAAE - endPad + callTableView - + - 98 + 109 + + + + contacts + + + + 84 + + + + speaker + + + + 82 + + + + dialer + + + + 49 + + + + mute + + + + 80 @@ -980,19 +948,155 @@ AAgACAAIAAEAAQABAAE - pause + controlSubView - + - 105 + 44 - callTableView + nine - + - 109 + 58 + + + + eight + + + + 75 + + + + seven + + + + 73 + + + + six + + + + 71 + + + + five + + + + 69 + + + + four + + + + 67 + + + + three + + + + 60 + + + + one + + + + 54 + + + + zero + + + + 55 + + + + two + + + + 59 + + + + hash + + + + 57 + + + + star + + + + 56 + + + + close + + + + 51 + + + + endPad + + + + 98 + + + + padSubView + + + + 45 + + + + addCall + + + + 112 + + + + mergeCalls + + + + 114 + + + + pause + + + + 115 @@ -1074,12 +1178,12 @@ AAgACAAIAAEAAQABAAE YES - + @@ -1102,21 +1206,52 @@ AAgACAAIAAEAAQABAAE duration + + 93 + + + status + + + 106 + + + 26 YES - - - + + + + + controls + + 111 + + + addcall + + + 104 + + + merge + + + 15 + + + contacts + 13 @@ -1129,12 +1264,6 @@ AAgACAAIAAEAAQABAAE dialer - - 18 - - - end - 16 @@ -1142,10 +1271,10 @@ AAgACAAIAAEAAQABAAE mute - 15 - + 18 + - contacts + end 27 @@ -1164,36 +1293,12 @@ AAgACAAIAAEAAQABAAE - + pad - - 28 - - - end - - - 29 - - - close - - - 30 - - - 1 - - - 31 - - - star - 32 @@ -1213,10 +1318,10 @@ AAgACAAIAAEAAQABAAE 7 - 35 - + 37 + - 4 + 6 36 @@ -1225,10 +1330,10 @@ AAgACAAIAAEAAQABAAE 5 - 37 - + 35 + - 6 + 4 38 @@ -1236,6 +1341,18 @@ AAgACAAIAAEAAQABAAE 3 + + 30 + + + 1 + + + 41 + + + 0 + 39 @@ -1249,28 +1366,29 @@ AAgACAAIAAEAAQABAAE hash - 41 - + 31 + - 0 + star - 93 - - - status + 29 + + + close - 104 - + 28 + + + end + + + 113 + pauseresume - - 106 - - - @@ -1282,10 +1400,12 @@ AAgACAAIAAEAAQABAAE -2.CustomClassName -2.IBPluginDependency 10.IBPluginDependency - 104.CustomClassName 104.IBPluginDependency 106.IBPluginDependency 11.IBPluginDependency + 111.IBPluginDependency + 113.CustomClassName + 113.IBPluginDependency 12.CustomClassName 12.IBPluginDependency 13.CustomClassName @@ -1336,10 +1456,12 @@ AAgACAAIAAEAAQABAAE UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIPauseResumeButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDuration com.apple.InterfaceBuilder.IBCocoaTouchPlugin UISpeakerButton @@ -1396,7 +1518,7 @@ AAgACAAIAAEAAQABAAE - 109 + 115 @@ -1419,6 +1541,7 @@ AAgACAAIAAEAAQABAAE YES YES + addCall callDuration callTableView close @@ -1431,6 +1554,7 @@ AAgACAAIAAEAAQABAAE five four hash + mergeCalls mute nine one @@ -1449,6 +1573,7 @@ AAgACAAIAAEAAQABAAE YES + UIButton UILabel UITableView UIButton @@ -1464,6 +1589,7 @@ AAgACAAIAAEAAQABAAE UIButton UIButton UIButton + UIButton UIView UIButton UILabel @@ -1482,6 +1608,7 @@ AAgACAAIAAEAAQABAAE YES YES + addCall callDuration callTableView close @@ -1494,6 +1621,7 @@ AAgACAAIAAEAAQABAAE five four hash + mergeCalls mute nine one @@ -1512,6 +1640,10 @@ AAgACAAIAAEAAQABAAE YES + + addCall + UIButton + callDuration UILabel @@ -1560,6 +1692,10 @@ AAgACAAIAAEAAQABAAE hash UIButton + + mergeCalls + UIButton + mute UIButton @@ -1711,6 +1847,7 @@ AAgACAAIAAEAAQABAAE mic_active.png mic_muted.png pausecall.png + startcall-green.png stopcall-red.png @@ -1721,6 +1858,7 @@ AAgACAAIAAEAAQABAAE {20, 20} {20, 20} {25, 23} + {60, 52} {62, 54} diff --git a/Classes/LinphoneUI/UICallButton.m b/Classes/LinphoneUI/UICallButton.m index 1a12e3e0e..a63167009 100644 --- a/Classes/LinphoneUI/UICallButton.m +++ b/Classes/LinphoneUI/UICallButton.m @@ -32,7 +32,7 @@ [error show]; return; } - if (!linphone_core_in_call([LinphoneManager getLc])) { + if (TRUE /*!linphone_core_in_call([LinphoneManager getLc])*/) { LinphoneProxyConfig* proxyCfg; //get default proxy linphone_core_get_default_proxy([LinphoneManager getLc],&proxyCfg); diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index f460f34db..4073cc1a1 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -200,7 +200,7 @@ -(void) displayCall:(LinphoneCall*) call InProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { [self displayInCall: call ViewforUser:username withDisplayName:displayName]; - [__call setEnabled:false]; + //[__call setEnabled:false]; [callDuration setText:NSLocalizedString(@"Calling...",nil)]; if ([speaker isOn]) [speaker toggle] ; //preset to off } From 8c741b0d39f3f0a7098eb10e8f493b0d94337c5a Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Mon, 7 Nov 2011 14:29:27 +0100 Subject: [PATCH 04/11] Conferencing integration continued --- Classes/IncallViewController.h | 22 +- Classes/IncallViewController.m | 218 ++- Classes/IncallViewController.xib | 1579 ++++++++++------------ Classes/LinphoneUI/LinphoneManager.m | 2 +- Classes/LinphoneUI/UIHangUpButton.m | 8 +- Classes/LinphoneUI/UIPauseResumeButton.m | 8 +- 6 files changed, 854 insertions(+), 983 deletions(-) diff --git a/Classes/IncallViewController.h b/Classes/IncallViewController.h index 9f5b6e613..a7c99288e 100644 --- a/Classes/IncallViewController.h +++ b/Classes/IncallViewController.h @@ -26,20 +26,16 @@ @interface IncallViewController : UIViewController { - UIView* controlSubView; + UIView* controlSubView, *callControlSubView; - UILabel* peerName; - UILabel* peerNumber; - UIDuration* callDuration; - UILabel* status; - UIHangUpButton* endCtrl; + UIButton* endCtrl; UIButton* dialer; UIMuteButton* mute; UIPauseResumeButton* pause; UISpeakerButton* speaker; UIButton* contacts; UITableView* callTableView; - UIButton* addCall, *mergeCalls; + UIButton* addCall, *mergeCalls, *addToConf; //key pad @@ -57,7 +53,6 @@ UIDigitButton* star; UIDigitButton* zero; UIDigitButton* hash; - UIHangUpButton* endPad; UIButton* close; bool dismissed; @@ -66,20 +61,18 @@ ABPeoplePickerNavigationController* myPeoplePickerController; - UITableViewCell* selectedCell; + LinphoneCall* selectedCall; } -(void)displayStatus:(NSString*) message; - (IBAction)doAction:(id)sender; + @property (nonatomic, retain) IBOutlet UIView* controlSubView; +@property (nonatomic, retain) IBOutlet UIView* callControlSubView; @property (nonatomic, retain) IBOutlet UIView* padSubView; -@property (nonatomic, retain) IBOutlet UILabel* peerName; -@property (nonatomic, retain) IBOutlet UILabel* peerNumber; -@property (nonatomic, retain) IBOutlet UILabel* callDuration; -@property (nonatomic, retain) IBOutlet UILabel* status; @property (nonatomic, retain) IBOutlet UIButton* endCtrl; @property (nonatomic, retain) IBOutlet UIButton* dialer; @property (nonatomic, retain) IBOutlet UIButton* mute; @@ -89,7 +82,7 @@ @property (nonatomic, retain) IBOutlet UITableView* callTableView; @property (nonatomic, retain) IBOutlet UIButton* addCall; @property (nonatomic, retain) IBOutlet UIButton* mergeCalls; - +@property (nonatomic, retain) IBOutlet UIButton* addToConf; @property (nonatomic, retain) IBOutlet UIButton* one; @property (nonatomic, retain) IBOutlet UIButton* two; @@ -104,5 +97,4 @@ @property (nonatomic, retain) IBOutlet UIButton* zero; @property (nonatomic, retain) IBOutlet UIButton* hash; @property (nonatomic, retain) IBOutlet UIButton* close; -@property (nonatomic, retain) IBOutlet UIButton* endPad; @end diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index 5e46d5aad..96b339ef2 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -26,12 +26,10 @@ @synthesize controlSubView; +@synthesize callControlSubView; @synthesize padSubView; -@synthesize peerName; -@synthesize peerNumber; -@synthesize callDuration; -@synthesize status; +@synthesize addToConf; @synthesize endCtrl; @synthesize close; @synthesize mute; @@ -55,7 +53,6 @@ @synthesize star; @synthesize zero; @synthesize hash; -@synthesize endPad; /* // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. @@ -112,9 +109,13 @@ int callCount(LinphoneCore* lc) { [hash initWithNumber:'#']; [addCall addTarget:self action:@selector(addCallPressed) forControlEvents:UIControlEventTouchDown]; - [mergeCalls addTarget:self action:@selector(mergeCallsPressed) forControlEvents:UIControlEventTouchDown]; + [mergeCalls addTarget:self action:@selector(mergeCallsPressed) forControlEvents:UIControlEventTouchDown]; + [endCtrl addTarget:self action:@selector(endCallPressed) forControlEvents:UIControlEventTouchUpInside]; + [addToConf addTarget:self action:@selector(addToConfCallPressed) forControlEvents:UIControlEventTouchUpInside]; [mergeCalls setHidden:YES]; + + selectedCall = nil; } -(void) addCallPressed { @@ -123,19 +124,20 @@ int callCount(LinphoneCore* lc) { -(void) mergeCallsPressed { LinphoneCore* lc = [LinphoneManager getLc]; - const MSList* calls = linphone_core_get_calls(lc); - while (calls != 0) { - LinphoneCall* call = (LinphoneCall*)calls->data; - if (!isInConference(call)) { - linphone_core_add_to_conference(lc, call); - } - calls = calls->next; - } + linphone_core_add_all_to_conference(lc); } +-(void) addToConfCallPressed { + if (!selectedCall) + return; + linphone_core_add_to_conference([LinphoneManager getLc], selectedCall); +} + + + -(void)updateCallsDurations { - [callTableView reloadData]; + [self updateUIFromLinphoneState: nil]; } -(void)viewDidAppear:(BOOL)animated { @@ -148,7 +150,6 @@ int callCount(LinphoneCore* lc) { selector:@selector(updateCallsDurations) userInfo:nil repeats:YES]; - selectedCell = nil; } } @@ -156,7 +157,7 @@ int callCount(LinphoneCore* lc) { if (durationRefreasher != nil) { [durationRefreasher invalidate]; durationRefreasher=nil; - selectedCell = nil; + selectedCall = nil; } } @@ -166,9 +167,7 @@ int callCount(LinphoneCore* lc) { } -(void) displayStatus:(NSString*) message; { - [status setText:message]; - - [callTableView reloadData]; + [self updateUIFromLinphoneState: nil]; } -(void) displayPad:(bool) enable { @@ -178,18 +177,9 @@ int callCount(LinphoneCore* lc) { -(void) displayCall:(LinphoneCall*) call InProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { //restaure view [self displayPad:false]; - - if (displayName && [displayName length]>0) { - [peerName setText:displayName]; - [peerNumber setText:username]; - } else { - [peerName setText:username]; - [peerNumber setText:@""]; - } - [callDuration setText:@"Calling"]; - dismissed = false; + dismissed = false; - [callTableView reloadData]; + [self updateUIFromLinphoneState: nil]; } -(void) displayIncomingCall:(LinphoneCall *)call NotificationFromUI:(UIViewController *)viewCtrl forUser:(NSString *)username withDisplayName:(NSString *)displayName { @@ -198,27 +188,45 @@ int callCount(LinphoneCore* lc) { -(void) displayInCall:(LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { dismissed = false; - [callTableView reloadData]; + selectedCall = call; + [self updateUIFromLinphoneState: nil]; } -(void) displayDialerFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - [callDuration stop]; [self dismissModalViewControllerAnimated:true]; dismissed = true; - [callTableView reloadData]; + [self updateUIFromLinphoneState: nil]; } -(void) updateUIFromLinphoneState:(UIViewController *)viewCtrl { [mute reset]; [pause reset]; - if (callCount([LinphoneManager getLc]) > 1) { - [pause setHidden:YES]; - [mergeCalls setHidden:NO]; - } else { - [pause setHidden:NO]; - [mergeCalls setHidden:YES]; + LinphoneCore* lc; + + @try { + lc = [LinphoneManager getLc]; + + if (callCount([LinphoneManager getLc]) > 1) { + [pause setHidden:YES]; + [mergeCalls setHidden:NO]; + } else { + [pause setHidden:NO]; + [mergeCalls setHidden:YES]; + } + + [callTableView reloadData]; + } @catch (NSException* exc) { + return; } - [callTableView reloadData]; + // hide call control subview if no call selected + [callControlSubView setHidden:(selectedCall == NULL)]; + // hide add to conf if no conf exist + if (!callControlSubView.hidden) { + [addToConf setHidden:(linphone_core_get_conference_size(lc) == 0 || + isInConference(selectedCall))]; + } + // hide pause/resume if in conference + [pause setHidden:linphone_core_is_in_conference(lc)]; } - (IBAction)doAction:(id)sender { @@ -261,14 +269,19 @@ int callCount(LinphoneCore* lc) { - (void)dealloc { - [super dealloc]; + [super dealloc]; } -(LinphoneCall*) retrieveCallAtIndex: (NSInteger) index inConference:(bool) conf{ const MSList* calls = linphone_core_get_calls([LinphoneManager getLc]); - while (calls != 0 && index > 0) { + if (!conf && linphone_core_get_conference_size([LinphoneManager getLc])) + index--; + + while (calls != 0) { if (isInConference((LinphoneCall*)calls->data) == conf) { + if (index == 0) + break; index--; } calls = calls->next; @@ -284,7 +297,7 @@ int callCount(LinphoneCore* lc) { -- (void) updateCell:(UITableViewCell*)cell withCall:(LinphoneCall*) call conferenceActive:(bool)confActive{ +- (void) updateCell:(UITableViewCell*)cell at:(NSIndexPath*) path withCall:(LinphoneCall*) call conferenceActive:(bool)confActive{ if (call == NULL) { ms_error("UpdateCell called with null call"); [cell.textLabel setText:@"BUG IN APP - call is null"]; @@ -314,20 +327,57 @@ int callCount(LinphoneCore* lc) { [ms appendFormat:@"%s", linphone_call_state_to_string(linphone_call_get_state(call)), nil]; } [cell.detailTextLabel setText:ms]; + - - if (linphone_core_get_current_call([LinphoneManager getLc]) == call) + if (linphone_core_get_current_call([LinphoneManager getLc]) == call) { cell.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.5]; - else if (confActive && isInConference(call)) - cell.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.5]; - else - cell.backgroundColor = [UIColor colorWithRed:1 green:0.5 blue:0 alpha:0.5]; - + } else if (confActive && isInConference(call)) { + cell.backgroundColor = [UIColor colorWithRed:0 green:0 blue:1 alpha:0.5]; + } else{ + cell.backgroundColor = [UIColor colorWithRed:1 green:0.5 blue:0 alpha:0.5]; + } - /*if (cell == selectedCell) + if (call == selectedCall) { + // [cell setSelected:YES animated:NO]; cell.accessoryType = UITableViewCellAccessoryCheckmark; + }else{ + //[cell setSelected:NO animated:NO]; + cell.accessoryType = UITableViewCellAccessoryNone; + } +} + +-(void) updateConferenceCell:(UITableViewCell*) cell at:(NSIndexPath*)indexPath { + [cell.textLabel setText:@"Conference"]; + + LinphoneCore* lc = [LinphoneManager getLc]; + + cell.accessoryType = UITableViewCellAccessoryNone; + + NSMutableString* ms = [[NSMutableString alloc] init ]; + const MSList* calls = linphone_core_get_calls(lc); + while (calls) { + LinphoneCall* call = (LinphoneCall*)calls->data; + if (isInConference(call)) { + const LinphoneAddress* addr = linphone_call_get_remote_address(call); + + const char* n = linphone_address_get_display_name(addr); + if (n) + [ms appendFormat:@"%s ", n, nil]; + else + [ms appendFormat:@"%s ", linphone_address_get_username(addr), nil]; + + + if (call == selectedCall) + cell.accessoryType = UITableViewCellAccessoryCheckmark; + } + calls = calls->next; + } + [cell.detailTextLabel setText:ms]; + + if (linphone_core_is_in_conference(lc)) + cell.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.5]; else - cell.accessoryType = UITableViewCellAccessoryNone;*/ + cell.backgroundColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:0.5]; } @@ -340,12 +390,17 @@ int callCount(LinphoneCore* lc) { } LinphoneCore* lc = [LinphoneManager getLc]; - if (indexPath.section == 0 && linphone_core_get_conference_size(lc) > 0) - [self updateCell:cell withCall: [self retrieveCallAtIndex:indexPath.row inConference:true] conferenceActive:linphone_core_is_in_conference(lc)]; + if (indexPath.row == 0 && linphone_core_get_conference_size(lc) > 0) + [self updateConferenceCell:cell at:indexPath]; else - [self updateCell:cell withCall: [self retrieveCallAtIndex:indexPath.row inConference:false] + [self updateCell:cell at:indexPath withCall: [self retrieveCallAtIndex:indexPath.row inConference:NO] conferenceActive:linphone_core_is_in_conference(lc)]; + cell.userInteractionEnabled = YES; + cell.selectionStyle = UITableViewCellSelectionStyleNone; + cell.selectionStyle = UITableViewCellSelectionStyleBlue; + + /*NSString *path = [[NSBundle mainBundle] pathForResource:[item objectForKey:@"imageKey"] ofType:@"png"]; UIImage *theImage = [UIImage imageWithContentsOfFile:path]; @@ -359,6 +414,8 @@ int callCount(LinphoneCore* lc) { { LinphoneCore* lc = [LinphoneManager getLc]; + return callCount(lc) + (int)(linphone_core_get_conference_size(lc) > 0); + if (section == 0 && linphone_core_get_conference_size(lc) > 0) return linphone_core_get_conference_size(lc) - linphone_core_is_in_conference(lc); @@ -367,6 +424,7 @@ int callCount(LinphoneCore* lc) { // UITableViewDataSource - (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { + return 1; LinphoneCore* lc = [LinphoneManager getLc]; int count = 0; @@ -387,10 +445,11 @@ int callCount(LinphoneCore* lc) { // UITableViewDataSource - (NSString*) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { + return @"Calls"; if (section == 0 && linphone_core_get_conference_size([LinphoneManager getLc]) > 0) - return @"CONF"; + return @"Conference"; else - return @"CALLS"; + return @"Calls"; } // UITableViewDataSource @@ -401,18 +460,51 @@ int callCount(LinphoneCore* lc) { - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - //selectedCell = [tableView cellForRowAtIndexPath:indexPath]; + [tableView deselectRowAtIndexPath:indexPath animated:NO]; + + LinphoneCore* lc = [LinphoneManager getLc]; - bool inConf = (indexPath.section == 0 && linphone_core_get_conference_size([LinphoneManager getLc]) > 0); + [[callTableView cellForRowAtIndexPath:indexPath] setSelected:YES animated:NO]; + + bool inConf = (indexPath.row == 0 && linphone_core_get_conference_size(lc) > 0); + + selectedCall = [self retrieveCallAtIndex:indexPath.row inConference:inConf]; if (inConf) { + if (linphone_core_is_in_conference(lc)) + return; + LinphoneCall* current = linphone_core_get_current_call(lc); + if (current) + linphone_core_pause_call(lc, current); linphone_core_enter_conference([LinphoneManager getLc]); - } else { - LinphoneCall* call = [self retrieveCallAtIndex:indexPath.row inConference:NO]; - linphone_core_resume_call([LinphoneManager getLc], call); + } else if (selectedCall) { + if (linphone_core_is_in_conference(lc)) { + linphone_core_leave_conference(lc); + } + linphone_core_resume_call([LinphoneManager getLc], selectedCall); } [self updateUIFromLinphoneState: nil]; } +-(void) endCallPressed { + if (selectedCall == NULL) { + ms_error("No selected call"); + return; + } + + LinphoneCore* lc = [LinphoneManager getLc]; + if (isInConference(selectedCall)) { + linphone_core_terminate_conference(lc); + /* + linphone_core_remove_from_conference(lc, selectedCall); + if ((linphone_core_get_conference_size(lc) - (int)linphone_core_is_in_conference(lc)) == 0) + linphone_core_terminate_conference(lc); + */ + } else { + linphone_core_terminate_call(lc, selectedCall); + } + selectedCall = NULL; +} + @end diff --git a/Classes/IncallViewController.xib b/Classes/IncallViewController.xib index 56393e2cd..ee5b5db69 100644 --- a/Classes/IncallViewController.xib +++ b/Classes/IncallViewController.xib @@ -12,11 +12,10 @@ YES - IBUIButton IBUIViewController IBUITableView IBUIView - IBUILabel + IBUIButton IBProxyObject @@ -49,177 +48,513 @@ {320, 182} - + _NS:418 - - 10 - - 549453824 - {512, 1} - - YES - - YES - - - - TU0AKgAACAjFzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ -y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ -xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ -xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ -xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ -xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ -xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ -y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ -y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ -xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ -xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ -xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ -xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ -xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ -y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ -y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ -xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ -xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ -xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ -xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ -xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ -y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ -y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ -xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ -xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ -xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ -xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ -xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ -y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ -y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ -xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ -xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ -xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ -xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ -xczS/8vS2P/L0tj/xczU/wANAQAAAwAAAAECAAAAAQEAAwAAAAEAAQAAAQIAAwAAAAQAAAiqAQMAAwAA -AAEAAQAAAQYAAwAAAAEAAgAAAREABAAAAAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEABAAAARYAAwAA -AAEAAQAAARcABAAAAAEAAAgAARwAAwAAAAEAAQAAAVIAAwAAAAEAAQAAAVMAAwAAAAQAAAiyAAAAAAAI -AAgACAAIAAEAAQABAAE - - - - - - 3 - MCAwAA - - - groupTableViewBackgroundColor + + 3 + MQA YES IBCocoaTouchFramework YES NO - 1 - 2 + 1 0 + YES YES 44 - 10 - 10 + 22 + 22 - + - -2147483356 - {320, 55} - - - - NO - YES - NO - IBCocoaTouchFramework - Caller - - 1 - MCAwIDAAA + 292 + + YES + + + 292 + {{119, -4}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Pau. Res. + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + 3 + MC41AA + + + NSImage + mic_active.png + + + NSImage + pausecall.png + + + NSImage + mic_muted.png + + + + 2 + 10 + + + Helvetica-Bold + 10 + 16 + + + + + 292 + {{26, -4}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Add to conf + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + + + + 2 + 14 + + + Helvetica-Bold + 14 + 16 + + + + + 292 + {{27, 56}, {262, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + stopcall-red.png + + + Helvetica-Bold + Helvetica + 2 + 15 + + + Helvetica-Bold + 15 + 16 + + - - 1 - 17 - 1 - - 1 - 17 + {{0, 312}, {320, 148}} + + + + _NS:196 + + 3 + MC42NjY2NjY2NjY3AA - - Helvetica - 17 - 16 + NO + NO + IBCocoaTouchFramework + + + + -2147483356 + + YES + + + 292 + {{95, 244}, {82, 37}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + hide + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{95, 184}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + 0 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{5, 9}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + 1 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{95, 9}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + 2 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{185, 9}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + 3 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{5, 69}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + 4 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{95, 69}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + 5 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{185, 69}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + 6 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{5, 124}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + 7 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{95, 124}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + 8 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{185, 124}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + 9 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{5, 184}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + * + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{185, 184}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + # + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + - - - - -2147483356 - {{31, 63}, {61, 21}} + {{24, 72}, {272, 317}} - + + NO - YES - NO + NO IBCocoaTouchFramework - Number - - - 1 - 10 - - - - - - -2147483356 - {{239, 63}, {65, 21}} - - - - NO - YES - NO - IBCocoaTouchFramework - Duration - - - 1 - 10 - - - - - - -2147483356 - {{31, 347}, {258, 21}} - - - - NO - YES - NO - IBCocoaTouchFramework - status - - - 1 - 10 - - 292 YES + + + 292 + {{119, 55}, {82, 52}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Merge + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + + + + 2 + 17 + + + Helvetica-Bold + 17 + 16 + + 292 - {{0, 68}, {82, 52}} + {{25, 0}, {82, 52}} @@ -230,42 +565,30 @@ AAgACAAIAAEAAQABAAE 0 1 Mute - - 3 - MQA - + 1 MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - 3 - MC41AA - - - NSImage - mic_active.png - - - - NSImage - mic_muted.png - - - + + + + + + 2 2 - + Helvetica-Bold 18 16 - + 292 - {{0, 122}, {82, 52}} + {{25, 54}, {82, 52}} @@ -282,128 +605,23 @@ AAgACAAIAAEAAQABAAE MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - + NSImage startcall-green.png - - - - - - - - 292 - {{94, 133}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - Pau. Res. - - - 1 - MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - - - - NSImage - pausecall.png - - - - - 2 - 10 - - - Helvetica-Bold - 10 - 16 - - - - - 292 - {{90, 122}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - Merge - - - 1 - MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - - - - - - 2 - 17 - - - Helvetica-Bold - 17 - 16 - - - - - 292 - {{6, 261}, {258, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - stopcall-red.png - - - Helvetica-Bold - Helvetica - 2 - 15 - - - Helvetica-Bold - 15 - 16 - + + + + 292 - {{181, 122}, {82, 52}} + {{206, 54}, {82, 52}} - + NO NO IBCocoaTouchFramework @@ -421,13 +639,13 @@ AAgACAAIAAEAAQABAAE NSImage contact-orange.png - - + + 292 - {{91, 68}, {82, 52}} + {{116, 0}, {82, 52}} @@ -448,16 +666,16 @@ AAgACAAIAAEAAQABAAE NSImage dialer-orange.png - - + + 292 - {{181, 68}, {82, 52}} + {{206, 0}, {82, 52}} - + NO NO IBCocoaTouchFramework @@ -475,361 +693,15 @@ AAgACAAIAAEAAQABAAE NSImage Speaker-32-off.png - - + + - {{25, 110}, {270, 317}} + {{0, 191}, {320, 113}} - - 3 - MSAwAA - - 2 - - - NO - NO - IBCocoaTouchFramework - - - - -2147483356 - - YES - - - 292 - {{30, 258}, {80, 65}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - - 292 - {{170, 266}, {72, 37}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - close - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{90, 184}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 0 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{0, 9}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 1 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{90, 9}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 2 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{180, 9}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 3 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{0, 69}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 4 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{90, 69}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 5 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{180, 69}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 6 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{0, 124}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 7 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{90, 124}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 8 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{180, 124}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 9 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{0, 184}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - * - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{180, 184}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - # - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - {{25, 110}, {270, 317}} - - - - - 3 - MSAwAA - - + NO NO IBCocoaTouchFramework @@ -866,38 +738,6 @@ AAgACAAIAAEAAQABAAE 23 - - - peerName - - - - 89 - - - - peerNumber - - - - 90 - - - - callDuration - - - - 91 - - - - status - - - - 94 - callTableView @@ -908,51 +748,11 @@ AAgACAAIAAEAAQABAAE - contacts + eight - + - 84 - - - - speaker - - - - 82 - - - - dialer - - - - 49 - - - - mute - - - - 80 - - - - endCtrl - - - - 99 - - - - controlSubView - - - - 44 + 75 @@ -962,14 +762,6 @@ AAgACAAIAAEAAQABAAE 58 - - - eight - - - - 75 - seven @@ -1058,14 +850,6 @@ AAgACAAIAAEAAQABAAE 51 - - - endPad - - - - 98 - padSubView @@ -1076,11 +860,27 @@ AAgACAAIAAEAAQABAAE - addCall + callControlSubView - + - 112 + 117 + + + + endCtrl + + + + 99 + + + + pause + + + + 115 @@ -1092,11 +892,59 @@ AAgACAAIAAEAAQABAAE - pause + addCall - + - 115 + 112 + + + + contacts + + + + 84 + + + + speaker + + + + 82 + + + + dialer + + + + 49 + + + + mute + + + + 80 + + + + controlSubView + + + + 44 + + + + addToConf + + + + 119 @@ -1178,110 +1026,23 @@ AAgACAAIAAEAAQABAAE YES - - - - - + + - - 10 - - - peerName - - - 11 - - - peerNumber - - - 12 - - - duration - - - 93 - - - status - 106 - - 26 - - - YES - - - - - - - - - - - controls - - - 111 - - - addcall - - - 104 - - - merge - - - 15 - - - contacts - - - 13 - - - speaker - - - 17 - - - dialer - - - 16 - - - mute - - - 18 - - - end - 27 YES - @@ -1299,18 +1060,18 @@ AAgACAAIAAEAAQABAAE pad - - 32 - - - 9 - 33 8 + + 32 + + + 9 + 34 @@ -1378,17 +1139,86 @@ AAgACAAIAAEAAQABAAE close - 28 - - + 116 + + + YES + + + + + + callcontrols + + + 18 + + end 113 - - + + pauseresume + + 118 + + + addtoconf + + + 26 + + + YES + + + + + + + + + controls + + + 104 + + + merge + + + 111 + + + addcall + + + 15 + + + contacts + + + 13 + + + speaker + + + 17 + + + dialer + + + 16 + + + mute + @@ -1399,28 +1229,23 @@ AAgACAAIAAEAAQABAAE -1.IBPluginDependency -2.CustomClassName -2.IBPluginDependency - 10.IBPluginDependency 104.IBPluginDependency 106.IBPluginDependency - 11.IBPluginDependency 111.IBPluginDependency 113.CustomClassName 113.IBPluginDependency - 12.CustomClassName - 12.IBPluginDependency + 116.IBPluginDependency + 118.IBPluginDependency 13.CustomClassName 13.IBPluginDependency 15.IBPluginDependency 16.CustomClassName 16.IBPluginDependency 17.IBPluginDependency - 18.CustomClassName 18.IBPluginDependency 2.IBPluginDependency 26.IBPluginDependency 27.IBPluginDependency - 28.CustomClassName - 28.IBPluginDependency 29.IBPluginDependency 30.CustomClassName 30.IBPluginDependency @@ -1447,7 +1272,6 @@ AAgACAAIAAEAAQABAAE 41.CustomClassName 41.IBPluginDependency 9.IBPluginDependency - 93.IBPluginDependency YES @@ -1458,11 +1282,9 @@ AAgACAAIAAEAAQABAAE com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIPauseResumeButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIDuration + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin UISpeakerButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -1470,13 +1292,10 @@ AAgACAAIAAEAAQABAAE UIMuteButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIHangUpButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIHangUpButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDigitButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -1503,7 +1322,6 @@ AAgACAAIAAEAAQABAAE UIDigitButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -1518,7 +1336,7 @@ AAgACAAIAAEAAQABAAE - 115 + 119 @@ -1542,7 +1360,8 @@ AAgACAAIAAEAAQABAAE YES addCall - callDuration + addToConf + callControlSubView callTableView close contacts @@ -1550,7 +1369,6 @@ AAgACAAIAAEAAQABAAE dialer eight endCtrl - endPad five four hash @@ -1560,13 +1378,10 @@ AAgACAAIAAEAAQABAAE one padSubView pause - peerName - peerNumber seven six speaker star - status three two zero @@ -1574,7 +1389,8 @@ AAgACAAIAAEAAQABAAE YES UIButton - UILabel + UIButton + UIView UITableView UIButton UIButton @@ -1589,16 +1405,12 @@ AAgACAAIAAEAAQABAAE UIButton UIButton UIButton - UIButton UIView UIButton - UILabel - UILabel UIButton UIButton UIButton UIButton - UILabel UIButton UIButton UIButton @@ -1609,7 +1421,8 @@ AAgACAAIAAEAAQABAAE YES addCall - callDuration + addToConf + callControlSubView callTableView close contacts @@ -1617,7 +1430,6 @@ AAgACAAIAAEAAQABAAE dialer eight endCtrl - endPad five four hash @@ -1627,13 +1439,10 @@ AAgACAAIAAEAAQABAAE one padSubView pause - peerName - peerNumber seven six speaker star - status three two zero @@ -1645,8 +1454,12 @@ AAgACAAIAAEAAQABAAE UIButton - callDuration - UILabel + addToConf + UIButton + + + callControlSubView + UIView callTableView @@ -1676,10 +1489,6 @@ AAgACAAIAAEAAQABAAE endCtrl UIButton - - endPad - UIButton - five UIButton @@ -1716,14 +1525,6 @@ AAgACAAIAAEAAQABAAE pause UIButton - - peerName - UILabel - - - peerNumber - UILabel - seven UIButton @@ -1740,10 +1541,6 @@ AAgACAAIAAEAAQABAAE star UIButton - - status - UILabel - three UIButton @@ -1771,22 +1568,6 @@ AAgACAAIAAEAAQABAAE ./Classes/UIDigitButton.h - - UIDuration - UILabel - - IBProjectSource - ./Classes/UIDuration.h - - - - UIHangUpButton - UIButton - - IBProjectSource - ./Classes/UIHangUpButton.h - - UIMuteButton UIToggleButton diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index 0b02bf203..a5fe0a59c 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -694,7 +694,7 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach libmsilbc_init(); #if defined (HAVE_SILK) - libmssilk_init(); + //libmssilk_init(); #endif #ifdef HAVE_AMR libmsamr_init(); //load amr plugin if present from the liblinphone sdk diff --git a/Classes/LinphoneUI/UIHangUpButton.m b/Classes/LinphoneUI/UIHangUpButton.m index 879276338..ffb57a87f 100644 --- a/Classes/LinphoneUI/UIHangUpButton.m +++ b/Classes/LinphoneUI/UIHangUpButton.m @@ -23,7 +23,13 @@ @implementation UIHangUpButton -(void) touchUp:(id) sender { - linphone_core_terminate_call([LinphoneManager getLc],linphone_core_get_current_call([LinphoneManager getLc])); + LinphoneCore* lc = [LinphoneManager getLc]; + if (!lc) + return; + LinphoneCall* call = linphone_core_get_current_call([LinphoneManager getLc]); + + if (call) + linphone_core_terminate_call(lc,call); } - (id)initWithFrame:(CGRect)frame { diff --git a/Classes/LinphoneUI/UIPauseResumeButton.m b/Classes/LinphoneUI/UIPauseResumeButton.m index 9cd47f8ac..22f7db8b3 100644 --- a/Classes/LinphoneUI/UIPauseResumeButton.m +++ b/Classes/LinphoneUI/UIPauseResumeButton.m @@ -38,13 +38,13 @@ } -(bool) isInitialStateOn { @try { - const MSList* c = linphone_core_get_calls([LinphoneManager getLc]); + LinphoneCall* c = linphone_core_get_current_call([LinphoneManager getLc]); if (c) { - return linphone_call_get_state((LinphoneCall*)c->data) == LinphoneCallPaused; + return linphone_call_get_state(c) == LinphoneCallPaused; } else { - - return false; + /* if current call is paused -> c == null */ + return true; } } @catch(NSException* e) { //not ready yet From 649e245a3a8782e31ef3b58e5fe93b65ec0bc6f7 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Mon, 7 Nov 2011 15:09:59 +0100 Subject: [PATCH 05/11] Add back-to-in-call-view button on dialer during call --- Classes/PhoneViewController.h | 2 + Classes/PhoneViewController.m | 14 +- Classes/PhoneViewController.xib | 399 +++++++++++--------------------- PhoneMainView.xib | 2 - 4 files changed, 151 insertions(+), 266 deletions(-) diff --git a/Classes/PhoneViewController.h b/Classes/PhoneViewController.h index 07df3c9b5..8d209d6ee 100644 --- a/Classes/PhoneViewController.h +++ b/Classes/PhoneViewController.h @@ -36,6 +36,7 @@ UIEraseButton* erase; UIView* incallView; + UIButton* backToCallView; UIDuration* callDuration; UIMuteButton* mute; UISpeakerButton* speaker; @@ -82,6 +83,7 @@ @property (nonatomic, retain) IBOutlet UIButton* speaker; @property (nonatomic, retain) IBOutlet UILabel* peerLabel; +@property (nonatomic, retain) IBOutlet UIButton* backToCallView; @property (nonatomic, retain) IBOutlet UIButton* one; @property (nonatomic, retain) IBOutlet UIButton* two; diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index 4073cc1a1..8ca16ba45 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -33,7 +33,7 @@ @synthesize hangup; @synthesize status; @synthesize erase; - +@synthesize backToCallView; @synthesize incallView; @synthesize callDuration; @@ -107,7 +107,15 @@ [mute initWithOnImage:[UIImage imageNamed:@"mic_muted.png"] offImage:[UIImage imageNamed:@"mic_active.png"] ]; [speaker initWithOnImage:[UIImage imageNamed:@"Speaker-32-on.png"] offImage:[UIImage imageNamed:@"Speaker-32-off.png"] ]; [erase initWithAddressField:address]; - + + [backToCallView addTarget:self action:@selector(backToCallViewPressed) forControlEvents:UIControlEventTouchUpInside]; +} + +-(void) backToCallViewPressed { + [self displayInCall: nil + FromUI:nil + forUser:nil + withDisplayName:nil]; } @@ -193,9 +201,7 @@ } else { [peerLabel setText:username?username:@""]; } - [address setHidden:true]; [incallView setHidden:false]; - [dialerView setHidden:true]; } -(void) displayCall:(LinphoneCall*) call InProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { [self displayInCall: call ViewforUser:username diff --git a/Classes/PhoneViewController.xib b/Classes/PhoneViewController.xib index 9e854ae94..385db8b02 100644 --- a/Classes/PhoneViewController.xib +++ b/Classes/PhoneViewController.xib @@ -43,133 +43,6 @@ 292 YES - - - -2147483356 - - YES - - - 292 - {320, 40} - - - NO - YES - NO - IBCocoaTouchFramework - who - - 1 - MCAwIDAAA - - - 1 - 10 - 1 - - 1 - 17 - - - Helvetica - 17 - 16 - - - - - 292 - {{98, 38}, {124, 21}} - - - NO - YES - NO - IBCocoaTouchFramework - how long - - - 1 - 10 - 1 - - - - - - 292 - {{239, 14}, {72, 37}} - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - 3 - MQA - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - 3 - MC41AA - - - NSImage - Speaker-32-off.png - - - Helvetica-Bold - Helvetica - 2 - 15 - - - Helvetica-Bold - 15 - 16 - - - - - 292 - {{0, 14}, {72, 37}} - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - mic_active.png - - - - - - {320, 65} - - - - 1 - MC45MDE5NjA3OSAwLjkwMTk2MDc5IDAuOTAxOTYwNzkAA - - NO - IBCocoaTouchFramework - 292 @@ -181,23 +54,39 @@ {{254, 0}, {66, 65}} + NO IBCocoaTouchFramework 0 0 <- - + + 3 + MQA + 1 MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - + + 3 + MC41AA + NSImage clavier-01-106px.png - - + + Helvetica-Bold + Helvetica + 2 + 15 + + + Helvetica-Bold + 15 + 16 + @@ -205,6 +94,7 @@ {{5, 0}, {255, 66}} + NO NO IBCocoaTouchFramework @@ -242,6 +132,7 @@ {320, 65} + 1 MC45MDE5NjA3OSAwLjkwMTk2MDc5IDAuOTAxOTYwNzkAA @@ -254,6 +145,7 @@ {{0, 328}, {160, 66}} + NO NO IBCocoaTouchFramework @@ -274,7 +166,7 @@ clavier-01-160px.png - + @@ -282,17 +174,28 @@ {{9, 390}, {304, 21}} + NO YES NO IBCocoaTouchFramework status - + + 1 + MCAwIDAAA + 1 10 - - + + 1 + 17 + + + Helvetica + 17 + 16 + @@ -300,6 +203,7 @@ {{213, 64}, {107, 66}} + NO NO IBCocoaTouchFramework @@ -314,7 +218,7 @@ - + @@ -322,6 +226,7 @@ {{0, 130}, {107, 66}} + NO NO IBCocoaTouchFramework @@ -336,7 +241,7 @@ - + @@ -344,6 +249,7 @@ {{107, 130}, {106, 66}} + NO NO IBCocoaTouchFramework @@ -361,7 +267,7 @@ clavier-01-108px.png - + @@ -369,6 +275,7 @@ {{213, 130}, {107, 66}} + NO NO IBCocoaTouchFramework @@ -383,7 +290,7 @@ - + @@ -391,6 +298,7 @@ {{0, 196}, {107, 66}} + NO NO IBCocoaTouchFramework @@ -405,7 +313,7 @@ - + @@ -413,6 +321,7 @@ {{213, 196}, {107, 66}} + NO NO IBCocoaTouchFramework @@ -427,7 +336,7 @@ - + @@ -435,6 +344,7 @@ {{107, 64}, {106, 66}} + NO NO IBCocoaTouchFramework @@ -449,7 +359,7 @@ - + @@ -457,6 +367,7 @@ {{0, 64}, {107, 66}} + 1 MC40MDAwMDAwMSAxIDEgMAA @@ -475,7 +386,7 @@ - + @@ -483,6 +394,7 @@ {{0, 262}, {107, 66}} + NO NO IBCocoaTouchFramework @@ -497,7 +409,7 @@ - + @@ -505,6 +417,7 @@ {{107, 262}, {106, 66}} + NO NO IBCocoaTouchFramework @@ -519,7 +432,7 @@ - + @@ -527,6 +440,7 @@ {{213, 262}, {107, 66}} + NO NO IBCocoaTouchFramework @@ -541,7 +455,7 @@ - + @@ -549,6 +463,7 @@ {{107, 196}, {106, 66}} + NO NO IBCocoaTouchFramework @@ -563,7 +478,7 @@ - + @@ -571,6 +486,7 @@ {{160, 328}, {160, 66}} + NO NO IBCocoaTouchFramework @@ -589,12 +505,61 @@ - + + + + + -2147483356 + + YES + + + 292 + {160, 66} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + Back + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + + 2 + 2 + + + Helvetica-Bold + 18 + 16 + + + + {{160, 328}, {160, 66}} + + + + + 1 + MC45MDE5NjA3OSAwLjkwMTk2MDc5IDAuOTAxOTYwNzkAA + + NO + IBCocoaTouchFramework {{0, 20}, {320, 460}} + 1 MC45MDE5NjA3OSAwLjkwMTk2MDc5IDAuOTAxOTYwNzkAA @@ -750,38 +715,6 @@ 119 - - - peerLabel - - - - 120 - - - - callDuration - - - - 121 - - - - speaker - - - - 123 - - - - mute - - - - 125 - erase @@ -806,6 +739,14 @@ 159 + + + backToCallView + + + + 161 + delegate @@ -863,7 +804,6 @@ - @@ -876,6 +816,7 @@ + @@ -900,38 +841,11 @@ YES - - - - + inCall - - 117 - - - speaker - - - 116 - - - duration - - - 118 - - - mute - - - 115 - - - display - 39 @@ -1017,6 +931,12 @@ Address + + 160 + + + back + @@ -1033,16 +953,10 @@ 107.IBPluginDependency 114.IBPluginDependency 114.IBUserGuides - 115.IBPluginDependency - 116.CustomClassName - 116.IBPluginDependency - 117.CustomClassName - 117.IBPluginDependency - 118.CustomClassName - 118.IBPluginDependency 150.CustomClassName 150.IBPluginDependency 157.IBPluginDependency + 160.IBPluginDependency 29.CustomClassName 29.IBPluginDependency 30.CustomClassName @@ -1104,16 +1018,10 @@ 1 - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIDuration - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UISpeakerButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIMuteButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIEraseButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDigitButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDigitButton @@ -1157,7 +1065,7 @@ - 159 + 161 @@ -1183,6 +1091,7 @@ __call address back + backToCallView callDuration dialerView eight @@ -1211,6 +1120,7 @@ UIButton UITextField UIButton + UIButton UILabel UIView UIButton @@ -1242,6 +1152,7 @@ __call address back + backToCallView callDuration dialerView eight @@ -1279,6 +1190,10 @@ back UIButton + + backToCallView + UIButton + callDuration UILabel @@ -1390,14 +1305,6 @@ ./Classes/UIDigitButton.h - - UIDuration - UILabel - - IBProjectSource - ./Classes/UIDuration.h - - UIEraseButton UIButton @@ -1414,30 +1321,6 @@ ./Classes/UIHangUpButton.h - - UIMuteButton - UIToggleButton - - IBProjectSource - ./Classes/UIMuteButton.h - - - - UISpeakerButton - UIToggleButton - - IBProjectSource - ./Classes/UISpeakerButton.h - - - - UIToggleButton - UIButton - - IBProjectSource - ./Classes/UIToggleButton.h - - 0 @@ -1460,21 +1343,17 @@ YES YES - Speaker-32-off.png clavier-01-106px.png clavier-01-108px.png clavier-01-160px.png - mic_active.png startcall-green.png stopcall-red.png YES - {32, 32} {106, 60} {108, 60} {160, 60} - {20, 20} {60, 52} {62, 54} diff --git a/PhoneMainView.xib b/PhoneMainView.xib index 27580eb6f..26cbcfb90 100644 --- a/PhoneMainView.xib +++ b/PhoneMainView.xib @@ -47,7 +47,6 @@ {320, 480} - 1 MSAxIDEAA @@ -141,7 +140,6 @@ 266 {{0, 431}, {320, 49}} - 3 MCAwAA From 58e9256f79412fefd5a56f3546f5ee28656ea9ae Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Mon, 7 Nov 2011 15:40:18 +0100 Subject: [PATCH 06/11] DTMF fixes --- Classes/IncallViewController.m | 10 +++++----- Classes/LinphoneUI/UIDigitButton.h | 7 ++++++- Classes/LinphoneUI/UIDigitButton.m | 8 +++++--- Classes/PhoneViewController.m | 30 +++++++++++++++++------------- 4 files changed, 33 insertions(+), 22 deletions(-) diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index 96b339ef2..4b2163559 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -115,7 +115,7 @@ int callCount(LinphoneCore* lc) { [mergeCalls setHidden:YES]; - selectedCall = nil; + //selectedCall = nil; } -(void) addCallPressed { @@ -157,7 +157,6 @@ int callCount(LinphoneCore* lc) { if (durationRefreasher != nil) { [durationRefreasher invalidate]; durationRefreasher=nil; - selectedCall = nil; } } @@ -188,7 +187,8 @@ int callCount(LinphoneCore* lc) { -(void) displayInCall:(LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { dismissed = false; - selectedCall = call; + if (call) + selectedCall = call; [self updateUIFromLinphoneState: nil]; } -(void) displayDialerFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { @@ -299,8 +299,8 @@ int callCount(LinphoneCore* lc) { - (void) updateCell:(UITableViewCell*)cell at:(NSIndexPath*) path withCall:(LinphoneCall*) call conferenceActive:(bool)confActive{ if (call == NULL) { - ms_error("UpdateCell called with null call"); - [cell.textLabel setText:@"BUG IN APP - call is null"]; + ms_warning("UpdateCell called with null call"); + [cell.textLabel setText:@""]; return; } const LinphoneAddress* addr = linphone_call_get_remote_address(call); diff --git a/Classes/LinphoneUI/UIDigitButton.h b/Classes/LinphoneUI/UIDigitButton.h index 08b3a813b..70f7aee18 100644 --- a/Classes/LinphoneUI/UIDigitButton.h +++ b/Classes/LinphoneUI/UIDigitButton.h @@ -23,9 +23,14 @@ @private char mDigit; UITextField* mAddress; + + bool_t sendDtmfDuringCall; } -(void) initWithNumber:(char)digit ; --(void) initWithNumber:(char)digit addressField:(UITextField*) address; +-(void) initWithNumber:(char)digit addressField:(UITextField*) address dtmf:(bool_t)send; + + +@property bool_t sendDtmfDuringCall; @end diff --git a/Classes/LinphoneUI/UIDigitButton.m b/Classes/LinphoneUI/UIDigitButton.m index a4660f11a..2a0cad86c 100644 --- a/Classes/LinphoneUI/UIDigitButton.m +++ b/Classes/LinphoneUI/UIDigitButton.m @@ -23,11 +23,12 @@ @implementation UIDigitButton +@synthesize sendDtmfDuringCall; -(void) touchDown:(id) sender { - if (mAddress && !linphone_core_in_call([LinphoneManager getLc])) { + if (mAddress && (!sendDtmfDuringCall || !linphone_core_in_call([LinphoneManager getLc]))) { NSString* newAddress = [NSString stringWithFormat:@"%@%c",mAddress.text,mDigit]; [mAddress setText:newAddress]; linphone_core_play_dtmf([LinphoneManager getLc], mDigit, -1); @@ -60,9 +61,10 @@ } -(void) initWithNumber:(char)digit { - [self initWithNumber:digit addressField:nil]; + [self initWithNumber:digit addressField:nil dtmf:true]; } --(void) initWithNumber:(char)digit addressField:(UITextField*) address{ +-(void) initWithNumber:(char)digit addressField:(UITextField*) address dtmf:(bool_t)sendDtmf{ + sendDtmfDuringCall = sendDtmf; mDigit=digit ; mAddress=address?[address retain]:nil; [self addTarget:self action:@selector(touchDown:) forControlEvents:UIControlEventTouchDown]; diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index 8ca16ba45..0e09d9a7c 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -91,18 +91,18 @@ [super viewDidLoad]; mDisplayName = [UILabel alloc]; - [zero initWithNumber:'0' addressField:address ]; - [one initWithNumber:'1' addressField:address ]; - [two initWithNumber:'2' addressField:address ]; - [three initWithNumber:'3' addressField:address ]; - [four initWithNumber:'4' addressField:address ]; - [five initWithNumber:'5' addressField:address ]; - [six initWithNumber:'6' addressField:address ]; - [seven initWithNumber:'7' addressField:address ]; - [eight initWithNumber:'8' addressField:address ]; - [nine initWithNumber:'9' addressField:address ]; - [star initWithNumber:'*' addressField:address ]; - [hash initWithNumber:'#' addressField:address ]; + [zero initWithNumber:'0' addressField:address dtmf:false]; + [one initWithNumber:'1' addressField:address dtmf:false]; + [two initWithNumber:'2' addressField:address dtmf:false]; + [three initWithNumber:'3' addressField:address dtmf:false]; + [four initWithNumber:'4' addressField:address dtmf:false]; + [five initWithNumber:'5' addressField:address dtmf:false]; + [six initWithNumber:'6' addressField:address dtmf:false]; + [seven initWithNumber:'7' addressField:address dtmf:false]; + [eight initWithNumber:'8' addressField:address dtmf:false]; + [nine initWithNumber:'9' addressField:address dtmf:false]; + [star initWithNumber:'*' addressField:address dtmf:false]; + [hash initWithNumber:'#' addressField:address dtmf:false]; [__call initWithAddress:address withDisplayName:mDisplayName]; [mute initWithOnImage:[UIImage imageNamed:@"mic_muted.png"] offImage:[UIImage imageNamed:@"mic_active.png"] ]; [speaker initWithOnImage:[UIImage imageNamed:@"Speaker-32-on.png"] offImage:[UIImage imageNamed:@"Speaker-32-off.png"] ]; @@ -201,7 +201,7 @@ } else { [peerLabel setText:username?username:@""]; } - [incallView setHidden:false]; + [incallView setHidden:NO]; } -(void) displayCall:(LinphoneCall*) call InProgressFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { [self displayInCall: call ViewforUser:username @@ -209,6 +209,8 @@ //[__call setEnabled:false]; [callDuration setText:NSLocalizedString(@"Calling...",nil)]; if ([speaker isOn]) [speaker toggle] ; //preset to off + + [incallView setHidden:NO]; } -(void) displayInCall:(LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { @@ -220,6 +222,8 @@ withDisplayName:displayName]; if ([speaker isOn]) [speaker toggle] ; //preset to off; } + + [incallView setHidden:NO]; } //status reporting -(void) displayStatus:(NSString*) message { From 2ef541de045dc46c818d7bfc11e23f6ab2132f8c Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Tue, 8 Nov 2011 14:33:57 +0100 Subject: [PATCH 07/11] Check LinphoneCore ptr validity before using it --- Classes/LinphoneUI/LinphoneManager.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index a5fe0a59c..6018af979 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -791,6 +791,8 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach } -(void) beginInterruption { + if (!theLinphoneCore) + return; LinphoneCall* c = linphone_core_get_current_call(theLinphoneCore); ms_message("Sound interruption detected!"); if (c) { @@ -799,6 +801,8 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach } -(void) endInterruption { + if (!theLinphoneCore) + return; ms_message("Sound interruption ended!"); const MSList* c = linphone_core_get_calls(theLinphoneCore); From 28f114cf29a53888b81344e9e72645760347064d Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Tue, 8 Nov 2011 15:18:10 +0100 Subject: [PATCH 08/11] Fix 'presentModelViewController' crash for iOS 5 with multicall --- Classes/AdvancedPhoneViewController.m | 3 ++- linphone.xcodeproj/project.pbxproj | 3 --- submodules/linphone | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Classes/AdvancedPhoneViewController.m b/Classes/AdvancedPhoneViewController.m index 1328e5ad3..39266f9c8 100644 --- a/Classes/AdvancedPhoneViewController.m +++ b/Classes/AdvancedPhoneViewController.m @@ -52,7 +52,8 @@ } -(void) displayInCall: (LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - if (linphone_call_get_dir(call)==LinphoneCallIncoming){ + if (self.presentedViewController != mIncallViewController && + linphone_call_get_dir(call)==LinphoneCallIncoming){ [self presentModalViewController:mIncallViewController animated:true]; } diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index e7cd1110c..aa8973b9a 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -403,8 +403,6 @@ 22F2508D107141E100AC9B3F /* PhoneViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PhoneViewController.xib; sourceTree = ""; }; 22F254801073D99800AC9B3F /* ringback.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = ringback.wav; path = "liblinphone-sdk/apple-darwin/share/sounds/linphone/ringback.wav"; sourceTree = ""; }; 22F51EF5107FA66500F98953 /* untitled.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = untitled.plist; sourceTree = ""; }; - 22F9D6B51463EBDC00C6FEAF /* AdvancedPhoneViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AdvancedPhoneViewController.m; sourceTree = ""; }; - 22F9D6B61463EBDC00C6FEAF /* AdvancedPhoneViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AdvancedPhoneViewController.h; sourceTree = ""; }; 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* linphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linphone_Prefix.pch; sourceTree = ""; }; @@ -811,7 +809,6 @@ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( - F0A486D71404FE53009EC0BE /* libsrtp.a */, 2214783B1386A2030020F8B8 /* Localizable.strings */, 22A10D9E11F88C1F00373793 /* liblinphone.xcodeproj */, 223148E51178A09900637D6A /* libmsilbc.a */, diff --git a/submodules/linphone b/submodules/linphone index f13744a76..9d7b21816 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit f13744a765200961c74617c12295d04640a74f05 +Subproject commit 9d7b218163752f7d76c59b6d873be222b3b97583 From 4e0cba4db9ae038624dd76c3aabacaa986e14292 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Tue, 8 Nov 2011 16:12:59 +0100 Subject: [PATCH 09/11] Update xcode project --- linphone.xcodeproj/project.pbxproj | 4 ++++ submodules/liblinphone.xcodeproj/project.pbxproj | 4 ++++ submodules/linphone | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index aa8973b9a..e7f916b11 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -83,6 +83,7 @@ 22F254811073D99800AC9B3F /* ringback.wav in Resources */ = {isa = PBXBuildFile; fileRef = 22F254801073D99800AC9B3F /* ringback.wav */; }; 22F51EF6107FA66500F98953 /* untitled.plist in Resources */ = {isa = PBXBuildFile; fileRef = 22F51EF5107FA66500F98953 /* untitled.plist */; }; 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; + 3440A549146978BB0076355C /* libsrtp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3440A548146978BB0076355C /* libsrtp.a */; }; 346A75C714619F1D005C9D07 /* AdvancedPhoneViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 346A75C614619F1D005C9D07 /* AdvancedPhoneViewController.m */; }; 346A75C814619F73005C9D07 /* IncallViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 222A483212F7176F0075F07F /* IncallViewController.m */; }; 346A75CB14628DC6005C9D07 /* pausecall.png in Resources */ = {isa = PBXBuildFile; fileRef = 346A75C914628DC6005C9D07 /* pausecall.png */; }; @@ -406,6 +407,7 @@ 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* linphone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linphone_Prefix.pch; sourceTree = ""; }; + 3440A548146978BB0076355C /* libsrtp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsrtp.a; path = "liblinphone-sdk/apple-darwin/lib/libsrtp.a"; sourceTree = ""; }; 346A75C514619F1D005C9D07 /* AdvancedPhoneViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AdvancedPhoneViewController.h; sourceTree = ""; }; 346A75C614619F1D005C9D07 /* AdvancedPhoneViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AdvancedPhoneViewController.m; sourceTree = ""; }; 346A75C914628DC6005C9D07 /* pausecall.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = pausecall.png; path = submodules/linphone/pixmaps/pausecall.png; sourceTree = ""; }; @@ -447,6 +449,7 @@ 22D1B68112A3E0BE001AE361 /* libresolv.dylib in Frameworks */, 226F2ED71344B0EF00F6EF27 /* libopencore-amrnb.a in Frameworks */, 226F2ED81344B0EF00F6EF27 /* libmsamr.a in Frameworks */, + 3440A549146978BB0076355C /* libsrtp.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -812,6 +815,7 @@ 2214783B1386A2030020F8B8 /* Localizable.strings */, 22A10D9E11F88C1F00373793 /* liblinphone.xcodeproj */, 223148E51178A09900637D6A /* libmsilbc.a */, + 3440A548146978BB0076355C /* libsrtp.a */, 223148E31178A08200637D6A /* libilbc.a */, 220FAD2810765B400068D98F /* libeXosip2.a */, 220FAD2910765B400068D98F /* libgsm.a */, diff --git a/submodules/liblinphone.xcodeproj/project.pbxproj b/submodules/liblinphone.xcodeproj/project.pbxproj index 3eb2650c2..ebd7dd53b 100644 --- a/submodules/liblinphone.xcodeproj/project.pbxproj +++ b/submodules/liblinphone.xcodeproj/project.pbxproj @@ -187,6 +187,7 @@ 22DD21B413A8E3310018ECD4 /* mediastreamViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22DD21AD13A8E3310018ECD4 /* mediastreamViewController.m */; }; 22FC56A813CB69FB002FD0F1 /* qualityindicator.c in Sources */ = {isa = PBXBuildFile; fileRef = 22FC56A713CB69FA002FD0F1 /* qualityindicator.c */; }; 22FC56AA13CB6A4F002FD0F1 /* bitratecontrol.c in Sources */ = {isa = PBXBuildFile; fileRef = 22FC56A913CB6A4F002FD0F1 /* bitratecontrol.c */; }; + 3440A54B14697B570076355C /* l16.c in Sources */ = {isa = PBXBuildFile; fileRef = 3440A54A14697B570076355C /* l16.c */; }; 7014533C13FA7ECA00A01D86 /* zrtp.h in Headers */ = {isa = PBXBuildFile; fileRef = 7014533B13FA7ECA00A01D86 /* zrtp.h */; }; 7014533E13FA841E00A01D86 /* zrtp.c in Sources */ = {isa = PBXBuildFile; fileRef = 7014533D13FA841E00A01D86 /* zrtp.c */; }; 70E542EE13E147C7002BA2C0 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70E542ED13E147C7002BA2C0 /* OpenGLES.framework */; }; @@ -418,6 +419,7 @@ 22DD21AD13A8E3310018ECD4 /* mediastreamViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = mediastreamViewController.m; sourceTree = ""; }; 22FC56A713CB69FA002FD0F1 /* qualityindicator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = qualityindicator.c; sourceTree = ""; }; 22FC56A913CB6A4F002FD0F1 /* bitratecontrol.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bitratecontrol.c; sourceTree = ""; }; + 3440A54A14697B570076355C /* l16.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = l16.c; sourceTree = ""; }; 7014533B13FA7ECA00A01D86 /* zrtp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zrtp.h; sourceTree = ""; }; 7014533D13FA841E00A01D86 /* zrtp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zrtp.c; sourceTree = ""; }; 70E542ED13E147C7002BA2C0 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; @@ -601,6 +603,7 @@ 222CA5DC11F6CF7600621220 /* src */ = { isa = PBXGroup; children = ( + 3440A54A14697B570076355C /* l16.c */, 22985D9214643BEF005CA0B5 /* aqsnd.c */, 225AA2E2144F1E3400BA809B /* qosanalyzer.c */, 225AA2E0144F1C6600BA809B /* bitratedriver.c */, @@ -1117,6 +1120,7 @@ 225AA2E3144F1E3400BA809B /* qosanalyzer.c in Sources */, 225AA2FD1451A95400BA809B /* conference.c in Sources */, 22985D9314643BEF005CA0B5 /* aqsnd.c in Sources */, + 3440A54B14697B570076355C /* l16.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/submodules/linphone b/submodules/linphone index 9d7b21816..cb3f7eb55 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 9d7b218163752f7d76c59b6d873be222b3b97583 +Subproject commit cb3f7eb5565d36e677145cf969e6d99ee8cb6ce5 From ec261bd518f54a140afa7a09bf0c1ef4ff8406e2 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Wed, 9 Nov 2011 16:04:59 +0100 Subject: [PATCH 10/11] Improved graphics/layout for incall view --- Classes/AdvancedPhoneViewController.m | 4 +- Classes/IncallViewController.h | 10 +- Classes/IncallViewController.m | 140 ++- Classes/IncallViewController.xib | 1450 ++++++++++++------------- Classes/LinphoneAppDelegate.m | 8 +- Classes/LinphoneUI/UIToggleButton.m | 6 +- Classes/PhoneViewController.m | 1 + PhoneMainView.xib | 26 +- Resources/Speaker-32-off.png | Bin 615 -> 1798 bytes Resources/Speaker-32-on.png | Bin 569 -> 1782 bytes Resources/addcall-green.png | Bin 0 -> 6261 bytes Resources/conf_merge.png | Bin 0 -> 3135 bytes Resources/contact_orange.png | Bin 0 -> 4771 bytes Resources/mic_active.png | Bin 0 -> 6770 bytes Resources/mic_muted.png | Bin 0 -> 10007 bytes Resources/numpad.png | Bin 0 -> 5314 bytes Resources/pausecall.png | Bin 0 -> 1622 bytes Resources/resumecall.png | Bin 0 -> 3110 bytes linphone.xcodeproj/project.pbxproj | 64 +- 19 files changed, 883 insertions(+), 826 deletions(-) create mode 100644 Resources/addcall-green.png create mode 100644 Resources/conf_merge.png create mode 100644 Resources/contact_orange.png create mode 100644 Resources/mic_active.png create mode 100644 Resources/mic_muted.png create mode 100644 Resources/numpad.png create mode 100644 Resources/pausecall.png create mode 100644 Resources/resumecall.png diff --git a/Classes/AdvancedPhoneViewController.m b/Classes/AdvancedPhoneViewController.m index 39266f9c8..8ad355a1b 100644 --- a/Classes/AdvancedPhoneViewController.m +++ b/Classes/AdvancedPhoneViewController.m @@ -52,8 +52,8 @@ } -(void) displayInCall: (LinphoneCall*) call FromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName { - if (self.presentedViewController != mIncallViewController && - linphone_call_get_dir(call)==LinphoneCallIncoming){ + if (self.presentedViewController != mIncallViewController && (call == 0x0 || + linphone_call_get_dir(call)==LinphoneCallIncoming)){ [self presentModalViewController:mIncallViewController animated:true]; } diff --git a/Classes/IncallViewController.h b/Classes/IncallViewController.h index a7c99288e..1efea4006 100644 --- a/Classes/IncallViewController.h +++ b/Classes/IncallViewController.h @@ -26,12 +26,12 @@ @interface IncallViewController : UIViewController { - UIView* controlSubView, *callControlSubView; + UIView* controlSubView, *callControlSubView, *hangUpView; UIButton* endCtrl; UIButton* dialer; UIMuteButton* mute; - UIPauseResumeButton* pause; + UIButton* pause; UISpeakerButton* speaker; UIButton* contacts; UITableView* callTableView; @@ -58,6 +58,10 @@ bool dismissed; NSTimer *durationRefreasher; + NSTimer * glowingTimer; + + float glow; + NSIndexPath* activePath; ABPeoplePickerNavigationController* myPeoplePickerController; @@ -72,6 +76,8 @@ @property (nonatomic, retain) IBOutlet UIView* controlSubView; @property (nonatomic, retain) IBOutlet UIView* callControlSubView; @property (nonatomic, retain) IBOutlet UIView* padSubView; +@property (nonatomic, retain) IBOutlet UIView* hangUpView; + @property (nonatomic, retain) IBOutlet UIButton* endCtrl; @property (nonatomic, retain) IBOutlet UIButton* dialer; diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index 4b2163559..8a961044b 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -28,6 +28,7 @@ @synthesize controlSubView; @synthesize callControlSubView; @synthesize padSubView; +@synthesize hangUpView; @synthesize addToConf; @synthesize endCtrl; @@ -67,6 +68,8 @@ bool isInConference(LinphoneCall* call) { + if (!call) + return false; return linphone_call_get_current_params(call)->in_conference; } @@ -88,10 +91,7 @@ int callCount(LinphoneCore* lc) { [super viewDidLoad]; //Controls [mute initWithOnImage:[UIImage imageNamed:@"mic_muted.png"] offImage:[UIImage imageNamed:@"mic_active.png"] ]; - UIImage* rc = [UIImage imageNamed:@"resumecall.png"]; - UIImage* pc = [UIImage imageNamed:@"pausecall.png"]; - [pause initWithOnImage:rc offImage:pc ]; - [speaker initWithOnImage:[UIImage imageNamed:@"Speaker-32-on.png"] offImage:[UIImage imageNamed:@"Speaker-32-off.png"] ]; + [speaker initWithOnImage:[UIImage imageNamed:@"Speaker-32-on.png"] offImage:[UIImage imageNamed:@"Speaker-32-off.png"] ]; //Dialer init @@ -112,6 +112,8 @@ int callCount(LinphoneCore* lc) { [mergeCalls addTarget:self action:@selector(mergeCallsPressed) forControlEvents:UIControlEventTouchDown]; [endCtrl addTarget:self action:@selector(endCallPressed) forControlEvents:UIControlEventTouchUpInside]; [addToConf addTarget:self action:@selector(addToConfCallPressed) forControlEvents:UIControlEventTouchUpInside]; + [pause addTarget:self action:@selector(pauseCallPressed) forControlEvents:UIControlEventTouchUpInside]; + [mergeCalls setHidden:YES]; @@ -134,6 +136,14 @@ int callCount(LinphoneCore* lc) { linphone_core_add_to_conference([LinphoneManager getLc], selectedCall); } +-(void) pauseCallPressed { + if (!selectedCall) + return; + if (linphone_call_get_state(selectedCall) == LinphoneCallPaused) + linphone_core_resume_call([LinphoneManager getLc], selectedCall); + else + linphone_core_pause_call([LinphoneManager getLc], selectedCall); +} -(void)updateCallsDurations { @@ -150,6 +160,13 @@ int callCount(LinphoneCore* lc) { selector:@selector(updateCallsDurations) userInfo:nil repeats:YES]; + glowingTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 + target:self + selector:@selector(updateGlow) + userInfo:nil + repeats:YES]; + glow = 0; + } } @@ -157,6 +174,8 @@ int callCount(LinphoneCore* lc) { if (durationRefreasher != nil) { [durationRefreasher invalidate]; durationRefreasher=nil; + [glowingTimer invalidate]; + glowingTimer = nil; } } @@ -165,11 +184,15 @@ int callCount(LinphoneCore* lc) { } + + -(void) displayStatus:(NSString*) message; { [self updateUIFromLinphoneState: nil]; } -(void) displayPad:(bool) enable { + [callTableView setHidden:enable]; + [hangUpView setHidden:enable]; [controlSubView setHidden:enable]; [padSubView setHidden:!enable]; } @@ -178,6 +201,8 @@ int callCount(LinphoneCore* lc) { [self displayPad:false]; dismissed = false; + if (call) + selectedCall = call; [self updateUIFromLinphoneState: nil]; } @@ -198,7 +223,10 @@ int callCount(LinphoneCore* lc) { } -(void) updateUIFromLinphoneState:(UIViewController *)viewCtrl { [mute reset]; - [pause reset]; + + // if ( + // [pause reset]; + LinphoneCore* lc; @@ -225,8 +253,28 @@ int callCount(LinphoneCore* lc) { [addToConf setHidden:(linphone_core_get_conference_size(lc) == 0 || isInConference(selectedCall))]; } - // hide pause/resume if in conference - [pause setHidden:linphone_core_is_in_conference(lc)]; + int callsCount = linphone_core_get_calls_nb(lc); + // hide pause/resume if in conference + if (selectedCall) { + if (linphone_core_is_in_conference(lc)) + [pause setHidden:YES]; + else if (linphone_call_get_state(selectedCall)==LinphoneCallPaused) { + [pause setHidden:NO]; + //[pause setTitle:@"Resume" forState:UIControlStateNormal]; + pause.selected = YES; + pause.highlighted = NO; + } else if (callCount(lc) == callsCount && callsCount == 1) { + [pause setHidden:NO]; + //[pause setTitle:@"Pause" forState:UIControlStateNormal]; + pause.selected = NO; + pause.highlighted = NO; + } else { + [pause setHidden:YES]; + } + } else { + [pause setHidden:callsCount > 0]; + } + [mergeCalls setHidden:!pause.hidden]; } - (IBAction)doAction:(id)sender { @@ -295,7 +343,42 @@ int callCount(LinphoneCore* lc) { } } +-(void) updateActive:(bool_t)active cell:(UITableViewCell*) cell { + if (!active) { + + cell.backgroundColor = [UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:0.2]; + + UIColor* c = [[UIColor blackColor] colorWithAlphaComponent:0.5]; + [cell.textLabel setTextColor:c]; + [cell.detailTextLabel setTextColor:c]; + } else { + cell.backgroundColor = [UIColor colorWithRed:0.4 green:0.4 blue:0.4 alpha:(0.7+sin(2*glow)*0.3)]; + [cell.textLabel setTextColor:[UIColor whiteColor]]; + [cell.detailTextLabel setTextColor:[UIColor whiteColor]]; + } + [cell.textLabel setBackgroundColor:[UIColor clearColor]]; + [cell.detailTextLabel setBackgroundColor:[UIColor clearColor]]; + [cell.accessoryView setHidden:YES]; + //[cell.backgroundView setBackgroundColor:cell.backgroundColor]; +} +-(void) updateGlow { + glow += 0.1; + + NSIndexPath* path = [callTableView indexPathForSelectedRow]; + if (path) { + UITableViewCell* cell = [callTableView cellForRowAtIndexPath:path]; + [self updateActive:YES cell:cell]; + [cell.backgroundView setNeedsDisplay]; + [cell setNeedsDisplay]; + [callTableView setNeedsDisplay]; + } +} + +-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { + [self updateActive:(cell.accessoryType == UITableViewCellAccessoryCheckmark) cell:cell]; + //cell.accessoryType = UITableViewCellAccessoryNone; +} - (void) updateCell:(UITableViewCell*)cell at:(NSIndexPath*) path withCall:(LinphoneCall*) call conferenceActive:(bool)confActive{ if (call == NULL) { @@ -328,30 +411,39 @@ int callCount(LinphoneCore* lc) { } [cell.detailTextLabel setText:ms]; - + /* if (linphone_core_get_current_call([LinphoneManager getLc]) == call) { - cell.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.5]; + cell.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:1]; } else if (confActive && isInConference(call)) { - cell.backgroundColor = [UIColor colorWithRed:0 green:0 blue:1 alpha:0.5]; + cell.backgroundColor = [UIColor colorWithRed:0 green:0 blue:1 alpha:1]; } else{ - cell.backgroundColor = [UIColor colorWithRed:1 green:0.5 blue:0 alpha:0.5]; - } + cell.backgroundColor = [UIColor colorWithRed:1 green:0.5 blue:0 alpha:1]; + }*/ + + + if (call == selectedCall) { - // [cell setSelected:YES animated:NO]; + [cell setSelected:YES animated:NO]; + [callTableView selectRowAtIndexPath:path animated:NO scrollPosition:UITableViewScrollPositionNone]; cell.accessoryType = UITableViewCellAccessoryCheckmark; }else{ - //[cell setSelected:NO animated:NO]; + [cell setSelected:NO animated:NO]; + [callTableView deselectRowAtIndexPath:path animated:NO]; cell.accessoryType = UITableViewCellAccessoryNone; } } + -(void) updateConferenceCell:(UITableViewCell*) cell at:(NSIndexPath*)indexPath { [cell.textLabel setText:@"Conference"]; LinphoneCore* lc = [LinphoneManager getLc]; cell.accessoryType = UITableViewCellAccessoryNone; + [self updateActive:NO cell:cell]; + cell.selected = NO; + [callTableView deselectRowAtIndexPath:indexPath animated:NO]; NSMutableString* ms = [[NSMutableString alloc] init ]; const MSList* calls = linphone_core_get_calls(lc); @@ -366,18 +458,23 @@ int callCount(LinphoneCore* lc) { else [ms appendFormat:@"%s ", linphone_address_get_username(addr), nil]; - - if (call == selectedCall) - cell.accessoryType = UITableViewCellAccessoryCheckmark; + //if (call == selectedCall) + // [self updateActive:YES cell:cell]; + if (call == selectedCall) { + [callTableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; + cell.selected = YES; + cell.accessoryType = UITableViewCellAccessoryCheckmark; + + } } calls = calls->next; } [cell.detailTextLabel setText:ms]; - if (linphone_core_is_in_conference(lc)) - cell.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.5]; + /*if (linphone_core_is_in_conference(lc)) + cell.backgroundColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:1]; else - cell.backgroundColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:0.5]; + cell.backgroundColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:1];*/ } @@ -398,7 +495,7 @@ int callCount(LinphoneCore* lc) { cell.userInteractionEnabled = YES; cell.selectionStyle = UITableViewCellSelectionStyleNone; - cell.selectionStyle = UITableViewCellSelectionStyleBlue; + //cell.selectionStyle = UITableViewCellSelectionStyleBlue; @@ -445,6 +542,7 @@ int callCount(LinphoneCore* lc) { // UITableViewDataSource - (NSString*) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { + return nil; return @"Calls"; if (section == 0 && linphone_core_get_conference_size([LinphoneManager getLc]) > 0) return @"Conference"; diff --git a/Classes/IncallViewController.xib b/Classes/IncallViewController.xib index ee5b5db69..a77415f09 100644 --- a/Classes/IncallViewController.xib +++ b/Classes/IncallViewController.xib @@ -45,130 +45,58 @@ 274 - {320, 182} + {320, 276} _NS:418 - + 3 - MQA + MC42NjY2NjY2NjY3AA YES IBCocoaTouchFramework YES NO - 1 0 - YES YES 44 22 22 - + 292 YES - - + + 292 - {{119, -4}, {82, 52}} - + {{36, 8}, {248, 52}} + - + + + 1 + MSAwIDAuMDgyMzIwMjU5MDQgMC4xOAA + NO NO IBCocoaTouchFramework 0 0 - 1 - Pau. Res. - + + 3 + MQA + 1 - MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA 3 MC41AA - - NSImage - mic_active.png - - - NSImage - pausecall.png - - - NSImage - mic_muted.png - - - - 2 - 10 - - - Helvetica-Bold - 10 - 16 - - - - - 292 - {{26, -4}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - Add to conf - - - 1 - MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - - - - - - 2 - 14 - - - Helvetica-Bold - 14 - 16 - - - - - 292 - {{27, 56}, {262, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - NSImage stopcall-red.png @@ -186,331 +114,15 @@ - {{0, 312}, {320, 148}} + {{0, 392}, {320, 68}} - + _NS:196 - + 3 - MC42NjY2NjY2NjY3AA + MC4zMzMzMzMzMzMzAA - NO - NO - IBCocoaTouchFramework - - - - -2147483356 - - YES - - - 292 - {{95, 244}, {82, 37}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - hide - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{95, 184}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 0 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{5, 9}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 1 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{95, 9}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 2 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{185, 9}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 3 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{5, 69}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 4 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{95, 69}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 5 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{185, 69}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 6 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{5, 124}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 7 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{95, 124}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 8 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{185, 124}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - 9 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{5, 184}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - * - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - 292 - {{185, 184}, {82, 52}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 1 - # - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - {{24, 72}, {272, 317}} - - - - - NO - NO IBCocoaTouchFramework @@ -521,31 +133,32 @@ 292 - {{119, 55}, {82, 52}} + {{119, 58}, {82, 52}} - + + NO NO IBCocoaTouchFramework 0 0 - 1 - Merge 1 MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - - - + + NSImage + conf_merge.png + + + 2 17 - + Helvetica-Bold 17 16 @@ -554,27 +167,26 @@ 292 - {{25, 0}, {82, 52}} + {{36, 5}, {82, 52}} + NO NO IBCocoaTouchFramework 0 0 - 1 - Mute 1 MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - - - + + NSImage + mic_active.png + 2 2 @@ -588,53 +200,52 @@ 292 - {{25, 54}, {82, 52}} + {{36, 58}, {82, 52}} + NO NO IBCocoaTouchFramework 0 0 - 1 - Add call 1 MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - NSImage - startcall-green.png + addcall-green.png - - 292 - {{206, 54}, {82, 52}} + {{202, 58}, {82, 52}} - + + NO NO IBCocoaTouchFramework 0 0 - 1 Cont 1 MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - + + 1 + MCAwIDAAA + NSImage contact-orange.png @@ -645,17 +256,16 @@ 292 - {{116, 0}, {82, 52}} + {{119, 5}, {82, 52}} + NO NO IBCocoaTouchFramework 0 0 - 1 - DTMF 1 @@ -664,7 +274,7 @@ NSImage - dialer-orange.png + numpad.png @@ -672,16 +282,16 @@ 292 - {{206, 0}, {82, 52}} + {{202, 5}, {82, 52}} + NO NO IBCocoaTouchFramework 0 0 - 1 Spk @@ -689,19 +299,358 @@ MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - NSImage - Speaker-32-off.png - + + + 292 + {{119, 58}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + + + NSImage + resumecall.png + + + NSImage + pausecall.png + + + + - {{0, 191}, {320, 113}} + {{0, 276}, {320, 115}} - + + NO + NO + IBCocoaTouchFramework + + + + -2147483356 + + YES + + + 292 + {{95, 219}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + Close + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{95, 166}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 0 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{12, 7}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 1 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{95, 7}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 2 + + + + + + + + + 292 + {{178, 7}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 3 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{12, 60}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 4 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{95, 60}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 5 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{178, 60}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 6 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{12, 113}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 7 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{95, 113}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 8 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{178, 113}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 9 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{12, 166}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + * + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + 292 + {{178, 166}, {82, 52}} + + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + # + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + {{24, 115}, {272, 279}} + + + + NO NO IBCocoaTouchFramework @@ -746,126 +695,6 @@ 109 - - - eight - - - - 75 - - - - nine - - - - 58 - - - - seven - - - - 73 - - - - six - - - - 71 - - - - five - - - - 69 - - - - four - - - - 67 - - - - three - - - - 60 - - - - one - - - - 54 - - - - zero - - - - 55 - - - - two - - - - 59 - - - - hash - - - - 57 - - - - star - - - - 56 - - - - close - - - - 51 - - - - padSubView - - - - 45 - - - - callControlSubView - - - - 117 - endCtrl @@ -874,22 +703,6 @@ 99 - - - pause - - - - 115 - - - - mergeCalls - - - - 114 - addCall @@ -900,11 +713,19 @@ - contacts + controlSubView - + - 84 + 44 + + + + mergeCalls + + + + 114 @@ -922,6 +743,14 @@ 49 + + + pause + + + + 115 + mute @@ -932,19 +761,131 @@ - controlSubView + contacts - + - 44 + 84 - addToConf + star - + - 119 + 56 + + + + two + + + + 59 + + + + one + + + + 54 + + + + four + + + + 67 + + + + hash + + + + 57 + + + + nine + + + + 58 + + + + padSubView + + + + 45 + + + + zero + + + + 55 + + + + seven + + + + 73 + + + + three + + + + 60 + + + + close + + + + 51 + + + + eight + + + + 75 + + + + six + + + + 71 + + + + five + + + + 69 + + + + hangUpView + + + + 122 @@ -1026,10 +967,10 @@ YES - + + - @@ -1039,167 +980,41 @@ - 27 - - - YES - - - - - - - - - - - - - - - - pad - - - 33 - - - 8 - - - 32 - - - 9 - - - 34 - - - 7 - - - 37 - - - 6 - - - 36 - - - 5 - - - 35 - - - 4 - - - 38 - - - 3 - - - 30 - - - 1 - - - 41 - - - 0 - - - 39 - - - 2 - - - 40 - - - hash - - - 31 - - - star - - - 29 - - - close - - - 116 - + 120 + YES - - - callcontrols 18 - + end - - 113 - - - pauseresume - - - 118 - - - addtoconf - 26 YES - - + + + controls - 104 - + 113 + - merge - - - 111 - - - addcall - - - 15 - - - contacts + pauseresume 13 @@ -1213,12 +1028,130 @@ dialer + + 15 + + + contacts + + + 111 + + + addcall + 16 mute + + 104 + + + merge + + + 27 + + + YES + + + + + + + + + + + + + + + + pad + + + 31 + + + star + + + 30 + + + 1 + + + 33 + + + 8 + + + 40 + + + hash + + + 36 + + + 5 + + + 29 + + + close + + + 39 + + + 2 + + + 41 + + + 0 + + + 38 + + + 3 + + + 35 + + + 4 + + + 37 + + + 6 + + + 34 + + + 7 + + + 32 + + + 9 + @@ -1230,17 +1163,19 @@ -2.CustomClassName -2.IBPluginDependency 104.IBPluginDependency + 104.IBUIButtonInspectorSelectedStateConfigurationMetadataKey 106.IBPluginDependency 111.IBPluginDependency - 113.CustomClassName + 111.IBUIButtonInspectorSelectedStateConfigurationMetadataKey 113.IBPluginDependency - 116.IBPluginDependency - 118.IBPluginDependency + 113.IBUIButtonInspectorSelectedStateConfigurationMetadataKey + 120.IBPluginDependency 13.CustomClassName 13.IBPluginDependency 15.IBPluginDependency 16.CustomClassName 16.IBPluginDependency + 16.IBUIButtonInspectorSelectedStateConfigurationMetadataKey 17.IBPluginDependency 18.IBPluginDependency 2.IBPluginDependency @@ -1280,17 +1215,19 @@ UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIPauseResumeButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UISpeakerButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIMuteButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -1336,7 +1273,7 @@ - 119 + 122 @@ -1371,6 +1308,7 @@ endCtrl five four + hangUpView hash mergeCalls mute @@ -1400,6 +1338,7 @@ UIButton UIButton UIButton + UIView UIButton UIButton UIButton @@ -1432,6 +1371,7 @@ endCtrl five four + hangUpView hash mergeCalls mute @@ -1497,6 +1437,10 @@ four UIButton + + hangUpView + UIView + hash UIButton @@ -1576,14 +1520,6 @@ ./Classes/UIMuteButton.h - - UIPauseResumeButton - UIToggleButton - - IBProjectSource - ./Classes/UIPauseResumeButton.h - - UISpeakerButton UIToggleButton @@ -1608,10 +1544,6 @@ com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 @@ -1622,24 +1554,24 @@ YES YES - Speaker-32-off.png + addcall-green.png + conf_merge.png contact-orange.png - dialer-orange.png mic_active.png - mic_muted.png + numpad.png pausecall.png - startcall-green.png + resumecall.png stopcall-red.png YES - {32, 32} + {82, 71} + {82, 75} {25, 23} - {25, 24} - {20, 20} - {20, 20} - {25, 23} - {60, 52} + {82, 82} + {82, 82} + {82, 75} + {82, 75} {62, 54} diff --git a/Classes/LinphoneAppDelegate.m b/Classes/LinphoneAppDelegate.m index 736d06e16..b73da3f43 100644 --- a/Classes/LinphoneAppDelegate.m +++ b/Classes/LinphoneAppDelegate.m @@ -143,9 +143,13 @@ [super dealloc]; } - - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { - linphone_core_accept_call([LinphoneManager getLc],linphone_core_get_current_call([LinphoneManager getLc])); + LinphoneCall* call = (LinphoneCall*)[notification.userInfo objectForKey:@"call"]; + if (!call) { + ms_warning("Local notification received with nil call"); + return; + } + linphone_core_accept_call([LinphoneManager getLc], call); } diff --git a/Classes/LinphoneUI/UIToggleButton.m b/Classes/LinphoneUI/UIToggleButton.m index 5961a46c1..04c0b3721 100644 --- a/Classes/LinphoneUI/UIToggleButton.m +++ b/Classes/LinphoneUI/UIToggleButton.m @@ -47,9 +47,9 @@ } -(void) initWithOnImage:(UIImage*) onImage offImage:(UIImage*) offImage { - mOnImage = [onImage retain]; - mOffImage = [offImage retain]; - mIsOn=false; + mOnImage = [onImage retain]; + mOffImage = [offImage retain]; + mIsOn=false; [self reset]; [self addTarget:self action:@selector(touchUp:) forControlEvents:UIControlEventTouchUpInside]; diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index 0e09d9a7c..243e5558d 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -247,6 +247,7 @@ notif.alertBody =[NSString stringWithFormat:NSLocalizedString(@" %@ is calling you",nil),[displayName length]>0?displayName:username]; notif.alertAction = @"Answer"; notif.soundName = @"oldphone-mono-30s.caf"; + notif.userInfo = [NSDictionary dictionaryWithObject:call forKey:"call"]; [[UIApplication sharedApplication] presentLocalNotificationNow:notif]; } diff --git a/PhoneMainView.xib b/PhoneMainView.xib index 26cbcfb90..1eb8dfbfc 100644 --- a/PhoneMainView.xib +++ b/PhoneMainView.xib @@ -65,18 +65,12 @@ IBCocoaTouchFramework NO - - - Dialer - - NSImage - dialer-orange.png - + + IBCocoaTouchFramework + 5 - PhoneViewController - 1 1 @@ -105,13 +99,18 @@ IBCocoaTouchFramework NO - - - + + + Dialer + + NSImage + dialer-orange.png + IBCocoaTouchFramework - 5 + PhoneViewController + 1 1 @@ -119,6 +118,7 @@ IBCocoaTouchFramework NO + diff --git a/Resources/Speaker-32-off.png b/Resources/Speaker-32-off.png index e93ae232f1f89192f3c27bd09a17e456f51ffb88..3a5b3fd73575527eecd542cbe844da391e6aeb55 100644 GIT binary patch literal 1798 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 Hf;BcaL-hkZ diff --git a/Resources/addcall-green.png b/Resources/addcall-green.png new file mode 100644 index 0000000000000000000000000000000000000000..8ccfe2ba13da0e449690778c3417448c25b2e391 GIT binary patch literal 6261 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 literal 0 HcmV?d00001 diff --git a/Resources/conf_merge.png b/Resources/conf_merge.png new file mode 100644 index 0000000000000000000000000000000000000000..409609c06eab47c987136f6ed249071b4be49d9e GIT binary patch literal 3135 zcmZ`*dpHw}_g}3ynaJysm|Mvute9Jd<`y!Fxf_LzUS?>>bqWou$f~I&^R6tnjV7BW zK*R3G3i?g5KF@6P( zi5pfC3j(2Xh;UdK*(n@Hh(&QFgvu&i$B!{6M27u$u_h@|EG|37$tOAyPCX>MFtO8v z^h`IVsYT+#5Cgy7JOm$o?5}SDy-V@|kz6aUmdf5dzGuea*Cxz0Ua7zNyi4i?aCEP#KXR7N$+xUJ|yA5i7;bTTqaMs7G38HKc?}`MVq` z*R*}hmOHNd͙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 P8UW|co_DOV56SvJ45Rv) literal 0 HcmV?d00001 diff --git a/Resources/contact_orange.png b/Resources/contact_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..cbdf86df8f5dae072cb35dcc42274832b9d1d2d4 GIT binary patch literal 4771 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 literal 0 HcmV?d00001 diff --git a/Resources/mic_active.png b/Resources/mic_active.png new file mode 100644 index 0000000000000000000000000000000000000000..e4b7c6a1b7fbd3f0bdf98a3d709ff48f903aae3b GIT binary patch literal 6770 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 literal 0 HcmV?d00001 diff --git a/Resources/mic_muted.png b/Resources/mic_muted.png new file mode 100644 index 0000000000000000000000000000000000000000..6110a04fc5304e9fb7f61b474bad85fe234972f6 GIT binary patch literal 10007 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 F{{W0a!`uJ> literal 0 HcmV?d00001 diff --git a/Resources/numpad.png b/Resources/numpad.png new file mode 100644 index 0000000000000000000000000000000000000000..966b483486404145b65ed9d20477938e7171d5e1 GIT binary patch literal 5314 zcmW-l2UL>ZAI8z#xiTD)xi$9+M`n%^SE8Ze-f2lWOAX6WREn4@OB0n!6E`LrnwqBO z#EnJD&z$8TQ>1d&|LuQx-}Aobp2I!&-tTii&vW0@i;gxz0uTWZ2qa`@Yvl|)|9|uG z0B^mT_X~grPv8X`E70G6zZdVya)1{8NL!DaAkg8X|85QtzEBEiQpyH?LHJVfX$f$ov_*^>*dC%08Tp z1jBasl3-bJgnE7n7|R*)#I4gnXZ_^wRSr(H2W!4o=CX96DH8cobzm5Ci87`w=ARp^ z!#4dZqT}E>)I0v^?>A#yu>}$tg8!XXS!rHXDS$*aj*q^<46>!;2#Ro;f}L292Sp$K z@qoPEc<@87$9-$B`3@5KFxVpm3eknT$fr;DH`HsM2g6`e$guZqIPFS*i%w_jjF5|Klf(wQiW&V2I-kurT;`5AH5rU@_$)y!r+9R!QQV#;K-GTSI13SQ};GUT2 zPRg47&_uB3GvW$U$Eu$CA1hhniK9@V8rQ?g0T%R_tWy%a zRhwZ259){WKEAzLbiBM?_0>}pUY{-8CED27*wozIIX!&>^q#D#ic>JSnQtvY{VJB$ zji~{nUIu#%K9QZDV0xdtw$=Rp;z{F=tT$U&E)@P8JqDP~N;FPaP%q!XpJBLZYSS{U z9m;S;!#s}!;faH8S)edRa)6Y>A?7uUqP&U)PD<)V%ySy3_ z$x!%_UcHTM3b_d8zIE%? zzd=WvJglr--r8G^HklprTDljDC)U<$-Y247Yo@_Me2+36f9jE5&e}*(R0VPqMq7i9 zM7yDt)ze7K*P6i6$Wiqr#ukjN0c|0X39v0aOCoC51XnBx=(0el>uzObA3I({{`=-u z<^Go0wmeQj#ded?OuE2cghQH!$shK%-w*7KLg9Z)n7bOcRdo6!qonIq!=!jze8hr^ zwrXyS7O zZ3a|q;@%F@v+tLsUiC;e&ZzU&KGMs=z5gLe;CGeI)P1SC7=w5&VQqMIm(VD7!$9fi zm`$#V)+zph_MH?`8W!0pala5N-6yMT=ZxAUcYouVozw7)4&`Ld2V&D|YrVwvic3*AKo)HFO>aNH%Vy6N zaSE?cp3QCuuzM~yJ!UMtQBO*6bbadr@q*gtP{Xc|AH~DN!$p(j_l~cpfONg-*WQeV z8qUSZNcVDpEjnh}^r-rSOaD4s`0<0(@VQkK;7J%GwDn4Ts&xrRm#)2llDa!GYoh9b z>aMKVA|Pc)N5{w;H!v*pqn-FR1=~*l>2S$AckWz7iW8PPpl~p(gVTnv~rBaM1($t2Bhc|w&dHvg>CPlgXQvBqP*8-pr`Hag= zq%_}JUK%vt+Bx!TK?M##(f=bAzLJEM#_jTPhj#Vj6Yc2nzj=2dwI@o!3Wh zRqD&h$r+!=LP{&uo2Rugau#?ZFqdXh9+#t~+m)#;_Fic&iY@Ge00UcUCq9Epy%4|q zlfSI2?3sg#1_uWS_*bzi28I93V4N4_iuB3T65vSmp#!Clij7TndTu7q$GL(gELqZH z1d|Vah#EwXDd>py@^7~KV+1iENl8ic-#=%27NYv;n-Ydnf-h7B9B5W0W816h#@Dj; zRo>!@;9fto!BQBx_drR35)f%C14<};fI*g`y5{zDR^mxJF^TuU>R{xuGV+3tU8z4N zk=9LTJ+56~{mJ%5JXYev+#QN|>up~%422I~Io0#V8et_Ua)(%1S-L|v4D)!U;*upq z(LR-38o?!tEmo9O=_=Rg96Y5Ig$Zu564eytN_%{oR3#XWITQcs+)X9PE;boCYFBHY zj>evY^c>FS9n-I`*qy6WC{6On)sxd2k5=vgt6CC+n;ryvjKA+&=&wAzdF(0Q4tf+0 zd8=JBL4WEQESKwd+I~9d^5~3}7RjEQo^JC^y;EWApzmA1h|UX1r`N6u^2Q6!LO1lw57?9o3~fx)vK19nIxKFGb0Nj5F?^ zbRzicO1+p2)z7$8*jTI@Db0J3D4UX!vSC{L03KJm9NPk5G31S>Ag;eJ)8x(CK>5&_ z5CV#oAUpEhJY{_ka6HZ9N4SGLBuqyxzxa<_E$;0J=7yy65X=$;K*|={X|Lb;igeA1 z-tV}ZO$wZ{-rm?-Z%<)1^L4!r>TEsMLP`s71TLyXfg9x5*~X{Vt_c6i%Hrwp^YobS z>+7|PQ}b_{N%h_ZWJpvzgAx@P2^wL$2R(rWbf!Pp3T61F_Uucy?|eJH-8Le6Z?JK- zdH5RQLkEe;F~tus&~B#!g&!9u1s28O99nyH1sfP)P)Pcl7|3Q^>x_6!GGWPBIDQ5g zP$&Z3KB8l0-mZR>MDrjc6svZF(7kQKC1IPVaK*Zm7DxIsLHqu1HY?@j;0GeGPuFN? zA~tj0w2bk+a;`AM6+3IetVv?iFzC}qA*I^9l_gZ)i_$bG+;#F*LzdqJU{Ead;AV)& zy-c!1Vn*OfV1cXoJCdjxtk6Ma`{&A0Qf+OWyQY1GEPui0=Zll%yYuJJ zCsc8fiHR8i3LVN^T)pRO)o`4E^F>Jm)9K;dY4f{n$N7a$r*AK0nn%XQ_F&|l(#GO_ z=nvQTmVe#eNRVBNEqKZC<)ha$3OuT?Lg#A}*}D8T!Sjg8;u zoOF^(?{UH=`f2C=gIa-6#KsQ$>VIFpCHjWd>HEwQhk21me;a_1qj=CH)<9;g) z%~Q#MM^~l9?BlB+Y4GSAlbaE+3GZ|cG^kVet7R+bQ|vw|_ZsnCT#S`Y$*&tQTJttyW`-q(DVVS3lcrX);3veK4Ey#&WTk}5=ldRU*^+R#$5vJJtj_{b3` zNBITJ`X=V=jI6_sSvC*ZJlc&nJf|^yIExE5TPUfjBUSf98!!D!8)0vUC@?}Gk#ok5 z6^k7$57cGfB8P|rNgGo=?G1cWcB-wB=&+JJWi5qM$}Zwn*e5ycwTIwW=n0D%mT_+7 zbMjr=AnquRc%K5l=sNzFhI=mD2_YCOgaJfI0)+M>GEH_5%#yq0O^Sr2d(~JNsNI03 zXN?5V0wj-;F@HG8G@~Kxc-#7AfEpjK)fIzl!@x~gH4{@)tCs0pL%s4!93b7fNNjA& z5Jbv~mitR3tmryh!xC=@N#CG3nFk~#C6!(obnzf8y`(ein)Sv)0=c54c>(4CPSo4m ztC24hF*OlsA+3NSO6dXvA)LMA8u;YH)f`l#r`9JWiz(mIY_A*%a+)0tTmIF{At*av zL1U&`UBd?eT1knbAkTe!{d*$9ivl61?qY=u;FqCOk;a-k)_NgXY4aY+taT9qL*(nF z!~!n-5b=pbj)4oZL(Z25_)yEVZ`6jqP;R=$Fr5+>ZE~WCMD58!1n*0c$v8oqPu~=) zinafOjxCEnRBHz2^|8+lectw-uTMTCk_mB zQn%!bN}Rt{N$LV}=w6Ebyo8W|A&`lH^a)^aaUD(j+M5&L+wAmxC>{*ag1b1VY4q`uZOjDbfRwE>P6e-j{qbKF)Yx$eaociscVO>U{qXO zYNo7tpnkrt=`$2MJ#0)tva{(Rv81U8m z9Ux%cx93u1XX9iv+*us{b?&nZy_wqwTQmP$y+6pAKM62?VPWBo>02{;pFbFBU%bUw z8hOrQ*0#_8{0VM&dv~iAh40iA{Jyp}x5Hl2P!?>?kX&_ysNI}}E(g}V|N2$gEPneg zjpkxq%KGLMA0*19D|m>Pm)G{O)s(eZubxT{zoV1WzYyc?;}c+5P{TJKCH=@+F~}ns zkkX**0~L?l0F$Em#YL`&nKmu{$0JKZT^7>4Qi42E>DC%Tmot+Ut5%gRv0o%g>BCqu zfj2(j$<-1=_2$&C&I5l`apdt-jZ;a1o2i*#$p>8aAGGV-TKy#V6pcQnUW0{sv}rMI z%bO$U&tndI8i7&0s}n4I>9o?& z?BN6Cf6B6B-SdzgADJHP&YMuve9^eM{`ke=jjKhmVe0jp8!7tIgr9xv)`kU&WByY= zaH7LG@i&={<^IGE{#|>+HMVJRk*{j%t5w-Mwz%<$ixy3pDnE_(N;;rIJ^O%L+5b*4 z(Nz8QO0PRXKYrEiYhJglR-j$>>K)w-u*YR8c@zk`%wM9tdJeQFzq1+{VLxxbd&;By zBL=je5NlPx@{)#9vX<~ z7DxvSieABxXfMm&8qfp41D^XFfVod0ZogDWAy#eR{WQ{}q`RV|xjF)2idt06`W{e$ z>OY!P7Jt)TTjpG3-*4ZvgzO1!n-;AP4SAA*A16;-PxC{1{nsZwwPu)+nF&Oc3td64 zR@}7q@DBmwZg6ne*P`}>7@ym(l{(v=5~phe?%ry%Gd1Jml;RpPk(h zU5hQ7;8DD8`?Z&Cn#q0WPd;I3juFxRa4AmNU+215$*>ST#!YIoQl^a8ChSW?_i$ZI z8SkaiqUd}Sei`BueP%j+tCr#HpmQCsLhY)W9U-3H#C2W&R>FOJ>{g%jMl<{cvO1$r z+|^P_?@Yzid~3xtzHB#WPe=AdRz%C+I2QwQWti>2bKkJe<=`=r!=ii!DnIyZo36VEb9bK#zVjSlbG zBFvmEap=^{WaJrEaMh(>TX5s=@|fyX?C0OFO;|E|bdva+od%rLs`?6*ONlvL?iq6| zW&7ey->pI)uKooZf*BZ_;ihc4*_0WgT6Z*$w><`ar>F;)R>z#oDeg8+=H4Kk3;iaE z8L5=3(5ys3&K!Rv1<9`RveD|_@OerMHF;7&5;gkT$q;yK-iYD5#`zm*5b2wR3u6EW zX+8`H_!t1t{GD%Yv}&>g%`ktfxqRSo;mi%^t4ApP519hFeqfV<>xKn&u2O`d`R88x zYkMxs0_v#bfWGAf7GFVgrkTZ?-Uv& zr&}vFkq(;>iLbKvxl&03Y-vl;*Je>u#q#5D#@%`KcD2~@u+`0))vpx=pz0Pgs{ZdU zz`136e+S5c|MF2}bo2+xUYM!*I9U_$h~N6rrkz3h0S*TI4H>6D^?R-o-gy~apUkzI zW5S}ZC>6;aia-186`cv3+&Z=rK2r|X#cfs1RN*d~c~s1P*U*rVVuYPW|J=ZDE?17Z zFefHMB`<0DX1REZj^5GwAI8GB-^l=*CJK$VT}vu(g1$RxBMzqtm{IdbmYUwZ;|6`w zckucgw6b7=ulW(zM2<4#Z~Jj-oB88u%37m5=|)6^2*CG$C$?I;qM=VkjJw{>2`U*p z!WKw8toPBPyy$JEVwhxloTgA!eb#)tM{Wlt%=ONA%n8C0Fy^`0SrCw^NKA~ddhYIL z$e!Ql{Fa6tZ0{X?-$=JUmekgFyfDto3H$J5(`Biisq@p<4|I5%(idtMj1w)D-PKP` zOkQCB-BAqJogH}h_Y-stc_Pql(iOCIdYh?9^~Ek(?H}cGg_Rw7O^2>Y!fA=5H2YYw rMM`hWA6f%h+d2W9zCUC0XUF`A5Tj68V>SW!+6c0PIa-m<`D6YE+%hWr literal 0 HcmV?d00001 diff --git a/Resources/pausecall.png b/Resources/pausecall.png new file mode 100644 index 0000000000000000000000000000000000000000..ffac25a4725feaa852d873fc05e31ab91901a1bd GIT binary patch literal 1622 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 Date: Mon, 14 Nov 2011 16:11:32 +0100 Subject: [PATCH 11/11] fix incomming call in bg mode --- Classes/LinphoneAppDelegate.m | 3 ++- Classes/PhoneViewController.m | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Classes/LinphoneAppDelegate.m b/Classes/LinphoneAppDelegate.m index b73da3f43..f4a172a23 100644 --- a/Classes/LinphoneAppDelegate.m +++ b/Classes/LinphoneAppDelegate.m @@ -144,7 +144,8 @@ } - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { - LinphoneCall* call = (LinphoneCall*)[notification.userInfo objectForKey:@"call"]; + LinphoneCall* call; + [(NSData*)([notification.userInfo objectForKey:@"call"]) getBytes:&call]; if (!call) { ms_warning("Local notification received with nil call"); return; diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index 243e5558d..214f9be66 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -247,7 +247,8 @@ notif.alertBody =[NSString stringWithFormat:NSLocalizedString(@" %@ is calling you",nil),[displayName length]>0?displayName:username]; notif.alertAction = @"Answer"; notif.soundName = @"oldphone-mono-30s.caf"; - notif.userInfo = [NSDictionary dictionaryWithObject:call forKey:"call"]; + NSData *callData = [NSData dataWithBytes:&call length:sizeof(call)]; + notif.userInfo = [NSDictionary dictionaryWithObject:callData forKey:@"call"]; [[UIApplication sharedApplication] presentLocalNotificationNow:notif]; }