Merge branch 'charlesmchen/fixIsContactTest'

pull/1/head
Michael Kirk 8 years ago
commit 2292f20c93

@ -837,6 +837,7 @@ static NSString *const kURLHostVerifyPrefix = @"verify";
[OWSProfileManager.sharedManager fetchLocalUsersProfile];
[[OWSReadReceiptManager sharedManager] prepareCachedValues];
[[Environment getCurrent].contactsManager loadLastKnownContactRecipientIds];
}
- (void)registrationStateDidChange

@ -171,7 +171,7 @@ NS_ASSUME_NONNULL_BEGIN
OWSAssert([self.thread isKindOfClass:[TSContactThread class]]);
TSContactThread *contactThread = (TSContactThread *)self.thread;
NSString *recipientId = contactThread.contactIdentifier;
return self.contactsManager.allContactsMap[recipientId] != nil;
return [self.contactsManager.lastKnownContactRecipientIds containsObject:recipientId];
}
#pragma mark - ContactEditingDelegate

@ -36,10 +36,27 @@ extern NSString *const OWSContactsManagerSignalAccountsDidChangeNotification;
@property (atomic, readonly) NSDictionary<NSString *, SignalAccount *> *signalAccountMap;
@property (atomic, readonly) NSArray<SignalAccount *> *signalAccounts;
// This value is cached and is available immediately, before system contacts
// fetch or contacts intersection.
//
// In some cases, its better if our UI reflects these values
// which haven't been updated yet rather than assume that
// we have no contacts until the first contacts intersection
// successfully completes.
//
// This significantly improves the user experience when:
//
// * No contacts intersection has completed because the app has just launched.
// * Contacts intersection can't complete due to an unreliable connection or
// the contacts intersection rate limit.
@property (atomic, readonly) NSArray<NSString *> *lastKnownContactRecipientIds;
- (nullable SignalAccount *)signalAccountForRecipientId:(NSString *)recipientId;
- (Contact *)getOrBuildContactForPhoneIdentifier:(NSString *)identifier;
- (void)loadLastKnownContactRecipientIds;
#pragma mark - System Contact Fetching
// Must call `requestSystemContactsOnce` before accessing this method

@ -16,12 +16,14 @@
@import Contacts;
NSString *const OWSContactsManagerSignalAccountsDidChangeNotification =
@"OWSContactsManagerSignalAccountsDidChangeNotification";
NSString *const OWSContactsManagerSignalAccountsDidChangeNotification
= @"OWSContactsManagerSignalAccountsDidChangeNotification";
NSString *const kTSStorageManager_AccountDisplayNames = @"kTSStorageManager_AccountDisplayNames";
NSString *const kTSStorageManager_AccountFirstNames = @"kTSStorageManager_AccountFirstNames";
NSString *const kTSStorageManager_AccountLastNames = @"kTSStorageManager_AccountLastNames";
NSString *const kTSStorageManager_OWSContactsManager = @"kTSStorageManager_OWSContactsManager";
NSString *const kTSStorageManager_lastKnownContactRecipientIds = @"lastKnownContactRecipientIds";
@interface OWSContactsManager () <SystemContactsFetcherDelegate>
@ -34,6 +36,7 @@ NSString *const kTSStorageManager_AccountLastNames = @"kTSStorageManager_Account
@property (atomic) NSDictionary<NSString *, Contact *> *allContactsMap;
@property (atomic) NSArray<SignalAccount *> *signalAccounts;
@property (atomic) NSDictionary<NSString *, SignalAccount *> *signalAccountMap;
@property (atomic) NSArray<NSString *> *lastKnownContactRecipientIds;
@property (nonatomic, readonly) SystemContactsFetcher *systemContactsFetcher;
@property (atomic) NSDictionary<NSString *, NSString *> *cachedAccountNameMap;
@ -53,8 +56,10 @@ NSString *const kTSStorageManager_AccountLastNames = @"kTSStorageManager_Account
// TODO: We need to configure the limits of this cache.
_avatarCache = [ImageCache new];
_allContacts = @[];
_allContactsMap = @{};
_signalAccountMap = @{};
_signalAccounts = @[];
_lastKnownContactRecipientIds = @[];
_systemContactsFetcher = [SystemContactsFetcher new];
_systemContactsFetcher.delegate = self;
@ -65,6 +70,18 @@ NSString *const kTSStorageManager_AccountLastNames = @"kTSStorageManager_Account
return self;
}
- (void)loadLastKnownContactRecipientIds
{
[TSStorageManager.sharedManager.newDatabaseConnection readWithBlock:^(
YapDatabaseReadTransaction *_Nonnull transaction) {
NSArray<NSString *> *_Nullable value = [transaction objectForKey:kTSStorageManager_lastKnownContactRecipientIds
inCollection:kTSStorageManager_OWSContactsManager];
if (value) {
self.lastKnownContactRecipientIds = value;
}
}];
}
#pragma mark - System Contact Fetching
// Request contacts access if you haven't asked recently.
@ -226,7 +243,16 @@ NSString *const kTSStorageManager_AccountLastNames = @"kTSStorageManager_Account
}
}
NSArray<NSString *> *lastKnownContactRecipientIds = [signalAccountMap allKeys];
[TSStorageManager.sharedManager.newDatabaseConnection
readWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) {
[transaction setObject:lastKnownContactRecipientIds
forKey:kTSStorageManager_lastKnownContactRecipientIds
inCollection:kTSStorageManager_OWSContactsManager];
}];
dispatch_async(dispatch_get_main_queue(), ^{
self.lastKnownContactRecipientIds = lastKnownContactRecipientIds;
self.signalAccountMap = [signalAccountMap copy];
self.signalAccounts = [signalAccounts copy];

@ -385,8 +385,8 @@ NS_ASSUME_NONNULL_BEGIN
shouldHaveAddToProfileWhitelistOffer = NO;
}
SignalAccount *signalAccount = contactsManager.signalAccountMap[recipientId];
if (signalAccount) {
BOOL isContact = [contactsManager.lastKnownContactRecipientIds containsObject:recipientId];
if (isContact) {
// Only create "add to contacts" offers for non-contacts.
shouldHaveAddToContactsOffer = NO;
// Only create block offers for non-contacts.

Loading…
Cancel
Save