@ -20,44 +20,24 @@ NSString *const TSRegistrationErrorUserInfoHTTPStatus = @"TSHTTPStatus";
NSString * const kNSNotificationName_RegistrationStateDidChange = @ "kNSNotificationName_RegistrationStateDidChange ";
NSString * const kNSNotificationName_LocalNumberDidChange = @ "kNSNotificationName_LocalNumberDidChange ";
NSString * const TSAccountManager_RegisteredNumberKey = @ "TSStorageRegisteredNumberKey ";
NSString * const TSAccountManager_LocalRegistrationIdKey = @ "TSStorageLocalRegistrationId ";
@ interface TSAccountManager ( )
@ property ( nonatomic , readonly ) BOOL isRegistered ;
@ property ( nonatomic , nullable ) NSString * phoneNumberAwaitingVerification ;
@ property ( nonatomic , nullable ) NSString * cachedLocalNumber ;
@ property ( nonatomic , readonly ) TSStorageManager * storageManager ;
@ property ( nonatomic , readonly ) YapDatabaseConnection * dbConnection ;
@ end
#pragma mark -
@ interface TSStorageManager ( TSAccountManagerStorage )
/ * *
* Stored registered phone number
*
* @ return E164 string of the registered phone number
* /
+ ( nullable NSString * ) localNumber ;
- ( nullable NSString * ) localNumber ;
@ end
@ implementation TSStorageManager ( TSAccountManagerStorage )
+ ( nullable NSString * ) localNumber
{
return [ [ self sharedManager ] localNumber ] ;
}
- ( nullable NSString * ) localNumber
{
return [ self stringForKey : TSStorageRegisteredNumberKey inCollection : TSStorageUserAccountCollection ] ;
}
@ end
@ implementation TSAccountManager
@ synthesize isRegistered = _isRegistered ;
- ( instancetype ) initWithNetworkManager : ( TSNetworkManager * ) networkManager
storageManager : ( TSStorageManager * ) storageManager
{
@ -67,7 +47,7 @@ NSString *const kNSNotificationName_LocalNumberDidChange = @"kNSNotificationName
}
_networkManager = networkManager ;
_ storageManager = storageManager ;
_ dbConnection = [ storageManager newDatabaseConnection ] ;
OWSSingletonAssert ( ) ;
@ -95,13 +75,42 @@ NSString *const kNSNotificationName_LocalNumberDidChange = @"kNSNotificationName
userInfo : nil ] ;
}
+ ( BOOL ) isRegistered {
return [ TSStorageManager localNumber ] ? YES : NO ;
+ ( BOOL ) isRegistered
{
return [ [ self sharedInstance ] isRegistered ] ;
}
- ( BOOL ) isRegistered
{
if ( _isRegistered ) {
return YES ;
} else {
@ synchronized ( self ) {
/ / Cache this once it ' s true since it ' s called alot , involves a dbLookup , and once set - it doesn ' t change .
_isRegistered = [ self storedLocalNumber ] != nil ;
}
}
return _isRegistered ;
}
- ( void ) ifRegistered : ( BOOL ) isRegistered runAsync : ( void ( ^) ( ) ) block
- ( void ) ifRegistered : ( BOOL ) runIf Registered runAsync : ( void ( ^) ( ) ) block
{
[ self . storageManager ifLocalNumberPresent : isRegistered runAsync : block ] ;
dispatch_async ( dispatch_get_global_queue ( DISPATCH_QUEUE_PRIORITY_DEFAULT , 0 ) , ^{
if ( [ self isRegistered ] == runIfRegistered ) {
if ( runIfRegistered ) {
DDLogDebug ( @ "%@ Running existing-user block", self.tag);
} else {
DDLogDebug ( @ "%@ Running new-user block", self.tag);
}
block ( ) ;
} else {
if ( runIfRegistered ) {
DDLogDebug ( @ "%@ Skipping existing-user block for new-user", self.tag);
} else {
DDLogDebug ( @ "%@ Skipping new-user block for existing-user", self.tag);
}
}
} ) ;
}
- ( void ) didRegister
@ -113,7 +122,7 @@ NSString *const kNSNotificationName_LocalNumberDidChange = @"kNSNotificationName
@ throw [ NSException exceptionWithName : @ "RegistrationFail " reason : @ "Internal Corrupted State " userInfo : nil ] ;
}
[ self . storageManager storePhone Number: phoneNumber ] ;
[ self storeLocal Number: phoneNumber ] ;
[ [ NSNotificationCenter defaultCenter ] postNotificationName : kNSNotificationName_RegistrationStateDidChange
object : nil
@ -136,30 +145,47 @@ NSString *const kNSNotificationName_LocalNumberDidChange = @"kNSNotificationName
@ synchronized ( self )
{
if ( self . cachedLocalNumber == nil ) {
self . cachedLocalNumber = [ TSStorageManager localNumber ] ;
self . cachedLocalNumber = self . storedLocalNumber ;
}
}
return self . cachedLocalNumber ;
}
+ ( uint32_t ) getOrGenerateRegistrationId {
YapDatabaseConnection * dbConn = [ [ TSStorageManager sharedManager ] newDatabaseConnection ] ;
__block uint32_t registrationID = 0 ;
- ( nullable NSString * ) storedLocalNumber
{
@ synchronized ( self ) {
return [ self . dbConnection stringForKey : TSAccountManager_RegisteredNumberKey
inCollection : TSStorageUserAccountCollection ] ;
}
}
[ dbConn readWithBlock : ^( YapDatabaseReadTransaction * transaction ) {
registrationID = [ [ transaction objectForKey : TSStorageLocalRegistrationId
- ( void ) storeLocalNumber : ( NSString * ) localNumber
{
@ synchronized ( self ) {
[ self . dbConnection setObject : localNumber
forKey : TSAccountManager_RegisteredNumberKey
inCollection : TSStorageUserAccountCollection ] ;
}
}
+ ( uint32_t ) getOrGenerateRegistrationId
{
return [ [ self sharedInstance ] getOrGenerateRegistrationId ] ;
}
- ( uint32_t ) getOrGenerateRegistrationId
{
uint32_t registrationID = [ [ self . dbConnection objectForKey : TSAccountManager_LocalRegistrationIdKey
inCollection : TSStorageUserAccountCollection ] unsignedIntValue ] ;
} ] ;
if ( registrationID == 0 ) {
registrationID = ( uint32_t ) arc4random_uniform ( 16380 ) + 1 ;
DDLogWarn ( @ "%@ Generated a new registrationID: %u", self.tag, registrationID);
[ dbConn readWriteWithBlock : ^( YapDatabaseReadWriteTransaction * transaction ) {
[ transaction setObject : [ NSNumber numberWithUnsignedInteger : registrationID ]
forKey : TSStorageLocalRegistrationId
[ self . dbConnection setObject : [ NSNumber numberWithUnsignedInteger : registrationID ]
forKey : TSAccountManager_LocalRegistrationIdKey
inCollection : TSStorageUserAccountCollection ] ;
} ] ;
}
return registrationID ;