diff --git a/Classes/ConferenceCallDetailCell.xib b/Classes/ConferenceCallDetailCell.xib deleted file mode 100644 index 1a406056a..000000000 --- a/Classes/ConferenceCallDetailCell.xib +++ /dev/null @@ -1,257 +0,0 @@ - - - - 1280 - 11C74 - 1938 - 1138.23 - 567.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 933 - - - IBUITableViewCell - IBUIImageView - IBUILabel - IBProxyObject - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 292 - - - - 256 - - - - 292 - {80, 80} - - - - _NS:567 - 1 - NO - IBCocoaTouchFramework - - - - 274 - {{80, 0}, {212, 80}} - - - - _NS:328 - NO - YES - 7 - 2 - NO - IBCocoaTouchFramework - Texte de test - - 1 - MCAwIDAAA - - - 1 - 10 - - 1 - 40 - - - Helvetica - 40 - 16 - - - - - 292 - {{292, 26}, {28, 28}} - - - - _NS:567 - 3 - NO - IBCocoaTouchFramework - - - {320, 79} - - - - _NS:395 - - 3 - MCAwAA - - NO - YES - 4 - YES - IBCocoaTouchFramework - - - {320, 80} - - - - _NS:384 - IBCocoaTouchFramework - - ConferenceDetailCellIdentifier - - - - - - - - conferenceDetailCell - - - - 7 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 3 - - - - - - - - - - 5 - - - - - 8 - - - - - 6 - - - - - - - ConferenceCallDetailView - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 8 - - - - - ConferenceCallDetailView - UIViewController - - UIButton - UIButton - UITableViewCell - UIButton - UIButton - UIButton - UITableView - - - - addCall - UIButton - - - back - UIButton - - - conferenceDetailCell - UITableViewCell - - - hangup - UIButton - - - mute - UIButton - - - speaker - UIButton - - - table - UITableView - - - - IBProjectSource - ./Classes/ConferenceCallDetailView.h - - - - - 0 - IBCocoaTouchFramework - YES - 3 - 933 - - diff --git a/Classes/ConferenceCallDetailView-ipad.xib b/Classes/ConferenceCallDetailView-ipad.xib deleted file mode 100644 index 57f2d7412..000000000 --- a/Classes/ConferenceCallDetailView-ipad.xib +++ /dev/null @@ -1,479 +0,0 @@ - - - - 1280 - 11C74 - 1938 - 1138.23 - 567.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 933 - - - IBUIButton - IBUITableView - IBUIView - IBProxyObject - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 274 - - - - 274 - {768, 872} - - - - _NS:418 - - 3 - MCAwAA - - YES - IBIPadFramework - YES - 0 - NO - YES - 44 - 22 - 22 - - - - 292 - {{224, 874}, {107, 66}} - - - - NO - IBIPadFramework - 0 - 0 - - 3 - MQA - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - NSImage - effacer.png - - - Helvetica-Bold - Helvetica - 2 - 15 - - - Helvetica-Bold - 15 - 16 - - - - - 292 - {{437, 873}, {107, 66}} - - - - - NO - NO - IBIPadFramework - 0 - 0 - - - 1 - MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - - - NSImage - HP_inverse.png - - - NSImage - HP.png - - - 2 - 2 - - - Helvetica-Bold - 18 - 16 - - - - - 292 - {{224, 938}, {320, 66}} - - - - - 1 - MSAwIDAuMDgyMzIwMjU5MDQgMC4xOAA - - NO - NO - IBIPadFramework - 0 - 0 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - stopcall-red.png - - - NSImage - clavier-01-106px.png - - - - - - - 292 - {{331, 873}, {106, 66}} - - - - - NO - NO - IBIPadFramework - 0 - 0 - - - 1 - MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - - - NSImage - mic_active.png - - - NSImage - micro_inverse.png - - - NSImage - micro.png - - - - - - {{0, 20}, {768, 1004}} - - - - - 3 - MC42NjY2NjY2NjY3AA - - - 2 - - IBIPadFramework - - - - - - - back - - - - 8 - - - - hangup - - - - 9 - - - - mute - - - - 10 - - - - speaker - - - - 11 - - - - table - - - - 12 - - - - view - - - - 13 - - - - dataSource - - - - 14 - - - - delegate - - - - 15 - - - - - - 0 - - - - - - 1 - - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 3 - - - Erase - - - 4 - - - speaker - - - 5 - - - - - 6 - - - end - - - 7 - - - mute - - - - - ConferenceCallDetailView - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIEraseButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UISpeakerButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIHangUpButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIMuteButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - - 15 - - - - - ConferenceCallDetailView - UIViewController - - UIButton - UIButton - UITableViewCell - UIButton - UIButton - UIButton - UITableView - - - - addCall - UIButton - - - back - UIButton - - - conferenceDetailCell - UITableViewCell - - - hangup - UIButton - - - mute - UIButton - - - speaker - UIButton - - - table - UITableView - - - - IBProjectSource - ./Classes/ConferenceCallDetailView.h - - - - UIEraseButton - UIButton - - IBProjectSource - ./Classes/UIEraseButton.h - - - - UIHangUpButton - UIButton - - IBProjectSource - ./Classes/UIHangUpButton.h - - - - UIMuteButton - UIToggleButton - - IBProjectSource - ./Classes/UIMuteButton.h - - - - UISpeakerButton - UIToggleButton - - IBProjectSource - ./Classes/UISpeakerButton.h - - - - UIToggleButton - UIButton - - IBProjectSource - ./Classes/UIToggleButton.h - - - - - 0 - IBIPadFramework - YES - 3 - - {107, 67} - {107, 67} - {106, 60} - {66, 65} - {20, 20} - {107, 67} - {107, 67} - {62, 54} - - 933 - - diff --git a/Classes/ConferenceCallDetailView.h b/Classes/ConferenceCallDetailView.h deleted file mode 100644 index 1c0ff02c0..000000000 --- a/Classes/ConferenceCallDetailView.h +++ /dev/null @@ -1,44 +0,0 @@ -/* ConferenceCallDetailView.h - * - * Copyright (C) 2011 Belledonne Comunications, Grenoble, France - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -#import -#import "LinphoneUI/UIMicroButton.h" -#import "LinphoneUI/UISpeakerButton.h" - -@interface ConferenceCallDetailView : UIViewController { - - UIMicroButton* mute; - UISpeakerButton* speaker; - UIButton* back; - UIButton* hangup; - UITableView* table; - - UITableViewCell* conferenceDetailCell; -} - -@property (nonatomic, retain) IBOutlet UIButton* mute; -@property (nonatomic, retain) IBOutlet UIButton* speaker; -@property (nonatomic, retain) IBOutlet UIButton* addCall; -@property (nonatomic, retain) IBOutlet UIButton* back; -@property (nonatomic, retain) IBOutlet UIButton* hangup; -@property (nonatomic, retain) IBOutlet UITableView* table; - -@property (nonatomic, assign) IBOutlet UITableViewCell* conferenceDetailCell; - --(void) updateCallQuality; -@end diff --git a/Classes/ConferenceCallDetailView.m b/Classes/ConferenceCallDetailView.m deleted file mode 100644 index 17769f2e7..000000000 --- a/Classes/ConferenceCallDetailView.m +++ /dev/null @@ -1,168 +0,0 @@ -/* ConferenceCallDetailView.m - * - * Copyright (C) 2011 Belledonne Comunications, Grenoble, France - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#import "ConferenceCallDetailView.h" -#import "LinphoneManager.h" -#import "InCallViewController.h" - -#include "linphonecore.h" - -@implementation ConferenceCallDetailView - -@synthesize mute; -@synthesize speaker; -@synthesize back; -@synthesize hangup; -@synthesize table; -@synthesize addCall; - -@synthesize conferenceDetailCell; - -NSTimer *callQualityRefresher; - -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil -{ - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - // Custom initialization - } - return self; -} - -- (void)didReceiveMemoryWarning -{ - // Releases the view if it doesn't have a superview. - [super didReceiveMemoryWarning]; - - // Release any cached data, images, etc that aren't in use. -} - -#pragma mark - View lifecycle - -- (void)viewDidLoad -{ - [super viewDidLoad]; - - [back addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside]; - - table.rowHeight = 80; - - /*[mute initWithOnImage:[UIImage imageNamed:@"micro_inverse.png"] offImage:[UIImage imageNamed:@"micro.png"] debugName:"MUTE button"]; - [speaker initWithOnImage:[UIImage imageNamed:@"HP_inverse.png"] offImage:[UIImage imageNamed:@"HP.png"] debugName:"SPEAKER button"]; - */ -} - --(void) backButtonPressed { - [self dismissModalViewControllerAnimated:YES]; -} - -- (void)viewDidUnload -{ - [super viewDidUnload]; - // Release any retained subviews of the main view. - // e.g. self.myOutlet = nil; -} - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - // Return YES for supported orientations - return (interfaceOrientation == UIInterfaceOrientationPortrait); -} - --(void) viewWillAppear:(BOOL)animated { - [table reloadData]; - [mute update]; - [speaker update]; - [[UIApplication sharedApplication] setIdleTimerDisabled:YES]; - [super viewWillAppear:animated]; -} - --(void) viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - callQualityRefresher = [NSTimer scheduledTimerWithTimeInterval:1 - target:self - selector:@selector(updateCallQuality) - userInfo:nil - repeats:YES]; -} - --(void) viewDidDisappear:(BOOL)animated { - [[UIApplication sharedApplication] setIdleTimerDisabled:NO]; - - if (callQualityRefresher != nil) { - [callQualityRefresher invalidate]; - callQualityRefresher=nil; - } -} - --(void) updateCallQuality { - [table reloadData]; - [table setNeedsDisplay]; -} - -#pragma mark - UITableView delegates --(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { - if (indexPath.row % 2) - cell.backgroundColor = [UIColor lightGrayColor]; - else - cell.backgroundColor = [UIColor darkGrayColor]; -} - --(UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - static NSString* identifier = @"ConferenceDetailCellIdentifier"; - UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:identifier]; - if (cell == nil) { - [[NSBundle mainBundle] loadNibNamed:@"ConferenceCallDetailCell" owner:self options:nil]; - cell = conferenceDetailCell; - self.conferenceDetailCell = nil; - } - //TODO - /* retrieve cell's fields using tags */ - //UIImageView* image = (UIImageView*) [cell viewWithTag:1]; - //UILabel* label = (UILabel*) [cell viewWithTag:2]; - - /* update cell content */ - //LinphoneCall* call = [InCallViewController retrieveCallAtIndex:indexPath.row inConference:YES]; - - //[InCallViewController updateCellImageView:image Label:label DetailLabel:nil AndAccessoryView:nil withCall:call]; - - cell.accessoryType = UITableViewCellAccessoryNone; - if (cell.accessoryView == nil) { - UIView *containerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 28, 28)] autorelease]; - cell.accessoryView = containerView; - } - else { - for (UIView *view in cell.accessoryView.subviews) { - [view removeFromSuperview]; - } - } - //UIImageView* callquality = (UIImageView*) [cell viewWithTag:3]; - //[InCallViewController updateIndicator:callquality withCallQuality:linphone_call_get_average_quality(call)]; - tableView.rowHeight = 80; - - return cell; -} - --(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - LinphoneCore* lc = [LinphoneManager getLc]; - int result = linphone_core_get_conference_size(lc) - (int)linphone_core_is_in_conference(lc); - return result; -} - -@end diff --git a/Classes/ConferenceCallDetailView.xib b/Classes/ConferenceCallDetailView.xib deleted file mode 100644 index 3b80aa096..000000000 --- a/Classes/ConferenceCallDetailView.xib +++ /dev/null @@ -1,478 +0,0 @@ - - - - 1280 - 11C74 - 1938 - 1138.23 - 567.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 933 - - - IBUITableView - IBUIButton - IBUIView - IBProxyObject - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - - - 274 - {320, 328} - - - - _NS:418 - - 3 - MCAwAA - - YES - IBCocoaTouchFramework - YES - 0 - NO - YES - 44 - 22 - 22 - - - - 292 - {{107, 328}, {106, 66}} - - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - 3 - MQA - - - 1 - MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - - 3 - MC41AA - - - NSImage - mic_active.png - - - NSImage - micro_inverse.png - - - NSImage - micro.png - - - 2 - 2 - - - Helvetica-Bold - 18 - 16 - - - - - 292 - {{213, 328}, {107, 66}} - - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - - 1 - MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - - - NSImage - HP_inverse.png - - - NSImage - HP.png - - - - - - - 292 - {{0, 394}, {320, 66}} - - - - - 1 - MSAwIDAuMDgyMzIwMjU5MDQgMC4xOAA - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - stopcall-red.png - - - NSImage - clavier-01-106px.png - - - Helvetica-Bold - Helvetica - 2 - 15 - - - Helvetica-Bold - 15 - 16 - - - - - 292 - {{0, 328}, {107, 66}} - - - - NO - IBCocoaTouchFramework - 0 - 0 - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - NSImage - effacer.png - - - - - - {{0, 20}, {320, 460}} - - - - - 3 - MC42NjY2NjY2NjY3AA - - - IBCocoaTouchFramework - - - - - - - back - - - - 16 - - - - hangup - - - - 17 - - - - mute - - - - 18 - - - - speaker - - - - 19 - - - - view - - - - 20 - - - - table - - - - 23 - - - - dataSource - - - - 21 - - - - delegate - - - - 22 - - - - - - 0 - - - - - - 1 - - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 7 - - - - - - 10 - - - mute - - - 11 - - - end - - - 12 - - - speaker - - - 14 - - - Erase - - - - - ConferenceCallDetailView - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIMuteButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - UIHangUpButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UISpeakerButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - UIEraseButton - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 23 - - - - - ConferenceCallDetailView - UIViewController - - UIButton - UIButton - UITableViewCell - UIButton - UIButton - UIButton - UITableView - - - - addCall - UIButton - - - back - UIButton - - - conferenceDetailCell - UITableViewCell - - - hangup - UIButton - - - mute - UIButton - - - speaker - UIButton - - - table - UITableView - - - - IBProjectSource - ./Classes/ConferenceCallDetailView.h - - - - UIEraseButton - UIButton - - IBProjectSource - ./Classes/UIEraseButton.h - - - - UIHangUpButton - UIButton - - IBProjectSource - ./Classes/UIHangUpButton.h - - - - UIMuteButton - UIToggleButton - - IBProjectSource - ./Classes/UIMuteButton.h - - - - UISpeakerButton - UIToggleButton - - IBProjectSource - ./Classes/UISpeakerButton.h - - - - UIToggleButton - UIButton - - IBProjectSource - ./Classes/UIToggleButton.h - - - - - 0 - IBCocoaTouchFramework - YES - 3 - - {107, 67} - {107, 67} - {106, 60} - {66, 65} - {20, 20} - {107, 67} - {107, 67} - {62, 54} - - 933 - - diff --git a/Classes/DialerViewController.h b/Classes/DialerViewController.h index 3f9083caf..188c63465 100644 --- a/Classes/DialerViewController.h +++ b/Classes/DialerViewController.h @@ -55,6 +55,7 @@ @property (nonatomic, retain) IBOutlet UICallButton* addCallButton; @property (nonatomic, retain) IBOutlet UIButton* cancelButton; @property (nonatomic, retain) IBOutlet UIEraseButton* eraseButton; + @property (nonatomic, retain) IBOutlet UIButton* oneButton; @property (nonatomic, retain) IBOutlet UIButton* twoButton; @property (nonatomic, retain) IBOutlet UIButton* threeButton; diff --git a/Classes/DialerViewController.m b/Classes/DialerViewController.m index c66283bf3..f2a3dfc1d 100644 --- a/Classes/DialerViewController.m +++ b/Classes/DialerViewController.m @@ -55,11 +55,15 @@ } - (void)viewWillAppear:(BOOL)animated { - // [[LinphoneManager instance] setRegistrationDelegate:self]; - - //TODO - //[mMainScreenWithVideoPreview showPreview:YES]; - + [super viewWillAppear:animated]; + [self update]; +} + +- (void)callUpdate:(NSNotification*)notif { + [self update]; +} + +- (void)update { if([LinphoneManager isLcReady]) { LinphoneCore *lc = [LinphoneManager getLc]; if(linphone_core_get_calls_nb(lc) > 0) { @@ -74,7 +78,6 @@ [addContactButton setHidden:false]; } } - [super viewWillAppear:animated]; } - (void)viewDidLoad { @@ -95,6 +98,13 @@ [callButton initWithAddress:addressField]; [addCallButton initWithAddress:addressField]; [eraseButton initWithAddressField:addressField]; + + // Set observer + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callUpdate:) name:@"LinphoneCallUpdate" object:nil]; +} + +- (void)viewDidUnload { + [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (void)setAddress:(NSString*) address { @@ -121,6 +131,9 @@ [starButton release]; [zeroButton release]; [hashButton release]; + + [[NSNotificationCenter defaultCenter] removeObserver:self]; + [super dealloc]; } diff --git a/Classes/DialerViewController.xib b/Classes/DialerViewController.xib index c3ef74098..26df9878a 100644 --- a/Classes/DialerViewController.xib +++ b/Classes/DialerViewController.xib @@ -224,35 +224,6 @@ - - - 292 - {{0, 135}, {107, 54}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - 7-over.png - - - NSImage - 7-actif.png - - - - 292 @@ -282,6 +253,35 @@ + + + 292 + {{0, 135}, {107, 54}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + 7-over.png + + + NSImage + 7-actif.png + + + + 292 @@ -650,7 +650,6 @@ {{214, 0}, {106, 69}} - _NS:9 NO IBCocoaTouchFramework diff --git a/Classes/InCallTableViewController.m b/Classes/InCallTableViewController.m index edd9fe1ce..f5802c21f 100644 --- a/Classes/InCallTableViewController.m +++ b/Classes/InCallTableViewController.m @@ -31,14 +31,14 @@ enum TableSection { CallSection = 1 }; -- (void)myInit { +- (void)initInCallTableViewController { self->callCellData = [[NSMutableDictionary alloc] init]; } - (id)init{ self = [super init]; if (self) { - [self myInit]; + [self initInCallTableViewController]; } return self; } @@ -46,7 +46,7 @@ enum TableSection { - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { - [self myInit]; + [self initInCallTableViewController]; } return self; } @@ -54,7 +54,7 @@ enum TableSection { - (id)initWithCoder:(NSCoder *)decoder { self = [super initWithCoder:decoder]; if (self) { - [self myInit]; + [self initInCallTableViewController]; } return self; } diff --git a/Classes/InCallViewController.m b/Classes/InCallViewController.m index ef5b48163..11a16c8f5 100644 --- a/Classes/InCallViewController.m +++ b/Classes/InCallViewController.m @@ -52,6 +52,8 @@ const NSInteger SECURE_BUTTON_TAG=5; return [super initWithNibName:@"InCallViewController" bundle:[NSBundle mainBundle]]; } +//TODO +/* - (void)orientationChanged: (NSNotification*) notif { int oldLinphoneOrientation = linphone_core_get_device_rotation([LinphoneManager getLc]); UIDeviceOrientation orientation = [UIDevice currentDevice].orientation; @@ -76,7 +78,7 @@ const NSInteger SECURE_BUTTON_TAG=5; linphone_core_update_call([LinphoneManager getLc], call, NULL); - /* animate button images rotation */ + // animate button images rotation #define degreesToRadians(x) (M_PI * x / 180.0) CGAffineTransform transform = CGAffineTransformIdentity; switch (orientation) { @@ -105,7 +107,7 @@ const NSInteger SECURE_BUTTON_TAG=5; [UIView commitAnimations]; } } -} +}*/ - (void)showControls:(id)sender { if (hideControlsTimer) { @@ -161,7 +163,8 @@ const NSInteger SECURE_BUTTON_TAG=5; - (void)enableVideoDisplay:(BOOL)animation { videoShown = true; - [self orientationChanged:nil]; + //TODO + //[self orientationChanged:nil]; [videoZoomHandler resetZoom]; @@ -180,9 +183,6 @@ const NSInteger SECURE_BUTTON_TAG=5; videoView.alpha = 1.0; videoView.hidden = FALSE; - linphone_core_set_native_video_window_id([LinphoneManager getLc],(unsigned long)videoView); - linphone_core_set_native_preview_window_id([LinphoneManager getLc],(unsigned long)videoPreview); - [[LinphoneManager instance] fullScreen: true]; [[LinphoneManager instance] showTabBar: false]; @@ -191,11 +191,9 @@ const NSInteger SECURE_BUTTON_TAG=5; #endif // [self batteryLevelChanged:nil]; - [self updateUIFromLinphoneState: YES]; videoWaitingForFirstImage.hidden = NO; [videoWaitingForFirstImage startAnimating]; - // TODO LinphoneCall *call = linphone_core_get_current_call([LinphoneManager getLc]); if (call != NULL && call->videostream) { linphone_call_set_next_video_frame_decoded_callback(call, hideSpinner, self); @@ -222,84 +220,21 @@ const NSInteger SECURE_BUTTON_TAG=5; [hideControlsTimer invalidate]; hideControlsTimer = nil; } - - /* restore buttons orientation */ - //endCtrl.imageView.transform = CGAffineTransformIdentity; - //TODO - //mute.imageView.transform = CGAffineTransformIdentity; - //speaker.imageView.transform = CGAffineTransformIdentity; - //pause.imageView.transform = CGAffineTransformIdentity; - //contacts.imageView.transform = CGAffineTransformIdentity; - //addCall.imageView.transform = CGAffineTransformIdentity; - //dialer.imageView.transform = CGAffineTransformIdentity; - //videoCallQuality.transform = CGAffineTransformIdentity; [[LinphoneManager instance] fullScreen:false]; } -/* Update in call view buttons (visibility, state, ...) and call duration text. - This is called periodically. The fullUpdate boolean is set when called after an event (call state change for instance) */ -- (void)updateUIFromLinphoneState:(BOOL) fullUpdate { - // check LinphoneCore is initialized - LinphoneCore* lc = nil; - if([LinphoneManager isLcReady]) - lc = [LinphoneManager getLc]; - - // 1 call: show pause button, otherwise show merge btn - // [LinphoneManager set:mergeCalls hidden:!pause.hidden withName:"MERGE button" andReason:"call count"]; - // reload table (glow update + call duration) - [callTableView reloadData]; - - // update conference details view if displayed - //TODO - /*if (self.presentedViewController == conferenceDetail) { - if (!linphone_core_is_in_conference(lc)) - [self dismissModalViewControllerAnimated:YES]; - else - [conferenceDetail.table reloadData]; - }*/ -} - // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; + // Set windows (warn memory leaks) + linphone_core_set_native_video_window_id([LinphoneManager getLc],(unsigned long)videoView); + linphone_core_set_native_preview_window_id([LinphoneManager getLc],(unsigned long)videoPreview); + // Set observer [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callUpdate:) name:@"LinphoneCallUpdate" object:nil]; - - //Controls - /*[mute initWithOnImage:[UIImage imageNamed:@"micro_inverse.png"] offImage:[UIImage imageNamed:@"micro.png"] debugName:"MUTE button"]; - [speaker initWithOnImage:[UIImage imageNamed:@"HP_inverse.png"] offImage:[UIImage imageNamed:@"HP.png"] debugName:"SPEAKER button"]; - */ - //Dialer init - /*[zero initWithNumber:'0']; - [one initWithNumber:'1']; - [two initWithNumber:'2']; - [three initWithNumber:'3']; - [four initWithNumber:'4']; - [five initWithNumber:'5']; - [six initWithNumber:'6']; - [seven initWithNumber:'7']; - [eight initWithNumber:'8']; - [nine initWithNumber:'9']; - [star initWithNumber:'*']; - [hash initWithNumber:'#']; - - [addCall addTarget:self action:@selector(addCallPressed) forControlEvents:UIControlEventTouchUpInside]; - [mergeCalls addTarget:self action:@selector(mergeCallsPressed) forControlEvents:UIControlEventTouchUpInside]; - [LinphoneManager set:mergeCalls hidden:YES withName:"MERGE button" andReason:"initialisation"];*/ - - //TODO - /* - if ([LinphoneManager runningOnIpad]) { - ms_message("Running on iPad"); - conferenceDetail = [[ConferenceCallDetailView alloc] initWithNibName:@"ConferenceCallDetailView-ipad" - bundle:[NSBundle mainBundle]]; - } else { - conferenceDetail = [[ConferenceCallDetailView alloc] initWithNibName:@"ConferenceCallDetailView" - bundle:[NSBundle mainBundle]]; - }*/ UITapGestureRecognizer* singleFingerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showControls:)]; [singleFingerTap setNumberOfTapsRequired:1]; @@ -310,30 +245,13 @@ const NSInteger SECURE_BUTTON_TAG=5; videoZoomHandler = [[VideoZoomHandler alloc] init]; [videoZoomHandler setup:videoGroup]; videoGroup.alpha = 0; - - //selectedCall = nil; - - //callTableView.rowHeight = 80; [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil]; + //[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(batteryLevelChanged:) name:UIDeviceBatteryLevelDidChangeNotification object:nil]; [videoCameraSwitch setPreview:videoPreview]; - //addVideo.videoUpdateIndicator = videoUpdateIndicator; - - //[transfer addTarget:self action:@selector(transferPressed) forControlEvents:UIControlEventTouchUpInside]; - - // prevent buttons resizing - /* - endCtrl.imageView.contentMode = UIViewContentModeCenter; - mute.imageView.contentMode = UIViewContentModeCenter; - speaker.imageView.contentMode = UIViewContentModeCenter; - pause.imageView.contentMode = UIViewContentModeCenter; - contacts.imageView.contentMode = UIViewContentModeCenter; - addCall.imageView.contentMode = UIViewContentModeCenter; - dialer.imageView.contentMode = UIViewContentModeCenter;*/ } - (void)transferPressed { @@ -441,53 +359,40 @@ const NSInteger SECURE_BUTTON_TAG=5; [[NSNotificationCenter defaultCenter] removeObserver:self]; } -- (void)displayPad:(bool) enable { - /*if (videoView.hidden) - [LinphoneManager set:callTableView hidden:enable withName:"CALL_TABLE view" andReason:AT];*/ - /*[LinphoneManager set:hangUpView hidden:enable withName:"HANG_UP view" andReason:AT]; - [LinphoneManager set:controlSubView hidden:enable withName:"CONTROL view" andReason:AT]; - [LinphoneManager set:padSubView hidden:!enable withName:"PAD view" andReason:AT];*/ -} - - (void)displayVideoCall:(LinphoneCall*) call { UIDevice *device = [UIDevice currentDevice]; device.proximityMonitoringEnabled = YES; - if (call !=nil && linphone_call_get_dir(call)==LinphoneCallIncoming) { - //if ([speaker isOn]) [speaker toggle]; - } - [self updateUIFromLinphoneState: YES]; - [self enableVideoDisplay: TRUE]; + if(!videoShown) + [self enableVideoDisplay: TRUE]; } -- (void)displayInCall:(LinphoneCall*) call { +- (void)displayTableCall:(LinphoneCall*) call { UIDevice *device = [UIDevice currentDevice]; device.proximityMonitoringEnabled = YES; - if (call !=nil && linphone_call_get_dir(call)==LinphoneCallIncoming) { - //if ([speaker isOn]) [speaker toggle]; - } - [self updateUIFromLinphoneState: YES]; - [self disableVideoDisplay: TRUE]; + if(videoShown) + [self disableVideoDisplay: TRUE]; } -static void hideSpinner(LinphoneCall* lc, void* user_data); - - (void)hideSpinnerIndicator: (LinphoneCall*)call { - if (!videoWaitingForFirstImage.hidden) { - videoWaitingForFirstImage.hidden = TRUE; - } else { - linphone_call_set_next_video_frame_decoded_callback(call, hideSpinner, self); - } + videoWaitingForFirstImage.hidden = TRUE; +} + +static void hideSpinner(LinphoneCall* call, void* user_data) { + InCallViewController* thiz = (InCallViewController*) user_data; + [thiz hideSpinnerIndicator:call]; } - (void)callUpdate: (NSNotification*) notif { LinphoneCall *call = [[notif.userInfo objectForKey: @"call"] pointerValue]; LinphoneCallState state = [[notif.userInfo objectForKey: @"state"] intValue]; - // Fake call update: Refresh UI + // Update table + [callTableView reloadData]; + + // Fake call update if(call == NULL) { - [self updateUIFromLinphoneState: YES]; return; } @@ -506,17 +411,18 @@ static void hideSpinner(LinphoneCall* lc, void* user_data); [callTableController minimizeAll]; } } - case LinphoneCallPausedByRemote: case LinphoneCallConnected: case LinphoneCallStreamsRunning: case LinphoneCallUpdated: + { //check video if (linphone_call_params_video_enabled(linphone_call_get_current_params(call))) { [self displayVideoCall:call]; } else { - [self displayInCall:call]; + [self displayTableCall:call]; } break; + } case LinphoneCallUpdatedByRemote: { const LinphoneCallParams* current = linphone_call_get_current_params(call); @@ -529,14 +435,15 @@ static void hideSpinner(LinphoneCall* lc, void* user_data); linphone_core_defer_call_update([LinphoneManager getLc], call); [self displayAskToEnableVideoCall:call]; } else if (linphone_call_params_video_enabled(current) && !linphone_call_params_video_enabled(remote)) { - [self displayInCall:call]; + [self displayTableCall:call]; } break; } case LinphoneCallPausing: case LinphoneCallPaused: + case LinphoneCallPausedByRemote: { - [self disableVideoDisplay: TRUE]; + [self displayTableCall: call]; break; } case LinphoneCallEnd: @@ -545,7 +452,6 @@ static void hideSpinner(LinphoneCall* lc, void* user_data); if(linphone_core_get_calls_nb([LinphoneManager getLc]) <= 1) { [callTableController maximizeAll]; } - [self updateUIFromLinphoneState: YES]; break; } default: @@ -554,11 +460,6 @@ static void hideSpinner(LinphoneCall* lc, void* user_data); } -static void hideSpinner(LinphoneCall* call, void* user_data) { - InCallViewController* thiz = (InCallViewController*) user_data; - [thiz hideSpinnerIndicator:call]; -} - - (void)dismissActionSheet: (id)o { if (visibleActionSheet != nil) { [visibleActionSheet dismissWithClickedButtonIndex:visibleActionSheet.cancelButtonIndex animated:TRUE]; @@ -599,11 +500,6 @@ static void hideSpinner(LinphoneCall* call, void* user_data) { [visibleActionSheet release]; } -- (void)firstVideoFrameDecoded: (LinphoneCall*) call { - // hide video in progress view indicator - videoWaitingForFirstImage.hidden = TRUE; -} - - (void)dealloc { [videoGroup release]; [callTableView release]; @@ -620,146 +516,6 @@ static void hideSpinner(LinphoneCall* call, void* user_data) { [super dealloc]; } -//TODO -/* -+ (void)updateCellImageView:(UIImageView*)imageView Label:(UILabel*)label DetailLabel:(UILabel*)detailLabel AndAccessoryView:(UIView*)accessoryView withCall:(LinphoneCall*) call { - if (call == NULL) { - ms_warning("UpdateCell called with null call"); - [label setText:@""]; - return; - } - const LinphoneAddress* addr = linphone_call_get_remote_address(call); - - label.adjustsFontSizeToFitWidth = YES; - - if (addr) { - const char* lUserNameChars=linphone_address_get_username(addr); - NSString* lUserName = lUserNameChars?[[[NSString alloc] initWithUTF8String:lUserNameChars] autorelease]:NSLocalizedString(@"Unknown",nil); - NSMutableString* mss = [[NSMutableString alloc] init]; - // contact name - const char* n = linphone_address_get_display_name(addr); - if (n) - [mss appendFormat:@"%s", n, nil]; - else - [mss appendFormat:@"%@",lUserName , nil]; - - if ([mss compare:label.text] != 0 || imageView.image == nil) { - [label setText:mss]; - - imageView.image = [[LinphoneManager instance] getImageFromAddressBook:lUserName]; - } - [mss release]; - } else { - [label setText:@"plop"]; - imageView.image = nil; - } - - if (detailLabel != nil) { - 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 { - switch (linphone_call_get_state(call)) { - case LinphoneCallPaused: - if(!linphone_core_sound_resources_locked(linphone_call_get_core(call))) { - [ms appendFormat:@"%@", NSLocalizedString(@"Paused (tap to resume)", nil), nil]; - } else { - [ms appendFormat:@"%@", NSLocalizedString(@"Paused", nil), nil]; - } - break; - case LinphoneCallOutgoingInit: - case LinphoneCallOutgoingProgress: - [ms appendFormat:@"%@...", NSLocalizedString(@"In progress", nil), nil]; - break; - case LinphoneCallOutgoingRinging: - [ms appendFormat:@"%@...", NSLocalizedString(@"Ringing...", nil), nil]; - break; - case LinphoneCallPausedByRemote: - { - switch (linphone_call_get_transfer_state(call)) { - case LinphoneCallOutgoingInit: - case LinphoneCallOutgoingProgress: - [ms appendFormat:@"%@...", NSLocalizedString(@"Transfer in progress", nil), nil]; - break; - case LinphoneCallConnected: - [ms appendFormat:@"%@", NSLocalizedString(@"Transfer successful", nil), nil]; - break; - case LinphoneCallError: - [ms appendFormat:@"%@", NSLocalizedString(@"Transfer failed", nil), nil]; - break; - case LinphoneCallIdle: - default: - [ms appendFormat:@"%@...", NSLocalizedString(@"Paused by remote", nil), nil]; - break; - } - break; - default: - break; - } - } - } - [detailLabel setText:ms]; - [ms release]; - } -}*/ -/* -- (void)updateConferenceCell:(UITableViewCell*) cell at:(NSIndexPath*)indexPath { - LinphoneCore* lc = [LinphoneManager getLc]; - - NSString* t= [NSString stringWithFormat: - NSLocalizedString(@"Conference", nil), - linphone_core_get_conference_size(lc) - linphone_core_is_in_conference(lc)]; - [cell.textLabel setText:t]; - - [self updateActive:NO cell:cell]; - cell.selected = NO; - - [callTableView deselectRowAtIndexPath:indexPath animated:NO]; - - if (!linphone_core_is_in_conference(lc)) { - [cell.detailTextLabel setText:NSLocalizedString(@"(tap to enter conference)", nil)]; - } else { - [cell.detailTextLabel setText: - [NSString stringWithFormat:NSLocalizedString(@"(me + %d participants)", nil), linphone_core_get_conference_size(lc) - linphone_core_is_in_conference(lc)]]; - } - cell.imageView.image = nil; -} - -- (void)secureIconPressed:(UIControl*) button withEvent: (UIEvent*) evt { - NSSet* touches = [evt allTouches]; - UITouch* touch = [touches anyObject]; - CGPoint currentTouchPos = [touch locationInView:self.callTableView]; - NSIndexPath *path = [self.callTableView indexPathForRowAtPoint:currentTouchPos]; - if (path) { - LinphoneCall* call = [InCallViewController retrieveCallAtIndex:path.row inConference:NO]; - // start action sheet to validate/unvalidate zrtp code - CallDelegate* cd = [[CallDelegate alloc] init]; - cd.eventType = CD_ZRTP; - cd.delegate = self; - cd.call = call; - UIView* container=(UIView*)[callTableView cellForRowAtIndexPath:path].accessoryView; - UIButton *button=(UIButton*)[container viewWithTag:SECURE_BUTTON_TAG]; - [button setImage:nil forState:UIControlStateNormal]; - - if (visibleActionSheet != nil) { - [visibleActionSheet dismissWithClickedButtonIndex:visibleActionSheet.cancelButtonIndex animated:TRUE]; - } - visibleActionSheet = [[UIActionSheet alloc] initWithTitle:[NSString stringWithFormat:NSLocalizedString(@" Mark auth token '%s' as:",nil),linphone_call_get_authentication_token(call)] - delegate:cd - cancelButtonTitle:NSLocalizedString(@"Unverified",nil) - destructiveButtonTitle:NSLocalizedString(@"Verified",nil) - otherButtonTitles:nil]; - - visibleActionSheet.actionSheetStyle = UIActionSheetStyleDefault; - [visibleActionSheet showInView:[[UIApplication sharedApplication].delegate window]]; - [visibleActionSheet release]; - } -} -*/ - (void)actionSheet:(UIActionSheet *)actionSheet ofType:(enum CallDelegateType)type clickedButtonAtIndex:(NSInteger)buttonIndex withUserDatas:(void *)datas { LinphoneCall* call = (LinphoneCall*)datas; // maybe we could verify call validity @@ -819,7 +575,4 @@ static void hideSpinner(LinphoneCall* call, void* user_data) { } } - - - @end diff --git a/Classes/LinphoneManager.h b/Classes/LinphoneManager.h index 9975dad3d..a7c527252 100644 --- a/Classes/LinphoneManager.h +++ b/Classes/LinphoneManager.h @@ -116,6 +116,8 @@ typedef struct _LinphoneCallAppData { - (void)fullScreen:(BOOL) enabled; - (PhoneView) currentView; +- (void)enableSpeaker:(BOOL)enable; + @property (nonatomic, retain) id settingsStore; @property Connectivity connectivity; diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m index 15cbf418d..ee51828a7 100644 --- a/Classes/LinphoneManager.m +++ b/Classes/LinphoneManager.m @@ -17,8 +17,6 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include "linphonecore_utils.h" -#include "lpconfig.h" #include #include #include @@ -32,6 +30,10 @@ #import "FastAddressBook.h" #import "LinphoneCoreSettingsStore.h" +#include "linphonecore_utils.h" +#include "lpconfig.h" +#include "private.h" + static LinphoneCore* theLinphoneCore=nil; static LinphoneManager* theLinphoneManager=nil; @@ -219,9 +221,9 @@ struct codec_name_pref_table codec_pref_table[]={ return; } -- (void)onCall:(LinphoneCall*) call StateChanged: (LinphoneCallState) new_state withMessage: (const char *) message { +- (void)onCall:(LinphoneCall*)call StateChanged:(LinphoneCallState)state withMessage:(const char *)message { // Handling wrapper - if(new_state == LinphoneCallReleased) { + if(state == LinphoneCallReleased) { if(linphone_call_get_user_pointer(call) != NULL) { free (linphone_call_get_user_pointer(call)); linphone_call_set_user_pointer(call, NULL); @@ -234,14 +236,19 @@ struct codec_name_pref_table codec_pref_table[]={ linphone_call_set_user_pointer(call, data); } - if (new_state == LinphoneCallIncomingReceived) { + if (state == LinphoneCallIncomingReceived) { [self updateCallWithAddressBookData:call]; // display name is updated } + if ((state == LinphoneCallEnd || state == LinphoneCallError)) { + if(linphone_core_get_calls_nb([LinphoneManager getLc]) == 0) + [self enableSpeaker:FALSE]; + } + // Post event NSDictionary* dict = [[[NSDictionary alloc] initWithObjectsAndKeys: [NSValue valueWithPointer:call], @"call", - [NSNumber numberWithInt:new_state], @"state", + [NSNumber numberWithInt:state], @"state", [NSString stringWithUTF8String:message], @"message", nil] autorelease]; [[NSNotificationCenter defaultCenter] postNotificationName:@"LinphoneCallUpdate" object:self userInfo:dict]; } @@ -532,7 +539,6 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach } } - //scheduling loop - (void)iterate { linphone_core_iterate(theLinphoneCore); @@ -573,7 +579,7 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach /************* *lib linphone init method */ -- (void)startLibLinphone { +- (void)startLibLinphone { //get default config from bundle NSBundle* myBundle = [NSBundle mainBundle]; @@ -610,11 +616,12 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach linphone_core_set_root_ca(theLinphoneCore, lRootCa); // Set audio assets - const char* lRing = [[myBundle pathForResource:@"oldphone-mono"ofType:@"wav"] cStringUsingEncoding:[NSString defaultCStringEncoding]]; + const char* lRing = [[myBundle pathForResource:@"oldphone-mono"ofType:@"wav"] cStringUsingEncoding:[NSString defaultCStringEncoding]]; linphone_core_set_ring(theLinphoneCore, lRing ); - const char* lRingBack = [[myBundle pathForResource:@"ringback"ofType:@"wav"] cStringUsingEncoding:[NSString defaultCStringEncoding]]; + const char* lRingBack = [[myBundle pathForResource:@"ringback"ofType:@"wav"] cStringUsingEncoding:[NSString defaultCStringEncoding]]; linphone_core_set_ringback(theLinphoneCore, lRingBack); - + const char* lPlay = [[myBundle pathForResource:@"toy-mono"ofType:@"wav"] cStringUsingEncoding:[NSString defaultCStringEncoding]]; + linphone_core_set_play_file(theLinphoneCore, lPlay); linphone_core_set_zrtp_secrets_file(theLinphoneCore, [zrtpSecretsFileName cStringUsingEncoding:[NSString defaultCStringEncoding]]); @@ -665,11 +672,6 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach } - if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)] - && [UIApplication sharedApplication].applicationState == UIApplicationStateBackground) { - //go directly to bg mode - [self enterBackgroundMode]; - } NSUInteger cpucount = [[NSProcessInfo processInfo] processorCount]; ms_set_cpu_count(cpucount); @@ -692,7 +694,12 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach ms_warning("Linphone [%s] started on [%s]" ,linphone_core_get_version() ,[[UIDevice currentDevice].model cStringUsingEncoding:[NSString defaultCStringEncoding]] ); - + + if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)] + && [UIApplication sharedApplication].applicationState == UIApplicationStateBackground) { + //go directly to bg mode + [self enterBackgroundMode]; + } } - (void)refreshRegisters{ @@ -743,6 +750,21 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach //let the user resume the call manually. } +- (void)enableSpeaker:(BOOL)enable { + //redirect audio to speaker + if(enable) { + UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; + AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute + , sizeof (audioRouteOverride) + , &audioRouteOverride); + } else { + UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None; + AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute + , sizeof (audioRouteOverride) + , &audioRouteOverride); + } +} + + (BOOL)runningOnIpad { #ifdef UI_USER_INTERFACE_IDIOM return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); diff --git a/Classes/LinphoneUI/UICallBar.h b/Classes/LinphoneUI/UICallBar.h index b93362fbc..564722771 100644 --- a/Classes/LinphoneUI/UICallBar.h +++ b/Classes/LinphoneUI/UICallBar.h @@ -24,6 +24,7 @@ #import "UISpeakerButton.h" #import "UIVideoButton.h" #import "UIHangUpButton.h" +#import "UIDigitButton.h" @interface UICallBar: UIViewController { UIPauseButton* pauseButton; @@ -33,6 +34,21 @@ UISpeakerButton* speakerButton; UIButton* optionsButton; UIHangUpButton* hangupButton; + UIView* padView; + + //Key pad + UIDigitButton* oneButton; + UIDigitButton* twoButton; + UIDigitButton* threeButton; + UIDigitButton* fourButton; + UIDigitButton* fiveButton; + UIDigitButton* sixButton; + UIDigitButton* sevenButton; + UIDigitButton* eightButton; + UIDigitButton* nineButton; + UIDigitButton* starButton; + UIDigitButton* zeroButton; + UIDigitButton* hashButton; } @property (nonatomic, retain) IBOutlet UIPauseButton* pauseButton; @@ -42,8 +58,23 @@ @property (nonatomic, retain) IBOutlet UISpeakerButton* speakerButton; @property (nonatomic, retain) IBOutlet UIButton* optionsButton; @property (nonatomic, retain) IBOutlet UIHangUpButton* hangupButton; +@property (nonatomic, retain) IBOutlet UIView* padView; + +@property (nonatomic, retain) IBOutlet UIButton* oneButton; +@property (nonatomic, retain) IBOutlet UIButton* twoButton; +@property (nonatomic, retain) IBOutlet UIButton* threeButton; +@property (nonatomic, retain) IBOutlet UIButton* fourButton; +@property (nonatomic, retain) IBOutlet UIButton* fiveButton; +@property (nonatomic, retain) IBOutlet UIButton* sixButton; +@property (nonatomic, retain) IBOutlet UIButton* sevenButton; +@property (nonatomic, retain) IBOutlet UIButton* eightButton; +@property (nonatomic, retain) IBOutlet UIButton* nineButton; +@property (nonatomic, retain) IBOutlet UIButton* starButton; +@property (nonatomic, retain) IBOutlet UIButton* zeroButton; +@property (nonatomic, retain) IBOutlet UIButton* hashButton; - (IBAction)onOptionsClick:(id)sender; - (IBAction)onConferenceClick:(id)sender; +- (IBAction)onPadClick:(id)sender; @end diff --git a/Classes/LinphoneUI/UICallBar.m b/Classes/LinphoneUI/UICallBar.m index 74e7f2f75..c63769ada 100644 --- a/Classes/LinphoneUI/UICallBar.m +++ b/Classes/LinphoneUI/UICallBar.m @@ -20,6 +20,9 @@ #import "UICallBar.h" #import "LinphoneManager.h" +#import "CPAnimationSequence.h" +#import "CPAnimationStep.h" + #include "linphonecore.h" #include "private.h" @@ -32,6 +35,20 @@ @synthesize speakerButton; @synthesize optionsButton; @synthesize hangupButton; +@synthesize padView; + +@synthesize oneButton; +@synthesize twoButton; +@synthesize threeButton; +@synthesize fourButton; +@synthesize fiveButton; +@synthesize sixButton; +@synthesize sevenButton; +@synthesize eightButton; +@synthesize nineButton; +@synthesize starButton; +@synthesize zeroButton; +@synthesize hashButton; - (id)init { return [super initWithNibName:@"UICallBar" bundle:[NSBundle mainBundle]]; @@ -39,6 +56,20 @@ - (void)viewDidLoad { [pauseButton setType:UIPauseButtonType_CurrentCall call:nil]; + + [zeroButton initWithNumber:'0' addressField:nil dtmf:true]; + [oneButton initWithNumber:'1' addressField:nil dtmf:true]; + [twoButton initWithNumber:'2' addressField:nil dtmf:true]; + [threeButton initWithNumber:'3' addressField:nil dtmf:true]; + [fourButton initWithNumber:'4' addressField:nil dtmf:true]; + [fiveButton initWithNumber:'5' addressField:nil dtmf:true]; + [sixButton initWithNumber:'6' addressField:nil dtmf:true]; + [sevenButton initWithNumber:'7' addressField:nil dtmf:true]; + [eightButton initWithNumber:'8' addressField:nil dtmf:true]; + [nineButton initWithNumber:'9' addressField:nil dtmf:true]; + [starButton initWithNumber:'*' addressField:nil dtmf:true]; + [hashButton initWithNumber:'#' addressField:nil dtmf:true]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callUpdate:) name:@"LinphoneCallUpdate" object:nil]; } @@ -47,6 +78,9 @@ } - (void)callUpdate: (NSNotification*) notif { + //LinphoneCall *call = [[notif.userInfo objectForKey: @"call"] pointerValue]; + LinphoneCallState state = [[notif.userInfo objectForKey: @"state"] intValue]; + // check LinphoneCore is initialized LinphoneCore* lc = nil; if([LinphoneManager isLcReady]) @@ -72,6 +106,20 @@ [conferenceButton setHidden:true]; } } + + if(linphone_core_get_current_call(lc) == NULL) { + [self hidePad]; + } + + switch(state) { + LinphoneCallEnd: + LinphoneCallError: + LinphoneCallIncoming: + LinphoneCallOutgoing: + [self hidePad]; + default: + break; + } } - (void)dealloc { @@ -87,6 +135,54 @@ [super dealloc]; } +- (IBAction)onPadClick:(id)sender { + if([padView isHidden]) { + [self showPad]; + } else { + [self hidePad]; + } +} + +- (void)showPad{ + CGRect frame = [padView frame]; + int original_y = frame.origin.y; + frame.origin.y = [[self view] frame].size.height; + [padView setFrame:frame]; + [padView setHidden:FALSE]; + CPAnimationSequence* move = [CPAnimationSequence sequenceWithSteps: + [CPAnimationStep for:0.5 animate:^{ + CGRect frame = [padView frame]; + frame.origin.y = original_y; + [padView setFrame:frame]; + }], + nil + ]; + [move run]; + [move release]; +} + +- (void)hidePad{ + CGRect frame = [padView frame]; + int original_y = frame.origin.y; + + CPAnimationSequence* move = [CPAnimationSequence sequenceWithSteps: + [CPAnimationStep for:0.5 animate:^{ + CGRect frame = [padView frame]; + frame.origin.y = [[self view] frame].size.height; + [padView setFrame:frame]; + }], + [CPAnimationStep after:0.0 animate:^{ + CGRect frame = [padView frame]; + frame.origin.y = original_y; + [padView setHidden:TRUE]; + [padView setFrame:frame]; + }], + nil + ]; + [move run]; + [move release]; +} + - (IBAction)onOptionsClick:(id)sender { // Go to dialer view NSDictionary *dict = [[[NSDictionary alloc] initWithObjectsAndKeys: diff --git a/Classes/LinphoneUI/UICallBar.xib b/Classes/LinphoneUI/UICallBar.xib index 92d108fa6..529c86679 100644 --- a/Classes/LinphoneUI/UICallBar.xib +++ b/Classes/LinphoneUI/UICallBar.xib @@ -38,17 +38,13 @@ -2147483356 - {{0, 10}, {320, 125}} + {{0, 335}, {320, 125}} - _NS:9 - 3 - MQA - - 2 - + 1 + MCAxIDAuMTkxOTQ1NDc1NQA NO NO @@ -57,277 +53,664 @@ NO IBCocoaTouchFramework - + - 292 - {80, 67} + -2147483360 + + + + 292 + {{-20, 20}, {107, 54}} + + + + + 1 + MC40MDAwMDAwMSAxIDEgMAA + + NO + NO + IBCocoaTouchFramework + 0 + 0 + + 3 + MQA + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + 3 + MC41AA + + + NSImage + 1-over.png + + + NSImage + 1-actif.png + + + Helvetica-Bold + Helvetica + 2 + 15 + + + Helvetica-Bold + 15 + 16 + + + + + 292 + {{87, 20}, {106, 54}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + 2-over.png + + + NSImage + 2-actif.png + + + + + + + 292 + {{193, 20}, {107, 54}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + 3-actif.png + + + + + + + 292 + {{-20, 82}, {107, 54}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + 4-over.png + + + NSImage + 4-actif.png + + + + + + + 292 + {{87, 82}, {106, 54}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + 5-over.png + + + NSImage + 5-actif.png + + + + + + + 292 + {{193, 82}, {107, 54}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + 6-over.png + + + NSImage + 6-actif.png + + + + + + + 292 + {{-20, 144}, {107, 54}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + 7-over.png + + + NSImage + 7-actif.png + + + + + + + 292 + {{87, 144}, {106, 54}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + 8-over.png + + + NSImage + 8-actif.png + + + + + + + 292 + {{193, 144}, {107, 54}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + 9-over.png + + + NSImage + 9-actif.png + + + + + + + 292 + {{-20, 206}, {107, 54}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + etoile-over.png + + + NSImage + etoile-actif.png + + + + + + + 292 + {{87, 206}, {106, 54}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + 0-over.png + + + NSImage + 0-actif.png + + + + + + + 292 + {{193, 206}, {107, 54}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + diese-over.png + + + NSImage + diese-actif.png + + + + + + {{20, 57}, {281, 260}} - _NS:9 - NO - - Video - - IBCocoaTouchFramework - 0 - 0 - NO - NO - + 3 - MC41AA - - - NSImage - video-ON-over.png - - - NSImage - video-OFF-disabled.png - - - NSImage - video-ON-actif.png - - - NSImage - video-OFF-actif.png - - - 2 - 15 - - - Helvetica-Bold - 15 - 16 + MSAwLjQAA + + 2 + + IBCocoaTouchFramework - + 292 - {{80, 0}, {80, 67}} + + + + 292 + {80, 67} + + + + _NS:9 + NO + + Video + + IBCocoaTouchFramework + 0 + 0 + NO + NO + + + NSImage + video-ON-over.png + + + NSImage + video-OFF-disabled.png + + + NSImage + video-ON-actif.png + + + NSImage + video-OFF-actif.png + + + 2 + 15 + + + + + + 292 + {{80, 0}, {80, 67}} + + + + _NS:9 + NO + + Micro + + IBCocoaTouchFramework + 0 + 0 + NO + + + NSImage + micro-ON-over.png + + + NSImage + micro-ON-actif.png + + + NSImage + micro-OFF-actif.png + + + + + + + 292 + {{160, 0}, {80, 67}} + + + + _NS:9 + NO + + Speaker + + IBCocoaTouchFramework + 0 + 0 + NO + + + NSImage + speacker-ON-over.png + + + NSImage + speacker-ON-actif.png + + + NSImage + speacker-OFF-actif.png + + + + + + + 292 + {{240, 0}, {80, 67}} + + + + _NS:9 + NO + + Add call + + IBCocoaTouchFramework + 0 + 0 + NO + + + NSImage + options_over.png + + + NSImage + add-call-over.png + + + NSImage + options_default.png + + + + + + + 264 + {{0, 67}, {105, 68}} + + + + _NS:9 + NO + + Pause + + IBCocoaTouchFramework + 0 + 0 + NO + + + NSImage + pause-over.png + + + NSImage + play-actif.png + + + NSImage + pause-actif.png + + + + + + + -2147483384 + {{0, 67}, {105, 68}} + + + + _NS:9 + NO + + Start Conference + + IBCocoaTouchFramework + 0 + 0 + NO + NO + + + NSImage + start-conference-over.png + + + NSImage + start-conference-actif.png + + + + + + + 264 + {{105, 67}, {111, 68}} + + + + _NS:9 + NO + + Hangup + + IBCocoaTouchFramework + 0 + 0 + NO + + + NSImage + raccrocher-over.png + + + NSImage + raccrocher-actif.png + + + + + + + 264 + {{215, 67}, {105, 68}} + + + + _NS:9 + NO + + Back + + IBCocoaTouchFramework + 0 + 0 + NO + + + NSImage + clavier-secondaire-over.png + + + NSImage + clavier-secondaire-actif.png + + + + + + + {{0, 325}, {320, 135}} - + _NS:9 - NO - - Micro + + 3 + MCAwAA IBCocoaTouchFramework - 0 - 0 - NO - - - NSImage - micro-ON-over.png - - - NSImage - micro-ON-actif.png - - - NSImage - micro-OFF-actif.png - - - - - - - 292 - {{160, 0}, {80, 67}} - - - - _NS:9 - NO - - Speaker - - IBCocoaTouchFramework - 0 - 0 - NO - - - NSImage - speacker-ON-over.png - - - NSImage - speacker-ON-actif.png - - - NSImage - speacker-OFF-actif.png - - - - - - - 292 - {{240, 0}, {80, 67}} - - - - _NS:9 - NO - - Add call - - IBCocoaTouchFramework - 0 - 0 - NO - - - NSImage - options_over.png - - - NSImage - add-call-over.png - - - NSImage - options_default.png - - - - - - - 264 - {{0, 67}, {105, 68}} - - - - _NS:9 - NO - - Pause - - IBCocoaTouchFramework - 0 - 0 - NO - - - NSImage - pause-over.png - - - NSImage - play-actif.png - - - NSImage - pause-actif.png - - - - - - - -2147483384 - {{0, 67}, {105, 68}} - - - - _NS:9 - NO - - Start Conference - - IBCocoaTouchFramework - 0 - 0 - NO - NO - - - NSImage - start-conference-over.png - - - NSImage - start-conference-actif.png - - - - - - - 264 - {{105, 67}, {111, 68}} - - - - _NS:9 - NO - - Hangup - - IBCocoaTouchFramework - 0 - 0 - NO - - - NSImage - raccrocher-over.png - - - NSImage - raccrocher-actif.png - - - - - - - 264 - {{215, 67}, {105, 68}} - - - - _NS:9 - NO - - Back - - IBCocoaTouchFramework - 0 - 0 - NO - - - NSImage - clavier-secondaire-over.png - - - NSImage - clavier-secondaire-actif.png - - - - - {320, 135} + {320, 460} - + _NS:9 - - 1 - MCAxIDAuMTkxOTQ1NDc1NSAwAA - + NO IBCocoaTouchFramework @@ -344,43 +727,11 @@ - pauseButton + hangupButton - + - 15 - - - - videoButton - - - - 17 - - - - microButton - - - - 14 - - - - speakerButton - - - - 16 - - - - optionsButton - - - - 19 + 29 @@ -392,11 +743,156 @@ - hangupButton + pauseButton - + - 29 + 15 + + + + optionsButton + + + + 19 + + + + speakerButton + + + + 16 + + + + microButton + + + + 14 + + + + videoButton + + + + 17 + + + + padView + + + + 45 + + + + zeroButton + + + + 47 + + + + twoButton + + + + 48 + + + + threeButton + + + + 49 + + + + starButton + + + + 50 + + + + sixButton + + + + 51 + + + + sevenButton + + + + 52 + + + + oneButton + + + + 53 + + + + nineButton + + + + 54 + + + + hashButton + + + + 55 + + + + fourButton + + + + 56 + + + + fiveButton + + + + 57 + + + + eightButton + + + + 58 + + + + onPadClick: + + + 7 + + 46 @@ -441,14 +937,8 @@ - - - - - - - - + + callTabBar @@ -460,53 +950,161 @@ mask + + 30 + + + + + + + + + + + + + buttons + 6 - + dialerButton 7 - + hangupButton + + 21 + + + conferenceButton + 8 - + pauseButton 10 - + optionsButton - - 12 - - - videoButton - - - 11 - - - microButton - 9 - + speakerButton - 21 - + 11 + + + microButton + + + 12 + + + videoButton + + + 31 + + + + + + + + + + + + + + + - conferenceButton + pad + + + 43 + + + 1 + + + 42 + + + 2 + + + 41 + + + 3 + + + 40 + + + 5 + + + 39 + + + 4 + + + 38 + + + 7 + + + 37 + + + 8 + + + 36 + + + 9 + + + 35 + + + # + + + 34 + + + 0 + + + 33 + + + * + + + 32 + + + 6 @@ -525,7 +1123,45 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIDigitButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + UIDigitButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + UIDigitButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + UIDigitButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + UIDigitButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + UIDigitButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + UIDigitButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + UIDigitButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + UIPassView com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIDigitButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + UIDigitButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIDigitButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + UIDigitButton + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -543,7 +1179,7 @@ - 29 + 58 @@ -553,6 +1189,7 @@ id id + id @@ -563,51 +1200,128 @@ onOptionsClick: id + + onPadClick: + id + UIButton + UIButton + UIButton + UIButton UIHangUpButton + UIButton UIMicroButton + UIButton + UIButton UIButton + UIView UIPauseButton + UIButton + UIButton UISpeakerButton + UIButton + UIButton + UIButton UIVideoButton + UIButton conferenceButton UIButton + + eightButton + UIButton + + + fiveButton + UIButton + + + fourButton + UIButton + hangupButton UIHangUpButton + + hashButton + UIButton + microButton UIMicroButton + + nineButton + UIButton + + + oneButton + UIButton + optionsButton UIButton + + padView + UIView + pauseButton UIPauseButton + + sevenButton + UIButton + + + sixButton + UIButton + speakerButton UISpeakerButton + + starButton + UIButton + + + threeButton + UIButton + + + twoButton + UIButton + videoButton UIVideoButton + + zeroButton + UIButton + IBProjectSource ./Classes/UICallBar.h + + UIDigitButton + UILongTouchButton + + IBProjectSource + ./Classes/UIDigitButton.h + + UIHangUpButton UIButton @@ -616,6 +1330,14 @@ ./Classes/UIHangUpButton.h + + UILongTouchButton + UIButton + + IBProjectSource + ./Classes/UILongTouchButton.h + + UIMicroButton UIToggleButton @@ -624,6 +1346,14 @@ ./Classes/UIMicroButton.h + + UIPassView + UIView + + IBProjectSource + ./Classes/UIPassView.h + + UIPauseButton UIToggleButton @@ -651,17 +1381,6 @@ UIVideoButton UIToggleButton - - videoUpdateIndicator - UIActivityIndicatorView - - - videoUpdateIndicator - - videoUpdateIndicator - UIActivityIndicatorView - - IBProjectSource ./Classes/UIVideoButton.h @@ -678,9 +1397,32 @@ YES 3 + {220, 113} + {220, 113} + {210, 113} + {210, 113} + {220, 113} + {220, 113} + {210, 113} + {210, 113} + {210, 113} + {220, 113} + {220, 113} + {210, 113} + {210, 113} + {210, 113} + {210, 113} + {220, 113} + {220, 113} + {210, 113} + {210, 113} {16, 16} {209, 136} {209, 136} + {210, 113} + {210, 113} + {210, 113} + {210, 113} {160, 134} {160, 134} {160, 134} diff --git a/Classes/LinphoneUI/UICompositeViewController.h b/Classes/LinphoneUI/UICompositeViewController.h index c684228e0..0a551c8a7 100644 --- a/Classes/LinphoneUI/UICompositeViewController.h +++ b/Classes/LinphoneUI/UICompositeViewController.h @@ -18,6 +18,8 @@ */ #import +#import + #import "LinphoneManager.h" @interface UICompositeViewDescription: NSObject{ @@ -35,6 +37,7 @@ tabBar:(NSString*)tabBar tabBarEnabled:(BOOL) tabBarEnabled fullscreen:(BOOL) fullscreen; + @end @interface UICompositeViewController : UIViewController { @@ -49,8 +52,11 @@ NSMutableDictionary *viewControllerCache; UICompositeViewDescription *currentViewDescription; + CATransition *viewTransition; } +@property (strong) CATransition *viewTransition; + @property (nonatomic, retain) IBOutlet UIView* stateBarView; @property (nonatomic, retain) IBOutlet UIView* contentView; @property (nonatomic, retain) IBOutlet UIView* tabBarView; diff --git a/Classes/LinphoneUI/UICompositeViewController.m b/Classes/LinphoneUI/UICompositeViewController.m index 6e7cba69b..06286378b 100644 --- a/Classes/LinphoneUI/UICompositeViewController.m +++ b/Classes/LinphoneUI/UICompositeViewController.m @@ -19,8 +19,6 @@ #import "UICompositeViewController.h" -#import - @implementation UICompositeViewDescription - (id)copy { @@ -56,15 +54,16 @@ @synthesize contentView; @synthesize tabBarView; +@synthesize viewTransition; -- (void)myInit { +- (void)initUICompositeViewController { self->viewControllerCache = [[NSMutableDictionary alloc] init]; } - (id)init{ self = [super init]; if (self) { - [self myInit]; + [self initUICompositeViewController]; } return self; } @@ -72,7 +71,7 @@ - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { - [self myInit]; + [self initUICompositeViewController]; } return self; } @@ -80,7 +79,7 @@ - (id)initWithCoder:(NSCoder *)decoder { self = [super initWithCoder:decoder]; if (self) { - [self myInit]; + [self initUICompositeViewController]; } return self; } @@ -141,19 +140,14 @@ currentViewDescription = description; // Animate only with a previous screen - if(oldViewDescription != nil) { - CATransition* trans = [CATransition animation]; - [trans setType:kCATransitionPush]; - [trans setDuration:0.35]; - [trans setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; - [trans setSubtype:kCATransitionFromRight]; - [contentView.layer addAnimation:trans forKey:@"Transition"]; + if(oldViewDescription != nil && viewTransition != nil) { + [contentView.layer addAnimation:viewTransition forKey:@"Transition"]; if((oldViewDescription->stateBarEnabled == true && currentViewDescription->stateBarEnabled == false) || (oldViewDescription->stateBarEnabled == false && currentViewDescription->stateBarEnabled == true)) { - [stateBarView.layer addAnimation:trans forKey:@"Transition"]; + [stateBarView.layer addAnimation:viewTransition forKey:@"Transition"]; } if(oldViewDescription->tabBar != currentViewDescription->tabBar) { - [tabBarView.layer addAnimation:trans forKey:@"Transition"]; + [tabBarView.layer addAnimation:viewTransition forKey:@"Transition"]; } } @@ -230,11 +224,12 @@ } } else { contentFrame.size.height = tabFrame.origin.y + tabFrame.size.height; - if(currentViewDescription->fullscreen) - contentFrame.size.height += IPHONE_STATUSBAR_HEIGHT; tabFrame.origin.y = [[UIScreen mainScreen] bounds].size.height - IPHONE_STATUSBAR_HEIGHT; } + if(currentViewDescription->fullscreen) + contentFrame.size.height = [[UIScreen mainScreen] bounds].size.height + IPHONE_STATUSBAR_HEIGHT; + // Resize innerView CGRect innerContentFrame = innerView.frame; innerContentFrame.size = contentFrame.size; diff --git a/Classes/LinphoneUI/UICompositeViewController.xib b/Classes/LinphoneUI/UICompositeViewController.xib index 15ca250eb..1b47e9536 100644 --- a/Classes/LinphoneUI/UICompositeViewController.xib +++ b/Classes/LinphoneUI/UICompositeViewController.xib @@ -40,6 +40,7 @@ {{0, 23}, {320, 380}} + _NS:9 YES IBCocoaTouchFramework @@ -65,6 +66,7 @@ {{0, 400}, {320, 60}} + _NS:9 3 @@ -77,6 +79,7 @@ {{0, 20}, {320, 460}} + 3 MQA @@ -178,8 +181,10 @@ UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIPassView com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIPassView com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -217,6 +222,14 @@ ./Classes/UICompositeViewController.h + + UIPassView + UIView + + IBProjectSource + ./Classes/UIPassView.h + + 0 diff --git a/Classes/LinphoneUI/UIHangUpButton.m b/Classes/LinphoneUI/UIHangUpButton.m index bc7b5da2f..c7cb1ddab 100644 --- a/Classes/LinphoneUI/UIHangUpButton.m +++ b/Classes/LinphoneUI/UIHangUpButton.m @@ -62,14 +62,14 @@ } } -- (void)myInit { +- (void)initUIHangUpButton { [self addTarget:self action:@selector(touchUp:) forControlEvents:UIControlEventTouchUpInside]; } - (id)init{ self = [super init]; if (self) { - [self myInit]; + [self initUIHangUpButton]; } return self; } @@ -77,7 +77,7 @@ - (id)initWithCoder:(NSCoder *)decoder { self = [super initWithCoder:decoder]; if (self) { - [self myInit]; + [self initUIHangUpButton]; } return self; } @@ -85,7 +85,7 @@ - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { - [self myInit]; + [self initUIHangUpButton]; } return self; } diff --git a/Classes/LinphoneUI/UIMainBar.xib b/Classes/LinphoneUI/UIMainBar.xib index 3779c3709..c42a61920 100644 --- a/Classes/LinphoneUI/UIMainBar.xib +++ b/Classes/LinphoneUI/UIMainBar.xib @@ -44,11 +44,8 @@ _NS:9 - 3 - MQA - - 2 - + 1 + MCAxIDAuMDkwOTI0NTczOTEAA NO NO diff --git a/Classes/LinphoneUI/UIPassView.h b/Classes/LinphoneUI/UIPassView.h new file mode 100644 index 000000000..839832347 --- /dev/null +++ b/Classes/LinphoneUI/UIPassView.h @@ -0,0 +1,24 @@ +/* UIPassView.h + * + * Copyright (C) 2012 Belledonne Comunications, Grenoble, France + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#import + +@interface UIPassView : UIView + +@end diff --git a/Classes/LinphoneUI/UIPassView.m b/Classes/LinphoneUI/UIPassView.m new file mode 100644 index 000000000..201f0fa2d --- /dev/null +++ b/Classes/LinphoneUI/UIPassView.m @@ -0,0 +1,44 @@ +/* UIPassView.m + * + * Copyright (C) 2012 Belledonne Comunications, Grenoble, France + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#import "UIPassView.h" + +@implementation UIPassView + +- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { + BOOL pointInside = NO; + + for(UIView *child in [self subviews]) { + if(![child isHidden]) { + if(CGRectContainsPoint(child.frame, point)) { + CGPoint newPoint = point; + newPoint.x -= child.frame.origin.x; + newPoint.y -= child.frame.origin.y; + if([child pointInside:newPoint withEvent:event]) { + pointInside = YES; + break; + } + } + } + } + + return pointInside; +} + +@end diff --git a/Classes/LinphoneUI/UIPauseButton.m b/Classes/LinphoneUI/UIPauseButton.m index 615babfa7..36fe79341 100644 --- a/Classes/LinphoneUI/UIPauseButton.m +++ b/Classes/LinphoneUI/UIPauseButton.m @@ -25,14 +25,14 @@ @implementation UIPauseButton -- (void)myInit { +- (void)initUIPauseButton { self->type = UIPauseButtonType_CurrentCall; } - (id)init{ self = [super init]; if (self) { - [self myInit]; + [self initUIPauseButton]; } return self; } @@ -40,7 +40,7 @@ - (id)initWithCoder:(NSCoder *)decoder { self = [super initWithCoder:decoder]; if (self) { - [self myInit]; + [self initUIPauseButton]; } return self; } @@ -48,7 +48,7 @@ - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { - [self myInit]; + [self initUIPauseButton]; } return self; } diff --git a/Classes/LinphoneUI/UISpeakerButton.m b/Classes/LinphoneUI/UISpeakerButton.m index 6665fb799..d931cb4df 100644 --- a/Classes/LinphoneUI/UISpeakerButton.m +++ b/Classes/LinphoneUI/UISpeakerButton.m @@ -17,8 +17,11 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#import "UISpeakerButton.h" #import +#import "UISpeakerButton.h" + +#import "LinphoneManager.h" + #include "linphonecore.h" @implementation UISpeakerButton @@ -35,33 +38,46 @@ static void audioRouteChangeListenerCallback ( } +- (void)initUISpeakerButton { + AudioSessionInitialize(NULL, NULL, NULL, NULL); + OSStatus lStatus = AudioSessionAddPropertyListener(routeChangeID, audioRouteChangeListenerCallback, self); + if (lStatus) { + ms_error ("cannot register route change handler [%ld]",lStatus); + } +} + - (id)init { - if((self = [super init]) != nil) { - - AudioSessionInitialize(NULL, NULL, NULL, NULL); - OSStatus lStatus = AudioSessionAddPropertyListener(routeChangeID, audioRouteChangeListenerCallback, self); - if (lStatus) { - ms_error ("cannot register route change handler [%ld]",lStatus); - } + self = [super init]; + if (self) { + [self initUISpeakerButton]; } return self; } +- (id)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self initUISpeakerButton]; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (self) { + [self initUISpeakerButton]; + } + return self; +} - (void)onOn { - //redirect audio to speaker - UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; - AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute - , sizeof (audioRouteOverride) - , &audioRouteOverride); - + [[LinphoneManager instance] enableSpeaker:TRUE]; } + - (void)onOff { - UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None; - AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute - , sizeof (audioRouteOverride) - , &audioRouteOverride); + [[LinphoneManager instance] enableSpeaker:FALSE]; } + - (bool)onUpdate { CFStringRef lNewRoute=CFSTR("Unknown"); UInt32 lNewRouteSize = sizeof(lNewRoute); diff --git a/Classes/LinphoneUI/UIToggleButton.m b/Classes/LinphoneUI/UIToggleButton.m index 5194912bc..92efe199d 100644 --- a/Classes/LinphoneUI/UIToggleButton.m +++ b/Classes/LinphoneUI/UIToggleButton.m @@ -53,16 +53,24 @@ return self.selected; } -- (id)init { + +- (void)initUIToggleButton { [self update]; [self addTarget:self action:@selector(touchUp:) forControlEvents:UIControlEventTouchUpInside]; - return self; +} + +- (id)init { + self = [super init]; + if (self) { + [self initUIToggleButton]; + } + return self; } - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { - [self init]; + [self initUIToggleButton]; } return self; } @@ -70,12 +78,11 @@ - (id)initWithCoder:(NSCoder *)decoder { self = [super initWithCoder:decoder]; if (self) { - [self init]; + [self initUIToggleButton]; } return self; } - - (void)dealloc { [super dealloc]; } diff --git a/Classes/LinphoneUI/UIVideoButton.h b/Classes/LinphoneUI/UIVideoButton.h index 17d588343..86586ce74 100644 --- a/Classes/LinphoneUI/UIVideoButton.h +++ b/Classes/LinphoneUI/UIVideoButton.h @@ -22,10 +22,7 @@ #import "UIToggleButton.h" @interface UIVideoButton : UIToggleButton { - UIActivityIndicatorView* videoUpdateIndicator; + BOOL locked; } - -@property (nonatomic, retain) IBOutlet UIActivityIndicatorView* videoUpdateIndicator; - @end diff --git a/Classes/LinphoneUI/UIVideoButton.m b/Classes/LinphoneUI/UIVideoButton.m index 2a7713b0f..961f1686a 100644 --- a/Classes/LinphoneUI/UIVideoButton.m +++ b/Classes/LinphoneUI/UIVideoButton.m @@ -22,16 +22,12 @@ @implementation UIVideoButton -@synthesize videoUpdateIndicator; - - (void)onOn { LinphoneCore* lc = [LinphoneManager getLc]; if (!linphone_core_video_enabled(lc)) return; - [videoUpdateIndicator startAnimating]; - [videoUpdateIndicator setHidden: FALSE]; [self setEnabled: FALSE]; LinphoneCall* call = linphone_core_get_current_call([LinphoneManager getLc]); if (call) { @@ -51,8 +47,6 @@ if (!linphone_core_video_enabled(lc)) return; - [videoUpdateIndicator startAnimating]; - [videoUpdateIndicator setHidden: FALSE]; [self setEnabled: FALSE]; LinphoneCall* call = linphone_core_get_current_call([LinphoneManager getLc]); if (call) { diff --git a/Classes/PhoneMainView.m b/Classes/PhoneMainView.m index 2992fbcbc..1c0f0ab5e 100644 --- a/Classes/PhoneMainView.m +++ b/Classes/PhoneMainView.m @@ -30,7 +30,7 @@ @synthesize mainViewController; -- (void)myInit { +- (void)initPhoneMainView { currentPhoneView = -1; loadCount = 0; // For avoiding IOS 4 bug @@ -42,7 +42,7 @@ - (id)init { self = [super init]; if (self) { - [self myInit]; + [self initPhoneMainView]; } return self; } @@ -50,7 +50,7 @@ - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { - [self myInit]; + [self initPhoneMainView]; } return self; } @@ -58,11 +58,52 @@ - (id)initWithCoder:(NSCoder *)decoder { self = [super initWithCoder:decoder]; if (self) { - [self myInit]; + [self initPhoneMainView]; } return self; } +- (CATransition*)getTransition:(PhoneView)old new:(PhoneView)new { + CATransition* trans = [CATransition animation]; + [trans setType:kCATransitionPush]; + [trans setDuration:0.35]; + [trans setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; + + bool left = false; + + if(old == PhoneView_Chat) { + if(new == PhoneView_Contacts || + new == PhoneView_Dialer || + new == PhoneView_Settings || + new == PhoneView_History) { + left = true; + } + } else if(old == PhoneView_Settings) { + if(new == PhoneView_Dialer || + new == PhoneView_Contacts || + new == PhoneView_History) { + left = true; + } + } else if(old == PhoneView_Dialer) { + if(new == PhoneView_Contacts || + new == PhoneView_History) { + left = true; + } + } else if(old == PhoneView_Contacts) { + if(new == PhoneView_History) { + left = true; + } + } + + if(left) { + [trans setSubtype:kCATransitionFromLeft]; + } else { + [trans setSubtype:kCATransitionFromRight]; + } + + return trans; +} + - (void)changeView: (NSNotification*) notif { NSNumber *viewId = [notif.userInfo objectForKey: @"view"]; NSNumber *tabBar = [notif.userInfo objectForKey: @"tabBar"]; @@ -75,6 +116,7 @@ if(description == nil) return; if(view != currentPhoneView) { + [mainViewController setViewTransition:[self getTransition:currentPhoneView new:view]]; [mainViewController changeView:description]; currentPhoneView = view; } diff --git a/Classes/Utils/CPAnimationSequence.h b/Classes/Utils/CPAnimationSequence.h new file mode 100755 index 000000000..d018d1dfc --- /dev/null +++ b/Classes/Utils/CPAnimationSequence.h @@ -0,0 +1,26 @@ + +// Created by Yang Meyer on 26.07.11. +// Copyright 2011-2012 compeople AG. All rights reserved. + +#import +#import "CPAnimationStep.h" + +/** + A CPAnimationSequence defines a sequence of CPAnimationStep objects, which can + be `-run` animatedly or non-animatedly. + + CPAnimationSequence implements the Composite design pattern, with CPAnimationStep + as the base class. + */ +@interface CPAnimationSequence : CPAnimationStep + +#pragma mark - constructors + ++ (id) sequenceWithSteps:(CPAnimationStep*)first, ... NS_REQUIRES_NIL_TERMINATION; + +#pragma mark - properties + +/** Animations steps, from first to last. */ +@property (nonatomic, strong, readonly) NSArray* steps; + +@end diff --git a/Classes/Utils/CPAnimationSequence.m b/Classes/Utils/CPAnimationSequence.m new file mode 100755 index 000000000..e87e869ec --- /dev/null +++ b/Classes/Utils/CPAnimationSequence.m @@ -0,0 +1,79 @@ + +// Created by Yang Meyer on 26.07.11. +// Copyright 2011-2012 compeople AG. All rights reserved. + +#import "CPAnimationSequence.h" + +@interface CPAnimationStep(hidden) +- (NSArray*) animationStepArray; +@end + +@interface CPAnimationSequence() +@property (nonatomic, strong, readwrite) NSArray* steps; +@end + +#pragma mark - +@implementation CPAnimationSequence + +@synthesize steps; + +#pragma mark - Object lifecycle + ++ (id) sequenceWithSteps:(CPAnimationStep*)first, ... { + CPAnimationSequence* instance = [[self alloc] init]; + if (instance) { + NSMutableArray* tempSteps = [[NSMutableArray alloc] initWithCapacity:10]; + va_list args; + va_start(args, first); + [tempSteps insertObject:first atIndex:0]; + CPAnimationStep* aStep; + while ((aStep = va_arg(args, CPAnimationStep*))) { + [tempSteps insertObject:aStep atIndex:0]; + } + instance.steps = [NSArray arrayWithArray:tempSteps]; + va_end(args); + } + return instance; +} + + +#pragma mark - property override + +- (void) setDelay:(NSTimeInterval)delay { + NSAssert(NO, @"Setting a delay on a sequence is undefined and therefore disallowed!"); +} + +- (void) setDuration:(NSTimeInterval)duration { + NSAssert(NO, @"Setting a duration on a sequence is undefined and therefore disallowed!"); +} + +- (void) setOptions:(UIViewAnimationOptions)options { + NSAssert(NO, @"Setting options on a sequence is undefined and therefore disallowed!"); +} + +#pragma mark - build the sequence + +- (NSArray*) animationStepArray { + NSMutableArray* array = [NSMutableArray arrayWithCapacity:[self.steps count]]; + for (CPAnimationStep* current in self.steps) { + [array addObjectsFromArray:[current animationStepArray]]; + } + return array; +} + +#pragma mark - pretty-print + +- (NSString*) description { + NSMutableString* sequenceBody = [[NSMutableString alloc] initWithCapacity:100*[self.steps count]]; + for (CPAnimationStep* step in self.steps) { + [sequenceBody appendString:[step description]]; + } + // indent + [sequenceBody replaceOccurrencesOfString:@"\n" + withString:@"\n " + options:NSCaseInsensitiveSearch + range:NSMakeRange(0, [sequenceBody length])]; + return [NSString stringWithFormat:@"\n(sequence:%@\n)", sequenceBody]; +} + +@end diff --git a/Classes/Utils/CPAnimationStep.h b/Classes/Utils/CPAnimationStep.h new file mode 100755 index 000000000..ca67b485c --- /dev/null +++ b/Classes/Utils/CPAnimationStep.h @@ -0,0 +1,46 @@ + +// Created by Yang Meyer on 26.07.11. +// Copyright 2011 compeople AG. All rights reserved. + +#import + +/** Helper type definition for the component. */ +typedef void (^AnimationStep)(void); + +/** + A CPAnimationStep defines a single animation object with a delay, duration, execution block and animation options. + */ +@interface CPAnimationStep : NSObject + +#pragma mark - constructors + ++ (id) after:(NSTimeInterval)delay + animate:(AnimationStep)step; + ++ (id) for:(NSTimeInterval)duration + animate:(AnimationStep)step; + ++ (id) after:(NSTimeInterval)delay + for:(NSTimeInterval)duration + animate:(AnimationStep)step; + ++ (id) after:(NSTimeInterval)delay + for:(NSTimeInterval)duration + options:(UIViewAnimationOptions)theOptions + animate:(AnimationStep)step; + +#pragma mark - properties (normally already set by the constructor) + +@property (nonatomic) NSTimeInterval delay; +@property (nonatomic) NSTimeInterval duration; +@property (nonatomic, copy) AnimationStep step; +@property (nonatomic) UIViewAnimationOptions options; + +#pragma mark - execution + +/** Starts the step execution. */ +- (void) runAnimated:(BOOL)animated; +/** Shortcut for [step runAnimated:YES] */ +- (void) run; + +@end diff --git a/Classes/Utils/CPAnimationStep.m b/Classes/Utils/CPAnimationStep.m new file mode 100755 index 000000000..8ea76a77d --- /dev/null +++ b/Classes/Utils/CPAnimationStep.m @@ -0,0 +1,124 @@ + +// Created by Yang Meyer on 26.07.11. +// Copyright 2011-2012 compeople AG. All rights reserved. + +#import "CPAnimationStep.h" + +@interface CPAnimationStep() +/** A temporary reverse queue of animation steps, i.e. from last to first. + It is created when the step is run, and is modified during the animation, + and is destroyed when the animation finishes. */ +@property (nonatomic, strong) NSMutableArray* consumableSteps; +@end + +@implementation CPAnimationStep + +@synthesize delay, duration, step, options; +@synthesize consumableSteps; + +#pragma mark overrides + + +#pragma mark construction + ++ (id) after:(NSTimeInterval)delay animate:(AnimationStep)step { + return [self after:delay for:0.0 options:0 animate:step]; +} + ++ (id) for:(NSTimeInterval)duration animate:(AnimationStep)step { + return [self after:0.0 for:duration options:0 animate:step]; +} + ++ (id) after:(NSTimeInterval)delay for:(NSTimeInterval)duration animate:(AnimationStep)step { + return [self after:delay for:duration options:0 animate:step]; +} + ++ (id) after:(NSTimeInterval)theDelay + for:(NSTimeInterval)theDuration + options:(UIViewAnimationOptions)theOptions + animate:(AnimationStep)theStep { + + CPAnimationStep* instance = [[self alloc] init]; + if (instance) { + instance.delay = theDelay; + instance.duration = theDuration; + instance.options = theOptions; + instance.step = [theStep copy]; + } + return instance; +} + +#pragma mark action + +// From http://stackoverflow.com/questions/4007023/blocks-instead-of-performselectorwithobjectafterdelay ++ (void) runBlock:(AnimationStep)block afterDelay:(NSTimeInterval)delay { + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC*delay), dispatch_get_current_queue(), block); +} + +- (NSArray*) animationStepArray { + // subclasses must override this! + return [NSArray arrayWithObject:self]; +} + +- (void) runAnimated:(BOOL)animated { + if (!self.consumableSteps) { + self.consumableSteps = [[NSMutableArray alloc] initWithArray:[self animationStepArray]]; + } + if (![self.consumableSteps count]) { // recursion anchor + self.consumableSteps = nil; + return; // we're done + } + AnimationStep completionStep = ^{ + [self.consumableSteps removeLastObject]; + [self runAnimated:animated]; // recurse! + }; + CPAnimationStep* currentStep = [self.consumableSteps lastObject]; + // Note: do not animate to short steps + if (animated && currentStep.duration >= 0.02) { + [UIView animateWithDuration:currentStep.duration + delay:currentStep.delay + options:currentStep.options + animations:currentStep.step + completion:^(BOOL finished) { + if (finished) { + completionStep(); + } + }]; + } else { + void (^execution)(void) = ^{ + currentStep.step(); + completionStep(); + }; + + if (animated && currentStep.delay) { + [CPAnimationStep runBlock:execution afterDelay:currentStep.delay]; + } else { + execution(); + } + } +} + +- (void) run { + [self runAnimated:YES]; +} + +#pragma mark - pretty-print + +- (NSString*) description { + NSMutableString* result = [[NSMutableString alloc] initWithCapacity:100]; + [result appendString:@"\n["]; + if (self.delay > 0.0) { + [result appendFormat:@"after:%.1f ", self.delay]; + } + if (self.duration > 0.0) { + [result appendFormat:@"for:%.1f ", self.duration]; + } + if (self.options > 0) { + [result appendFormat:@"options:%d ", self.options]; + } + [result appendFormat:@"animate:%@", self.step]; + [result appendString:@"]"]; + return result; +} + +@end diff --git a/Resources/toy-mono.wav b/Resources/toy-mono.wav new file mode 100644 index 000000000..a225ac2cb Binary files /dev/null and b/Resources/toy-mono.wav differ diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index e4529577b..b2de10655 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -147,8 +147,6 @@ 34075199150645A300B89C47 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 340751961506459A00B89C47 /* CoreTelephony.framework */; }; 340751E7150F38FD00B89C47 /* UIVideoButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 340751E6150F38FD00B89C47 /* UIVideoButton.m */; }; 340751E8150F38FD00B89C47 /* UIVideoButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 340751E6150F38FD00B89C47 /* UIVideoButton.m */; }; - 340A75B014C0670B006AA708 /* ConferenceCallDetailView-ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 340A75AF14C0670A006AA708 /* ConferenceCallDetailView-ipad.xib */; }; - 340A75B114C0670B006AA708 /* ConferenceCallDetailView-ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 340A75AF14C0670A006AA708 /* ConferenceCallDetailView-ipad.xib */; }; 3418843714C58BB100EA48C7 /* nowebcamCIF.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 3418843614C58BB100EA48C7 /* nowebcamCIF.jpg */; }; 3418843814C58BB100EA48C7 /* nowebcamCIF.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 3418843614C58BB100EA48C7 /* nowebcamCIF.jpg */; }; 341FCA8E149798210084BC26 /* linphonerc-ipad in Resources */ = {isa = PBXBuildFile; fileRef = 341FCA8D149798210084BC26 /* linphonerc-ipad */; }; @@ -159,12 +157,6 @@ 3422AA5114975EC9000D4E8A /* InCallViewController-ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3422AA4F14975EC9000D4E8A /* InCallViewController-ipad.xib */; }; 3422AA5314978352000D4E8A /* PhoneViewController-ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3422AA5214978352000D4E8A /* PhoneViewController-ipad.xib */; }; 3422AA5414978352000D4E8A /* PhoneViewController-ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3422AA5214978352000D4E8A /* PhoneViewController-ipad.xib */; }; - 344ABD72147FC438007420B6 /* ConferenceCallDetailView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 344ABD71147FC438007420B6 /* ConferenceCallDetailView.xib */; }; - 344ABD73147FC438007420B6 /* ConferenceCallDetailView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 344ABD71147FC438007420B6 /* ConferenceCallDetailView.xib */; }; - 344ABD77147FCB68007420B6 /* ConferenceCallDetailView.m in Sources */ = {isa = PBXBuildFile; fileRef = 344ABD76147FCB68007420B6 /* ConferenceCallDetailView.m */; }; - 344ABD78147FCB68007420B6 /* ConferenceCallDetailView.m in Sources */ = {isa = PBXBuildFile; fileRef = 344ABD76147FCB68007420B6 /* ConferenceCallDetailView.m */; }; - 344ABD7A147FD32B007420B6 /* ConferenceCallDetailCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 344ABD79147FD32B007420B6 /* ConferenceCallDetailCell.xib */; }; - 344ABD7B147FD32B007420B6 /* ConferenceCallDetailCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 344ABD79147FD32B007420B6 /* ConferenceCallDetailCell.xib */; }; 344ABDE81484E723007420B6 /* libzrtpcpp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 344ABDE71484E723007420B6 /* libzrtpcpp.a */; }; 344ABDF114850AE9007420B6 /* libc++.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 344ABDEF14850AE9007420B6 /* libc++.1.dylib */; settings = {ATTRIBUTES = (Weak, ); }; }; 344ABDF214850AE9007420B6 /* libstdc++.6.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 344ABDF014850AE9007420B6 /* libstdc++.6.dylib */; settings = {ATTRIBUTES = (Weak, ); }; }; @@ -229,6 +221,12 @@ D3211BC3159CBFD70098460B /* cancel_white_bg_over.png in Resources */ = {isa = PBXBuildFile; fileRef = D3211BBD159CBFD60098460B /* cancel_white_bg_over.png */; }; D32409C3158B49A600C8C119 /* UILongTouchButton.m in Sources */ = {isa = PBXBuildFile; fileRef = D32409C2158B49A600C8C119 /* UILongTouchButton.m */; }; D32409C4158B49A600C8C119 /* UILongTouchButton.m in Sources */ = {isa = PBXBuildFile; fileRef = D32409C2158B49A600C8C119 /* UILongTouchButton.m */; }; + D32460E6159D9AAD00BA7F3A /* UIPassView.m in Sources */ = {isa = PBXBuildFile; fileRef = D32460E5159D9AAD00BA7F3A /* UIPassView.m */; }; + D32460E7159D9AAD00BA7F3A /* UIPassView.m in Sources */ = {isa = PBXBuildFile; fileRef = D32460E5159D9AAD00BA7F3A /* UIPassView.m */; }; + D32460ED159DA47700BA7F3A /* CPAnimationSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = D32460EA159DA47700BA7F3A /* CPAnimationSequence.m */; }; + D32460EE159DA47700BA7F3A /* CPAnimationSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = D32460EA159DA47700BA7F3A /* CPAnimationSequence.m */; }; + D32460EF159DA47700BA7F3A /* CPAnimationStep.m in Sources */ = {isa = PBXBuildFile; fileRef = D32460EC159DA47700BA7F3A /* CPAnimationStep.m */; }; + D32460F0159DA47700BA7F3A /* CPAnimationStep.m in Sources */ = {isa = PBXBuildFile; fileRef = D32460EC159DA47700BA7F3A /* CPAnimationStep.m */; }; D326483815887D5200930C67 /* OrderedDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = D326483715887D5200930C67 /* OrderedDictionary.m */; }; D326483915887D5200930C67 /* OrderedDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = D326483715887D5200930C67 /* OrderedDictionary.m */; }; D326483E1588950F00930C67 /* UICallBar.m in Sources */ = {isa = PBXBuildFile; fileRef = D326483C1588950F00930C67 /* UICallBar.m */; }; @@ -396,6 +394,8 @@ D3A55FBD15877E5E003FD403 /* UIContactCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D3A55FBB15877E5E003FD403 /* UIContactCell.m */; }; D3A55FBF15877E69003FD403 /* UIContactCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = D3A55FBE15877E69003FD403 /* UIContactCell.xib */; }; D3A55FC015877E69003FD403 /* UIContactCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = D3A55FBE15877E69003FD403 /* UIContactCell.xib */; }; + D3C714B3159DB84400705B8E /* toy-mono.wav in Resources */ = {isa = PBXBuildFile; fileRef = D3C714B2159DB84400705B8E /* toy-mono.wav */; }; + D3C714B4159DB84400705B8E /* toy-mono.wav in Resources */ = {isa = PBXBuildFile; fileRef = D3C714B2159DB84400705B8E /* toy-mono.wav */; }; D3D6A39E159B0EEF005F692C /* add_call_more_default.png in Resources */ = {isa = PBXBuildFile; fileRef = D3D6A39B159B0EEF005F692C /* add_call_more_default.png */; }; D3D6A39F159B0EEF005F692C /* add_call_more_default.png in Resources */ = {isa = PBXBuildFile; fileRef = D3D6A39B159B0EEF005F692C /* add_call_more_default.png */; }; D3D6A3A0159B0EEF005F692C /* add_call_more_disable.png in Resources */ = {isa = PBXBuildFile; fileRef = D3D6A39C159B0EEF005F692C /* add_call_more_disable.png */; }; @@ -903,17 +903,12 @@ 340751E4150E4D0200B89C47 /* CallDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CallDelegate.h; sourceTree = ""; }; 340751E5150F38FC00B89C47 /* UIVideoButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIVideoButton.h; sourceTree = ""; }; 340751E6150F38FD00B89C47 /* UIVideoButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIVideoButton.m; sourceTree = ""; }; - 340A75AF14C0670A006AA708 /* ConferenceCallDetailView-ipad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "ConferenceCallDetailView-ipad.xib"; sourceTree = ""; }; 3418843614C58BB100EA48C7 /* nowebcamCIF.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = nowebcamCIF.jpg; path = submodules/linphone/mediastreamer2/src/nowebcamCIF.jpg; sourceTree = ""; }; 341FCA8D149798210084BC26 /* linphonerc-ipad */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "linphonerc-ipad"; sourceTree = ""; }; 34216F3E1547EBCD00EA9777 /* VideoZoomHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VideoZoomHandler.h; path = LinphoneUI/VideoZoomHandler.h; sourceTree = ""; }; 34216F3F1547EBCD00EA9777 /* VideoZoomHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VideoZoomHandler.m; path = LinphoneUI/VideoZoomHandler.m; sourceTree = ""; }; 3422AA4F14975EC9000D4E8A /* InCallViewController-ipad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "InCallViewController-ipad.xib"; sourceTree = ""; }; 3422AA5214978352000D4E8A /* PhoneViewController-ipad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "PhoneViewController-ipad.xib"; sourceTree = ""; }; - 344ABD71147FC438007420B6 /* ConferenceCallDetailView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ConferenceCallDetailView.xib; sourceTree = ""; }; - 344ABD75147FCB68007420B6 /* ConferenceCallDetailView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConferenceCallDetailView.h; sourceTree = ""; }; - 344ABD76147FCB68007420B6 /* ConferenceCallDetailView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ConferenceCallDetailView.m; sourceTree = ""; }; - 344ABD79147FD32B007420B6 /* ConferenceCallDetailCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ConferenceCallDetailCell.xib; sourceTree = ""; }; 344ABDE71484E723007420B6 /* libzrtpcpp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libzrtpcpp.a; path = "liblinphone-sdk/apple-darwin/lib/libzrtpcpp.a"; sourceTree = ""; }; 344ABDEF14850AE9007420B6 /* libc++.1.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libc++.1.dylib"; path = "usr/lib/libc++.1.dylib"; sourceTree = SDKROOT; }; 344ABDF014850AE9007420B6 /* libstdc++.6.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libstdc++.6.dylib"; path = "usr/lib/libstdc++.6.dylib"; sourceTree = SDKROOT; }; @@ -957,6 +952,12 @@ D3211BBD159CBFD60098460B /* cancel_white_bg_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = cancel_white_bg_over.png; path = Resources/cancel_white_bg_over.png; sourceTree = ""; }; D32409C1158B49A600C8C119 /* UILongTouchButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UILongTouchButton.h; sourceTree = ""; }; D32409C2158B49A600C8C119 /* UILongTouchButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UILongTouchButton.m; sourceTree = ""; }; + D32460E4159D9AAD00BA7F3A /* UIPassView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIPassView.h; sourceTree = ""; }; + D32460E5159D9AAD00BA7F3A /* UIPassView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIPassView.m; sourceTree = ""; }; + D32460E9159DA47700BA7F3A /* CPAnimationSequence.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPAnimationSequence.h; path = Utils/CPAnimationSequence.h; sourceTree = ""; }; + D32460EA159DA47700BA7F3A /* CPAnimationSequence.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPAnimationSequence.m; path = Utils/CPAnimationSequence.m; sourceTree = ""; }; + D32460EB159DA47700BA7F3A /* CPAnimationStep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPAnimationStep.h; path = Utils/CPAnimationStep.h; sourceTree = ""; }; + D32460EC159DA47700BA7F3A /* CPAnimationStep.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPAnimationStep.m; path = Utils/CPAnimationStep.m; sourceTree = ""; }; D326483615887D5200930C67 /* OrderedDictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OrderedDictionary.h; path = Utils/OrderedDictionary.h; sourceTree = ""; }; D326483715887D5200930C67 /* OrderedDictionary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OrderedDictionary.m; path = Utils/OrderedDictionary.m; sourceTree = ""; }; D326483B1588950F00930C67 /* UICallBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UICallBar.h; sourceTree = ""; }; @@ -1077,6 +1078,7 @@ D3A55FBA15877E5E003FD403 /* UIContactCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIContactCell.h; sourceTree = ""; }; D3A55FBB15877E5E003FD403 /* UIContactCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIContactCell.m; sourceTree = ""; }; D3A55FBE15877E69003FD403 /* UIContactCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UIContactCell.xib; sourceTree = ""; }; + D3C714B2159DB84400705B8E /* toy-mono.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = "toy-mono.wav"; path = "Resources/toy-mono.wav"; sourceTree = ""; }; D3D6A39B159B0EEF005F692C /* add_call_more_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = add_call_more_default.png; path = Resources/add_call_more_default.png; sourceTree = ""; }; D3D6A39C159B0EEF005F692C /* add_call_more_disable.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = add_call_more_disable.png; path = Resources/add_call_more_disable.png; sourceTree = ""; }; D3D6A39D159B0EEF005F692C /* add_call_more_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = add_call_more_over.png; path = Resources/add_call_more_over.png; sourceTree = ""; }; @@ -1302,11 +1304,6 @@ D35E7594159460560066B1C1 /* ChatViewController.h */, D35E7595159460560066B1C1 /* ChatViewController.m */, D35E7596159460570066B1C1 /* ChatViewController.xib */, - 344ABD79147FD32B007420B6 /* ConferenceCallDetailCell.xib */, - 340A75AF14C0670A006AA708 /* ConferenceCallDetailView-ipad.xib */, - 344ABD75147FCB68007420B6 /* ConferenceCallDetailView.h */, - 344ABD76147FCB68007420B6 /* ConferenceCallDetailView.m */, - 344ABD71147FC438007420B6 /* ConferenceCallDetailView.xib */, 22E0A820111C44E100B04932 /* ConsoleViewController.h */, 22E0A81F111C44E100B04932 /* ConsoleViewController.m */, 22E0A81E111C44E100B04932 /* ConsoleViewController.xib */, @@ -1621,6 +1618,8 @@ 2214EBF212F86360002A5394 /* UIMicroButton.m */, D3F34F331599C354005BE94F /* UIModalViewController.h */, D3F34F341599C354005BE94F /* UIModalViewController.m */, + D32460E4159D9AAD00BA7F3A /* UIPassView.h */, + D32460E5159D9AAD00BA7F3A /* UIPassView.m */, D36FB2D31589EF7C0036F6F2 /* UIPauseButton.h */, D36FB2D41589EF7C0036F6F2 /* UIPauseButton.m */, 22968A5D12F875C600588287 /* UISpeakerButton.h */, @@ -1950,6 +1949,7 @@ D3EA5402159852080037DC6B /* tchat-new-discussion-over.png */, D38327FF158100E400FA0D23 /* tchat-over.png */, D38327F21580FE3A00FA0D23 /* tchat-selectionne.png */, + D3C714B2159DB84400705B8E /* toy-mono.wav */, D3F83F00158205A100336684 /* video-OFF-actif.png */, D37295DA158B3C9600D2C0C7 /* video-OFF-disabled.png */, D3F83F01158205A100336684 /* video-OFF-over.png */, @@ -1972,6 +1972,10 @@ D326483415887D4400930C67 /* Utils */ = { isa = PBXGroup; children = ( + D32460E9159DA47700BA7F3A /* CPAnimationSequence.h */, + D32460EA159DA47700BA7F3A /* CPAnimationSequence.m */, + D32460EB159DA47700BA7F3A /* CPAnimationStep.h */, + D32460EC159DA47700BA7F3A /* CPAnimationStep.m */, D3F26BEA159869A6005F9CAB /* AbstractCall.h */, D3F26BEB159869A6005F9CAB /* AbstractCall.m */, D326483615887D5200930C67 /* OrderedDictionary.h */, @@ -2157,13 +2161,10 @@ 228B19AF130290C500F154D3 /* iTunesArtwork in Resources */, 2214783D1386A2030020F8B8 /* Localizable.strings in Resources */, 70571E1A13FABCB000CDD3C2 /* rootca.pem in Resources */, - 344ABD72147FC438007420B6 /* ConferenceCallDetailView.xib in Resources */, - 344ABD7A147FD32B007420B6 /* ConferenceCallDetailCell.xib in Resources */, 34CA852F148F646700503C01 /* MainScreenWithVideoPreview.xib in Resources */, 3422AA5014975EC9000D4E8A /* InCallViewController-ipad.xib in Resources */, 3422AA5314978352000D4E8A /* PhoneViewController-ipad.xib in Resources */, 341FCA8E149798210084BC26 /* linphonerc-ipad in Resources */, - 340A75B014C0670B006AA708 /* ConferenceCallDetailView-ipad.xib in Resources */, 3418843714C58BB100EA48C7 /* nowebcamCIF.jpg in Resources */, 34C7646C14CD5585008E9607 /* dialer-orange.png in Resources */, 34C7646D14CD5585008E9607 /* history-orange.png in Resources */, @@ -2340,6 +2341,7 @@ D3211BBE159CBFD60098460B /* cancel_white_bg_default.png in Resources */, D3211BC0159CBFD70098460B /* cancel_white_bg_disabled.png in Resources */, D3211BC2159CBFD70098460B /* cancel_white_bg_over.png in Resources */, + D3C714B3159DB84400705B8E /* toy-mono.wav in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2364,13 +2366,10 @@ 22D8F13D147548E2008C97DB /* Localizable.strings in Resources */, 22D8F142147548E2008C97DB /* rootca.pem in Resources */, 2211DB95147564B400DEE054 /* Settings.bundle in Resources */, - 344ABD73147FC438007420B6 /* ConferenceCallDetailView.xib in Resources */, - 344ABD7B147FD32B007420B6 /* ConferenceCallDetailCell.xib in Resources */, 34CA8530148F646700503C01 /* MainScreenWithVideoPreview.xib in Resources */, 3422AA5114975EC9000D4E8A /* InCallViewController-ipad.xib in Resources */, 3422AA5414978352000D4E8A /* PhoneViewController-ipad.xib in Resources */, 341FCA8F149798210084BC26 /* linphonerc-ipad in Resources */, - 340A75B114C0670B006AA708 /* ConferenceCallDetailView-ipad.xib in Resources */, 3418843814C58BB100EA48C7 /* nowebcamCIF.jpg in Resources */, 57282931154AF1460076F540 /* history-orange.png in Resources */, 57282933154AF14D0076F540 /* dialer-orange.png in Resources */, @@ -2531,6 +2530,7 @@ D3211BBF159CBFD70098460B /* cancel_white_bg_default.png in Resources */, D3211BC1159CBFD70098460B /* cancel_white_bg_disabled.png in Resources */, D3211BC3159CBFD70098460B /* cancel_white_bg_over.png in Resources */, + D3C714B4159DB84400705B8E /* toy-mono.wav in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2558,7 +2558,6 @@ 223963171393CFAF001DE689 /* FastAddressBook.m in Sources */, 22AA8B0113D83F6300B30535 /* UICamSwitch.m in Sources */, 2211DBBE14769C8300DEE054 /* CallDelegate.m in Sources */, - 344ABD77147FCB68007420B6 /* ConferenceCallDetailView.m in Sources */, 34CA8539148F692A00503C01 /* MainScreenWithVideoPreview.m in Sources */, 340751E7150F38FD00B89C47 /* UIVideoButton.m in Sources */, 34216F401547EBCD00EA9777 /* VideoZoomHandler.m in Sources */, @@ -2606,6 +2605,9 @@ D3F34F351599C354005BE94F /* UIModalViewController.m in Sources */, D31AAF5E159B3919002C6B02 /* InCallTableViewController.m in Sources */, D3211BB0159C4EF10098460B /* UIConferenceHeader.m in Sources */, + D32460E6159D9AAD00BA7F3A /* UIPassView.m in Sources */, + D32460ED159DA47700BA7F3A /* CPAnimationSequence.m in Sources */, + D32460EF159DA47700BA7F3A /* CPAnimationStep.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2630,7 +2632,6 @@ 22D8F157147548E2008C97DB /* FastAddressBook.m in Sources */, 22D8F159147548E2008C97DB /* UICamSwitch.m in Sources */, 2211DBBF14769C8300DEE054 /* CallDelegate.m in Sources */, - 344ABD78147FCB68007420B6 /* ConferenceCallDetailView.m in Sources */, 34CA853A148F692A00503C01 /* MainScreenWithVideoPreview.m in Sources */, 340751E8150F38FD00B89C47 /* UIVideoButton.m in Sources */, 34216F411547EBCD00EA9777 /* VideoZoomHandler.m in Sources */, @@ -2678,6 +2679,9 @@ D3F34F361599C354005BE94F /* UIModalViewController.m in Sources */, D31AAF5F159B3919002C6B02 /* InCallTableViewController.m in Sources */, D3211BB1159C4EF10098460B /* UIConferenceHeader.m in Sources */, + D32460E7159D9AAD00BA7F3A /* UIPassView.m in Sources */, + D32460EE159DA47700BA7F3A /* CPAnimationSequence.m in Sources */, + D32460F0159DA47700BA7F3A /* CPAnimationStep.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/main.m b/main.m index 511484655..ecec28813 100644 --- a/main.m +++ b/main.m @@ -20,8 +20,6 @@ #import int main(int argc, char *argv[]) { - - NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release];