diff --git a/Classes/ChatRoomTableViewController.m b/Classes/ChatRoomTableViewController.m index 80f9a4ede..32dcbc629 100644 --- a/Classes/ChatRoomTableViewController.m +++ b/Classes/ChatRoomTableViewController.m @@ -54,9 +54,10 @@ } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UIChatRoomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UIChatRoomCell"]; + static NSString *kCellId = @"UIChatRoomCell"; + UIChatRoomCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId]; if (cell == nil) { - cell = [[UIChatRoomCell alloc] initWithIdentifier:@"UIChatRoomCell"]; + cell = [[[UIChatRoomCell alloc] initWithIdentifier:kCellId] autorelease]; } [cell setChat:[data objectAtIndex:[indexPath row]]]; diff --git a/Classes/ChatRoomViewController.m b/Classes/ChatRoomViewController.m index 6be06c8e7..515db7f71 100644 --- a/Classes/ChatRoomViewController.m +++ b/Classes/ChatRoomViewController.m @@ -63,6 +63,8 @@ - (void)viewDidLoad { + [super viewDidLoad]; + // Set selected+over background: IB lack ! [editButton setImage:[UIImage imageNamed:@"chat_ok_over.png"] forState:(UIControlStateHighlighted | UIControlStateSelected)]; @@ -83,8 +85,8 @@ selector:@selector(textReceivedEvent:) name:@"LinphoneTextReceived" object:nil]; - - [[tableController tableView] setEditing:FALSE]; + if([tableController isEditing]) + [tableController setEditing:FALSE]; [editButton setOff]; [[tableController tableView] reloadData]; } @@ -180,7 +182,7 @@ } - (IBAction)onEditClick:(id)event { - [[tableController tableView] setEditing:![[tableController tableView] isEditing] animated:TRUE]; + [tableController setEditing:![tableController isEditing] animated:TRUE]; } - (IBAction)onSendClick:(id)event { diff --git a/Classes/ChatTableViewController.m b/Classes/ChatTableViewController.m index 769179480..c919595ed 100644 --- a/Classes/ChatTableViewController.m +++ b/Classes/ChatTableViewController.m @@ -45,22 +45,20 @@ #pragma mark - UITableViewDataSource Functions -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView -{ +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section -{ +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { [self reloadData]; return [data count]; } -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath -{ - UIChatCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UIChatCell"]; +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + static NSString *kCellId = @"UIChatCell"; + UIChatCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId]; if (cell == nil) { - cell = [[UIChatCell alloc] initWithIdentifier:@"UIChatCell"]; + cell = [[[UIChatCell alloc] initWithIdentifier:kCellId] autorelease]; } [cell setChat:[data objectAtIndex:[indexPath row]]]; diff --git a/Classes/ChatViewController.m b/Classes/ChatViewController.m index 8a92ae4b6..25a7fb3f6 100644 --- a/Classes/ChatViewController.m +++ b/Classes/ChatViewController.m @@ -45,6 +45,8 @@ #pragma mark - ViewController Functions - (void)viewDidLoad { + [super viewDidLoad]; + // Set selected+over background: IB lack ! [editButton setImage:[UIImage imageNamed:@"chat_ok_over.png"] forState:(UIControlStateHighlighted | UIControlStateSelected)]; @@ -56,8 +58,8 @@ selector:@selector(textReceivedEvent:) name:@"LinphoneTextReceived" object:nil]; - - [[tableController tableView] setEditing:FALSE]; + if([tableController isEditing]) + [tableController setEditing:FALSE]; [editButton setOff]; [[tableController tableView] reloadData]; } @@ -99,7 +101,7 @@ } - (IBAction)onEditClick:(id)event { - [[tableController tableView] setEditing:![[tableController tableView] isEditing] animated:TRUE]; + [tableController setEditing:![tableController isEditing] animated:TRUE]; } @end diff --git a/Classes/ContactDetailsLabelViewController.h b/Classes/ContactDetailsLabelViewController.h new file mode 100644 index 000000000..cefe72273 --- /dev/null +++ b/Classes/ContactDetailsLabelViewController.h @@ -0,0 +1,36 @@ +/* ContactDetailsLabelViewController.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 + +#import "UIModalViewController.h" + +@interface ContactDetailsLabelViewController : UIModalViewController { + NSDictionary *dataList; + UITableView *tableView; + NSString *selectedData; +} + +@property (nonatomic, copy) NSString *selectedData; +@property (nonatomic, retain) NSDictionary *dataList; +@property (nonatomic, retain) IBOutlet UITableView *tableView; + +- (IBAction)onBackClick:(id)event; + +@end diff --git a/Classes/ContactDetailsLabelViewController.m b/Classes/ContactDetailsLabelViewController.m new file mode 100644 index 000000000..7ec07dd90 --- /dev/null +++ b/Classes/ContactDetailsLabelViewController.m @@ -0,0 +1,86 @@ +/* ContactDetailsLabelViewController.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 "ContactDetailsLabelViewController.h" + +@implementation ContactDetailsLabelViewController + +@synthesize dataList; +@synthesize tableView; +@synthesize selectedData; + + +#pragma mark - Property Functions + +- (void)setDataList:(NSDictionary *)adatalist { + if (self->dataList != nil) { + [self->dataList release]; + } + self->dataList = [adatalist retain]; + [tableView reloadData]; +} + + +- (void)setSelectedData:(NSString *)aselectedData { + if (selectedData != nil) { + [selectedData release]; + } + selectedData = [[NSString alloc] initWithString:aselectedData]; + [tableView reloadData]; +} + +#pragma mark - UITableViewDataSource Functions + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return 1; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return [dataList count]; +} + +- (UITableViewCell *)tableView:(UITableView *)atableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + static NSString *kCellId = @"ContactDetailsLabelCell"; + UITableViewCell *cell = [atableView dequeueReusableCellWithIdentifier:kCellId]; + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:kCellId] autorelease]; + } + NSString* key = [[dataList allKeys] objectAtIndex:[indexPath row]]; + [cell.textLabel setText:[dataList objectForKey:key]]; + if ([key compare:selectedData]==0) { + [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; + } else { + [cell setAccessoryType:UITableViewCellAccessoryNone]; + } + return cell; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + NSString* key = [[dataList allKeys] objectAtIndex:[indexPath row]]; + [self setSelectedData:key]; + [self dismiss:key]; +} + +#pragma mark - Action Functions + +- (IBAction)onBackClick:(id)event { + [self dismiss]; +} + +@end diff --git a/Classes/ContactDetailsLabelViewController.xib b/Classes/ContactDetailsLabelViewController.xib new file mode 100644 index 000000000..dbc7d7a22 --- /dev/null +++ b/Classes/ContactDetailsLabelViewController.xib @@ -0,0 +1,354 @@ + + + + 1296 + 11E53 + 2182 + 1138.47 + 569.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1181 + + + IBUITableView + IBUIImageView + IBUIView + IBUIButton + IBProxyObject + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + + + 292 + {320, 460} + + + + _NS:9 + NO + IBCocoaTouchFramework + + NSImage + numpad_background.png + + + + + 290 + + + + 292 + {160, 58} + + + + _NS:9 + NO + + Add contact + + IBCocoaTouchFramework + 0 + 0 + NO + + 3 + MC41AA + + + NSImage + contact_back_over.png + + + NSImage + contact_back_default.png + + + 2 + 15 + + + Helvetica-Bold + 15 + 16 + + + + + 292 + {{160, 0}, {160, 58}} + + + + _NS:9 + NO + IBCocoaTouchFramework + + NSImage + contact_bar_background.png + + + + {320, 58} + + + + _NS:9 + + 3 + MQA + + 2 + + + IBCocoaTouchFramework + + + + 306 + {{0, 59}, {320, 401}} + + + + _NS:9 + + 3 + MCAwAA + + YES + IBCocoaTouchFramework + 0.0 + 10 + 0.0 + 0.0 + YES + 1 + 2 + 0 + YES + 44 + 10 + 10 + + + {{0, 20}, {320, 460}} + + + + + 3 + MQA + + + + IBCocoaTouchFramework + + + + + + + view + + + + 12 + + + + tableView + + + + 15 + + + + dataSource + + + + 13 + + + + delegate + + + + 14 + + + + onBackClick: + + + 7 + + 11 + + + + + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + + + + + + 5 + + + tableView + + + 6 + + + + + + + header + + + 7 + + + background + + + 8 + + + backButton + + + 10 + + + barBackground + + + + + ContactDetailsLabelViewController + 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 + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + + 15 + + + + + ContactDetailsLabelViewController + UIModalViewController + + onBackClick: + id + + + onBackClick: + + onBackClick: + id + + + + tableView + UITableView + + + tableView + + tableView + UITableView + + + + IBProjectSource + ./Classes/ContactDetailsLabelViewController.h + + + + UIModalViewController + UIViewController + + IBProjectSource + ./Classes/UIModalViewController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + YES + 3 + + {320, 117} + {320, 117} + {5, 117} + {640, 523} + + 1181 + + diff --git a/Classes/ContactDetailsTableViewController.h b/Classes/ContactDetailsTableViewController.h index 955868e99..7eb886d69 100644 --- a/Classes/ContactDetailsTableViewController.h +++ b/Classes/ContactDetailsTableViewController.h @@ -20,11 +20,16 @@ #import #import -@interface ContactDetailsTableViewController : UITableViewController { +#import "ContactDetailsLabelViewController.h" + +@interface ContactDetailsTableViewController : UITableViewController { @private ABRecordRef contact; NSMutableArray *dataCache; ABAddressBookRef addressBook; + ContactDetailsLabelViewController *contactDetailsLabelViewController; + NSMutableArray *labelArray; + NSIndexPath *editingIndexPath; } @property (nonatomic, assign) ABRecordRef contact; diff --git a/Classes/ContactDetailsTableViewController.m b/Classes/ContactDetailsTableViewController.m index d8f355650..e4cee9949 100644 --- a/Classes/ContactDetailsTableViewController.m +++ b/Classes/ContactDetailsTableViewController.m @@ -20,6 +20,41 @@ #import "ContactDetailsTableViewController.h" #import "UIContactDetailsHeader.h" #import "PhoneMainView.h" +#import "UIEditableTableViewCell.h" +#import "UIView+ModalStack.h" + +@interface Entry : NSObject + +@property (retain) NSString *key; +@property (retain) NSString *value; + +@end + +@implementation Entry + +@synthesize key; +@synthesize value; + + +#pragma mark - Lifecycle Functions + +- (id)initWithData:(NSString*)akey value:(NSString*)avalue { + self = [super init]; + if (self != NULL) { + [self setKey:akey]; + [self setValue:avalue]; + } + return self; +} + +- (void)dealloc { + [key release]; + [value release]; + [super dealloc]; +} + +@end + @implementation ContactDetailsTableViewController @@ -31,6 +66,12 @@ - (void)initContactDetailsTableViewController { addressBook = ABAddressBookCreate(); dataCache = [[NSMutableArray alloc] init]; + labelArray = [[NSMutableArray alloc] initWithObjects: + [NSString stringWithString:(NSString*)kABPersonPhoneMobileLabel], + [NSString stringWithString:(NSString*)kABPersonPhoneIPhoneLabel], + [NSString stringWithString:(NSString*)kABPersonPhoneMainLabel], + [NSString stringWithString:(NSString*)kABPersonPhoneHomeFAXLabel], + [NSString stringWithString:(NSString*)kABPersonPhoneWorkFAXLabel], nil]; } - (id)init { @@ -50,7 +91,8 @@ } - (void)dealloc { - [dataCache dealloc]; + [labelArray release]; + [dataCache release]; [super dealloc]; } @@ -64,12 +106,47 @@ - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; + contact = nil; // Clear previous selection ABAddressBookUnregisterExternalChangeCallback(addressBook, sync_toc_address_book, self); + if(contactDetailsLabelViewController != nil) { + [[[self view] superview] removeModalView:[contactDetailsLabelViewController view]]; + [editingIndexPath release]; + editingIndexPath = nil; + [contactDetailsLabelViewController release]; + contactDetailsLabelViewController = nil; + } } #pragma mark - ++ (BOOL)findAndResignFirstResponder:(UIView*)view { + if (view.isFirstResponder) { + [view resignFirstResponder]; + return YES; + } + for (UIView *subView in view.subviews) { + if ([ContactDetailsTableViewController findAndResignFirstResponder:subView]) + return YES; + } + return NO; +} + ++ (NSString*)localizeLabel:(NSString*)str { + CFStringRef lLocalizedLabel = ABAddressBookCopyLocalizedLabel((CFStringRef) str); + NSString * retStr = [NSString stringWithString:(NSString*) lLocalizedLabel]; + CFRelease(lLocalizedLabel); + return retStr; +} + +- (NSDictionary*)getLocalizedLabels { + NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:[labelArray count]]; + for(NSString *str in labelArray) { + [dict setObject:[ContactDetailsTableViewController localizeLabel:str] forKey:str]; + } + return [dict autorelease]; +} + static void sync_toc_address_book (ABAddressBookRef addressBook, CFDictionaryRef info, void *context) { ContactDetailsTableViewController* controller = (ContactDetailsTableViewController*)context; ABRecordID recordID = ABRecordGetRecordID([controller contact]); @@ -92,10 +169,9 @@ static void sync_toc_address_book (ABAddressBookRef addressBook, CFDictionaryRef for(int i = 0; i < ABMultiValueGetCount(lMap); ++i) { CFStringRef lValue = ABMultiValueCopyValueAtIndex(lMap, i); CFStringRef lLabel = ABMultiValueCopyLabelAtIndex(lMap, i); - CFStringRef lLocalizedLabel = ABAddressBookCopyLocalizedLabel(lLabel); - [subArray addObject:[NSArray arrayWithObjects:[NSString stringWithString:(NSString*)lValue], [NSString stringWithString:(NSString*)lLocalizedLabel], nil]]; - if(lLocalizedLabel) - CFRelease(lLocalizedLabel); + Entry *entry = [[Entry alloc] initWithData:[NSString stringWithString:(NSString*)lLabel] value:[NSString stringWithString:(NSString*)lValue]]; + [subArray addObject: entry]; + [entry release]; CFRelease(lLabel); CFRelease(lValue); } @@ -109,16 +185,15 @@ static void sync_toc_address_book (ABAddressBookRef addressBook, CFDictionaryRef NSMutableArray *subArray = [[NSMutableArray alloc] init]; for(int i = 0; i < ABMultiValueGetCount(lMap); ++i) { CFDictionaryRef lDict = ABMultiValueCopyValueAtIndex(lMap, i); - if(CFDictionaryContainsKey(lDict, @"service")) { - if(CFStringCompare((CFStringRef)@"SIP", CFDictionaryGetValue(lDict, @"service"), kCFCompareCaseInsensitive) == 0) { - CFStringRef lValue = CFDictionaryGetValue(lDict, @"username"); + if(CFDictionaryContainsKey(lDict, kABPersonInstantMessageServiceKey)) { + if(CFStringCompare((CFStringRef)@"SIP", CFDictionaryGetValue(lDict, kABPersonInstantMessageServiceKey), kCFCompareCaseInsensitive) == 0) { + CFStringRef lValue = CFDictionaryGetValue(lDict, kABPersonInstantMessageUsernameKey); CFStringRef lLabel = ABMultiValueCopyLabelAtIndex(lMap, i); - CFStringRef lLocalizedLabel = ABAddressBookCopyLocalizedLabel(lLabel); - [subArray addObject:[NSArray arrayWithObjects:[NSString stringWithString:(NSString*)lValue], [NSString stringWithString:(NSString*)lLocalizedLabel], nil]]; - if(lLocalizedLabel) - CFRelease(lLocalizedLabel); + Entry *entry = [[Entry alloc] initWithData:[NSString stringWithString:(NSString*)lLabel] value:[NSString stringWithString:(NSString*)lValue]]; + [subArray addObject: entry]; + [entry release]; CFRelease(lLabel); - + CFRelease(lValue); } } CFRelease(lDict); @@ -128,62 +203,150 @@ static void sync_toc_address_book (ABAddressBookRef addressBook, CFDictionaryRef } } +- (void)addEntry:(UITableView*)tableview section:(NSInteger)section editing:(BOOL)editing animated:(BOOL)animated { + NSMutableArray *sectionArray = [dataCache objectAtIndex:section]; + NSUInteger count = [sectionArray count]; + Entry *entry = [[Entry alloc] initWithData:[labelArray objectAtIndex:0] value:@""]; + [sectionArray addObject:entry]; + + NSArray *tagInsertIndexPath = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:count inSection:section]]; + + // Add or remove the Add row as appropriate. + UITableViewRowAnimation animationStyle = UITableViewRowAnimationNone; + if (animated) { + animationStyle = UITableViewRowAnimationFade; + } + [self.tableView insertRowsAtIndexPaths:tagInsertIndexPath withRowAnimation:animationStyle]; +} + +- (void)removeEntry:(UITableView*)tableview section:(NSInteger)section editing:(BOOL)editing animated:(BOOL)animated { + NSMutableArray *sectionArray = [dataCache objectAtIndex:section]; + for (int i = 0; i < [sectionArray count]; ++i) { + Entry *entry = [sectionArray objectAtIndex:i]; + if(![[entry value] length]) { + [sectionArray removeObjectAtIndex:i]; + NSArray *tagInsertIndexPath = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:i inSection:section]]; + UITableViewRowAnimation animationStyle = UITableViewRowAnimationNone; + if (animated) { + animationStyle = UITableViewRowAnimationFade; + } + [self.tableView deleteRowsAtIndexPaths:tagInsertIndexPath withRowAnimation:animationStyle]; + } + } +} + #pragma mark - Property Functions - (void)setContact:(ABRecordRef)acontact { self->contact = acontact; - [[self tableView] reloadData]; + [self loadData]; + [self.tableView reloadData]; } #pragma mark - UITableViewDataSource Functions - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - [self loadData]; return [dataCache count]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - NSMutableDictionary *dict = [dataCache objectAtIndex:section]; - return [dict count]; + return [[dataCache objectAtIndex:section] count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ContactDetailsCell"]; - if (cell == nil) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:@"ContactDetailsCell"]; - //[cell setSelectedBackgroundView:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"list_hightlight.png"]]]; + static NSString *kCellId = @"ContactDetailsCell"; + UIEditableTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId]; + if (cell == nil) { + cell = [[[UIEditableTableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:kCellId] autorelease]; + // [cell setEditingAccessoryType:UITableViewCellAccessoryNone]; + // [cell setSelectionStyle: UITableViewCellSelectionStyleNone]; + } + if ([indexPath row] < [[dataCache objectAtIndex:[indexPath section]] count]) { + NSMutableArray *sectionDict = [dataCache objectAtIndex:[indexPath section]]; + Entry *entry = [sectionDict objectAtIndex:[indexPath row]]; + [cell.textLabel setText:[ContactDetailsTableViewController localizeLabel:[entry key]]]; + NSString *value = [entry value]; + [cell.detailTextLabel setText:value]; + [cell.detailTextField setText:value]; + } + if ([indexPath section] == 0) { + [cell.detailTextField setKeyboardType:UIKeyboardTypeNumbersAndPunctuation]; + [cell.detailTextField setPlaceholder:@"Phone number"]; + } else { + [cell.detailTextField setKeyboardType:UIKeyboardTypeEmailAddress]; + [cell.detailTextField setPlaceholder:@"SIP address"]; } - NSMutableArray *sectionDict = [dataCache objectAtIndex:[indexPath section]]; - NSArray *tuple = [sectionDict objectAtIndex:[indexPath row]]; - [cell.textLabel setText:[tuple objectAtIndex:1]]; - [cell.detailTextLabel setText:[tuple objectAtIndex:0]]; return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + [tableView deselectRowAtIndexPath:indexPath animated:NO]; NSMutableArray *sectionDict = [dataCache objectAtIndex:[indexPath section]]; - NSArray *tuple = [sectionDict objectAtIndex:[indexPath row]]; - - NSString *dest = [tuple objectAtIndex:0]; - if(![dest hasPrefix:@"sip:"]) - dest = [NSString stringWithFormat:@"sip:%@", [tuple objectAtIndex:0]]; - CFStringRef lDisplayName = ABRecordCopyCompositeName(contact); - NSString *displayName = [NSString stringWithString:(NSString*) lDisplayName]; - CFRelease(lDisplayName); - - // Go to dialer view - NSDictionary *dict = [[[NSDictionary alloc] initWithObjectsAndKeys: - [[[NSArray alloc] initWithObjects: dest, displayName, nil] autorelease] - , @"call:displayName:", - nil] autorelease]; - [[PhoneMainView instance] changeView:PhoneView_Dialer dict:dict]; + Entry *entry = [sectionDict objectAtIndex:[indexPath row]]; + if (![self isEditing]) { + NSString *dest = [entry value]; + if(![dest hasPrefix:@"sip:"]) + dest = [NSString stringWithFormat:@"sip:%@", [entry key]]; + CFStringRef lDisplayName = ABRecordCopyCompositeName(contact); + NSString *displayName = [NSString stringWithString:(NSString*) lDisplayName]; + CFRelease(lDisplayName); + + // Go to dialer view + NSDictionary *dict = [[[NSDictionary alloc] initWithObjectsAndKeys: + [[[NSArray alloc] initWithObjects: dest, displayName, nil] autorelease] + , @"call:displayName:", + nil] autorelease]; + [[PhoneMainView instance] changeView:PhoneView_Dialer dict:dict]; + } else { + contactDetailsLabelViewController = [[ContactDetailsLabelViewController alloc] initWithNibName:@"ContactDetailsLabelViewController" + bundle:[NSBundle mainBundle]]; + [contactDetailsLabelViewController setSelectedData:[entry key]]; + [contactDetailsLabelViewController setDataList:[self getLocalizedLabels]]; + [contactDetailsLabelViewController setModalDelegate:self]; + editingIndexPath = [indexPath copy]; + [[[self view] superview] addModalView:[contactDetailsLabelViewController view]]; + } } #pragma mark - UITableViewDelegate Functions +- (void)setEditing:(BOOL)editing animated:(BOOL)animated { + // Add entries + + if(editing) { + [self.tableView beginUpdates]; + for (int section = 0; section <[self numberOfSectionsInTableView:[self tableView]]; ++section) { + [self addEntry:self.tableView section:section editing:editing animated:animated]; + } + [self.tableView endUpdates]; + } else { + [self.tableView beginUpdates]; + for (int section = 0; section <[self numberOfSectionsInTableView:[self tableView]]; ++section) { + [self removeEntry:self.tableView section:section editing:editing animated:animated]; + } + [self.tableView endUpdates]; + } + + // Set animated + [super setEditing:editing animated:animated]; + + // Resign keyboard + if(!editing) { + [ContactDetailsTableViewController findAndResignFirstResponder:[self tableView]]; + } +} + +- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { + int last_index = [[dataCache objectAtIndex:[indexPath section]] count] - 1; + if (indexPath.row == last_index) { + return UITableViewCellEditingStyleInsert; + } + return UITableViewCellEditingStyleDelete; +} + - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { if(section == 0) { UIContactDetailsHeader *headerController = [[UIContactDetailsHeader alloc] init]; @@ -193,16 +356,38 @@ static void sync_toc_address_book (ABAddressBookRef addressBook, CFDictionaryRef [headerController release]; return headerView; } else { - return [[UIView alloc] initWithFrame:CGRectZero]; + return [super tableView:tableView viewForHeaderInSection:section]; + } +} + +- (NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { + if(section == 0) { + return [super tableView:tableView titleForHeaderInSection:section]; + } else { + return @"SIP"; } } - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { - if(section == 0) + if(section == 0) { return [UIContactDetailsHeader height]; - else { - return 0.000001f; // Hack UITableView = 0 + } else { + return 22; } } + +#pragma mark - UIModalViewDeletage Functions + +- (void)modalViewDismiss:(UIModalViewController*)controller value:(id)value { + [[[self view]superview] removeModalView:[contactDetailsLabelViewController view]]; + contactDetailsLabelViewController = nil; + NSMutableArray *sectionDict = [dataCache objectAtIndex:[editingIndexPath section]]; + Entry *entry = [sectionDict objectAtIndex:[editingIndexPath row]]; + [entry setKey:value]; + [[self tableView] reloadRowsAtIndexPaths:[NSArray arrayWithObject: editingIndexPath] withRowAnimation:FALSE]; + [editingIndexPath release]; + editingIndexPath = nil; +} + @end diff --git a/Classes/ContactDetailsViewController.h b/Classes/ContactDetailsViewController.h index bf50a77b3..2cc90bcbc 100644 --- a/Classes/ContactDetailsViewController.h +++ b/Classes/ContactDetailsViewController.h @@ -22,15 +22,19 @@ #import "UICompositeViewController.h" #import "ContactDetailsTableViewController.h" +#import "UIToggleButton.h" @interface ContactDetailsViewController : UIViewController { ContactDetailsTableViewController *tableController; ABRecordRef contact; + UIToggleButton *editButton; } @property (nonatomic, assign) ABRecordRef contact; @property (nonatomic, retain) IBOutlet ContactDetailsTableViewController *tableController; +@property (nonatomic, retain) IBOutlet UIToggleButton *editButton; - (IBAction)onBackClick:(id)event; +- (IBAction)onEditClick:(id)event; @end diff --git a/Classes/ContactDetailsViewController.m b/Classes/ContactDetailsViewController.m index c025949a1..4142ce1be 100644 --- a/Classes/ContactDetailsViewController.m +++ b/Classes/ContactDetailsViewController.m @@ -24,6 +24,7 @@ @synthesize tableController; @synthesize contact; +@synthesize editButton; #pragma mark - Lifecycle Functions @@ -40,13 +41,29 @@ #pragma mark - Property Functions - - (void)setContact:(ABRecordRef)acontact { self->contact = acontact; [tableController setContact:contact]; } +#pragma mark - ViewController Functions + +- (void)viewDidLoad{ + [super viewDidLoad]; + // Set selected+over background: IB lack ! + [editButton setImage:[UIImage imageNamed:@"contact_ok_over.png"] + forState:(UIControlStateHighlighted | UIControlStateSelected)]; +} + +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + if([tableController isEditing]) + [tableController setEditing:FALSE]; + [editButton setOff]; +} + + #pragma mark - UICompositeViewDelegate Functions + (UICompositeViewDescription*) compositeViewDescription { @@ -67,4 +84,8 @@ [[PhoneMainView instance] popView]; } +- (IBAction)onEditClick:(id)event { + [tableController setEditing:![tableController isEditing] animated:TRUE]; +} + @end diff --git a/Classes/ContactDetailsViewController.xib b/Classes/ContactDetailsViewController.xib index 91f6d8dd2..fa5d16d7b 100644 --- a/Classes/ContactDetailsViewController.xib +++ b/Classes/ContactDetailsViewController.xib @@ -116,6 +116,10 @@ NSImage contact_edit_over.png + + NSImage + contact_ok_default.png + NSImage contact_edit_default.png @@ -144,7 +148,6 @@ {{0, 59}, {320, 401}} - _NS:9 3 @@ -152,10 +155,15 @@ YES IBCocoaTouchFramework + 0.0 + 10 + 0.0 + 0.0 YES 1 2 0 + YES YES 44 10 @@ -202,6 +210,23 @@ 27 + + + editButton + + + + 31 + + + + onEditClick: + + + 7 + + 30 + onBackClick: @@ -319,8 +344,9 @@ ContactDetailsTableViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIToggleButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - + com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -328,7 +354,7 @@ - 29 + 46 @@ -343,33 +369,47 @@ ContactDetailsViewController UIViewController - - onBackClick: - id - - - onBackClick: - + + id + id + + + onBackClick: id - - - tableController - ContactDetailsTableViewController - - - tableController - + + onEditClick: + id + + + + UIToggleButton + ContactDetailsTableViewController + + + + editButton + UIToggleButton + + tableController ContactDetailsTableViewController - + IBProjectSource ./Classes/ContactDetailsViewController.h + + UIToggleButton + UIButton + + IBProjectSource + ./Classes/UIToggleButton.h + + 0 @@ -385,6 +425,7 @@ {320, 117} {320, 117} {320, 117} + {320, 117} {640, 523} 1181 diff --git a/Classes/ContactsTableViewController.m b/Classes/ContactsTableViewController.m index 643fbb361..054367e77 100644 --- a/Classes/ContactsTableViewController.m +++ b/Classes/ContactsTableViewController.m @@ -155,9 +155,10 @@ static void sync_toc_address_book (ABAddressBookRef addressBook, CFDictionaryRef } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UIContactCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UIContactCell"]; + static NSString *kCellId = @"UIContactCell"; + UIContactCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId]; if (cell == nil) { - cell = [[UIContactCell alloc] initWithIdentifier:@"UIContactCell"]; + cell = [[[UIContactCell alloc] initWithIdentifier:kCellId] autorelease]; } OrderedDictionary *subDic = [addressBookMap objectForKey: [addressBookMap keyAtIndex: [indexPath section]]]; diff --git a/Classes/FirstLoginViewController.m b/Classes/FirstLoginViewController.m index c8e2f61bf..554c5fdd8 100644 --- a/Classes/FirstLoginViewController.m +++ b/Classes/FirstLoginViewController.m @@ -37,11 +37,11 @@ } - (void)dealloc { - [loginButton dealloc]; - [siteButton dealloc]; - [usernameField dealloc]; - [passwordField dealloc]; - [waitView dealloc]; + [loginButton release]; + [siteButton release]; + [usernameField release]; + [passwordField release]; + [waitView release]; // Remove all observer [[NSNotificationCenter defaultCenter] removeObserver:self]; @@ -97,6 +97,8 @@ } - (void)viewDidLoad { + [super viewDidLoad]; + NSString* siteUrl = [[LinphoneManager instance].settingsStore objectForKey:@"first_login_view_url"]; if (siteUrl==nil) { siteUrl=@"http://www.linphone.org"; diff --git a/Classes/HistoryTableViewController.m b/Classes/HistoryTableViewController.m index 15f4bba32..72f54f72f 100644 --- a/Classes/HistoryTableViewController.m +++ b/Classes/HistoryTableViewController.m @@ -91,9 +91,10 @@ } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UIHistoryCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UIHistoryCell"]; + static NSString *kCellId = @"UIHistoryCell"; + UIHistoryCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId]; if (cell == nil) { - cell = [[UIHistoryCell alloc] initWithIdentifier:@"UIHistoryCell"]; + cell = [[[UIHistoryCell alloc] initWithIdentifier:kCellId] autorelease]; } LinphoneCallLog *log = [[callLogs objectAtIndex:[indexPath row]] pointerValue]; diff --git a/Classes/HistoryViewController.m b/Classes/HistoryViewController.m index f60c676ac..4ea5cc67b 100644 --- a/Classes/HistoryViewController.m +++ b/Classes/HistoryViewController.m @@ -70,9 +70,10 @@ typedef enum _HistoryView { - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - [[tableController tableView] setEditing:FALSE]; - [self changeView: History_All]; + if([tableController isEditing]) + [tableController setEditing:FALSE]; [editButton setOff]; + [self changeView: History_All]; [self.tableView reloadData]; } @@ -124,7 +125,7 @@ typedef enum _HistoryView { } - (IBAction)onEditClick:(id) event { - [[tableController tableView] setEditing:![[tableController tableView] isEditing] animated:TRUE]; + [tableController setEditing:![tableController isEditing] animated:TRUE]; } diff --git a/Classes/InCallTableViewController.m b/Classes/InCallTableViewController.m index b4bd3d8c0..533dec6fe 100644 --- a/Classes/InCallTableViewController.m +++ b/Classes/InCallTableViewController.m @@ -63,7 +63,7 @@ enum TableSection { - (void)dealloc { [callCellData removeAllObjects]; - [callCellData dealloc]; + [callCellData release]; [super dealloc]; } @@ -196,9 +196,10 @@ enum TableSection { #pragma mark - UITableViewDataSource Functions - (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UICallCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UICallCell"]; + static NSString *kCellId = @"UICallCell"; + UICallCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId]; if (cell == nil) { - cell = [[UICallCell alloc] initWithIdentifier:@"UICallCell"]; + cell = [[[UICallCell alloc] initWithIdentifier:kCellId] autorelease]; } bool inConference = indexPath.section == ConferenceSection; diff --git a/Classes/IncomingCallViewController.m b/Classes/IncomingCallViewController.m index 833ddb811..d41bc09d2 100644 --- a/Classes/IncomingCallViewController.m +++ b/Classes/IncomingCallViewController.m @@ -75,7 +75,7 @@ - (void)callUpdate:(LinphoneCall *)acall state:(LinphoneCallState)astate { if(call == acall && (astate == LinphoneCallEnd || astate == LinphoneCallError)) { - [self dismiss: IncomingCall_Aborted]; + [self dismiss: [NSNumber numberWithInt: IncomingCall_Aborted]]; } } @@ -103,12 +103,12 @@ - (IBAction)onAcceptClick:(id)event { linphone_core_accept_call([LinphoneManager getLc], call); - [self dismiss: IncomingCall_Accepted]; + [self dismiss: [NSNumber numberWithInt:IncomingCall_Accepted]]; } - (IBAction)onDeclineClick:(id)event { linphone_core_terminate_call([LinphoneManager getLc], call); - [self dismiss: IncomingCall_Decline]; + [self dismiss: [NSNumber numberWithInt:IncomingCall_Decline]]; } @end diff --git a/Classes/LinphoneUI/UICallBar.m b/Classes/LinphoneUI/UICallBar.m index e34be52e5..58cf6000c 100644 --- a/Classes/LinphoneUI/UICallBar.m +++ b/Classes/LinphoneUI/UICallBar.m @@ -99,6 +99,8 @@ #pragma mark - ViewController Functions - (void)viewDidLoad { + [super viewDidLoad]; + [pauseButton setType:UIPauseButtonType_CurrentCall call:nil]; [zeroButton setDigit:'0']; diff --git a/Classes/LinphoneUI/UICompositeViewController.m b/Classes/LinphoneUI/UICompositeViewController.m index 280bc5834..7279cef15 100644 --- a/Classes/LinphoneUI/UICompositeViewController.m +++ b/Classes/LinphoneUI/UICompositeViewController.m @@ -93,7 +93,7 @@ [stateBarView release]; [tabBarView release]; [viewControllerCache removeAllObjects]; - [currentViewDescription dealloc]; + [currentViewDescription release]; [super dealloc]; } @@ -268,7 +268,7 @@ // Dealloc old view description if(oldViewDescription != nil) { - [oldViewDescription dealloc]; + [oldViewDescription release]; } } diff --git a/Classes/LinphoneUI/UIEditableTableViewCell.h b/Classes/LinphoneUI/UIEditableTableViewCell.h new file mode 100644 index 000000000..d36708e9e --- /dev/null +++ b/Classes/LinphoneUI/UIEditableTableViewCell.h @@ -0,0 +1,28 @@ +/* UIEditableTableViewCell.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 UIEditableTableViewCell : UITableViewCell { + UITextField *detailTextField; +} + +@property (nonatomic, retain) IBOutlet UITextField *detailTextField; + +@end diff --git a/Classes/LinphoneUI/UIEditableTableViewCell.m b/Classes/LinphoneUI/UIEditableTableViewCell.m new file mode 100644 index 000000000..6ae24eaaa --- /dev/null +++ b/Classes/LinphoneUI/UIEditableTableViewCell.m @@ -0,0 +1,100 @@ +/* UIEditableTableViewCell.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 "UIEditableTableViewCell.h" + +@implementation UIEditableTableViewCell + +@synthesize detailTextField; + + +#pragma mark - Lifecycle Functions + +- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier +{ + self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; + if (self) { + UIView *parent = [self.detailTextLabel superview]; + self.detailTextField = [[UITextField alloc] init]; + [self.detailTextField setHidden:TRUE]; + [self.detailTextField setDelegate:self]; + [self.detailTextField setClearButtonMode: UITextFieldViewModeWhileEditing]; + [self.detailTextField setContentVerticalAlignment: UIControlContentVerticalAlignmentCenter]; + + UIFont *font = [UIFont fontWithName:@"Helvetica-Bold" size:[UIFont systemFontSize]]; + [self.detailTextLabel setFont:font]; + [self.detailTextField setFont:font]; + [parent addSubview:detailTextField]; + } + return self; +} + +- (void)dealloc { + [self.detailTextField release]; + [super dealloc]; +} + + +#pragma mark - View Functions + +- (void)layoutSubviews { + [super layoutSubviews]; + + CGRect frame; + frame.origin.x = 83; + frame.origin.y = 0; + frame.size.height = 44; + + CGRect superframe = [self frame]; + frame.size.width = superframe.size.width - frame.origin.x - 10; + [self.detailTextField setFrame:frame]; +} + + +#pragma mark - UITableViewCell Functions + +- (void)setEditing:(BOOL)editing animated:(BOOL)animated { + [super setEditing:editing animated:animated]; + if(editing) { + [self.detailTextField setHidden:FALSE]; + [self.detailTextLabel setHidden:TRUE]; + } else { + [self.detailTextField setHidden:TRUE]; + [self.detailTextLabel setHidden:FALSE]; + } +} + +- (void)setEditing:(BOOL)editing { + [self setEditing:editing animated:FALSE]; +} + +- (void)setSelected:(BOOL)selected animated:(BOOL)animated +{ + [super setSelected:selected animated:animated]; +} + + +#pragma mark - UITextFieldDelegate Functions + +- (BOOL)textFieldShouldReturn:(UITextField *)textField { + [textField resignFirstResponder]; + return YES; +} + +@end diff --git a/Classes/LinphoneUI/UIModalViewController.h b/Classes/LinphoneUI/UIModalViewController.h index f422b632a..929414823 100644 --- a/Classes/LinphoneUI/UIModalViewController.h +++ b/Classes/LinphoneUI/UIModalViewController.h @@ -23,16 +23,17 @@ @protocol UIModalViewDelegate -- (void)modalViewDismiss:(UIModalViewController*)controller value:(int)value; +- (void)modalViewDismiss:(UIModalViewController*)controller value:(id)value; @end @interface UIModalViewController : UIViewController { + BOOL dismissed; id modalDelegate; } - (void)setModalDelegate:(id)delegate; -- (void)dismiss:(int)value; +- (void)dismiss:(id)value; - (void)dismiss; @end diff --git a/Classes/LinphoneUI/UIModalViewController.m b/Classes/LinphoneUI/UIModalViewController.m index 6207ccbb8..e2c888f13 100644 --- a/Classes/LinphoneUI/UIModalViewController.m +++ b/Classes/LinphoneUI/UIModalViewController.m @@ -21,14 +21,52 @@ @implementation UIModalViewController -- (void)dismiss:(int)value { +- (void)initUIModalViewController { + dismissed = FALSE; +} + +- (id)init { + self = [super init]; + if (self) { + [self initUIModalViewController]; + } + return self; +} + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + [self initUIModalViewController]; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (self) { + [self initUIModalViewController]; + } + return self; +} + +- (void)dismiss:(id)value { if(modalDelegate != nil) [modalDelegate modalViewDismiss:self value:value]; + + if(!dismissed) { + dismissed = true; + [self autorelease]; + } } - (void)dismiss{ if(modalDelegate != nil) - [modalDelegate modalViewDismiss:self value:0]; + [modalDelegate modalViewDismiss:self value:nil]; + + if(!dismissed) { + dismissed = true; + [self autorelease]; + } } - (void)setModalDelegate:(id)delegate { diff --git a/Classes/LinphoneUI/UIView+ModalStack.h b/Classes/LinphoneUI/UIView+ModalStack.h new file mode 100644 index 000000000..c036ad7ff --- /dev/null +++ b/Classes/LinphoneUI/UIView+ModalStack.h @@ -0,0 +1,29 @@ +/* UIView+ModalStack.h + * + * Copyright (C) 2012 Belledonne Comunications, Grenoble, France + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#import + +#import "UIModalViewController.h" + +@interface UIView (ModalStack) + +- (void)addModalView:(UIView*)view; +- (void)removeModalView:(UIView*)view; + +@end diff --git a/Classes/LinphoneUI/UIView+ModalStack.m b/Classes/LinphoneUI/UIView+ModalStack.m new file mode 100644 index 000000000..24170c292 --- /dev/null +++ b/Classes/LinphoneUI/UIView+ModalStack.m @@ -0,0 +1,49 @@ +/* UIView+ModalStack.m + * + * Copyright (C) 2012 Belledonne Comunications, Grenoble, France + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#import + +#import "UIView+ModalStack.h" + +@implementation UIView (ModalStack) + +- (void)addModalView:(UIView*)view { + CATransition* trans = [CATransition animation]; + [trans setType:kCATransitionFade]; + [trans setDuration:0.35]; + [trans setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; + [trans setSubtype:kCATransitionFromRight]; + [self.layer addAnimation:trans forKey:@"Appear"]; + + [self addSubview:view]; + [self bringSubviewToFront:view]; +} + +- (void)removeModalView:(UIView*)view { + CATransition* trans = [CATransition animation]; + [trans setType:kCATransitionFade]; + [trans setDuration:0.35]; + [trans setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; + [trans setSubtype:kCATransitionFromRight]; + [self.layer addAnimation:trans forKey:@"Disappear"]; + + [view removeFromSuperview]; +} + +@end diff --git a/Classes/PhoneMainView.h b/Classes/PhoneMainView.h index fab26455c..212884dea 100644 --- a/Classes/PhoneMainView.h +++ b/Classes/PhoneMainView.h @@ -43,8 +43,6 @@ typedef enum _PhoneView { @private UICompositeViewController *mainViewController; - NSMutableArray *modalControllers; - NSMutableDictionary *viewDescriptions; UIActionSheet *incomingCallActionSheet; diff --git a/Classes/PhoneMainView.m b/Classes/PhoneMainView.m index a74aea4df..0eab53ed0 100644 --- a/Classes/PhoneMainView.m +++ b/Classes/PhoneMainView.m @@ -36,6 +36,7 @@ #import "ContactDetailsViewController.h" #import "AbstractCall.h" +#import "UIView+ModalStack.h" static PhoneMainView* phoneMainViewInstance=nil; @@ -55,7 +56,6 @@ static PhoneMainView* phoneMainViewInstance=nil; // Init view descriptions viewDescriptions = [[NSMutableDictionary alloc] init]; - modalControllers = [[NSMutableArray alloc] init]; } - (id)init { @@ -90,9 +90,6 @@ static PhoneMainView* phoneMainViewInstance=nil; [viewDescriptions removeAllObjects]; [viewDescriptions release]; - [modalControllers removeAllObjects]; - [modalControllers release]; - [viewStack release]; [super dealloc]; @@ -458,7 +455,8 @@ static PhoneMainView* phoneMainViewInstance=nil; } else { IncomingCallViewController *controller = [[IncomingCallViewController alloc] init]; [controller setCall:call]; - [self addModalViewController:controller]; + [controller setModalDelegate:self]; + [[self view] addModalView:[controller view]]; } } @@ -519,37 +517,9 @@ static PhoneMainView* phoneMainViewInstance=nil; #pragma mark - Modal Functions -- (void)modalViewDismiss:(UIModalViewController*)controller value:(int)value { - [self removeModalViewController:controller]; -} - -- (void)addModalViewController:(UIModalViewController*)controller { - [controller setModalDelegate:self]; - [modalControllers insertObject:controller atIndex:0]; - - CATransition* trans = [CATransition animation]; - [trans setType:kCATransitionFade]; - [trans setDuration:0.35]; - [trans setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; - [trans setSubtype:kCATransitionFromRight]; - [[self view].layer addAnimation:trans forKey:@"Appear"]; - - [[self view] addSubview:[controller view]]; - [[self view] bringSubviewToFront:[controller view]]; -} - -- (void)removeModalViewController:(UIModalViewController*)controller { +- (void)modalViewDismiss:(UIModalViewController*)controller value:(id)value { [controller setModalDelegate:nil]; - [modalControllers removeObject:controller]; - - CATransition* trans = [CATransition animation]; - [trans setType:kCATransitionFade]; - [trans setDuration:0.35]; - [trans setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; - [trans setSubtype:kCATransitionFromRight]; - [[self view].layer addAnimation:trans forKey:@"Disappear"]; - - [[controller view] removeFromSuperview]; + [[self view] removeModalView:[controller view]]; } @end \ No newline at end of file diff --git a/Classes/SettingsViewController.m b/Classes/SettingsViewController.m index 41e117729..8062de0a5 100644 --- a/Classes/SettingsViewController.m +++ b/Classes/SettingsViewController.m @@ -46,18 +46,35 @@ } +#pragma mark - + ++ (void)removeBackground:(UIView*)view { + if([view isKindOfClass:[UITableView class]]) { + [view setBackgroundColor:[UIColor clearColor]]; + } + for(UIView *subview in [view subviews]) { + [SettingsViewController removeBackground:subview]; + } +} + #pragma mark - ViewController Functions - (void)viewDidLoad { + [super viewDidLoad]; + settingsController.delegate = self; settingsController.settingsReaderDelegate = self; settingsController.settingsStore=[[LinphoneManager instance] settingsStore]; settingsController.showCreditsFooter = FALSE; navigationController.view.frame = self.view.frame; + [SettingsViewController removeBackground:navigationController.view]; + [SettingsViewController removeBackground:settingsController.view]; [self.view addSubview: navigationController.view]; } + + - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if ([[UIDevice currentDevice].systemVersion doubleValue] < 5.0) { diff --git a/Classes/SettingsViewController.xib b/Classes/SettingsViewController.xib index 38b76b8c3..09bf98376 100644 --- a/Classes/SettingsViewController.xib +++ b/Classes/SettingsViewController.xib @@ -11,12 +11,13 @@ 1181 + IBProxyObject + IBUINavigationController + IBUIViewController + IBUIImageView IBUINavigationBar IBUINavigationItem - IBUIViewController IBUIView - IBUINavigationController - IBProxyObject com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -37,9 +38,23 @@ 274 + + + + 292 + {320, 460} + + _NS:9 + NO + IBCocoaTouchFramework + + NSImage + numpad_background.png + + + {320, 460} - _NS:9 IBCocoaTouchFramework @@ -66,7 +81,6 @@ NO - Settings IBCocoaTouchFramework @@ -132,6 +146,9 @@ 4 + + + @@ -165,6 +182,12 @@ settingsItem + + 16 + + + background + @@ -175,6 +198,7 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin IASKAppSettingsViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -183,64 +207,9 @@ - 15 - - - - - IASKAppSettingsViewController - UITableViewController - - dismiss: - id - - - dismiss: - - dismiss: - id - - - - delegate - id - - - delegate - - delegate - id - - - - IBProjectSource - ./Classes/IASKAppSettingsViewController.h - - - - SettingsViewController - UIViewController - - UINavigationController - IASKAppSettingsViewController - - - - navigationController - UINavigationController - - - settingsController - IASKAppSettingsViewController - - - - IBProjectSource - ./Classes/SettingsViewController.h - - - + 17 + 0 IBCocoaTouchFramework @@ -249,6 +218,10 @@ YES 3 + + numpad_background.png + {640, 523} + 1181 diff --git a/Classes/WizardViewController.m b/Classes/WizardViewController.m index 226f61ece..c32db0ad4 100644 --- a/Classes/WizardViewController.m +++ b/Classes/WizardViewController.m @@ -93,6 +93,7 @@ UICompositeViewDescription *description = [UICompositeViewDescription alloc]; #pragma mark - ViewController Functions - (void)viewDidLoad { + [super viewDidLoad]; [self changeView:welcomeView back:FALSE animation:FALSE]; } diff --git a/Resources/contact_bar_background.png b/Resources/contact_bar_background.png new file mode 100644 index 000000000..e3638e197 Binary files /dev/null and b/Resources/contact_bar_background.png differ diff --git a/Resources/contact_ok_default.png b/Resources/contact_ok_default.png new file mode 100644 index 000000000..0c49ac3d5 Binary files /dev/null and b/Resources/contact_ok_default.png differ diff --git a/Resources/contact_ok_over.png b/Resources/contact_ok_over.png new file mode 100644 index 000000000..4fe6248f8 Binary files /dev/null and b/Resources/contact_ok_over.png differ diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index bd29d5d5e..63551e32d 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -370,6 +370,14 @@ D37295DB158B3C9600D2C0C7 /* video_off_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = D37295DA158B3C9600D2C0C7 /* video_off_disabled.png */; }; D37295DC158B3C9600D2C0C7 /* video_off_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = D37295DA158B3C9600D2C0C7 /* video_off_disabled.png */; }; D377BBFA15A19DA6002B696B /* video_on_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = D377BBF915A19DA6002B696B /* video_on_disabled.png */; }; + D378906515AC373B00BD776C /* ContactDetailsLabelViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D378906315AC373B00BD776C /* ContactDetailsLabelViewController.m */; }; + D378906615AC373B00BD776C /* ContactDetailsLabelViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D378906315AC373B00BD776C /* ContactDetailsLabelViewController.m */; }; + D378906715AC373B00BD776C /* ContactDetailsLabelViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = D378906415AC373B00BD776C /* ContactDetailsLabelViewController.xib */; }; + D378906815AC373B00BD776C /* ContactDetailsLabelViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = D378906415AC373B00BD776C /* ContactDetailsLabelViewController.xib */; }; + D378906A15AC37C800BD776C /* contact_bar_background.png in Resources */ = {isa = PBXBuildFile; fileRef = D378906915AC37C800BD776C /* contact_bar_background.png */; }; + D378906B15AC37C800BD776C /* contact_bar_background.png in Resources */ = {isa = PBXBuildFile; fileRef = D378906915AC37C800BD776C /* contact_bar_background.png */; }; + D378907515AC448A00BD776C /* UIView+ModalStack.m in Sources */ = {isa = PBXBuildFile; fileRef = D378907415AC448A00BD776C /* UIView+ModalStack.m */; }; + D378907615AC448A00BD776C /* UIView+ModalStack.m in Sources */ = {isa = PBXBuildFile; fileRef = D378907415AC448A00BD776C /* UIView+ModalStack.m */; }; D37B96B715A1A6F20005CCD2 /* call_state_delete_default.png in Resources */ = {isa = PBXBuildFile; fileRef = D37B96B515A1A6F20005CCD2 /* call_state_delete_default.png */; }; D37B96B815A1A6F20005CCD2 /* call_state_delete_default.png in Resources */ = {isa = PBXBuildFile; fileRef = D37B96B515A1A6F20005CCD2 /* call_state_delete_default.png */; }; D37B96B915A1A6F20005CCD2 /* call_state_delete_over.png in Resources */ = {isa = PBXBuildFile; fileRef = D37B96B615A1A6F20005CCD2 /* call_state_delete_over.png */; }; @@ -487,6 +495,12 @@ D3C2814C15A2D38D0098AA42 /* dialer_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = D3C2814A15A2D38D0098AA42 /* dialer_selected.png */; }; D3C2815215A2D64A0098AA42 /* numpad_star_over.png in Resources */ = {isa = PBXBuildFile; fileRef = D3C2815115A2D64A0098AA42 /* numpad_star_over.png */; }; D3C2815315A2D64A0098AA42 /* numpad_star_over.png in Resources */ = {isa = PBXBuildFile; fileRef = D3C2815115A2D64A0098AA42 /* numpad_star_over.png */; }; + D3C6526715AC1A8F0092A874 /* UIEditableTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D3C6526615AC1A8F0092A874 /* UIEditableTableViewCell.m */; }; + D3C6526815AC1A8F0092A874 /* UIEditableTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D3C6526615AC1A8F0092A874 /* UIEditableTableViewCell.m */; }; + D3C6526B15AC228A0092A874 /* contact_ok_default.png in Resources */ = {isa = PBXBuildFile; fileRef = D3C6526915AC228A0092A874 /* contact_ok_default.png */; }; + D3C6526C15AC228A0092A874 /* contact_ok_default.png in Resources */ = {isa = PBXBuildFile; fileRef = D3C6526915AC228A0092A874 /* contact_ok_default.png */; }; + D3C6526D15AC228A0092A874 /* contact_ok_over.png in Resources */ = {isa = PBXBuildFile; fileRef = D3C6526A15AC228A0092A874 /* contact_ok_over.png */; }; + D3C6526E15AC228A0092A874 /* contact_ok_over.png in Resources */ = {isa = PBXBuildFile; fileRef = D3C6526A15AC228A0092A874 /* contact_ok_over.png */; }; 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 */; }; D3D14E7715A70EE30074A527 /* UIChatRoomHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = D3D14E7515A70EE20074A527 /* UIChatRoomHeader.m */; }; @@ -869,7 +883,7 @@ 2214EBF212F86360002A5394 /* UIMicroButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIMicroButton.m; sourceTree = ""; }; 2218A5CE12F973450088A667 /* LogView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LogView.h; sourceTree = ""; }; 2218A92212FBE1340088A667 /* FirstLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FirstLoginViewController.h; sourceTree = ""; }; - 2218A92312FBE1340088A667 /* FirstLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FirstLoginViewController.m; sourceTree = ""; }; + 2218A92312FBE1340088A667 /* FirstLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = FirstLoginViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 2218A92412FBE1340088A667 /* FirstLoginViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = FirstLoginViewController.xib; sourceTree = ""; }; 22276E8013C73D3100210156 /* libavcodec.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libavcodec.a; path = "liblinphone-sdk/apple-darwin/lib/libavcodec.a"; sourceTree = ""; }; 22276E8113C73D3100210156 /* libavutil.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libavutil.a; path = "liblinphone-sdk/apple-darwin/lib/libavutil.a"; sourceTree = ""; }; @@ -914,11 +928,11 @@ 22C7555F1317E59C007BC101 /* UIBluetoothButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIBluetoothButton.m; sourceTree = ""; }; 22C7560513265C6A007BC101 /* aes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aes.h; sourceTree = ""; }; 22C7560613265C6A007BC101 /* asn1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asn1.h; sourceTree = ""; }; - 22C7560713265C6A007BC101 /* asn1_mac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asn1_mac.h; sourceTree = ""; }; + 22C7560713265C6A007BC101 /* asn1_mac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = asn1_mac.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 22C7560813265C6A007BC101 /* asn1t.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asn1t.h; sourceTree = ""; }; 22C7560913265C6A007BC101 /* bio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bio.h; sourceTree = ""; }; 22C7560A13265C6A007BC101 /* blowfish.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blowfish.h; sourceTree = ""; }; - 22C7560B13265C6A007BC101 /* bn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bn.h; sourceTree = ""; }; + 22C7560B13265C6A007BC101 /* bn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = bn.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 22C7560C13265C6A007BC101 /* buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = buffer.h; sourceTree = ""; }; 22C7560D13265C6A007BC101 /* cast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cast.h; sourceTree = ""; }; 22C7560E13265C6A007BC101 /* comp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = comp.h; sourceTree = ""; }; @@ -936,7 +950,7 @@ 22C7561A13265C6A007BC101 /* ec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ec.h; sourceTree = ""; }; 22C7561B13265C6A007BC101 /* ecdh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ecdh.h; sourceTree = ""; }; 22C7561C13265C6A007BC101 /* ecdsa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ecdsa.h; sourceTree = ""; }; - 22C7561D13265C6A007BC101 /* engine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = engine.h; sourceTree = ""; }; + 22C7561D13265C6A007BC101 /* engine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = engine.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 22C7561E13265C6A007BC101 /* err.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = err.h; sourceTree = ""; }; 22C7561F13265C6A007BC101 /* evp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = evp.h; sourceTree = ""; }; 22C7562013265C6A007BC101 /* fips.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fips.h; sourceTree = ""; }; @@ -994,7 +1008,7 @@ 22E5B0AD133B5EA20044EA25 /* libssl.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libssl.a; path = "liblinphone-sdk/apple-darwin/lib/libssl.a"; sourceTree = ""; }; 22E5B0AE133B5EA20044EA25 /* libcrypto.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcrypto.a; path = "liblinphone-sdk/apple-darwin/lib/libcrypto.a"; sourceTree = ""; }; 22F2508B107141E100AC9B3F /* DialerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DialerViewController.h; sourceTree = ""; }; - 22F2508C107141E100AC9B3F /* DialerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DialerViewController.m; sourceTree = ""; }; + 22F2508C107141E100AC9B3F /* DialerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = DialerViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 22F2508D107141E100AC9B3F /* DialerViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DialerViewController.xib; sourceTree = ""; }; 22F254801073D99800AC9B3F /* ringback.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = ringback.wav; path = "liblinphone-sdk/apple-darwin/share/sounds/linphone/ringback.wav"; sourceTree = ""; }; 22F51EF5107FA66500F98953 /* untitled.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = untitled.plist; sourceTree = ""; }; @@ -1075,7 +1089,7 @@ D32B6E2B15A5C0800033019F /* database.sqlite */ = {isa = PBXFileReference; lastKnownFileType = file; name = database.sqlite; path = Resources/database.sqlite; sourceTree = ""; }; D32B6E2E15A5C0AC0033019F /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; }; D32B6E3615A5C2430033019F /* ChatModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ChatModel.h; path = Model/ChatModel.h; sourceTree = ""; }; - D32B6E3715A5C2430033019F /* ChatModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ChatModel.m; path = Model/ChatModel.m; sourceTree = ""; }; + D32B6E3715A5C2430033019F /* ChatModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = ChatModel.m; path = Model/ChatModel.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; D32B9DFA15A2F131000B6DEC /* FastAddressBook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FastAddressBook.h; path = Utils/FastAddressBook.h; sourceTree = ""; }; D32B9DFB15A2F131000B6DEC /* FastAddressBook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FastAddressBook.m; path = Utils/FastAddressBook.m; sourceTree = ""; }; D3432A5C158A4446001C6B0B /* led_connected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = led_connected.png; path = Resources/led_connected.png; sourceTree = ""; }; @@ -1105,7 +1119,7 @@ D35406F515A47E9E007E7E81 /* button_background_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_background_default.png; path = Resources/button_background_default.png; sourceTree = ""; }; D35406F615A47E9E007E7E81 /* button_background_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = button_background_over.png; path = Resources/button_background_over.png; sourceTree = ""; }; D35497FB15875372000081D8 /* ContactsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContactsViewController.h; sourceTree = ""; }; - D35497FC15875372000081D8 /* ContactsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ContactsViewController.m; sourceTree = ""; }; + D35497FC15875372000081D8 /* ContactsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = ContactsViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; D35497FD15875372000081D8 /* ContactsViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ContactsViewController.xib; sourceTree = ""; }; D354980215875534000081D8 /* contacts_all_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = contacts_all_selected.png; path = Resources/contacts_all_selected.png; sourceTree = ""; }; D354980315875534000081D8 /* contacts_all_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = contacts_all_default.png; path = Resources/contacts_all_default.png; sourceTree = ""; }; @@ -1114,7 +1128,7 @@ D354980E15875608000081D8 /* contacts_add_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = contacts_add_default.png; path = Resources/contacts_add_default.png; sourceTree = ""; }; D354980F15875608000081D8 /* contacts_add_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = contacts_add_over.png; path = Resources/contacts_add_over.png; sourceTree = ""; }; D3549814158761CF000081D8 /* ContactsTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContactsTableViewController.h; sourceTree = ""; }; - D3549815158761D0000081D8 /* ContactsTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ContactsTableViewController.m; sourceTree = ""; }; + D3549815158761D0000081D8 /* ContactsTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = ContactsTableViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; D354981815876FE7000081D8 /* list_details_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = list_details_default.png; path = Resources/list_details_default.png; sourceTree = ""; }; D354981915876FE7000081D8 /* list_details_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = list_details_over.png; path = Resources/list_details_over.png; sourceTree = ""; }; D354981E1587716B000081D8 /* UIStateBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIStateBar.h; sourceTree = ""; }; @@ -1153,6 +1167,12 @@ D36FB2D41589EF7C0036F6F2 /* UIPauseButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIPauseButton.m; sourceTree = ""; }; D37295DA158B3C9600D2C0C7 /* video_off_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = video_off_disabled.png; path = Resources/video_off_disabled.png; sourceTree = ""; }; D377BBF915A19DA6002B696B /* video_on_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = video_on_disabled.png; path = Resources/video_on_disabled.png; sourceTree = ""; }; + D378906215AC373B00BD776C /* ContactDetailsLabelViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContactDetailsLabelViewController.h; sourceTree = ""; }; + D378906315AC373B00BD776C /* ContactDetailsLabelViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ContactDetailsLabelViewController.m; sourceTree = ""; }; + D378906415AC373B00BD776C /* ContactDetailsLabelViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ContactDetailsLabelViewController.xib; sourceTree = ""; }; + D378906915AC37C800BD776C /* contact_bar_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = contact_bar_background.png; path = Resources/contact_bar_background.png; sourceTree = ""; }; + D378907415AC448A00BD776C /* UIView+ModalStack.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+ModalStack.m"; sourceTree = ""; }; + D378907715AC44A300BD776C /* UIView+ModalStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+ModalStack.h"; sourceTree = ""; }; D37B96B515A1A6F20005CCD2 /* call_state_delete_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = call_state_delete_default.png; path = Resources/call_state_delete_default.png; sourceTree = ""; }; D37B96B615A1A6F20005CCD2 /* call_state_delete_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = call_state_delete_over.png; path = Resources/call_state_delete_over.png; sourceTree = ""; }; D37C638C15AAD251009D0BAC /* contact_number_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = contact_number_over.png; path = Resources/contact_number_over.png; sourceTree = ""; }; @@ -1165,18 +1185,18 @@ D37DC6BF1594AE1800B2A5EB /* LinphoneCoreSettingsStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LinphoneCoreSettingsStore.h; sourceTree = ""; }; D37DC6C01594AE1800B2A5EB /* LinphoneCoreSettingsStore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LinphoneCoreSettingsStore.m; sourceTree = ""; }; D37DC6C51594AE6F00B2A5EB /* IASKAppSettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKAppSettingsViewController.h; sourceTree = ""; }; - D37DC6C61594AE6F00B2A5EB /* IASKAppSettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKAppSettingsViewController.m; sourceTree = ""; }; + D37DC6C61594AE6F00B2A5EB /* IASKAppSettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = IASKAppSettingsViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; D37DC6C71594AE6F00B2A5EB /* IASKAppSettingsWebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKAppSettingsWebViewController.h; sourceTree = ""; }; - D37DC6C81594AE6F00B2A5EB /* IASKAppSettingsWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKAppSettingsWebViewController.m; sourceTree = ""; }; + D37DC6C81594AE6F00B2A5EB /* IASKAppSettingsWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = IASKAppSettingsWebViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; D37DC6C91594AE6F00B2A5EB /* IASKSpecifierValuesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSpecifierValuesViewController.h; sourceTree = ""; }; D37DC6CA1594AE6F00B2A5EB /* IASKSpecifierValuesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSpecifierValuesViewController.m; sourceTree = ""; }; D37DC6CB1594AE6F00B2A5EB /* IASKViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKViewController.h; sourceTree = ""; }; D37DC6CD1594AE6F00B2A5EB /* IASKSettingsReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsReader.h; sourceTree = ""; }; - D37DC6CE1594AE6F00B2A5EB /* IASKSettingsReader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsReader.m; sourceTree = ""; }; + D37DC6CE1594AE6F00B2A5EB /* IASKSettingsReader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = IASKSettingsReader.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; D37DC6CF1594AE6F00B2A5EB /* IASKSettingsStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsStore.h; sourceTree = ""; }; D37DC6D01594AE6F00B2A5EB /* IASKSettingsStore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsStore.m; sourceTree = ""; }; D37DC6D11594AE6F00B2A5EB /* IASKSettingsStoreFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsStoreFile.h; sourceTree = ""; }; - D37DC6D21594AE6F00B2A5EB /* IASKSettingsStoreFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsStoreFile.m; sourceTree = ""; }; + D37DC6D21594AE6F00B2A5EB /* IASKSettingsStoreFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = IASKSettingsStoreFile.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; D37DC6D31594AE6F00B2A5EB /* IASKSettingsStoreUserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsStoreUserDefaults.h; sourceTree = ""; }; D37DC6D41594AE6F00B2A5EB /* IASKSettingsStoreUserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsStoreUserDefaults.m; sourceTree = ""; }; D37DC6D51594AE6F00B2A5EB /* IASKSpecifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSpecifier.h; sourceTree = ""; }; @@ -1188,7 +1208,7 @@ D37DC6DC1594AE6F00B2A5EB /* IASKPSTitleValueSpecifierViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKPSTitleValueSpecifierViewCell.h; sourceTree = ""; }; D37DC6DD1594AE6F00B2A5EB /* IASKPSTitleValueSpecifierViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKPSTitleValueSpecifierViewCell.m; sourceTree = ""; }; D37DC6DE1594AE6F00B2A5EB /* IASKPSToggleSwitchSpecifierViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKPSToggleSwitchSpecifierViewCell.h; sourceTree = ""; }; - D37DC6DF1594AE6F00B2A5EB /* IASKPSToggleSwitchSpecifierViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKPSToggleSwitchSpecifierViewCell.m; sourceTree = ""; }; + D37DC6DF1594AE6F00B2A5EB /* IASKPSToggleSwitchSpecifierViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = IASKPSToggleSwitchSpecifierViewCell.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; D37DC6E01594AE6F00B2A5EB /* IASKSlider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSlider.h; sourceTree = ""; }; D37DC6E11594AE6F00B2A5EB /* IASKSlider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSlider.m; sourceTree = ""; }; D37DC6E21594AE6F00B2A5EB /* IASKSwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSwitch.h; sourceTree = ""; }; @@ -1241,6 +1261,10 @@ D3B9A3DE15A58C450096EA4E /* chat_send_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = chat_send_over.png; path = Resources/chat_send_over.png; sourceTree = ""; }; D3C2814A15A2D38D0098AA42 /* dialer_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = dialer_selected.png; path = Resources/dialer_selected.png; sourceTree = ""; }; D3C2815115A2D64A0098AA42 /* numpad_star_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = numpad_star_over.png; path = Resources/numpad_star_over.png; sourceTree = ""; }; + D3C6526515AC1A8F0092A874 /* UIEditableTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIEditableTableViewCell.h; sourceTree = ""; }; + D3C6526615AC1A8F0092A874 /* UIEditableTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIEditableTableViewCell.m; sourceTree = ""; }; + D3C6526915AC228A0092A874 /* contact_ok_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = contact_ok_default.png; path = Resources/contact_ok_default.png; sourceTree = ""; }; + D3C6526A15AC228A0092A874 /* contact_ok_over.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = contact_ok_over.png; path = Resources/contact_ok_over.png; sourceTree = ""; }; D3C714B2159DB84400705B8E /* toy-mono.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = "toy-mono.wav"; path = "Resources/toy-mono.wav"; sourceTree = ""; }; D3D14E7415A70EE20074A527 /* UIChatRoomHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIChatRoomHeader.h; sourceTree = ""; }; D3D14E7515A70EE20074A527 /* UIChatRoomHeader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIChatRoomHeader.m; sourceTree = ""; }; @@ -1288,12 +1312,12 @@ D3ED3E9615872EF1006C0DE4 /* history_missed_selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = history_missed_selected.png; path = Resources/history_missed_selected.png; sourceTree = ""; }; D3ED3E9715872EF1006C0DE4 /* history_missed_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = history_missed_default.png; path = Resources/history_missed_default.png; sourceTree = ""; }; D3ED3EA41587334B006C0DE4 /* HistoryTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HistoryTableViewController.h; sourceTree = ""; }; - D3ED3EA51587334C006C0DE4 /* HistoryTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HistoryTableViewController.m; sourceTree = ""; }; + D3ED3EA51587334C006C0DE4 /* HistoryTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = HistoryTableViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; D3ED3EB2158738FA006C0DE4 /* HistoryViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = HistoryViewController.xib; sourceTree = ""; }; D3ED3EB515873928006C0DE4 /* HistoryViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HistoryViewController.h; sourceTree = ""; }; - D3ED3EB615873929006C0DE4 /* HistoryViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HistoryViewController.m; sourceTree = ""; }; + D3ED3EB615873929006C0DE4 /* HistoryViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = HistoryViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; D3F26BEA159869A6005F9CAB /* AbstractCall.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AbstractCall.h; path = Utils/AbstractCall.h; sourceTree = ""; }; - D3F26BEB159869A6005F9CAB /* AbstractCall.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AbstractCall.m; path = Utils/AbstractCall.m; sourceTree = ""; }; + D3F26BEB159869A6005F9CAB /* AbstractCall.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = AbstractCall.m; path = Utils/AbstractCall.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; D3F26BEE15986B71005F9CAB /* IncomingCallViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IncomingCallViewController.h; sourceTree = ""; }; D3F26BEF15986B71005F9CAB /* IncomingCallViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IncomingCallViewController.m; sourceTree = ""; }; D3F26BF015986B72005F9CAB /* IncomingCallViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IncomingCallViewController.xib; sourceTree = ""; }; @@ -1479,6 +1503,9 @@ 22E0A820111C44E100B04932 /* ConsoleViewController.h */, 22E0A81F111C44E100B04932 /* ConsoleViewController.m */, 22E0A81E111C44E100B04932 /* ConsoleViewController.xib */, + D378906215AC373B00BD776C /* ContactDetailsLabelViewController.h */, + D378906315AC373B00BD776C /* ContactDetailsLabelViewController.m */, + D378906415AC373B00BD776C /* ContactDetailsLabelViewController.xib */, D37C639915AADEF4009D0BAC /* ContactDetailsTableViewController.h */, D37C639A15AADEF5009D0BAC /* ContactDetailsTableViewController.m */, D3128FDE15AABC7E00A2147A /* ContactDetailsViewController.h */, @@ -1784,6 +1811,8 @@ D37C639415AADDAF009D0BAC /* UIContactDetailsHeader.xib */, 2248E90C12F7E4CF00220D9C /* UIDigitButton.h */, 2248E90D12F7E4CF00220D9C /* UIDigitButton.m */, + D3C6526515AC1A8F0092A874 /* UIEditableTableViewCell.h */, + D3C6526615AC1A8F0092A874 /* UIEditableTableViewCell.m */, 22BB1A67132FF16A005CD7AA /* UIEraseButton.h */, 22BB1A68132FF16A005CD7AA /* UIEraseButton.m */, 2214EB8712F84EBB002A5394 /* UIHangUpButton.h */, @@ -1815,6 +1844,8 @@ D3196D3D15A32BD8007FEEBA /* UITransferButton.m */, 340751E5150F38FC00B89C47 /* UIVideoButton.h */, 340751E6150F38FD00B89C47 /* UIVideoButton.m */, + D378907715AC44A300BD776C /* UIView+ModalStack.h */, + D378907415AC448A00BD776C /* UIView+ModalStack.m */, ); path = LinphoneUI; sourceTree = ""; @@ -2042,10 +2073,13 @@ D31AAF62159B5B6E002C6B02 /* conference_over.png */, D3128FE715AABE4E00A2147A /* contact_back_default.png */, D3128FE815AABE4E00A2147A /* contact_back_over.png */, + D378906915AC37C800BD776C /* contact_bar_background.png */, D3128FE915AABE4E00A2147A /* contact_edit_default.png */, D3128FEA15AABE4E00A2147A /* contact_edit_over.png */, D37C638D15AAD251009D0BAC /* contact_number.png */, D37C638C15AAD251009D0BAC /* contact_number_over.png */, + D3C6526915AC228A0092A874 /* contact_ok_default.png */, + D3C6526A15AC228A0092A874 /* contact_ok_over.png */, D354980E15875608000081D8 /* contacts_add_default.png */, D354980F15875608000081D8 /* contacts_add_over.png */, D354980315875534000081D8 /* contacts_all_default.png */, @@ -2643,6 +2677,10 @@ D37C638E15AAD251009D0BAC /* contact_number_over.png in Resources */, D37C639015AAD251009D0BAC /* contact_number.png in Resources */, D37C639715AADDAF009D0BAC /* UIContactDetailsHeader.xib in Resources */, + D3C6526B15AC228A0092A874 /* contact_ok_default.png in Resources */, + D3C6526D15AC228A0092A874 /* contact_ok_over.png in Resources */, + D378906715AC373B00BD776C /* ContactDetailsLabelViewController.xib in Resources */, + D378906A15AC37C800BD776C /* contact_bar_background.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2869,6 +2907,10 @@ D37C638F15AAD251009D0BAC /* contact_number_over.png in Resources */, D37C639115AAD251009D0BAC /* contact_number.png in Resources */, D37C639815AADDAF009D0BAC /* UIContactDetailsHeader.xib in Resources */, + D3C6526C15AC228A0092A874 /* contact_ok_default.png in Resources */, + D3C6526E15AC228A0092A874 /* contact_ok_over.png in Resources */, + D378906815AC373B00BD776C /* ContactDetailsLabelViewController.xib in Resources */, + D378906B15AC37C800BD776C /* contact_bar_background.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2954,6 +2996,9 @@ D3128FE115AABC7E00A2147A /* ContactDetailsViewController.m in Sources */, D37C639515AADDAF009D0BAC /* UIContactDetailsHeader.m in Sources */, D37C639B15AADEF6009D0BAC /* ContactDetailsTableViewController.m in Sources */, + D3C6526715AC1A8F0092A874 /* UIEditableTableViewCell.m in Sources */, + D378906515AC373B00BD776C /* ContactDetailsLabelViewController.m in Sources */, + D378907515AC448A00BD776C /* UIView+ModalStack.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3036,6 +3081,9 @@ D3128FE215AABC7E00A2147A /* ContactDetailsViewController.m in Sources */, D37C639615AADDAF009D0BAC /* UIContactDetailsHeader.m in Sources */, D37C639C15AADEF6009D0BAC /* ContactDetailsTableViewController.m in Sources */, + D3C6526815AC1A8F0092A874 /* UIEditableTableViewCell.m in Sources */, + D378906615AC373B00BD776C /* ContactDetailsLabelViewController.m in Sources */, + D378907615AC448A00BD776C /* UIView+ModalStack.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; };