mirror of
https://github.com/vector-im/element-ios.git
synced 2024-09-30 00:02:47 +00:00
Code format
This commit is contained in:
parent
d11053421d
commit
003400807c
1 changed files with 310 additions and 193 deletions
|
@ -32,7 +32,8 @@ NSString *const kContactsDidInternationalizeNotification = @"kContactsDidInterna
|
|||
//#define CONTACTS_3PIDS_SYNC 1
|
||||
// else checks the matrix IDs for each displayed contact
|
||||
|
||||
@interface ContactManager() {
|
||||
@interface ContactManager()
|
||||
{
|
||||
NSDate *lastSyncDate;
|
||||
NSMutableDictionary* deviceContactByContactID;
|
||||
|
||||
|
@ -52,8 +53,10 @@ NSString *const kContactsDidInternationalizeNotification = @"kContactsDidInterna
|
|||
#pragma mark Singleton Methods
|
||||
static ContactManager* sharedContactManager = nil;
|
||||
|
||||
+ (id)sharedManager {
|
||||
@synchronized(self) {
|
||||
+ (id)sharedManager
|
||||
{
|
||||
@synchronized(self)
|
||||
{
|
||||
if(sharedContactManager == nil)
|
||||
sharedContactManager = [[self alloc] init];
|
||||
}
|
||||
|
@ -62,8 +65,10 @@ static ContactManager* sharedContactManager = nil;
|
|||
|
||||
#pragma mark -
|
||||
|
||||
-(ContactManager *)init {
|
||||
if (self = [super init]) {
|
||||
-(ContactManager *)init
|
||||
{
|
||||
if (self = [super init])
|
||||
{
|
||||
NSString *label = [NSString stringWithFormat:@"ConsoleMatrix.%@.Contacts", [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"]];
|
||||
|
||||
processingQueue = dispatch_queue_create([label UTF8String], NULL);
|
||||
|
@ -79,9 +84,11 @@ static ContactManager* sharedContactManager = nil;
|
|||
return self;
|
||||
}
|
||||
|
||||
-(void)dealloc {
|
||||
-(void)dealloc
|
||||
{
|
||||
|
||||
if (matrixSessionStateObserver) {
|
||||
if (matrixSessionStateObserver)
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:matrixSessionStateObserver];
|
||||
matrixSessionStateObserver = nil;
|
||||
}
|
||||
|
@ -91,25 +98,31 @@ static ContactManager* sharedContactManager = nil;
|
|||
|
||||
#pragma mark -
|
||||
|
||||
- (MXRestClient*)mxRestClient {
|
||||
- (MXRestClient*)mxRestClient
|
||||
{
|
||||
// Ignore `mxRestClient` property if a matrix session has been defined
|
||||
if (self.mxSession) {
|
||||
if (self.mxSession)
|
||||
{
|
||||
return self.mxSession.matrixRestClient;
|
||||
}
|
||||
|
||||
return _mxRestClient;
|
||||
}
|
||||
|
||||
- (void)setMxSession:(MXSession *)session {
|
||||
- (void)setMxSession:(MXSession *)session
|
||||
{
|
||||
// Remove potential session observer
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:matrixSessionStateObserver];
|
||||
|
||||
if (session) {
|
||||
if (session)
|
||||
{
|
||||
// Register session state observer
|
||||
matrixSessionStateObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kMXSessionStateDidChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) {
|
||||
matrixSessionStateObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kMXSessionStateDidChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif)
|
||||
{
|
||||
|
||||
// Check whether the concerned session is the associated one
|
||||
if (notif.object == _mxSession) {
|
||||
if (notif.object == _mxSession)
|
||||
{
|
||||
[self didMatrixSessionStateChange];
|
||||
}
|
||||
}];
|
||||
|
@ -121,9 +134,11 @@ static ContactManager* sharedContactManager = nil;
|
|||
[self didMatrixSessionStateChange];
|
||||
}
|
||||
|
||||
- (void)didMatrixSessionStateChange {
|
||||
- (void)didMatrixSessionStateChange
|
||||
{
|
||||
|
||||
if (_mxSession && _mxSession.state == MXSessionStateRunning) {
|
||||
if (_mxSession && _mxSession.state == MXSessionStateRunning)
|
||||
{
|
||||
[self manage3PIDS];
|
||||
}
|
||||
}
|
||||
|
@ -131,7 +146,8 @@ static ContactManager* sharedContactManager = nil;
|
|||
#pragma mark -
|
||||
|
||||
// delete contacts info
|
||||
- (void)reset {
|
||||
- (void)reset
|
||||
{
|
||||
|
||||
contacts = nil;
|
||||
|
||||
|
@ -139,7 +155,8 @@ static ContactManager* sharedContactManager = nil;
|
|||
deviceContactByContactID = nil;
|
||||
matrixContactByMatrixUserID = nil;
|
||||
|
||||
if (matrixSessionStateObserver) {
|
||||
if (matrixSessionStateObserver)
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:matrixSessionStateObserver];
|
||||
matrixSessionStateObserver = nil;
|
||||
}
|
||||
|
@ -148,18 +165,20 @@ static ContactManager* sharedContactManager = nil;
|
|||
[self saveMatrixIDsDict];
|
||||
[self saveDeviceContacts];
|
||||
[self saveContactBookInfo];
|
||||
|
||||
|
||||
// warn of the contacts list update
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:kContactManagerContactsListRefreshNotification object:nil userInfo:nil];
|
||||
}
|
||||
|
||||
// refresh the international phonenumber of the contacts
|
||||
- (void)internationalizePhoneNumbers:(NSString*)countryCode {
|
||||
- (void)internationalizePhoneNumbers:(NSString*)countryCode
|
||||
{
|
||||
|
||||
dispatch_async(processingQueue, ^{
|
||||
NSArray* contactsSnapshot = [deviceContactByContactID allValues];
|
||||
|
||||
for(MXCContact* contact in contactsSnapshot) {
|
||||
for(MXCContact* contact in contactsSnapshot)
|
||||
{
|
||||
[contact internationalizePhonenumbers:countryCode];
|
||||
}
|
||||
|
||||
|
@ -169,10 +188,12 @@ static ContactManager* sharedContactManager = nil;
|
|||
});
|
||||
}
|
||||
|
||||
- (void)fullRefresh {
|
||||
- (void)fullRefresh
|
||||
{
|
||||
|
||||
// check if the user allowed to sync local contacts
|
||||
if (![[MXKAppSettings standardAppSettings] syncLocalContacts]) {
|
||||
if (![[MXKAppSettings standardAppSettings] syncLocalContacts])
|
||||
{
|
||||
contacts = nil;
|
||||
// if the user did not allow to sync local contacts
|
||||
// ignore this sync
|
||||
|
@ -186,12 +207,15 @@ static ContactManager* sharedContactManager = nil;
|
|||
ABAuthorizationStatus cbStatus = ABAddressBookGetAuthorizationStatus();
|
||||
|
||||
// did not yet request the access
|
||||
if (cbStatus == kABAuthorizationStatusNotDetermined) {
|
||||
if (cbStatus == kABAuthorizationStatusNotDetermined)
|
||||
{
|
||||
// request address book access
|
||||
ABAddressBookRef ab = ABAddressBookCreateWithOptions(nil, nil);
|
||||
|
||||
if (ab) {
|
||||
ABAddressBookRequestAccessWithCompletion(ab, ^(bool granted, CFErrorRef error) {
|
||||
if (ab)
|
||||
{
|
||||
ABAddressBookRequestAccessWithCompletion(ab, ^(bool granted, CFErrorRef error)
|
||||
{
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[self fullRefresh];
|
||||
});
|
||||
|
@ -206,25 +230,28 @@ static ContactManager* sharedContactManager = nil;
|
|||
|
||||
pending3PIDs = [[NSMutableArray alloc] init];
|
||||
checked3PIDs = [[NSMutableArray alloc] init];
|
||||
|
||||
|
||||
// cold start
|
||||
// launch the dict from the file system
|
||||
// It is cached to improve UX.
|
||||
if (!matrixIDBy3PID) {
|
||||
if (!matrixIDBy3PID)
|
||||
{
|
||||
[self loadMatrixIDsDict];
|
||||
}
|
||||
|
||||
|
||||
dispatch_async(processingQueue, ^{
|
||||
|
||||
|
||||
// in case of cold start
|
||||
// get the info from the file system
|
||||
if (!lastSyncDate) {
|
||||
if (!lastSyncDate)
|
||||
{
|
||||
// load cached contacts
|
||||
[self loadDeviceContacts];
|
||||
[self loadContactBookInfo];
|
||||
|
||||
// no local contact -> assume that the last sync date is useless
|
||||
if (deviceContactByContactID.count == 0) {
|
||||
if (deviceContactByContactID.count == 0)
|
||||
{
|
||||
lastSyncDate = nil;
|
||||
}
|
||||
}
|
||||
|
@ -234,7 +261,8 @@ static ContactManager* sharedContactManager = nil;
|
|||
NSMutableArray* deletedContactIDs = [[deviceContactByContactID allKeys] mutableCopy];
|
||||
|
||||
// can list tocal contacts
|
||||
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {
|
||||
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized)
|
||||
{
|
||||
|
||||
NSString* countryCode = [[MXKAppSettings standardAppSettings] phonebookCountryCode];
|
||||
|
||||
|
@ -244,10 +272,12 @@ static ContactManager* sharedContactManager = nil;
|
|||
CFIndex index;
|
||||
CFMutableArrayRef people = (CFMutableArrayRef)ABAddressBookCopyArrayOfAllPeople(ab);
|
||||
|
||||
if (nil != people) {
|
||||
if (nil != people)
|
||||
{
|
||||
CFIndex peopleCount = CFArrayGetCount(people);
|
||||
|
||||
for (index = 0; index < peopleCount; index++) {
|
||||
for (index = 0; index < peopleCount; index++)
|
||||
{
|
||||
|
||||
contactRecord = (ABRecordRef)CFArrayGetValueAtIndex(people, index);
|
||||
|
||||
|
@ -256,10 +286,12 @@ static ContactManager* sharedContactManager = nil;
|
|||
// the contact still exists
|
||||
[deletedContactIDs removeObject:contactID];
|
||||
|
||||
if (lastSyncDate) {
|
||||
if (lastSyncDate)
|
||||
{
|
||||
// ignore unchanged contacts since the previous sync
|
||||
CFDateRef lastModifDate = ABRecordCopyValue(contactRecord, kABPersonModificationDateProperty);
|
||||
if (kCFCompareGreaterThan != CFDateCompare (lastModifDate, (__bridge CFDateRef)lastSyncDate, nil))
|
||||
|
||||
{
|
||||
CFRelease(lastModifDate);
|
||||
continue;
|
||||
|
@ -271,7 +303,8 @@ static ContactManager* sharedContactManager = nil;
|
|||
|
||||
MXCContact* contact = [[MXCContact alloc] initWithABRecord:contactRecord];
|
||||
|
||||
if (countryCode) {
|
||||
if (countryCode)
|
||||
{
|
||||
[contact internationalizePhonenumbers:countryCode];
|
||||
}
|
||||
|
||||
|
@ -282,30 +315,36 @@ static ContactManager* sharedContactManager = nil;
|
|||
CFRelease(people);
|
||||
}
|
||||
|
||||
if (ab) {
|
||||
if (ab)
|
||||
{
|
||||
CFRelease(ab);
|
||||
}
|
||||
}
|
||||
|
||||
// some contacts have been deleted
|
||||
for (NSString* contactID in deletedContactIDs) {
|
||||
for (NSString* contactID in deletedContactIDs)
|
||||
{
|
||||
contactBookUpdate = YES;
|
||||
[deviceContactByContactID removeObjectForKey:contactID];
|
||||
}
|
||||
|
||||
|
||||
// something has been modified in the device contact book
|
||||
if (contactBookUpdate) {
|
||||
if (contactBookUpdate)
|
||||
{
|
||||
[self saveDeviceContacts];
|
||||
}
|
||||
|
||||
lastSyncDate = [NSDate date];
|
||||
[self saveContactBookInfo];
|
||||
|
||||
|
||||
NSMutableArray* deviceContacts = [[deviceContactByContactID allValues] mutableCopy];
|
||||
|
||||
if (_mxSession && _mxSession.state == MXSessionStateRunning) {
|
||||
if (_mxSession && _mxSession.state == MXSessionStateRunning)
|
||||
{
|
||||
[self manage3PIDS];
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
// display what you could have read
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
contacts = deviceContacts;
|
||||
|
@ -319,7 +358,8 @@ static ContactManager* sharedContactManager = nil;
|
|||
|
||||
// the local contacts are listed
|
||||
// update their 3PIDs and their update
|
||||
- (void) manage3PIDS {
|
||||
- (void) manage3PIDS
|
||||
{
|
||||
dispatch_async(processingQueue, ^{
|
||||
NSMutableArray* tmpContacts = nil;
|
||||
|
||||
|
@ -336,7 +376,7 @@ static ContactManager* sharedContactManager = nil;
|
|||
[self refreshMatrixIDs];
|
||||
#else
|
||||
// nop
|
||||
// wait that refreshContactMatrixIDs is called
|
||||
// wait that refreshContactMatrixIDs is called
|
||||
|
||||
#endif
|
||||
// at least, display the known contacts
|
||||
|
@ -345,24 +385,31 @@ static ContactManager* sharedContactManager = nil;
|
|||
});
|
||||
}
|
||||
|
||||
- (void) updateContactMatrixIDs:(MXCContact*) contact {
|
||||
- (void) updateContactMatrixIDs:(MXCContact*) contact
|
||||
{
|
||||
// the phonenumbers wil be managed later
|
||||
/*for(ConsolePhoneNumber* pn in contact.phoneNumbers) {
|
||||
if (pn.textNumber.length > 0) {
|
||||
/*for(ConsolePhoneNumber* pn in contact.phoneNumbers)
|
||||
{
|
||||
if (pn.textNumber.length > 0)
|
||||
{
|
||||
|
||||
// not yet added
|
||||
if ([pids indexOfObject:pn.textNumber] == NSNotFound) {
|
||||
if ([pids indexOfObject:pn.textNumber] == NSNotFound)
|
||||
{
|
||||
[pids addObject:pn.textNumber];
|
||||
[medias addObject:@"msisdn"];
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
for(MXCEmail* email in contact.emailAddresses) {
|
||||
if (email.emailAddress.length > 0) {
|
||||
for(MXCEmail* email in contact.emailAddresses)
|
||||
{
|
||||
if (email.emailAddress.length > 0)
|
||||
{
|
||||
id matrixID = [matrixIDBy3PID valueForKey:email.emailAddress];
|
||||
|
||||
if ([matrixID isKindOfClass:[NSString class]]) {
|
||||
if ([matrixID isKindOfClass:[NSString class]])
|
||||
{
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[email setMatrixID:matrixID];
|
||||
});
|
||||
|
@ -371,12 +418,14 @@ static ContactManager* sharedContactManager = nil;
|
|||
}
|
||||
}
|
||||
|
||||
- (void) updateMatrixIDDeviceContacts {
|
||||
- (void) updateMatrixIDDeviceContacts
|
||||
{
|
||||
|
||||
NSArray* deviceContacts = [deviceContactByContactID allValues];
|
||||
|
||||
// update the contacts info
|
||||
for(MXCContact* contact in deviceContacts) {
|
||||
for(MXCContact* contact in deviceContacts)
|
||||
{
|
||||
[self updateContactMatrixIDs:contact];
|
||||
}
|
||||
}
|
||||
|
@ -384,30 +433,38 @@ static ContactManager* sharedContactManager = nil;
|
|||
#ifdef CONTACTS_3PIDS_SYNC
|
||||
// refresh the 3PIDs -> Matrix ID list
|
||||
// update the contact is required
|
||||
- (void)refreshMatrixIDs {
|
||||
- (void)refreshMatrixIDs
|
||||
{
|
||||
|
||||
// build the request parameters
|
||||
NSMutableArray* pids = [[NSMutableArray alloc] init];
|
||||
NSMutableArray* medias = [[NSMutableArray alloc] init];
|
||||
|
||||
for(MXCContact* contact in deviceContactsList) {
|
||||
for(MXCContact* contact in deviceContactsList)
|
||||
{
|
||||
// the phonenumbers are not managed
|
||||
/*for(ConsolePhoneNumber* pn in contact.phoneNumbers) {
|
||||
if (pn.textNumber.length > 0) {
|
||||
/*for(ConsolePhoneNumber* pn in contact.phoneNumbers)
|
||||
{
|
||||
if (pn.textNumber.length > 0)
|
||||
{
|
||||
|
||||
// not yet added
|
||||
if ([pids indexOfObject:pn.textNumber] == NSNotFound) {
|
||||
if ([pids indexOfObject:pn.textNumber] == NSNotFound)
|
||||
{
|
||||
[pids addObject:pn.textNumber];
|
||||
[medias addObject:@"msisdn"];
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
for(MXCEmail* email in contact.emailAddresses) {
|
||||
if (email.emailAddress.length > 0) {
|
||||
for(MXCEmail* email in contact.emailAddresses)
|
||||
{
|
||||
if (email.emailAddress.length > 0)
|
||||
{
|
||||
|
||||
// not yet added
|
||||
if ([pids indexOfObject:email.emailAddress] == NSNotFound) {
|
||||
if ([pids indexOfObject:email.emailAddress] == NSNotFound)
|
||||
{
|
||||
[pids addObject:email.emailAddress];
|
||||
[medias addObject:@"email"];
|
||||
}
|
||||
|
@ -416,34 +473,39 @@ static ContactManager* sharedContactManager = nil;
|
|||
}
|
||||
|
||||
// get some pids
|
||||
if (pids.count > 0) {
|
||||
if (self.mxRestClient) {
|
||||
if (pids.count > 0)
|
||||
{
|
||||
if (self.mxRestClient)
|
||||
{
|
||||
[self.mxRestClient lookup3pids:pids
|
||||
forMedia:medias
|
||||
success:^(NSArray *userIds) {
|
||||
// sanity check
|
||||
if (userIds.count == pids.count) {
|
||||
|
||||
matrixIDBy3PID = [[NSMutableDictionary alloc] initWithObjects:userIds forKeys:pids];
|
||||
[self saveMatrixIDsDict];
|
||||
[self updateMatrixIDDeviceContactsList];
|
||||
|
||||
// add the MX users
|
||||
NSMutableArray* tmpContacts = [deviceContactsList mutableCopy];
|
||||
[self mergeMXUsers:tmpContacts];
|
||||
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
contacts = tmpContacts;
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:kContactManagerContactsListRefreshNotification object:nil userInfo:nil];
|
||||
});
|
||||
}
|
||||
}
|
||||
failure:^(NSError *error) {
|
||||
// try later
|
||||
dispatch_after(dispatch_walltime(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
|
||||
[self refreshMatrixIDs];
|
||||
});
|
||||
}
|
||||
success:^(NSArray *userIds)
|
||||
{
|
||||
// sanity check
|
||||
if (userIds.count == pids.count)
|
||||
{
|
||||
|
||||
matrixIDBy3PID = [[NSMutableDictionary alloc] initWithObjects:userIds forKeys:pids];
|
||||
[self saveMatrixIDsDict];
|
||||
[self updateMatrixIDDeviceContactsList];
|
||||
|
||||
// add the MX users
|
||||
NSMutableArray* tmpContacts = [deviceContactsList mutableCopy];
|
||||
[self mergeMXUsers:tmpContacts];
|
||||
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
contacts = tmpContacts;
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:kContactManagerContactsListRefreshNotification object:nil userInfo:nil];
|
||||
});
|
||||
}
|
||||
}
|
||||
failure:^(NSError *error)
|
||||
{
|
||||
// try later
|
||||
dispatch_after(dispatch_walltime(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
|
||||
[self refreshMatrixIDs];
|
||||
});
|
||||
}
|
||||
];
|
||||
}
|
||||
}
|
||||
|
@ -451,104 +513,129 @@ static ContactManager* sharedContactManager = nil;
|
|||
#endif
|
||||
|
||||
// refresh matrix IDs
|
||||
- (void)refreshContactMatrixIDs:(MXCContact*)contact {
|
||||
- (void)refreshContactMatrixIDs:(MXCContact*)contact
|
||||
{
|
||||
#ifndef CONTACTS_3PIDS_SYNC
|
||||
if (!contact.isMatrixContact) {
|
||||
if (!contact.isMatrixContact)
|
||||
{
|
||||
|
||||
// check pending requests
|
||||
NSMutableArray* pids = [[NSMutableArray alloc] init];
|
||||
NSMutableArray* medias = [[NSMutableArray alloc] init];
|
||||
|
||||
for(MXCEmail* email in contact.emailAddresses) {
|
||||
if (([pending3PIDs indexOfObject:email.emailAddress] == NSNotFound) && ([checked3PIDs indexOfObject:email.emailAddress] == NSNotFound)) {
|
||||
for(MXCEmail* email in contact.emailAddresses)
|
||||
{
|
||||
if (([pending3PIDs indexOfObject:email.emailAddress] == NSNotFound) && ([checked3PIDs indexOfObject:email.emailAddress] == NSNotFound))
|
||||
{
|
||||
[pids addObject:email.emailAddress];
|
||||
[medias addObject:@"email"];
|
||||
}
|
||||
}
|
||||
|
||||
if (pids.count > 0) {
|
||||
|
||||
if (pids.count > 0)
|
||||
{
|
||||
[pending3PIDs addObjectsFromArray:pids];
|
||||
|
||||
if (self.mxRestClient) {
|
||||
if (self.mxRestClient)
|
||||
{
|
||||
[self.mxRestClient lookup3pids:pids
|
||||
forMedia:medias
|
||||
success:^(NSArray *userIds) {
|
||||
// sanity check
|
||||
if (userIds.count == pids.count) {
|
||||
|
||||
// update statuses table
|
||||
[checked3PIDs addObjectsFromArray:pids];
|
||||
for(NSString* pid in pids) {
|
||||
[pending3PIDs removeObject:pid];
|
||||
}
|
||||
|
||||
BOOL isUpdated = NO;
|
||||
NSMutableArray* matrixContactsToRemove = [[NSMutableArray alloc] init];
|
||||
|
||||
// apply updates
|
||||
if (pids.count > 0) {
|
||||
for(int index = 0; index < pids.count; index++) {
|
||||
NSString* matrixID = [userIds objectAtIndex:index];
|
||||
NSString* pid = [pids objectAtIndex:index];
|
||||
|
||||
// the dict is created on demand
|
||||
if (!matrixIDBy3PID) {
|
||||
[self loadMatrixIDsDict];
|
||||
}
|
||||
|
||||
id currentMatrixID = [matrixIDBy3PID valueForKey:pid];
|
||||
|
||||
// do not keep useless info
|
||||
if ([matrixID isKindOfClass:[NSString class]]) {
|
||||
|
||||
// do not update if not required
|
||||
if (![currentMatrixID isKindOfClass:[NSString class]] || ![(NSString*)currentMatrixID isEqualToString:matrixID]) {
|
||||
[matrixIDBy3PID setValue:matrixID forKey:pid];
|
||||
isUpdated = YES;
|
||||
}
|
||||
|
||||
} else {
|
||||
if (currentMatrixID) {
|
||||
[matrixIDBy3PID removeObjectForKey:pid];
|
||||
isUpdated = YES;
|
||||
}
|
||||
}
|
||||
|
||||
// is there a matrix contact with the same
|
||||
if ([matrixContactByMatrixUserID objectForKey:matrixID]) {
|
||||
[matrixContactsToRemove addObject:[matrixContactByMatrixUserID objectForKey:matrixID]];
|
||||
}
|
||||
}
|
||||
|
||||
if (isUpdated) {
|
||||
[self saveMatrixIDsDict];
|
||||
}
|
||||
}
|
||||
|
||||
// some matrix contacts will be replaced by this contact
|
||||
if (matrixContactsToRemove.count > 0) {
|
||||
[self updateContactMatrixIDs:contact];
|
||||
|
||||
for(MXCContact* contactToRemove in matrixContactsToRemove) {
|
||||
[self.contacts removeObject:contactToRemove];
|
||||
}
|
||||
|
||||
// warn there is a global refresh
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:kContactManagerContactsListRefreshNotification object:nil userInfo:nil];
|
||||
} else {
|
||||
// update only this contact
|
||||
[self updateContactMatrixIDs:contact];
|
||||
}
|
||||
}
|
||||
}
|
||||
failure:^(NSError *error) {
|
||||
// try later
|
||||
dispatch_after(dispatch_walltime(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
|
||||
[self refreshContactMatrixIDs:contact];
|
||||
});
|
||||
}];
|
||||
success:^(NSArray *userIds)
|
||||
{
|
||||
// sanity check
|
||||
if (userIds.count == pids.count)
|
||||
{
|
||||
|
||||
// update statuses table
|
||||
[checked3PIDs addObjectsFromArray:pids];
|
||||
for(NSString* pid in pids)
|
||||
{
|
||||
[pending3PIDs removeObject:pid];
|
||||
}
|
||||
|
||||
BOOL isUpdated = NO;
|
||||
NSMutableArray* matrixContactsToRemove = [[NSMutableArray alloc] init];
|
||||
|
||||
// apply updates
|
||||
if (pids.count > 0)
|
||||
{
|
||||
for(int index = 0; index < pids.count; index++)
|
||||
{
|
||||
NSString* matrixID = [userIds objectAtIndex:index];
|
||||
NSString* pid = [pids objectAtIndex:index];
|
||||
|
||||
// the dict is created on demand
|
||||
if (!matrixIDBy3PID)
|
||||
{
|
||||
[self loadMatrixIDsDict];
|
||||
}
|
||||
|
||||
id currentMatrixID = [matrixIDBy3PID valueForKey:pid];
|
||||
|
||||
// do not keep useless info
|
||||
if ([matrixID isKindOfClass:[NSString class]])
|
||||
{
|
||||
|
||||
// do not update if not required
|
||||
if (![currentMatrixID isKindOfClass:[NSString class]] || ![(NSString*)currentMatrixID isEqualToString:matrixID])
|
||||
{
|
||||
[matrixIDBy3PID setValue:matrixID forKey:pid];
|
||||
isUpdated = YES;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
if (currentMatrixID)
|
||||
{
|
||||
[matrixIDBy3PID removeObjectForKey:pid];
|
||||
isUpdated = YES;
|
||||
}
|
||||
}
|
||||
|
||||
// is there a matrix contact with the same
|
||||
if ([matrixContactByMatrixUserID objectForKey:matrixID])
|
||||
{
|
||||
[matrixContactsToRemove addObject:[matrixContactByMatrixUserID objectForKey:matrixID]];
|
||||
}
|
||||
}
|
||||
|
||||
if (isUpdated)
|
||||
{
|
||||
[self saveMatrixIDsDict];
|
||||
}
|
||||
}
|
||||
|
||||
// some matrix contacts will be replaced by this contact
|
||||
if (matrixContactsToRemove.count > 0)
|
||||
{
|
||||
[self updateContactMatrixIDs:contact];
|
||||
|
||||
for(MXCContact* contactToRemove in matrixContactsToRemove)
|
||||
{
|
||||
[self.contacts removeObject:contactToRemove];
|
||||
}
|
||||
|
||||
// warn there is a global refresh
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:kContactManagerContactsListRefreshNotification object:nil userInfo:nil];
|
||||
}
|
||||
else
|
||||
{
|
||||
// update only this contact
|
||||
[self updateContactMatrixIDs:contact];
|
||||
}
|
||||
}
|
||||
}
|
||||
failure:^(NSError *error)
|
||||
{
|
||||
// try later
|
||||
dispatch_after(dispatch_walltime(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
|
||||
[self refreshContactMatrixIDs:contact];
|
||||
});
|
||||
}];
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
dispatch_after(dispatch_walltime(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
|
||||
[self refreshContactMatrixIDs:contact];
|
||||
});
|
||||
|
@ -560,15 +647,18 @@ static ContactManager* sharedContactManager = nil;
|
|||
|
||||
#pragma mark - KVO
|
||||
|
||||
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
|
||||
if ([@"syncLocalContacts" isEqualToString:keyPath]) {
|
||||
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
|
||||
{
|
||||
if ([@"syncLocalContacts" isEqualToString:keyPath])
|
||||
{
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[self fullRefresh];
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
- (SectionedContacts *)getSectionedContacts:(NSArray*)contactsList {
|
||||
- (SectionedContacts *)getSectionedContacts:(NSArray*)contactsList
|
||||
{
|
||||
UILocalizedIndexedCollation *collation = [UILocalizedIndexedCollation currentCollation];
|
||||
|
||||
int indexOffset = 0;
|
||||
|
@ -578,7 +668,8 @@ static ContactManager* sharedContactManager = nil;
|
|||
|
||||
sectionTitlesCount += indexOffset;
|
||||
|
||||
for (index = 0; index < sectionTitlesCount; index++) {
|
||||
for (index = 0; index < sectionTitlesCount; index++)
|
||||
{
|
||||
NSMutableArray *array = [[NSMutableArray alloc] init];
|
||||
[tmpSectionsArray addObject:array];
|
||||
}
|
||||
|
@ -586,6 +677,7 @@ static ContactManager* sharedContactManager = nil;
|
|||
int contactsCount = 0;
|
||||
|
||||
for (MXCContact *aContact in contactsList)
|
||||
|
||||
{
|
||||
NSInteger section = [collation sectionForObject:aContact collationStringSelector:@selector(displayName)] + indexOffset;
|
||||
|
||||
|
@ -596,11 +688,13 @@ static ContactManager* sharedContactManager = nil;
|
|||
NSMutableArray *tmpSectionedContactsTitle = [[NSMutableArray alloc] initWithCapacity:sectionTitlesCount];
|
||||
NSMutableArray *shortSectionsArray = [[NSMutableArray alloc] initWithCapacity:sectionTitlesCount];
|
||||
|
||||
for (index = indexOffset; index < sectionTitlesCount; index++) {
|
||||
for (index = indexOffset; index < sectionTitlesCount; index++)
|
||||
{
|
||||
|
||||
NSMutableArray *usersArrayForSection = [tmpSectionsArray objectAtIndex:index];
|
||||
|
||||
if ([usersArrayForSection count] != 0) {
|
||||
if ([usersArrayForSection count] != 0)
|
||||
{
|
||||
NSArray* sortedUsersArrayForSection = [collation sortedArrayFromArray:usersArrayForSection collationStringSelector:@selector(displayName)];
|
||||
[shortSectionsArray addObject:sortedUsersArrayForSection];
|
||||
[tmpSectionedContactsTitle addObject:[[[UILocalizedIndexedCollation currentCollation] sectionTitles] objectAtIndex:(index - indexOffset)]];
|
||||
|
@ -623,6 +717,7 @@ static NSString *contactsBookInfoFile = @"contacts";
|
|||
NSString *dataFilePath = [documentsDirectory stringByAppendingPathComponent:matrixIDsDictFile];
|
||||
|
||||
if (matrixIDBy3PID)
|
||||
|
||||
{
|
||||
NSMutableData *theData = [NSMutableData data];
|
||||
NSKeyedArchiver *encoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:theData];
|
||||
|
@ -633,6 +728,7 @@ static NSString *contactsBookInfoFile = @"contacts";
|
|||
[theData writeToFile:dataFilePath atomically:YES];
|
||||
}
|
||||
else
|
||||
|
||||
{
|
||||
NSFileManager *fileManager = [[NSFileManager alloc] init];
|
||||
[fileManager removeItemAtPath:dataFilePath error:nil];
|
||||
|
@ -648,35 +744,42 @@ static NSString *contactsBookInfoFile = @"contacts";
|
|||
NSFileManager *fileManager = [[NSFileManager alloc] init];
|
||||
|
||||
if ([fileManager fileExistsAtPath:dataFilePath])
|
||||
|
||||
{
|
||||
// the file content could be corrupted
|
||||
@try {
|
||||
@try
|
||||
{
|
||||
NSData* filecontent = [NSData dataWithContentsOfFile:dataFilePath options:(NSDataReadingMappedAlways | NSDataReadingUncached) error:nil];
|
||||
|
||||
NSKeyedUnarchiver *decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:filecontent];
|
||||
|
||||
id object = [decoder decodeObjectForKey:@"matrixIDsDict"];
|
||||
|
||||
if ([object isKindOfClass:[NSDictionary class]]) {
|
||||
if ([object isKindOfClass:[NSDictionary class]])
|
||||
{
|
||||
matrixIDBy3PID = [object mutableCopy];
|
||||
}
|
||||
|
||||
|
||||
[decoder finishDecoding];
|
||||
} @catch (NSException *exception) {
|
||||
} @catch (NSException *exception)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
if (!matrixIDBy3PID) {
|
||||
|
||||
if (!matrixIDBy3PID)
|
||||
{
|
||||
matrixIDBy3PID = [[NSMutableDictionary alloc] init];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) saveDeviceContacts {
|
||||
- (void) saveDeviceContacts
|
||||
{
|
||||
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
||||
NSString *documentsDirectory = [paths objectAtIndex:0];
|
||||
NSString *dataFilePath = [documentsDirectory stringByAppendingPathComponent:localContactsFile];
|
||||
|
||||
if (deviceContactByContactID && (deviceContactByContactID.count > 0))
|
||||
|
||||
{
|
||||
NSMutableData *theData = [NSMutableData data];
|
||||
NSKeyedArchiver *encoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:theData];
|
||||
|
@ -688,13 +791,15 @@ static NSString *contactsBookInfoFile = @"contacts";
|
|||
[theData writeToFile:dataFilePath atomically:YES];
|
||||
}
|
||||
else
|
||||
|
||||
{
|
||||
NSFileManager *fileManager = [[NSFileManager alloc] init];
|
||||
[fileManager removeItemAtPath:dataFilePath error:nil];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) loadDeviceContacts {
|
||||
- (void)loadDeviceContacts
|
||||
{
|
||||
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
||||
NSString *documentsDirectory = [paths objectAtIndex:0];
|
||||
NSString *dataFilePath = [documentsDirectory stringByAppendingPathComponent:localContactsFile];
|
||||
|
@ -702,36 +807,43 @@ static NSString *contactsBookInfoFile = @"contacts";
|
|||
NSFileManager *fileManager = [[NSFileManager alloc] init];
|
||||
|
||||
if ([fileManager fileExistsAtPath:dataFilePath])
|
||||
|
||||
{
|
||||
// the file content could be corrupted
|
||||
@try {
|
||||
@try
|
||||
{
|
||||
NSData* filecontent = [NSData dataWithContentsOfFile:dataFilePath options:(NSDataReadingMappedAlways | NSDataReadingUncached) error:nil];
|
||||
|
||||
NSKeyedUnarchiver *decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:filecontent];
|
||||
|
||||
id object = [decoder decodeObjectForKey:@"deviceContactByContactID"];
|
||||
|
||||
if ([object isKindOfClass:[NSDictionary class]]) {
|
||||
if ([object isKindOfClass:[NSDictionary class]])
|
||||
{
|
||||
deviceContactByContactID = [object mutableCopy];
|
||||
}
|
||||
|
||||
[decoder finishDecoding];
|
||||
} @catch (NSException *exception) {
|
||||
} @catch (NSException *exception)
|
||||
{
|
||||
lastSyncDate = nil;
|
||||
}
|
||||
}
|
||||
|
||||
if (!deviceContactByContactID) {
|
||||
if (!deviceContactByContactID)
|
||||
{
|
||||
deviceContactByContactID = [[NSMutableDictionary alloc] init];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) saveContactBookInfo {
|
||||
- (void)saveContactBookInfo
|
||||
{
|
||||
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
||||
NSString *documentsDirectory = [paths objectAtIndex:0];
|
||||
NSString *dataFilePath = [documentsDirectory stringByAppendingPathComponent:contactsBookInfoFile];
|
||||
|
||||
if (lastSyncDate)
|
||||
|
||||
{
|
||||
NSMutableData *theData = [NSMutableData data];
|
||||
NSKeyedArchiver *encoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:theData];
|
||||
|
@ -743,13 +855,15 @@ static NSString *contactsBookInfoFile = @"contacts";
|
|||
[theData writeToFile:dataFilePath atomically:YES];
|
||||
}
|
||||
else
|
||||
|
||||
{
|
||||
NSFileManager *fileManager = [[NSFileManager alloc] init];
|
||||
[fileManager removeItemAtPath:dataFilePath error:nil];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) loadContactBookInfo {
|
||||
- (void)loadContactBookInfo
|
||||
{
|
||||
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
||||
NSString *documentsDirectory = [paths objectAtIndex:0];
|
||||
NSString *dataFilePath = [documentsDirectory stringByAppendingPathComponent:contactsBookInfoFile];
|
||||
|
@ -757,9 +871,11 @@ static NSString *contactsBookInfoFile = @"contacts";
|
|||
NSFileManager *fileManager = [[NSFileManager alloc] init];
|
||||
|
||||
if ([fileManager fileExistsAtPath:dataFilePath])
|
||||
|
||||
{
|
||||
// the file content could be corrupted
|
||||
@try {
|
||||
@try
|
||||
{
|
||||
NSData* filecontent = [NSData dataWithContentsOfFile:dataFilePath options:(NSDataReadingMappedAlways | NSDataReadingUncached) error:nil];
|
||||
|
||||
NSKeyedUnarchiver *decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:filecontent];
|
||||
|
@ -767,7 +883,8 @@ static NSString *contactsBookInfoFile = @"contacts";
|
|||
lastSyncDate = [decoder decodeObjectForKey:@"lastSyncDate"];
|
||||
|
||||
[decoder finishDecoding];
|
||||
} @catch (NSException *exception) {
|
||||
} @catch (NSException *exception)
|
||||
{
|
||||
lastSyncDate = nil;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue