From 11a2fba54005fc05959f859be4da97113372d445 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Fri, 27 Jul 2012 15:09:12 +0200 Subject: [PATCH] Cached avatar in contacts list --- Classes/ContactsTableViewController.h | 1 + Classes/ContactsTableViewController.m | 25 ++++++++++++++++++++++--- Classes/LinphoneUI/UIContactCell.m | 4 ++-- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/Classes/ContactsTableViewController.h b/Classes/ContactsTableViewController.h index 529a97d07..fa63b5fbd 100644 --- a/Classes/ContactsTableViewController.h +++ b/Classes/ContactsTableViewController.h @@ -24,6 +24,7 @@ @interface ContactsTableViewController : UITableViewController { OrderedDictionary* addressBookMap; + NSMutableDictionary* avatarMap; ABAddressBookRef addressBook; } diff --git a/Classes/ContactsTableViewController.m b/Classes/ContactsTableViewController.m index d0c4d935c..506e0003d 100644 --- a/Classes/ContactsTableViewController.m +++ b/Classes/ContactsTableViewController.m @@ -31,6 +31,7 @@ - (void)initContactsTableViewController { addressBookMap = [[OrderedDictionary alloc] init]; + avatarMap = [[NSMutableDictionary alloc] init]; addressBook = ABAddressBookCreate(); ABAddressBookRegisterExternalChangeCallback(addressBook, sync_address_book, self); @@ -56,6 +57,9 @@ ABAddressBookUnregisterExternalChangeCallback(addressBook, sync_address_book, self); CFRelease(addressBook); [addressBookMap removeAllObjects]; + [addressBookMap release]; + [avatarMap removeAllObjects]; + [avatarMap release]; [super dealloc]; } @@ -68,6 +72,7 @@ // Reset Address book [addressBookMap removeAllObjects]; + [avatarMap removeAllObjects]; NSArray *lContacts = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook); for (id lPerson in lContacts) { @@ -78,7 +83,7 @@ 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) { + if(CFStringCompare((CFStringRef)@"SIP", CFDictionaryGetValue(lDict, @"service"), kCFCompareCaseInsensitive) == 0) { add = true; } } else { @@ -126,7 +131,7 @@ } } CFRelease(lContacts); - } + } [self.tableView reloadData]; } @@ -136,7 +141,6 @@ static void sync_address_book (ABAddressBookRef addressBook, CFDictionaryRef inf [controller loadData]; } - #pragma mark - ViewController Functions - (void)viewWillDisappear:(BOOL)animated { @@ -169,6 +173,21 @@ static void sync_address_book (ABAddressBookRef addressBook, CFDictionaryRef inf NSString *key = [[subDic allKeys] objectAtIndex:[indexPath row]]; ABRecordRef contact = [subDic objectForKey:key]; + + // Cached avatar + UIImage *image = nil; + id data = [avatarMap objectForKey:[NSNumber numberWithInt: ABRecordGetRecordID(contact)]]; + if(data == nil) { + image = [FastAddressBook getContactImage:contact thumbnail:true]; + [avatarMap setObject:image forKey:[NSNumber numberWithInt: ABRecordGetRecordID(contact)]]; + } else if(data != [NSNull null]) { + image = data; + } + if(image == nil) { + image = [UIImage imageNamed:@"avatar_unknown_small.png"]; + } + [[cell avatarImage] setImage:image]; + [cell setContact: contact]; return cell; } diff --git a/Classes/LinphoneUI/UIContactCell.m b/Classes/LinphoneUI/UIContactCell.m index aa203fc6e..2f1374df1 100644 --- a/Classes/LinphoneUI/UIContactCell.m +++ b/Classes/LinphoneUI/UIContactCell.m @@ -101,11 +101,11 @@ CFRelease(lFirstName); // Avatar - UIImage *image = [FastAddressBook getContactImage:contact thumbnail:true]; + /*UIImage *image = [FastAddressBook getContactImage:contact thumbnail:true]; if(image == nil) { image = [UIImage imageNamed:@"avatar_unknown_small.png"]; } - [avatarImage setImage:image]; + [avatarImage setImage:image];*/ // // Adapt size