From 518f15155acddf006d5647c4759e41d43bcd05ee Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Fri, 10 Nov 2017 12:04:24 -0500 Subject: [PATCH] Respond to CR. // FREEBIE --- .../OWSLinkDeviceViewController.m | 2 +- SignalServiceKit/src/Devices/OWSDevice.h | 18 +++-- SignalServiceKit/src/Devices/OWSDevice.m | 81 ++++++++++++++----- .../src/Messages/OWSMessageSender.m | 4 +- .../src/Storage/YapDatabaseConnection+OWS.m | 4 +- 5 files changed, 79 insertions(+), 30 deletions(-) diff --git a/Signal/src/ViewControllers/OWSLinkDeviceViewController.m b/Signal/src/ViewControllers/OWSLinkDeviceViewController.m index edc941136..81385f76e 100644 --- a/Signal/src/ViewControllers/OWSLinkDeviceViewController.m +++ b/Signal/src/ViewControllers/OWSLinkDeviceViewController.m @@ -147,7 +147,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)provisionWithParser:(OWSDeviceProvisioningURLParser *)parser { // Optimistically set this flag. - [OWSDevice setMayHaveLinkedDevices:YES dbConnection:self.dbConnection]; + [OWSDeviceManager.sharedManager setMayHaveLinkedDevices:YES dbConnection:self.dbConnection]; ECKeyPair *_Nullable identityKeyPair = [[OWSIdentityManager sharedManager] identityKeyPair]; OWSAssert(identityKeyPair); diff --git a/SignalServiceKit/src/Devices/OWSDevice.h b/SignalServiceKit/src/Devices/OWSDevice.h index 095f04909..eba4af55c 100644 --- a/SignalServiceKit/src/Devices/OWSDevice.h +++ b/SignalServiceKit/src/Devices/OWSDevice.h @@ -9,6 +9,19 @@ NS_ASSUME_NONNULL_BEGIN extern uint32_t const OWSDevicePrimaryDeviceId; +@interface OWSDeviceManager : NSObject + +- (instancetype)init NS_UNAVAILABLE; + ++ (instancetype)sharedManager; + +- (BOOL)mayHaveLinkedDevices:(YapDatabaseConnection *)dbConnection; +- (void)setMayHaveLinkedDevices:(BOOL)value dbConnection:(YapDatabaseConnection *)dbConnection; + +@end + +#pragma mark - + @interface OWSDevice : TSYapDatabaseObject @property (nonatomic, readonly) NSInteger deviceId; @@ -52,11 +65,6 @@ extern uint32_t const OWSDevicePrimaryDeviceId; */ - (BOOL)updateAttributesWithDevice:(OWSDevice *)other; -#pragma mark - "May Have Linked Devices" Flag - -+ (BOOL)mayHaveLinkedDevices:(YapDatabaseConnection *)dbConnection; -+ (void)setMayHaveLinkedDevices:(BOOL)value dbConnection:(YapDatabaseConnection *)dbConnection; - @end NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Devices/OWSDevice.m b/SignalServiceKit/src/Devices/OWSDevice.m index 886cbc5ae..d2b423535 100644 --- a/SignalServiceKit/src/Devices/OWSDevice.m +++ b/SignalServiceKit/src/Devices/OWSDevice.m @@ -16,6 +16,67 @@ uint32_t const OWSDevicePrimaryDeviceId = 1; NSString *const kTSStorageManager_OWSDeviceCollection = @"kTSStorageManager_OWSDeviceCollection"; NSString *const kTSStorageManager_MayHaveLinkedDevices = @"kTSStorageManager_MayHaveLinkedDevices"; +@interface OWSDeviceManager () + +@property (atomic, nullable) NSNumber *mayHaveLinkedDevicesCached; + +@end + +#pragma mark - + +@implementation OWSDeviceManager + ++ (instancetype)sharedManager +{ + static OWSDeviceManager *instance = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + instance = [[self alloc] initDefault]; + }); + return instance; +} + +- (instancetype)initDefault +{ + return [super init]; +} + +- (BOOL)mayHaveLinkedDevices:(YapDatabaseConnection *)dbConnection +{ + OWSAssert(dbConnection); + + @synchronized(self) + { + if (!self.mayHaveLinkedDevicesCached) { + self.mayHaveLinkedDevicesCached = @([dbConnection boolForKey:kTSStorageManager_MayHaveLinkedDevices + inCollection:kTSStorageManager_OWSDeviceCollection + defaultValue:YES]); + } + + return [self.mayHaveLinkedDevicesCached boolValue]; + } +} + +- (void)setMayHaveLinkedDevices:(BOOL)value dbConnection:(YapDatabaseConnection *)dbConnection +{ + OWSAssert(dbConnection); + + @synchronized(self) + { + self.mayHaveLinkedDevicesCached = @(YES); + + [dbConnection asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { + [transaction setObject:@(value) + forKey:kTSStorageManager_MayHaveLinkedDevices + inCollection:kTSStorageManager_OWSDeviceCollection]; + }]; + } +} + +@end + +#pragma mark - + @interface OWSDevice () @property (nonatomic) NSInteger deviceId; @@ -182,26 +243,6 @@ NSString *const kTSStorageManager_MayHaveLinkedDevices = @"kTSStorageManager_May return self.deviceId == device.deviceId; } -#pragma mark - "May Have Linked Devices" Flag - -+ (BOOL)mayHaveLinkedDevices:(YapDatabaseConnection *)dbConnection -{ - OWSAssert(dbConnection); - - return [dbConnection boolForKey:kTSStorageManager_MayHaveLinkedDevices - inCollection:kTSStorageManager_OWSDeviceCollection - defaultValue:YES]; -} - -+ (void)setMayHaveLinkedDevices:(BOOL)value dbConnection:(YapDatabaseConnection *)dbConnection -{ - OWSAssert(dbConnection); - - [dbConnection setBool:value - forKey:kTSStorageManager_MayHaveLinkedDevices - inCollection:kTSStorageManager_OWSDeviceCollection]; -} - @end NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index ba7a27a28..ad5d71c40 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -971,7 +971,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; // devices, then can safely skip sending sync message. // 1. Check OWSDevice's state. - BOOL mayHaveLinkedDevices = [OWSDevice mayHaveLinkedDevices:self.dbConnection]; + BOOL mayHaveLinkedDevices = [OWSDeviceManager.sharedManager mayHaveLinkedDevices:self.dbConnection]; // 2. Check SignalRecipient's state. BOOL hasDeviceMessages = deviceMessages.count > 0; @@ -1113,7 +1113,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; if (missingDevices.count > 0) { NSString *localNumber = [TSAccountManager localNumber]; if ([localNumber isEqualToString:recipient.uniqueId]) { - [OWSDevice setMayHaveLinkedDevices:YES dbConnection:self.dbConnection]; + [OWSDeviceManager.sharedManager setMayHaveLinkedDevices:YES dbConnection:self.dbConnection]; } } diff --git a/SignalServiceKit/src/Storage/YapDatabaseConnection+OWS.m b/SignalServiceKit/src/Storage/YapDatabaseConnection+OWS.m index 9f2d2c024..0e31b973b 100644 --- a/SignalServiceKit/src/Storage/YapDatabaseConnection+OWS.m +++ b/SignalServiceKit/src/Storage/YapDatabaseConnection+OWS.m @@ -57,8 +57,8 @@ NS_ASSUME_NONNULL_BEGIN - (BOOL)boolForKey:(NSString *)key inCollection:(NSString *)collection defaultValue:(BOOL)defaultValue { - NSNumber *_Nullable number = [self objectForKey:key inCollection:collection ofExpectedType:[NSNumber class]]; - return [number boolValue]; + NSNumber *_Nullable value = [self objectForKey:key inCollection:collection ofExpectedType:[NSNumber class]]; + return value ? [value boolValue] : defaultValue; } - (nullable NSData *)dataForKey:(NSString *)key inCollection:(NSString *)collection