mirror of https://github.com/oxen-io/session-ios
Merge branch 'charlesmchen/syncContactsEagerly'
commit
c81206ca70
@ -0,0 +1,19 @@
|
|||||||
|
//
|
||||||
|
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "SignalsViewController.h"
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
@class OWSContactsManager;
|
||||||
|
@class OWSMessageSender;
|
||||||
|
|
||||||
|
@interface OWSContactsSyncing : NSObject
|
||||||
|
|
||||||
|
- (instancetype)initWithContactsManager:(OWSContactsManager *)contactsManager
|
||||||
|
messageSender:(OWSMessageSender *)messageSender;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
@ -0,0 +1,140 @@
|
|||||||
|
//
|
||||||
|
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "OWSContactsSyncing.h"
|
||||||
|
#import "OWSContactsManager.h"
|
||||||
|
#import "TSAccountManager.h"
|
||||||
|
#import <SignalServiceKit/MIMETypeUtil.h>
|
||||||
|
#import <SignalServiceKit/OWSMessageSender.h>
|
||||||
|
#import <SignalServiceKit/OWSSyncContactsMessage.h>
|
||||||
|
#import <SignalServiceKit/TSAccountManager.h>
|
||||||
|
#import <SignalServiceKit/TSStorageManager.h>
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
NSString *const kTSStorageManagerOWSContactsSyncingCollection = @"kTSStorageManagerOWSContactsSyncingCollection";
|
||||||
|
NSString *const kTSStorageManagerOWSContactsSyncingLastMessageKey =
|
||||||
|
@"kTSStorageManagerOWSContactsSyncingLastMessageKey";
|
||||||
|
|
||||||
|
@interface OWSContactsSyncing ()
|
||||||
|
|
||||||
|
@property (nonatomic, readonly) OWSContactsManager *contactsManager;
|
||||||
|
@property (nonatomic, readonly) OWSMessageSender *messageSender;
|
||||||
|
@property (nonatomic) BOOL isRequestInFlight;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation OWSContactsSyncing
|
||||||
|
|
||||||
|
- (instancetype)initWithContactsManager:(OWSContactsManager *)contactsManager
|
||||||
|
messageSender:(OWSMessageSender *)messageSender
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
|
||||||
|
if (!self) {
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
OWSAssert(contactsManager);
|
||||||
|
OWSAssert(messageSender);
|
||||||
|
|
||||||
|
_contactsManager = contactsManager;
|
||||||
|
_messageSender = messageSender;
|
||||||
|
|
||||||
|
OWSSingletonAssert();
|
||||||
|
|
||||||
|
__weak OWSContactsSyncing *weakSelf = self;
|
||||||
|
[contactsManager.getObservableContacts watchLatestValue:^(id latestValue) {
|
||||||
|
[weakSelf sendSyncContactsMessageIfPossible];
|
||||||
|
}
|
||||||
|
onThread:[NSThread mainThread]
|
||||||
|
untilCancelled:nil];
|
||||||
|
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Methods
|
||||||
|
|
||||||
|
- (void)sendSyncContactsMessageIfNecessary
|
||||||
|
{
|
||||||
|
AssertIsOnMainThread();
|
||||||
|
|
||||||
|
if (self.isRequestInFlight) {
|
||||||
|
// De-bounce. It's okay if we ignore some new changes;
|
||||||
|
// `sendSyncContactsMessageIfPossible` is called fairly
|
||||||
|
// often so we'll sync soon.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
OWSSyncContactsMessage *syncContactsMessage =
|
||||||
|
[[OWSSyncContactsMessage alloc] initWithContactsManager:self.contactsManager];
|
||||||
|
|
||||||
|
NSData *messageData = [syncContactsMessage buildPlainTextAttachmentData];
|
||||||
|
|
||||||
|
NSData *lastMessageData =
|
||||||
|
[[TSStorageManager sharedManager] objectForKey:kTSStorageManagerOWSContactsSyncingLastMessageKey
|
||||||
|
inCollection:kTSStorageManagerOWSContactsSyncingCollection];
|
||||||
|
|
||||||
|
if (lastMessageData && [lastMessageData isEqual:messageData]) {
|
||||||
|
// Ignore redundant contacts sync message.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.isRequestInFlight = YES;
|
||||||
|
|
||||||
|
[self.messageSender sendTemporaryAttachmentData:[syncContactsMessage buildPlainTextAttachmentData]
|
||||||
|
contentType:OWSMimeTypeApplicationOctetStream
|
||||||
|
inMessage:syncContactsMessage
|
||||||
|
success:^{
|
||||||
|
DDLogInfo(@"%@ Successfully sent contacts sync message.", self.tag);
|
||||||
|
|
||||||
|
[[TSStorageManager sharedManager] setObject:messageData
|
||||||
|
forKey:kTSStorageManagerOWSContactsSyncingLastMessageKey
|
||||||
|
inCollection:kTSStorageManagerOWSContactsSyncingCollection];
|
||||||
|
|
||||||
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
|
self.isRequestInFlight = NO;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
failure:^(NSError *error) {
|
||||||
|
DDLogError(@"%@ Failed to send contacts sync message with error: %@", self.tag, error);
|
||||||
|
|
||||||
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
|
self.isRequestInFlight = NO;
|
||||||
|
});
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)sendSyncContactsMessageIfPossible
|
||||||
|
{
|
||||||
|
AssertIsOnMainThread();
|
||||||
|
|
||||||
|
if (![self.contactsManager hasAddressBook]) {
|
||||||
|
// Don't bother until the contacts manager has finished setup.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[TSAccountManager sharedInstance] ifRegistered:YES
|
||||||
|
runAsync:^{
|
||||||
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
|
[self sendSyncContactsMessageIfNecessary];
|
||||||
|
});
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Logging
|
||||||
|
|
||||||
|
+ (NSString *)tag
|
||||||
|
{
|
||||||
|
return [NSString stringWithFormat:@"[%@]", self.class];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSString *)tag
|
||||||
|
{
|
||||||
|
return self.class.tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
Loading…
Reference in New Issue